/*
* Copyright (C) 2006 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.opengl;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.ShortBuffer;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;
import javax.microedition.khronos.opengles.*;
class MaterialIndices {
private Material material = null;
private ShortBuffer indexBuffer = null;
public MaterialIndices(Material material, ShortBuffer indexBuffer) {
this.material = material;
this.indexBuffer = indexBuffer;
}
public Material getMaterial() {
return material;
}
public ShortBuffer getIndexBuffer() {
return indexBuffer;
}
}
/**
* {@hide}
*/
public class Group {
private Object3D parent;
private String name;
private List<MaterialIndices> materialIndices =
new ArrayList<MaterialIndices>();
public Group(Object3D parent) {
this.parent = parent;
}
public String getName() {
return name;
}
public void load(DataInputStream dis) throws IOException {
dis.readInt(); // name length
this.name = dis.readUTF();
int numMaterials = dis.readInt();
for (int i = 0; i < numMaterials; i++) {
dis.readInt(); // material name length
String matName = dis.readUTF();
Material material = parent.getMaterial(matName);
int numIndices = dis.readInt();
byte[] indicesBytes = new byte[numIndices * 2];
dis.readFully(indicesBytes);
// Swap bytes from network to native order if necessary
if (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN) {
int idx = 0;
for (int j = 0; j < numIndices; j++) {
byte b0 = indicesBytes[idx];
byte b1 = indicesBytes[idx + 1];
indicesBytes[idx] = b1;
indicesBytes[idx + 1] = b0;
idx += 2;
}
}
ByteBuffer ibb = ByteBuffer.allocateDirect(2*numIndices);
ibb.order(ByteOrder.nativeOrder());
ibb.put(indicesBytes);
ibb.position(0);
ShortBuffer sb = ibb.asShortBuffer();
materialIndices.add(new MaterialIndices(material, sb));
}
}
public int getNumTriangles() {
int numTriangles = 0;
Iterator<MaterialIndices> iter = materialIndices.iterator();
while (iter.hasNext()) {
MaterialIndices matIdx = iter.next();
ShortBuffer indexBuffer = matIdx.getIndexBuffer();
numTriangles += indexBuffer.capacity()/3;
}
return numTriangles;
}
public void draw(GL10 gl) {
gl.glDisableClientState(gl.GL_COLOR_ARRAY);
gl.glVertexPointer(3, gl.GL_FIXED, 0, parent.getVertexBuffer());
gl.glEnableClientState(gl.GL_VERTEX_ARRAY);
gl.glNormalPointer(gl.GL_FIXED, 0, parent.getNormalBuffer());
gl.glEnableClientState(gl.GL_NORMAL_ARRAY);
if (parent.hasTexcoords()) {
gl.glTexCoordPointer(2, gl.GL_FIXED, 0, parent.getTexcoordBuffer());
gl.glEnableClientState(gl.GL_TEXTURE_COORD_ARRAY);
gl.glEnable(gl.GL_TEXTURE_2D);
} else {
gl.glDisable(gl.GL_TEXTURE_2D);
}
Iterator<MaterialIndices> iter = materialIndices.iterator();
while (iter.hasNext()) {
MaterialIndices matIdx = iter.next();
ShortBuffer indexBuffer = matIdx.getIndexBuffer();
Material mat = matIdx.getMaterial();
mat.setMaterialParameters(gl);
if (parent.hasTexcoords() && mat.getMap_Kd().length() > 0) {
Texture texture = parent.getTexture(mat.getMap_Kd());
texture.setTextureParameters(gl);
}
gl.glDrawElements(gl.GL_TRIANGLES,
indexBuffer.capacity(),
gl.GL_UNSIGNED_SHORT,
indexBuffer);
}
}
public String toString() {
return "Group[" +
"name=" + name +
"]";
}
}
|