19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.opengl; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.nio.ByteBuffer; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.nio.ByteOrder; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.nio.ShortBuffer; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.DataInputStream; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport javax.microedition.khronos.opengles.*; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass MaterialIndices { 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Material material = null; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ShortBuffer indexBuffer = null; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MaterialIndices(Material material, ShortBuffer indexBuffer) { 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.material = material; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.indexBuffer = indexBuffer; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Material getMaterial() { 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return material; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ShortBuffer getIndexBuffer() { 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return indexBuffer; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Group { 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Object3D parent; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String name; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private List<MaterialIndices> materialIndices = 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new ArrayList<MaterialIndices>(); 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Group(Object3D parent) { 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.parent = parent; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String getName() { 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return name; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void load(DataInputStream dis) throws IOException { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dis.readInt(); // name length 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.name = dis.readUTF(); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numMaterials = dis.readInt(); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numMaterials; i++) { 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dis.readInt(); // material name length 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String matName = dis.readUTF(); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Material material = parent.getMaterial(matName); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numIndices = dis.readInt(); 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] indicesBytes = new byte[numIndices * 2]; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dis.readFully(indicesBytes); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Swap bytes from network to native order if necessary 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN) { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int idx = 0; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0; j < numIndices; j++) { 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte b0 = indicesBytes[idx]; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte b1 = indicesBytes[idx + 1]; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indicesBytes[idx] = b1; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indicesBytes[idx + 1] = b0; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project idx += 2; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ByteBuffer ibb = ByteBuffer.allocateDirect(2*numIndices); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ibb.order(ByteOrder.nativeOrder()); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ibb.put(indicesBytes); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ibb.position(0); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ShortBuffer sb = ibb.asShortBuffer(); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project materialIndices.add(new MaterialIndices(material, sb)); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getNumTriangles() { 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numTriangles = 0; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Iterator<MaterialIndices> iter = materialIndices.iterator(); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (iter.hasNext()) { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MaterialIndices matIdx = iter.next(); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ShortBuffer indexBuffer = matIdx.getIndexBuffer(); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project numTriangles += indexBuffer.capacity()/3; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return numTriangles; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void draw(GL10 gl) { 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gl.glDisableClientState(gl.GL_COLOR_ARRAY); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gl.glVertexPointer(3, gl.GL_FIXED, 0, parent.getVertexBuffer()); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gl.glEnableClientState(gl.GL_VERTEX_ARRAY); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gl.glNormalPointer(gl.GL_FIXED, 0, parent.getNormalBuffer()); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gl.glEnableClientState(gl.GL_NORMAL_ARRAY); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parent.hasTexcoords()) { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gl.glTexCoordPointer(2, gl.GL_FIXED, 0, parent.getTexcoordBuffer()); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gl.glEnableClientState(gl.GL_TEXTURE_COORD_ARRAY); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gl.glEnable(gl.GL_TEXTURE_2D); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gl.glDisable(gl.GL_TEXTURE_2D); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Iterator<MaterialIndices> iter = materialIndices.iterator(); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (iter.hasNext()) { 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MaterialIndices matIdx = iter.next(); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ShortBuffer indexBuffer = matIdx.getIndexBuffer(); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Material mat = matIdx.getMaterial(); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mat.setMaterialParameters(gl); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parent.hasTexcoords() && mat.getMap_Kd().length() > 0) { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Texture texture = parent.getTexture(mat.getMap_Kd()); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project texture.setTextureParameters(gl); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gl.glDrawElements(gl.GL_TRIANGLES, 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indexBuffer.capacity(), 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gl.GL_UNSIGNED_SHORT, 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indexBuffer); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Group[" + 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "name=" + name + 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "]"; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 156