156 lines
4.7 KiB
Java
156 lines
4.7 KiB
Java
/*
|
|
* 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 +
|
|
"]";
|
|
}
|
|
}
|