Advertisement
alexarcan

lab5_CG

Mar 25th, 2016
313
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.54 KB | None | 0 0
  1. package cg.bouncycube;
  2.  
  3. import android.app.Activity;
  4. import android.opengl.GLSurfaceView;
  5. import android.os.Bundle;
  6. import android.view.WindowManager;
  7.  
  8. public class BouncyCubeActivity extends Activity
  9. {
  10.     public void onCreate(Bundle savedInstanceState)
  11.     {
  12.         super.onCreate(savedInstanceState);
  13.         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
  14.                 WindowManager.LayoutParams.FLAG_FULLSCREEN);
  15.         GLSurfaceView view = new GLSurfaceView(this);
  16.         view.setRenderer(new CubeRenderer());
  17.         setContentView(view);
  18.     }
  19. }
  20.  
  21.  
  22. //-----
  23.  
  24. package cg.bouncycube;
  25. import java.nio.ByteBuffer;
  26. import java.nio.ByteOrder;
  27. import java.nio.FloatBuffer;
  28. import javax.microedition.khronos.opengles.GL10;
  29. import javax.microedition.khronos.opengles.GL11;
  30.  
  31. class Cube
  32. {
  33.     private FloatBuffer mFVertexBuffer;
  34.     private ByteBuffer mColorBuffer;
  35.     private ByteBuffer mTFan1;
  36.     private ByteBuffer mTFan2;
  37.     private FloatBuffer mNormalBuffer;
  38.     public Cube()
  39.     {
  40.         float[] normals =
  41.  
  42.                 {
  43.  
  44.                         -1.0f/(float)Math.sqrt(3), 1.0f/(float)Math.sqrt(3), 1.0f/(float)Math.sqrt(3),
  45.  
  46.                         1.0f/(float)Math.sqrt(3), 1.0f/(float)Math.sqrt(3), 1.0f/(float)Math.sqrt(3),
  47.  
  48.                         1.0f/(float)Math.sqrt(3), -1.0f/(float)Math.sqrt(3), 1.0f/(float)Math.sqrt(3),
  49.  
  50.                         -1.0f/(float)Math.sqrt(3), -1.0f/(float)Math.sqrt(3), 1.0f/(float)Math.sqrt(3),
  51.  
  52.                         -1.0f/(float)Math.sqrt(3), 1.0f/(float)Math.sqrt(3), -1.0f/(float)Math.sqrt(3),
  53.  
  54.                         1.0f/(float)Math.sqrt(3), 1.0f/(float)Math.sqrt(3), -1.0f/(float)Math.sqrt(3),
  55.  
  56.                         1.0f/(float)Math.sqrt(3), -1.0f/(float)Math.sqrt(3), -1.0f/(float)Math.sqrt(3),
  57.  
  58.                         -1.0f/(float)Math.sqrt(3), -1.0f/(float)Math.sqrt(3), -1.0f/(float)Math.sqrt(3)
  59.  
  60.                 };
  61.         float vertices[] =
  62.                 {
  63.                         -1.0f, 1.0f, 1.0f,
  64.                         1.0f, 1.0f, 1.0f,
  65.                         1.0f, -1.0f, 1.0f,
  66.                         -1.0f, -1.0f, 1.0f,
  67.                         -1.0f, 1.0f, -1.0f,
  68.                         1.0f, 1.0f, -1.0f,
  69.                         1.0f, -1.0f, -1.0f,
  70.                         -1.0f, -1.0f, -1.0f
  71.                 };
  72.         byte maxColor=(byte)255;
  73.         byte colors[] =
  74.                 {
  75.                         maxColor, 0, 0, maxColor,
  76.                         maxColor, 0, 0, maxColor,
  77.                         maxColor, 0, 0, maxColor,
  78.                         maxColor, 0, 0, maxColor,
  79.                         0, 0, 0, maxColor,
  80.                         0, 0, 0, maxColor,
  81.                         0, 0, 0, maxColor,
  82.                         0, 0, 0, maxColor,
  83.                 };
  84.         byte tFan1[] =
  85.                 {
  86.                         1,0,3,
  87.                         1,3,2,
  88.                         1,2,6,
  89.                         1,6,5,
  90.                         1,5,4,
  91.                         1,4,0
  92.                 };
  93.         byte tFan2[] =
  94.                 {
  95.                         7,4,5,
  96.                         7,5,6,
  97.                         7,6,2,
  98.                         7,2,3,
  99.                         7,3,0,
  100.                         7,0,4
  101.                 };
  102.         ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
  103.         vbb.order(ByteOrder.nativeOrder());
  104.         mFVertexBuffer = vbb.asFloatBuffer();
  105.         mFVertexBuffer.put(vertices);
  106.         mFVertexBuffer.position(0);
  107.         mColorBuffer = ByteBuffer.allocateDirect(colors.length);
  108.         mColorBuffer.put(colors);
  109.         mColorBuffer.position(0);
  110.         mTFan1 = ByteBuffer.allocateDirect(tFan1.length);
  111.         mTFan1.put(tFan1);
  112.         mTFan1.position(0);
  113.         mTFan2 = ByteBuffer.allocateDirect(tFan2.length);
  114.         mTFan2.put(tFan2);
  115.         mTFan2.position(0);
  116.  
  117.         ByteBuffer nbb = ByteBuffer.allocateDirect(normals.length * 4);
  118.  
  119.         nbb.order(ByteOrder.nativeOrder());
  120.  
  121.         mNormalBuffer = nbb.asFloatBuffer();
  122.  
  123.         mNormalBuffer.put(normals);
  124.  
  125.         mNormalBuffer.position(0);
  126.     }
  127.  
  128.     public void draw(GL10 gl)
  129.     {
  130.         gl.glVertexPointer(3, GL11.GL_FLOAT, 0, mFVertexBuffer);
  131.         gl.glColorPointer(4, GL11.GL_UNSIGNED_BYTE, 0, mColorBuffer);
  132.         gl.glDrawElements( gl.GL_TRIANGLE_FAN, 6 * 3, gl.GL_UNSIGNED_BYTE, mTFan1);
  133.         gl.glDrawElements( gl.GL_TRIANGLE_FAN, 6 * 3, gl.GL_UNSIGNED_BYTE, mTFan2);
  134.  
  135.         gl.glNormalPointer(GL10.GL_FLOAT, 0, mNormalBuffer);
  136.         gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
  137.     }
  138. }
  139.  
  140. //-----
  141.  
  142. package cg.bouncycube;
  143. import javax.microedition.khronos.egl.EGLConfig;
  144. import javax.microedition.khronos.opengles.GL10;
  145. import android.opengl.GLSurfaceView;
  146. import java.lang.Math;
  147. import java.nio.ByteBuffer;
  148. import java.nio.ByteOrder;
  149. import java.nio.FloatBuffer;
  150.  
  151. class CubeRenderer implements GLSurfaceView.Renderer
  152. {
  153.     private Cube mCube;
  154.     private float mTransY;
  155.     private float mAngle;
  156.     public final static int SS_SUNLIGHT = GL10.GL_LIGHT0;
  157.  
  158.     public CubeRenderer()
  159.     {
  160.         mCube = new Cube();
  161.     }
  162.     public void onDrawFrame(GL10 gl)
  163.     {
  164.         gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
  165.         gl.glMatrixMode(GL10.GL_MODELVIEW);
  166.         gl.glLoadIdentity();
  167.         gl.glTranslatef(0.0f, (float) Math.sin(mTransY), -7.0f);
  168.         mTransY += 0.075f;
  169.         gl.glRotatef(mAngle, 0.0f, 1.0f, 0.0f);
  170.         gl.glRotatef(mAngle, 1.0f, 0.0f, 0.0f);
  171.         mAngle += 0.4;
  172.         gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
  173.         gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
  174.         mCube.draw(gl);
  175.     }
  176.  
  177.     protected static FloatBuffer makeFloatBuffer(float[] array)
  178.  
  179.     {
  180.  
  181.         ByteBuffer bb = ByteBuffer.allocateDirect(array.length*4);
  182.  
  183.  
  184.         bb.order(ByteOrder.nativeOrder());
  185.  
  186.         FloatBuffer fb = bb.asFloatBuffer();
  187.  
  188.         fb.put(array);
  189.  
  190.         fb.position(0);
  191.  
  192.         return fb;
  193.  
  194.     }
  195.  
  196.     public void initLighting(GL10 gl){
  197.         float[] green = {0.0f, 1.0f, 0.0f, 1.0f};
  198.         //float[] position = {0.0f, 5.0f, 0.0f, 1.0f};
  199.         float[] position = {10.0f,0.0f,3.0f,1.0f};
  200.         float[] red = {1.0f, 0.0f, 0.0f, 1.0f};
  201.         float[] blue = {0.0f,0.0f,1.0f,1.0f};
  202.         float[] yellow = {1.0f,1.0f,0.0f,1.0f};
  203.         gl.glLightfv(SS_SUNLIGHT, GL10.GL_POSITION, makeFloatBuffer(position));
  204.        // gl.glLightfv(SS_SUNLIGHT, GL10.GL_DIFFUSE, makeFloatBuffer(green));
  205.         //gl.glLightfv(SS_SUNLIGHT, GL10.GL_SPECULAR, makeFloatBuffer(red));
  206.         gl.glLightfv(SS_SUNLIGHT, GL10.GL_AMBIENT, makeFloatBuffer(blue));
  207.         gl.glShadeModel(GL10.GL_SMOOTH);
  208.         gl.glEnable(GL10.GL_LIGHTING);
  209.         gl.glEnable(SS_SUNLIGHT);
  210.         gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_DIFFUSE, makeFloatBuffer(red));
  211.         gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_SPECULAR, makeFloatBuffer(red));
  212.        // gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_AMBIENT, makeFloatBuffer(blue));
  213.         gl.glMaterialf(GL10.GL_FRONT_AND_BACK, GL10.GL_SHININESS, 0);
  214.         //gl.glMaterialfv(GL10.GL_FRONT_AND_BACK, GL10.GL_EMISSION, makeFloatBuffer(yellow));
  215.         gl.glLightf(SS_SUNLIGHT, GL10.GL_LINEAR_ATTENUATION, 0.025f);
  216.  
  217.         float[] colorVector={0.2f, 0.2f, 0.2f, 1.0f};
  218.         gl.glLightModelfv(GL10.GL_LIGHT_MODEL_AMBIENT, makeFloatBuffer(colorVector));
  219.  
  220.         float direction[]={1.0f,0.0f,0.0f};
  221.         gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPOT_DIRECTION, makeFloatBuffer(direction));
  222.  
  223.     }
  224.  
  225.     public void onSurfaceChanged(GL10 gl, int width, int height)
  226.     {
  227.         gl.glViewport(0, 0, width, height);
  228.         float aspectRatio = (float)width/(float)height;
  229.         float zNear = 0.1f;
  230.         float zFar = 1000;
  231.         float fieldOfView = 30.0f/57.3f;
  232.         float size = zNear * (float)(Math.tan((double)(fieldOfView/2.0f)));
  233.         gl.glEnable(GL10.GL_NORMALIZE);
  234.         gl.glMatrixMode(GL10.GL_PROJECTION);
  235.         gl.glFrustumf(-size, size, -size/aspectRatio, size/aspectRatio, zNear, zFar);
  236.         gl.glMatrixMode(GL10.GL_MODELVIEW);
  237.  
  238.         gl.glDepthMask(false);
  239.         initLighting(gl);
  240.     }
  241.  
  242.     public void onSurfaceCreated(GL10 gl, EGLConfig config)
  243.     {
  244.         gl.glDisable(GL10.GL_DITHER);
  245.         gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,
  246.                 GL10.GL_FASTEST);
  247.         gl.glClearColor(255,255,255,255);
  248.         gl.glEnable(GL10.GL_CULL_FACE);
  249.         gl.glShadeModel(GL10.GL_SMOOTH);
  250.         gl.glEnable(GL10.GL_DEPTH_TEST);
  251.     }
  252. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement