Hi guys
Thanks for the replies, I admittedly do feel better now, but only because
someone out there cares. My overlay still flikers.
In the small universe of the j3d "overlay" i have made a significant
breakthrough, though, by getting the 3D stuff *not* to flicker. Im either on
the right path, or this was the last step to the end of the road. If I were
Pascal...and I had to wager...
Anyhow, it's also now also becoming a personal thing, because in our office,
I'm the only guy doing this, on risk. On Monday, it's *Monday*.
-----------------------------------------------------------------------
/*
cw-e
(compile without expectations)
creditations and thanks to many contributors
won't run without modifications
You need to add a few things (like a shape3d and some g2d drawings)
*/
//not all imports are necessary - choose
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import javax.media.j3d.*;
import javax.vecmath.*;
import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;
import com.mnstarfire.loaders3d.Inspector3DS;
import java.util.*;
import com.sun.j3d.utils.picking.*;
import java.awt.image.BufferedImage;
//import org.j3d.geom.overlay.ImageOverlay;
//import org.j3d.geom.overlay.OverlayBase;
import javax.media.j3d.*;
import java.util.Enumeration;
public class AH-MFD-3D extends Applet implements getInput
{
private double sceneScale = 0.4;
private TransformGroup xformgrpScale = new TransformGroup();
private TransformGroup xgrpView = new TransformGroup();
private BoundingSphere bounds = new BoundingSphere(new Point3d(0.0, 0.0,
0.0), 200.0);
private BranchGroup bgrpRoot = new BranchGroup();
private ViewingPlatform vp = new ViewingPlatform();
private GraphicsContext3D gc3d;
private J3DGraphics2D j3dg2d;
private SimpleUniverse su = null;
public BranchGroup createSceneGraph (SimpleUniverse su)
{
Transform3D xform3DMain;
Transform3D xform3D = new Transform3D();
xform3D.setScale(sceneScale);
xformgrpScale.setTransform(xform3D);
bgrpRoot.addChild(xformgrpScale);
Color3f bgCol = new Color3f(0.0f, 0.0f, 0.0f);
Background bgMain = new Background(bgCol);
bgMain.setApplicationBounds(bounds);
xformgrpScale.addChild(bgMain);
bgrpRoot.compile();
return bgrpRoot;
}
/*
I know that some people have wondered how to use Starfire's 3DS loader,
so here's a snippet
of code to show you how I've done it. I use the terrain in a branchgroup
of its own so that
I can use pickray to get intersection coords for terrain following...and
it works! :)
public BranchGroup createTerrainGraph (SimpleUniverse su)
{
BranchGroup terrainBG = new BranchGroup();
Transform3D xform3Dterrain = new Transform3D();
TransformGroup xformgrpScaleTerrain = new TransformGroup();
xform3Dterrain.setScale(sceneScale);
xformgrpScaleTerrain.setTransform(xform3Dterrain);
terrainBG.addChild(xformgrpScaleTerrain);
Inspector3DS terrain = new Inspector3DS(modelPath[pathToUse] +
"terrain_latest.3ds");//<--String path + filename
//terrain.setTextureLightingOn(); //<-- when commented out, the
geometry becomes "self illuminating"
terrain.parseIt();
TransformGroup xformTerrain = terrain.getModel();
xformgrpScaleTerrain.addChild(xformTerrain);
terrainBG.compile();
return terrainBG;
}
*/
public void init()
{
setLayout(new BorderLayout());
GraphicsConfiguration gConfig =
SimpleUniverse.getPreferredConfiguration();
DrawOnCanvas3D canvas3D = new DrawOnCanvas3D(gConfig);
add ("Center", canvas3D);
su = new SimpleUniverse(canvas3D);
su.getViewingPlatform().setNominalViewingTransform();
su.getViewer().getView().setBackClipDistance(500.0);
su.getViewer().getView().setFieldOfView(Math.toRadians(60));
//xgrpView = su.getViewingPlatform().getViewPlatformTransform();
BranchGroup mainScene = createSceneGraph(su);
su.addBranchGraph(mainScene);
//see public BranchGroup createTerrainGraph (SimpleUniverse su) above
//terrainScene = createTerrainGraph(su);
//su.addBranchGraph(terrainScene);
OrbitBehavior orbit = new OrbitBehavior(canvas3D);
orbit.setSchedulingBounds(new BoundingSphere(new Point3d(0.0, 1.0,
0.0), Double.POSITIVE_INFINITY));
su.getViewingPlatform().setViewPlatformBehavior(orbit);
}
public void destroy()
{
su.cleanup();
}
public static void main(String[] args)
{
new MainFrame(new AH-MFD-3D(), width, height);
}
public void say(Object o)
{
System.out.println(o);
}
}
// this class overrides canvas3d so that I can draw on the canvas3d by
making use
// of the postSwap() callback.
// I used to do it using a behavior, but I took that out in favour of this
method.
// The way I've done it here, I've managed to get rid of the flickering of the
// entire scene. Now only the bufferedimage that gets drawn onto the canvas,
// i.e. my overlay stuff, flickers. why, i dunno...
class DrawOnCanvas3D extends Canvas3D
{
private GraphicsContext3D gc3d;
private J3DGraphics2D j3dg2d;
private int width = 512, height = width;
private BufferedImage bufim;
private Graphics2D g2d;
public DrawOnCanvas3D(GraphicsConfiguration gc)
{
super(gc);
bufim = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
g2d = bufim.createGraphics();
j3dg2d = this.getGraphics2D();
gc3d = this.getGraphicsContext3D();
}
public void postSwap()
{
//I tried using the following commented line, but to no avail.
//I've had it in many different places, same result (nothing). What
does it do, btw?
//Toolkit.getDefaultToolkit().sync();
gc3d.setBufferOverride(false);
this.setDoubleBufferEnable(false);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR,
0.0f));
g2d.setColor(Color.BLACK);
g2d.fillRect(0,0,width,height);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
1.0f));
g2d.setColor(Color.WHITE);
/*---->
g2d.drawingStuffHappensHere(...)
<----*/
j3dg2d.flush(true);//<--with or without, makes no diff
j3dg2d.drawAndFlushImage(bufim, 0, 0, this);
this.setDoubleBufferEnable(true);
}
}
===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA3D-INTEREST". For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".