Android Open Source - 3DSModel-AR Main Activity






From Project

Back to project page 3DSModel-AR.

License

The source code is released under:

GNU General Public License

If you think the Android project 3DSModel-AR listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.example.dsmodel_ar;
//  ww  w. ja  v  a2  s. c o  m
import java.io.InputStream;
import java.lang.reflect.Field;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.app.Activity;
import android.graphics.PixelFormat;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.WindowManager.LayoutParams;

import com.threed.jpct.Camera;
import com.threed.jpct.FrameBuffer;
import com.threed.jpct.Light;
import com.threed.jpct.Loader;
import com.threed.jpct.Logger;
import com.threed.jpct.Matrix;
import com.threed.jpct.Object3D;
import com.threed.jpct.SimpleVector;
import com.threed.jpct.Texture;
import com.threed.jpct.TextureManager;
import com.threed.jpct.World;
import com.threed.jpct.util.BitmapHelper;
import com.threed.jpct.util.MemoryHelper;

public class MainActivity extends Activity {

  // Used to handle pause and resume...
    private static MainActivity master = null;

    private GLSurfaceView mGLView;
    private MyRenderer renderer = null;
    private FrameBuffer fb = null;
    private World world = null;

    private float touchTurn = 0;
    private float touchTurnUp = 0;

    private float xpos = -1;
    private float ypos = -1;

    private Object3D cube = null;
    private int fps = 0;

    private Light sun = null;

    protected void onCreate(Bundle savedInstanceState) {

      Logger.log("onCreate");

      if (master != null) {
        copy(master);
      }

      super.onCreate(savedInstanceState);
      mGLView = new GLSurfaceView(this);
      
      mGLView.setEGLConfigChooser( 8, 8, 8, 8, 16, 0 );
      mGLView.getHolder().setFormat( PixelFormat.TRANSLUCENT );
      
      renderer = new MyRenderer();
      mGLView.setRenderer(renderer);
      setContentView(mGLView);
      
      CameraView cameraView = new CameraView( this );
          addContentView( cameraView, new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT ) );
    }

    @Override
    protected void onPause() {
      super.onPause();
      mGLView.onPause();
    }

    @Override
    protected void onResume() {
      super.onResume();
      mGLView.onResume();
    }

    @Override
    protected void onStop() {
      super.onStop();
    }

    private void copy(Object src) {
      try {
        Logger.log("Copying data from master Activity!");
        Field[] fs = src.getClass().getDeclaredFields();
        for (Field f : fs) {
          f.setAccessible(true);
          f.set(this, f.get(src));
        }
      } catch (Exception e) {
        throw new RuntimeException(e);
      }
    }

    public boolean onTouchEvent(MotionEvent me) {

      if (me.getAction() == MotionEvent.ACTION_DOWN) {
        xpos = me.getX();
        ypos = me.getY();
        return true;
      }

      if (me.getAction() == MotionEvent.ACTION_UP) {
        xpos = -1;
        ypos = -1;
        touchTurn = 0;
        touchTurnUp = 0;
        return true;
      }

      if (me.getAction() == MotionEvent.ACTION_MOVE) {
        float xd = me.getX() - xpos;
        float yd = me.getY() - ypos;

        xpos = me.getX();
        ypos = me.getY();

        touchTurn = xd / -100f;
        touchTurnUp = yd / -100f;
        return true;
      }

      try {
        Thread.sleep(15);
      } catch (Exception e) {
        // No need for this...
      }

      return super.onTouchEvent(me);
    }

    protected boolean isFullscreenOpaque() {
      return true;
    }

    class MyRenderer implements GLSurfaceView.Renderer {

      private long time = System.currentTimeMillis();

      public MyRenderer() {
      }

      public void onSurfaceChanged(GL10 gl, int w, int h) {
        if (fb != null) {
          fb.dispose();
        }
        fb = new FrameBuffer(gl, w, h);

        if (master == null) {

          world = new World();
          world.setAmbientLight(20, 20, 20);

          sun = new Light(world);
          sun.setIntensity(250, 250, 250);

          Texture texture = new Texture(BitmapHelper.rescale(BitmapHelper.convert(getResources().getDrawable(R.drawable.monster)), 512, 512));
          TextureManager.getInstance().addTexture("texture", texture);

          cube = loadModel("res/raw/monster.3ds", (float) 0.5);
          cube.setTexture("texture");
          cube.build();

          world.addObject(cube);

          Camera cam = world.getCamera();
          cam.moveCamera(Camera.CAMERA_MOVEOUT, 50);
          cam.lookAt(cube.getTransformedCenter());

          SimpleVector sv = new SimpleVector();
          sv.set(cube.getTransformedCenter());
          sv.y -= 100;
          sv.z -= 100;
          sun.setPosition(sv);
          MemoryHelper.compact();

          if (master == null) {
            Logger.log("Saving master Activity!");
            master = MainActivity.this;
          }
        }
      }

      public void onSurfaceCreated(GL10 gl, EGLConfig config) {
      }

      public void onDrawFrame(GL10 gl) {
        if (touchTurn != 0) {
          cube.rotateY(touchTurn);
          touchTurn = 0;
        }

        if (touchTurnUp != 0) {
          cube.rotateX(touchTurnUp);
          touchTurnUp = 0;
        }

        fb.clear();
        world.renderScene(fb);
        world.draw(fb);
        fb.display();

        if (System.currentTimeMillis() - time >= 1000) {
          Logger.log(fps + "fps");
          fps = 0;
          time = System.currentTimeMillis();
        }
        fps++;
      }
      
      private Object3D loadModel(String filename, float scale){
        InputStream stream = getResources().openRawResource(R.raw.monster);
            Object3D[] model = Loader.load3DS(stream, scale);
            Object3D o3d = new Object3D(0);
            Object3D temp = null;
            for (int i = 0; i < model.length; i++) {
                temp = model[i];
                temp.setCenter(SimpleVector.ORIGIN);
                temp.rotateX((float)( -.5*Math.PI));
                temp.rotateMesh();
                temp.setRotationMatrix(new Matrix());
                o3d = Object3D.mergeObjects(o3d, temp);
                o3d.build();
            }
            return o3d;
        }
    }

}




Java Source Code List

com.example.dsmodel_ar.CameraView.java
com.example.dsmodel_ar.MainActivity.java