1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.example.android.apis.graphics.kube;
18 
19 import java.nio.ByteBuffer;
20 import java.nio.ByteOrder;
21 import java.nio.IntBuffer;
22 import java.nio.ShortBuffer;
23 import java.util.Iterator;
24 import java.util.ArrayList;
25 
26 import javax.microedition.khronos.opengles.GL10;
27 
28 public class GLWorld {
29 
addShape(GLShape shape)30 	public void addShape(GLShape shape) {
31 		mShapeList.add(shape);
32 		mIndexCount += shape.getIndexCount();
33 	}
34 
generate()35 	public void generate() {
36 	    ByteBuffer bb = ByteBuffer.allocateDirect(mVertexList.size()*4*4);
37 	    bb.order(ByteOrder.nativeOrder());
38 		mColorBuffer = bb.asIntBuffer();
39 
40 	    bb = ByteBuffer.allocateDirect(mVertexList.size()*4*3);
41 	    bb.order(ByteOrder.nativeOrder());
42 	    mVertexBuffer = bb.asIntBuffer();
43 
44 	    bb = ByteBuffer.allocateDirect(mIndexCount*2);
45 	    bb.order(ByteOrder.nativeOrder());
46 	    mIndexBuffer = bb.asShortBuffer();
47 
48 		Iterator<GLVertex> iter2 = mVertexList.iterator();
49 		while (iter2.hasNext()) {
50 			GLVertex vertex = iter2.next();
51 			vertex.put(mVertexBuffer, mColorBuffer);
52 		}
53 
54 		Iterator<GLShape> iter3 = mShapeList.iterator();
55 		while (iter3.hasNext()) {
56 			GLShape shape = iter3.next();
57 			shape.putIndices(mIndexBuffer);
58 		}
59 	}
60 
addVertex(float x, float y, float z)61 	public GLVertex addVertex(float x, float y, float z) {
62 		GLVertex vertex = new GLVertex(x, y, z, mVertexList.size());
63 		mVertexList.add(vertex);
64 		return vertex;
65 	}
66 
transformVertex(GLVertex vertex, M4 transform)67 	public void transformVertex(GLVertex vertex, M4 transform) {
68 		vertex.update(mVertexBuffer, transform);
69 	}
70 
71 	int count = 0;
draw(GL10 gl)72     public void draw(GL10 gl)
73     {
74 		mColorBuffer.position(0);
75 		mVertexBuffer.position(0);
76 		mIndexBuffer.position(0);
77 
78 		gl.glFrontFace(GL10.GL_CW);
79         gl.glShadeModel(GL10.GL_FLAT);
80         gl.glVertexPointer(3, GL10.GL_FIXED, 0, mVertexBuffer);
81         gl.glColorPointer(4, GL10.GL_FIXED, 0, mColorBuffer);
82         gl.glDrawElements(GL10.GL_TRIANGLES, mIndexCount, GL10.GL_UNSIGNED_SHORT, mIndexBuffer);
83         count++;
84     }
85 
toFloat(int x)86     static public float toFloat(int x) {
87     	return x/65536.0f;
88     }
89 
90 	private ArrayList<GLShape>	mShapeList = new ArrayList<GLShape>();
91 	private ArrayList<GLVertex>	mVertexList = new ArrayList<GLVertex>();
92 
93 	private int mIndexCount = 0;
94 
95     private IntBuffer   mVertexBuffer;
96     private IntBuffer   mColorBuffer;
97     private ShortBuffer mIndexBuffer;
98 }
99