diff src/samer/j3d/Util.java @ 0:bf79fb79ee13

Initial Mercurial check in.
author samer
date Tue, 17 Jan 2012 17:50:20 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/samer/j3d/Util.java	Tue Jan 17 17:50:20 2012 +0000
@@ -0,0 +1,225 @@
+package samer.j3d;
+
+import samer.core.*;
+import java.awt.*;
+import javax.media.j3d.*;
+import javax.vecmath.*;
+import com.sun.j3d.utils.behaviors.keyboard.*;
+import com.sun.j3d.utils.behaviors.mouse.*;
+import com.sun.j3d.utils.geometry.*;
+
+public class Util
+{
+	private static Bounds bounds=new BoundingSphere(new Point3d(0,0,0),1000);
+	public static void setBounds(Bounds b) { bounds=b; }
+	public static Bounds getBounds() { return bounds; }
+
+
+	// -------------- TransformGroup behviours ------------------
+
+	public static TransformGroup mouseRotate(TransformGroup tg)
+	{
+        MouseRotate m = new MouseRotate(readwrite(tg));
+        m.setSchedulingBounds(bounds);
+        tg.addChild(m);
+		return tg;
+	}
+
+	public static TransformGroup mouseTranslate(TransformGroup tg)
+	{
+        MouseTranslate m = new MouseTranslate(readwrite(tg));
+        m.setSchedulingBounds(bounds);
+        tg.addChild(m);
+		return tg;
+	}
+
+	public static TransformGroup mouseZoom(TransformGroup tg)
+	{
+        MouseZoom m = new MouseZoom(readwrite(tg));
+        m.setSchedulingBounds(bounds);
+        tg.addChild(m);
+		return tg;
+	}
+
+	public static void addKeyNavigator(Group g, TransformGroup tg)
+	{
+		// readwrite(tg);
+        KeyNavigatorBehavior keynav = new KeyNavigatorBehavior(tg);
+        keynav.setSchedulingBounds(bounds);
+        g.addChild(keynav);
+	}
+
+	public static TransformGroup addRotator(int period, TransformGroup tg)
+	{
+		Alpha alpha = new Alpha(-1, period);
+		Behavior rotator = new RotationInterpolator(alpha, writable(tg));
+		rotator.setSchedulingBounds(bounds);
+		tg.addChild(rotator);
+		return tg;
+	}
+
+	// -------------- Lighting ------------------
+
+	public static Light color(Light l, Color3f c) { l.setColor(c); return l; }
+	public static Light directionalLight(double x, double y, double z)
+	{
+        DirectionalLight l = new DirectionalLight();
+		l.setDirection(-(float)x,-(float)y,-(float)z);
+        l.setInfluencingBounds(bounds);
+		return l;
+	}
+
+	public static Light ambientLight() 
+	{
+        AmbientLight a = new AmbientLight();
+        a.setInfluencingBounds(bounds);
+		return a;
+	}
+
+	public static Light pointLight(double x, double y, double z)
+	{
+        PointLight l = new PointLight();
+        l.setInfluencingBounds(bounds);
+		l.setPosition((float)x,(float)y,(float)z);
+		l.setAttenuation(0,0,1);
+		return l;
+	}
+
+	public static Background background(double r, double g, double b)
+	{
+		Background bg=new Background((float)r,(float)g,(float)b);
+		bg.setApplicationBounds(bounds);
+		return bg;
+	}
+
+
+	public static ViewPlatform	 writable(ViewPlatform vp) {
+        vp.setCapability(ViewPlatform.ALLOW_POLICY_WRITE); return vp; 
+	}
+	public static TransformGroup writable(TransformGroup tg) {
+        tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); return tg; 
+	}
+	public static TransformGroup readwrite(TransformGroup tg) {
+        tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); 
+        tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); 
+		return tg; 
+	}
+
+	// ----------------- Appearances ------------------
+
+	// basic appearances
+	
+	public static Appearance points()
+	{
+		Appearance a = new Appearance();
+		PolygonAttributes pa = new PolygonAttributes();
+		pa.setPolygonMode(PolygonAttributes.POLYGON_POINT);
+		pa.setCullFace(PolygonAttributes.CULL_NONE);
+		a.setPolygonAttributes(pa);
+		a.setPointAttributes(
+			new PointAttributes((float)Shell.getDouble("pointsize",3), false));
+		return a;
+	}
+
+	public static Appearance wireframe()
+	{
+		Appearance a = new Appearance();
+		PolygonAttributes polyAttrib = new PolygonAttributes();
+		polyAttrib.setPolygonMode(PolygonAttributes.POLYGON_LINE);
+		if (!Shell.getBoolean("backfacecull",false)) {
+			polyAttrib.setCullFace(PolygonAttributes.CULL_NONE);
+		}
+		a.setPolygonAttributes(polyAttrib);
+		a.setLineAttributes(
+			new LineAttributes((float)Shell.getDouble("linewidth",2),
+						LineAttributes.PATTERN_SOLID,true));
+
+		return a;
+    }
+
+    public static Appearance shadedwireframe() 
+	{
+        Appearance a = new Appearance();
+        PolygonAttributes polyAttrib = new PolygonAttributes();
+        polyAttrib.setPolygonMode(PolygonAttributes.POLYGON_LINE);
+        a.setPolygonAttributes(polyAttrib);
+		a.setLineAttributes(new LineAttributes(2f,LineAttributes.PATTERN_SOLID,false));
+
+        Material material = new Material();
+        material.setDiffuseColor(new Color3f(.7f, 0.6f, 0.9f));
+		material.setShininess(128);
+        a.setMaterial(material);
+        return a;
+    }
+
+	public static Appearance offsetPolygon() 
+	{		
+		Appearance a = new Appearance();
+		PolygonAttributes polyAttrib = new PolygonAttributes();
+		polyAttrib.setPolygonOffset(2f);
+		a.setPolygonAttributes(polyAttrib);
+
+		return a;
+	}
+	
+	public static Appearance patches()
+	{
+		Appearance a = new Appearance();
+		PolygonAttributes polyAttrib = new PolygonAttributes();
+		polyAttrib.setCullFace(PolygonAttributes.CULL_NONE);
+		a.setPolygonAttributes(polyAttrib);
+
+		// I think this is for transparent polygons
+		// see depthBufferFreezeTransparent in view
+		RenderingAttributes	ra=new RenderingAttributes();
+		ra.setDepthBufferEnable(false);
+		ra.setIgnoreVertexColors(false);
+		a.setRenderingAttributes(ra);
+		
+		return a;
+	}
+
+	// modifiers
+	
+	public static Appearance color(Color3f c, Appearance a)
+	{
+		ColoringAttributes colorAttrib=new ColoringAttributes();
+		colorAttrib.setColor(c);
+		a.setColoringAttributes(colorAttrib);
+		return a;
+	}
+
+	public static Appearance flat(Appearance a)
+	{
+		ColoringAttributes colorAttrib=new ColoringAttributes();
+		colorAttrib.setShadeModel(ColoringAttributes.SHADE_FLAT);
+		a.setColoringAttributes(colorAttrib);
+		return a;
+	}
+
+	public static Appearance flat(Color3f c, Appearance a)
+	{
+		ColoringAttributes colorAttrib=new ColoringAttributes();
+		colorAttrib.setShadeModel(ColoringAttributes.SHADE_FLAT);
+		colorAttrib.setColor(c);
+		a.setColoringAttributes(colorAttrib);
+		return a;
+	}
+
+	public static Appearance alpha(double t, Appearance a)
+	{
+		a.setTransparencyAttributes(
+			new TransparencyAttributes(TransparencyAttributes.BLENDED,(float)t));
+		return a;
+	}
+
+    public static Appearance material(Color3f diff, Color3f spec, int shin, Appearance a) 
+	{
+        Material material = new Material();
+        material.setDiffuseColor(diff);
+        material.setSpecularColor(spec);
+		material.setShininess(shin);
+        a.setMaterial(material);
+        return a;
+    }
+}