コード例 #1
0
  public ModelView(edu.union.graphics.Model m, Context c) {
    super(c);
    setFocusable(true);
    this.m = m;
    context = new OpenGLContext(OpenGLContext.DEPTH_BUFFER);

    GL10 gl = (GL10) context.getGL();
    gl.glShadeModel(GL10.GL_SMOOTH);
    gl.glClearColor(1, 1, 1, 1);

    gl.glClearDepthf(1.0f);
    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glDepthFunc(GL10.GL_LEQUAL);

    gl.glEnable(GL10.GL_LIGHTING);
    gl.glEnable(GL10.GL_LIGHT0);
    gl.glEnable(GL10.GL_NORMALIZE);

    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbient, 0);
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuse, 0);
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, pos, 0);

    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, matAmbient, 0);
    gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, matDiffuse, 0);

    // Pretty perspective
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
    gl.glEnable(GL10.GL_CULL_FACE);
    // Turn on these for textures.

    ByteBuffer bb;
    vertices = new IntBuffer[m.getFrameCount()];
    for (int i = 0; i < m.getFrameCount(); i++) {
      Mesh ms = m.getFrame(i).getMesh();
      verts = ms.getFaceCount() * 3;

      // bb = ByteBuffer.allocateDirect(msh.getVertexCount()*3*4);
      bb = ByteBuffer.allocateDirect(verts * 3 * 4);
      bb.order(ByteOrder.nativeOrder());
      vertices[i] = bb.asIntBuffer();

      for (int f = 0; f < ms.getFaceCount(); f++) {
        int[] face = ms.getFace(f);
        for (int j = 0; j < 3; j++) {
          float[] v = ms.getVertexf(face[j]);
          for (int k = 0; k < 3; k++) {
            vertices[i].put(FixedPointUtils.toFixed(v[k]));
          }
        }
      }
      vertices[i].position(0);
    }

    Mesh msh = m.getFrame(0).getMesh();
    if (msh.getTextureFile() != null) {
      gl.glEnable(GL10.GL_TEXTURE_2D);
      tex = loadTexture(gl, BitmapFactory.decodeResource(c.getResources(), R.drawable.skin));
    }

    // bb = ByteBuffer.allocateDirect(msh.getVertexCount()*3*4);
    bb = ByteBuffer.allocateDirect(verts * 3 * 4);
    bb.order(ByteOrder.nativeOrder());
    normals = bb.asIntBuffer();

    bb = ByteBuffer.allocateDirect(verts * 2 * 4);
    bb.order(ByteOrder.nativeOrder());
    texCoords = bb.asIntBuffer();

    bb = ByteBuffer.allocateDirect(verts * 2);
    bb.order(ByteOrder.nativeOrder());
    indices = bb.asShortBuffer();

    short ct = 0;
    for (int i = 0; i < msh.getFaceCount(); i++) {
      int[] face_n = msh.getFaceNormals(i);
      int[] face_tx = msh.getFaceTextures(i);
      for (int j = 0; j < 3; j++) {
        float[] n = msh.getNormalf(face_n[j]);
        for (int k = 0; k < 3; k++) {
          normals.put(FixedPointUtils.toFixed(n[k]));
        }
        float[] tx = msh.getTextureCoordinatef(face_tx[j]);
        texCoords.put(FixedPointUtils.toFixed(tx[0]));
        texCoords.put(FixedPointUtils.toFixed(tx[1]));
        indices.put(ct++);
      }
    }
    normals.position(0);
    texCoords.position(0);
    indices.position(0);

    animator = new ViewAnimator(this, 5);
  }