private static final Point3f[] mVertices ={
new Point3f(-1.0f,-1.0f, 0.0f),
new Point3f( 1.0f, 1.0f, 0.0f),
new Point3f( 1.0f,-1.0f, 0.0f),
new Point3f(-1.0f,-1.0f, 0.0f),
new Point3f(-1.0f, 1.0f, 0.0f),
new Point3f( 1.0f, 1.0f, 0.0f)
};
private TriangleArray mGeometry;
public SimpleF4(){
int i;
mGeometry = new TriangleArray(6,TriangleArray.COORDINATES |
TriangleArray.NORMALS | TriangleArray.COLOR_3);
mGeometry.setCoordinates(0,mVertices);
for(i = 0; i < 3; ++i){
mGeometry.setColor(i,new Color3b((byte)255,(byte)192,(byte)128));
}
for(i = 3; i < 6; ++i){
mGeometry.setColor(i,new Color3b((byte)128,(byte)192,(byte)255));
}
Vector3f normal = new Vector3f(0.0f,0.0f, -1.0f);
for (i = 0; i < 6; ++i){
mGeometry.setNormal(i,normal);
}
this.setGeometry(mGeometry);
}
}
boolean mInited = false;
Color mBgColor = new Color(36,120,120);
Canvas3D mCanvas = null;
Thread mThread = null;
boolean mLoop=false;
long mCycle = 6000;
long mTick = 0;
long mTimeOld;
float mFInterval = 1.0f / 2000.0f;
float m_fX=0.0f, m_fY=0.0f, m_fZ=1.5f;
SimpleUniverse mUniv;
Transform3D mTrans1 = new Transform3D();
Transform3D mTrans2 = new Transform3D();
SimpleF4 mF4 = null;
public void init() {
setLayout(null);
mCanvas = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
add(mCanvas);
Dimension d = this.getSize();
mCanvas.setBounds(0,0,d.width,d.height);
mCanvas.stopRenderer();
mCanvas.setDoubleBufferEnable(true);
createSceneGraph();
setupView();
mTimeOld = System.currentTimeMillis();
mInited = true;
}
public void destroy(){
mLoop = false;
mUniv.removeAllLocales();
}
private void setupView(){
Transform3D pers = new Transform3D();
Transform3D lookat = new Transform3D();
mUniv = new SimpleUniverse(mCanvas);
lookat.set(Transform3D.ZERO);
pers.set(Transform3D.ZERO);
lookat.lookAt(new Point3d(0.0,0.0,0.0), new Point3d(0.0,0.0,1.0), new Vector3d(0.0,-1.0,0.0));
pers.perspective(Math.toRadians(90.0), 1.0, 0.01, 100.0);
mCanvas.getView().setWindowEyepointPolicy(View.RELATIVE_TO_COEXISTENCE);
mCanvas.getView().setProjectionPolicy(View.PERSPECTIVE_PROJECTION);
mCanvas.getView().setCompatibilityModeEnable(true);
mCanvas.getView().setVpcToEc(lookat);
mCanvas.setMonoscopicViewPolicy(View.LEFT_EYE_VIEW);
mCanvas.getView().setLeftProjection(pers);
mCanvas.getView().setScreenScalePolicy(View.SCALE_SCREEN_SIZE);
}
public void createSceneGraph() {
Material mat;
Light lit1;
mat = new Material();
mat.setAmbientColor(0.5f, 0.5f, 0.5f);
mat.setLightingEnable(true);
Appearance app = new Appearance();
app.setMaterial(mat);
mCanvas.getGraphicsContext3D().setAppearance(app);
mF4 = new SimpleF4();
mF4.setAppearance(app);
Color3f lColor1 = new Color3f(1.0f,1.0f,1.0f);
Vector3f lDir1 = new Vector3f(0.0f, 1.0f, 1.0f);
lit1 = new DirectionalLight(lColor1, lDir1);
mCanvas.getGraphicsContext3D().addLight(lit1);
mCanvas.getGraphicsContext3D().addLight(new AmbientLight(true, new Color3f(0.7f, 0.7f, 0.7f)));
}
public void render(){
GraphicsContext3D gc;
double angle;
angle = (float)mTick * mFInterval;
angle *= Math.PI * 2.0;
gc = mCanvas.getGraphicsContext3D();
mTrans1.set(Transform3D.ZERO);
mTrans1.setTranslation(new Vector3f(m_fX,-m_fY,m_fZ));
mTrans2.set(Transform3D.ZERO);
mTrans2.rotY(angle);
mTrans1.mul(mTrans2);
gc.clear();
gc.setModelTransform(mTrans1);
gc.draw(mF4);
mCanvas.swap();
}
public void start() {
mLoop = true;
if(mThread == null) {
mThread = new Thread(this);
mThread.start();
}else{
if (!mThread.isAlive()){
mThread = new Thread(this);
mThread.start();
}
}
}
public void stop() {
mLoop = false;
}
public void run(){
long current,elapsed;
while(mLoop){
current = System.currentTimeMillis();
elapsed = current - mTimeOld;
if ( elapsed > 15){
mTimeOld = current;
mTick += elapsed;
mTick %= mCycle;
if (mInited){
render();
}
}
mThread.yield();
}
}
}