use of net.drewke.tdme.engine.model.TextureCoordinate in project tdme by andreasdr.
the class Tools method createGroundModel.
/**
* Creates a ground plate
* @param width
* @param depth
* @param float y
* @return ground model
*/
public static Model createGroundModel(float width, float depth, float y) {
// ground model
Model ground = new Model("ground", "ground", UpVector.Y_UP, RotationOrder.XYZ, null);
// material
Material groundMaterial = new Material("ground");
groundMaterial.getSpecularColor().set(0f, 0f, 0f, 1f);
ground.getMaterials().put("ground", groundMaterial);
// group
Group groundGroup = new Group(ground, null, "ground", "ground");
// faces entity
// ground
FacesEntity groupFacesEntityGround = new FacesEntity(groundGroup, "ground group faces entity ground");
groupFacesEntityGround.setMaterial(groundMaterial);
// faces entity
ArrayList<FacesEntity> groupFacesEntities = new ArrayList<FacesEntity>();
groupFacesEntities.add(groupFacesEntityGround);
// vertices
ArrayList<Vector3> groundVertices = new ArrayList<Vector3>();
// left, near, ground
groundVertices.add(new Vector3(-width, y, -depth));
// left, far, ground
groundVertices.add(new Vector3(-width, y, +depth));
// right far, ground
groundVertices.add(new Vector3(+width, y, +depth));
// right, near, ground
groundVertices.add(new Vector3(+width, y, -depth));
// normals
ArrayList<Vector3> groundNormals = new ArrayList<Vector3>();
// ground
groundNormals.add(new Vector3(0f, 1f, 0f));
// texture coordinates
ArrayList<TextureCoordinate> groundTextureCoordinates = new ArrayList<TextureCoordinate>();
groundTextureCoordinates.add(new TextureCoordinate(0f, 0f));
groundTextureCoordinates.add(new TextureCoordinate(0f, 1f));
groundTextureCoordinates.add(new TextureCoordinate(1f, 1f));
groundTextureCoordinates.add(new TextureCoordinate(1f, 0f));
// faces ground
ArrayList<Face> groundFacesGround = new ArrayList<Face>();
groundFacesGround.add(new Face(groundGroup, 0, 1, 2, 0, 0, 0, 0, 1, 2));
groundFacesGround.add(new Face(groundGroup, 2, 3, 0, 0, 0, 0, 2, 3, 0));
// set up faces entity
groupFacesEntityGround.setFaces(groundFacesGround);
// setup ground group
groundGroup.setVertices(groundVertices);
groundGroup.setNormals(groundNormals);
groundGroup.setTextureCoordinates(groundTextureCoordinates);
groundGroup.setFacesEntities(groupFacesEntities);
// register group
ground.getGroups().put("ground", groundGroup);
ground.getSubGroups().put("ground", groundGroup);
// prepare for indexed rendering
ModelHelper.prepareForIndexedRendering(ground);
//
return ground;
}
use of net.drewke.tdme.engine.model.TextureCoordinate in project tdme by andreasdr.
the class DAEReader method readGeometry.
/**
* Reads a geometry
* @param authoring tools
* @param path name
* @param model
* @param group
* @param xml root
* @param xml node id
* @param material symbols
* @throws Exception
*/
public static void readGeometry(AuthoringTool authoringTool, String pathName, Model model, Group group, Element xmlRoot, String xmlNodeId, HashMap<String, String> materialSymbols) throws Exception {
StringTokenizer t;
//
FacesEntity facesEntity = null;
ArrayList<FacesEntity> facesEntities = new ArrayList<FacesEntity>(Arrays.asList(group.getFacesEntities()));
int verticesOffset = group.getVertices().length;
ArrayList<Vector3> vertices = new ArrayList<Vector3>(Arrays.asList(group.getVertices()));
int normalsOffset = group.getNormals().length;
ArrayList<Vector3> normals = new ArrayList<Vector3>(Arrays.asList(group.getNormals()));
int textureCoordinatesOffset = group.getTextureCoordinates() != null ? group.getTextureCoordinates().length : 0;
ArrayList<TextureCoordinate> textureCoordinates = group.getTextureCoordinates() != null ? new ArrayList<TextureCoordinate>(Arrays.asList(group.getTextureCoordinates())) : new ArrayList<TextureCoordinate>();
Element xmlLibraryGeometries = getChildrenByTagName(xmlRoot, "library_geometries").get(0);
for (Element xmlGeometry : getChildrenByTagName(xmlLibraryGeometries, "geometry")) {
if (xmlGeometry.getAttribute("id").equals(xmlNodeId)) {
Element xmlMesh = getChildrenByTagName(xmlGeometry, "mesh").get(0);
ArrayList<Element> xmlPolygonsList = new ArrayList<Element>();
// try to read from triangles
for (Element xmlTriangesElement : getChildrenByTagName(xmlMesh, "triangles")) {
xmlPolygonsList.add(xmlTriangesElement);
}
// try to read from polylist
for (Element xmlPolyListElement : getChildrenByTagName(xmlMesh, "polylist")) {
xmlPolygonsList.add(xmlPolyListElement);
}
// try to read from polygons
for (Element xmlPolygonsElement : getChildrenByTagName(xmlMesh, "polygons")) {
xmlPolygonsList.add(xmlPolygonsElement);
}
// parse from xml polygons elements
for (Element xmlPolygons : xmlPolygonsList) {
ArrayList<Face> faces = new ArrayList<Face>();
facesEntity = new FacesEntity(group, xmlNodeId);
if (xmlPolygons.getNodeName().toLowerCase().equals("polylist")) {
t = new StringTokenizer(getChildrenByTagName(xmlPolygons, "vcount").get(0).getTextContent());
while (t.hasMoreTokens()) {
int vertexCount = Integer.parseInt(t.nextToken());
if (vertexCount != 3) {
throw new ModelFileIOException("we only support triangles in " + xmlNodeId);
}
}
}
// parse triangles
int xmlInputs = -1;
int xmlVerticesOffset = -1;
String xmlVerticesSource = null;
int xmlNormalsOffset = -1;
String xmlNormalsSource = null;
int xmlTexCoordOffset = -1;
String xmlTexCoordSource = null;
int xmlColorOffset = -1;
String xmlColorSource = null;
// material
String xmlMaterialId = xmlPolygons.getAttribute("material");
String materialSymbol = materialSymbols.get(xmlMaterialId);
if (materialSymbol != null)
xmlMaterialId = materialSymbol.substring(1);
if (xmlMaterialId != null && xmlMaterialId.length() > 0) {
Material material = model.getMaterials().get(xmlMaterialId);
if (material == null) {
// parse material as we do not have it yet
material = readMaterial(authoringTool, pathName, model, xmlRoot, xmlMaterialId);
}
// set it up
facesEntity.setMaterial(material);
}
// parse input sources
HashSet<Integer> xmlInputSet = new HashSet<Integer>();
for (Element xmlTrianglesInput : getChildrenByTagName(xmlPolygons, "input")) {
// check for vertices sources
if (xmlTrianglesInput.getAttribute("semantic").equals("VERTEX")) {
xmlVerticesOffset = Integer.parseInt(xmlTrianglesInput.getAttribute("offset"));
xmlVerticesSource = xmlTrianglesInput.getAttribute("source").substring(1);
xmlInputSet.add(xmlVerticesOffset);
} else // check for normals sources
if (xmlTrianglesInput.getAttribute("semantic").equals("NORMAL")) {
xmlNormalsOffset = Integer.parseInt(xmlTrianglesInput.getAttribute("offset"));
xmlNormalsSource = xmlTrianglesInput.getAttribute("source").substring(1);
xmlInputSet.add(xmlNormalsOffset);
}
// check for texture coordinate sources
if (xmlTrianglesInput.getAttribute("semantic").equals("TEXCOORD")) {
xmlTexCoordOffset = Integer.parseInt(xmlTrianglesInput.getAttribute("offset"));
xmlTexCoordSource = xmlTrianglesInput.getAttribute("source").substring(1);
xmlInputSet.add(xmlTexCoordOffset);
}
// check for color coordinate sources
if (xmlTrianglesInput.getAttribute("semantic").equals("COLOR")) {
xmlColorOffset = Integer.parseInt(xmlTrianglesInput.getAttribute("offset"));
xmlColorSource = xmlTrianglesInput.getAttribute("source").substring(1);
xmlInputSet.add(xmlColorOffset);
}
}
xmlInputs = xmlInputSet.size();
// get vertices source
for (Element xmlVertices : getChildrenByTagName(xmlMesh, "vertices")) {
if (xmlVertices.getAttribute("id").equals(xmlVerticesSource)) {
for (Element xmlVerticesInput : getChildrenByTagName(xmlVertices, "input")) {
if (xmlVerticesInput.getAttribute("semantic").equalsIgnoreCase("position")) {
xmlVerticesSource = xmlVerticesInput.getAttribute("source").substring(1);
} else if (xmlVerticesInput.getAttribute("semantic").equalsIgnoreCase("normal")) {
xmlNormalsSource = xmlVerticesInput.getAttribute("source").substring(1);
}
}
}
}
// check for triangles vertices sources
if (xmlVerticesSource == null) {
throw new ModelFileIOException("Could not determine triangles vertices source for '" + xmlNodeId + "'");
}
// check for triangles normals sources
if (xmlNormalsSource == null) {
throw new ModelFileIOException("Could not determine triangles normal source for '" + xmlNodeId + "'");
}
// load vertices, normals, texture coordinates
for (Element xmlMeshSource : getChildrenByTagName(xmlMesh, "source")) {
// vertices
if (xmlMeshSource.getAttribute("id").equals(xmlVerticesSource)) {
Element xmlFloatArray = getChildrenByTagName(xmlMeshSource, "float_array").get(0);
String valueString = xmlFloatArray.getTextContent();
t = new StringTokenizer(valueString, " \n\r");
while (t.hasMoreTokens()) {
Vector3 v = new Vector3(Float.parseFloat(t.nextToken()), Float.parseFloat(t.nextToken()), Float.parseFloat(t.nextToken()));
vertices.add(v);
}
} else // normals
if (xmlMeshSource.getAttribute("id").equals(xmlNormalsSource)) {
Element xmlFloatArray = getChildrenByTagName(xmlMeshSource, "float_array").get(0);
String valueString = xmlFloatArray.getTextContent();
t = new StringTokenizer(valueString, " \n\r");
while (t.hasMoreTokens()) {
Vector3 v = new Vector3(Float.parseFloat(t.nextToken()), Float.parseFloat(t.nextToken()), Float.parseFloat(t.nextToken()));
normals.add(v);
}
}
// texture coordinates
if (xmlTexCoordSource != null) {
if (xmlMeshSource.getAttribute("id").equals(xmlTexCoordSource)) {
Element xmlFloatArray = getChildrenByTagName(xmlMeshSource, "float_array").get(0);
String valueString = xmlFloatArray.getTextContent();
t = new StringTokenizer(valueString, " \n\r");
while (t.hasMoreTokens()) {
TextureCoordinate tc = new TextureCoordinate(Float.parseFloat(t.nextToken()), Float.parseFloat(t.nextToken()));
textureCoordinates.add(tc);
}
}
}
}
// load faces
for (Element xmlPolygon : getChildrenByTagName(xmlPolygons, "p")) {
String valueString = xmlPolygon.getTextContent();
t = new StringTokenizer(valueString, " \n\r");
int[] vi = new int[3];
int viIdx = 0;
int[] ni = new int[3];
int niIdx = 0;
int[] ti = xmlTexCoordSource == null ? null : new int[3];
int tiIdx = 0;
int valueIdx = 0;
boolean valid = true;
while (t.hasMoreTokens()) {
int value = Integer.parseInt(t.nextToken());
if (valueIdx % xmlInputs == xmlVerticesOffset) {
vi[viIdx++] = value;
// validate
if (value < 0 || value >= vertices.size() - verticesOffset) {
valid = false;
}
// fix for some strange models
if (xmlNormalsSource != null && xmlNormalsOffset == -1) {
ni[niIdx++] = value;
// validate
if (value < 0 || value >= normals.size() - normalsOffset) {
valid = false;
}
}
}
if (xmlNormalsOffset != -1 && valueIdx % xmlInputs == xmlNormalsOffset) {
ni[niIdx++] = value;
// validate
if (value < 0 || value >= normals.size() - normalsOffset) {
valid = false;
}
}
if (xmlTexCoordOffset != -1 && valueIdx % xmlInputs == xmlTexCoordOffset) {
ti[tiIdx++] = value;
// validate
if (value < 0 || value >= textureCoordinates.size() - textureCoordinatesOffset) {
valid = false;
}
}
if (viIdx == 3 && niIdx == 3 && (ti == null || tiIdx == 3)) {
// only add valid faces
if (valid) {
// add face
Face f = new Face(group, vi[0] + verticesOffset, vi[1] + verticesOffset, vi[2] + verticesOffset, ni[0] + normalsOffset, ni[1] + normalsOffset, ni[2] + normalsOffset);
if (ti != null) {
f.setTextureCoordinateIndices(ti[0] + textureCoordinatesOffset, ti[1] + textureCoordinatesOffset, ti[2] + textureCoordinatesOffset);
}
faces.add(f);
}
viIdx = 0;
niIdx = 0;
tiIdx = 0;
valid = true;
}
valueIdx++;
}
}
// add faces entities if we have any
if (faces.isEmpty() == false) {
facesEntity.setFaces(faces);
facesEntities.add(facesEntity);
}
}
}
}
// set up group
group.setVertices(vertices);
group.setNormals(normals);
if (textureCoordinates.size() > 0)
group.setTextureCoordinates(textureCoordinates);
group.setFacesEntities(facesEntities);
// create normal tangents and bitangents
ModelHelper.createNormalTangentsAndBitangents(group);
// determine features
group.determineFeatures();
}
use of net.drewke.tdme.engine.model.TextureCoordinate in project tdme by andreasdr.
the class Object3DGroupMesh method createMesh.
/**
* Creates a object3d group mesh from group
* @param animation processing target
* @param group
* @param transformationm matrices
* @return object 3d group mesh
*/
protected static Object3DGroupMesh createMesh(Engine.AnimationProcessingTarget animationProcessingTarget, Group group, HashMap<String, Matrix4x4> transformationMatrices) {
Object3DGroupMesh mesh = new Object3DGroupMesh();
// group data
Vector3[] groupVertices = group.getVertices();
Vector3[] groupNormals = group.getNormals();
TextureCoordinate[] groupTextureCoordinates = group.getTextureCoordinates();
Vector3[] groupTangents = group.getTangents();
Vector3[] groupBitangents = group.getBitangents();
// determine face count
int faceCount = group.getFaceCount();
// set up face count
mesh.faces = faceCount;
// animation processing target
mesh.animationProcessingTarget = animationProcessingTarget;
// transformations for skinned meshes
Skinning skinning = group.getSkinning();
mesh.skinning = skinning != null;
// transformed mesh vertices
mesh.transformedVertices = new Vector3[groupVertices.length];
for (int j = 0; j < mesh.transformedVertices.length; j++) {
mesh.transformedVertices[j] = new Vector3().set(groupVertices[j]);
}
// transformed mesh normals
mesh.transformedNormals = new Vector3[groupNormals.length];
for (int j = 0; j < mesh.transformedNormals.length; j++) {
mesh.transformedNormals[j] = new Vector3().set(groupNormals[j]);
}
// texture coordinates
if (groupTextureCoordinates != null) {
mesh.textureCoordinates = new TextureCoordinate[groupTextureCoordinates.length];
for (int j = 0; j < mesh.textureCoordinates.length; j++) {
mesh.textureCoordinates[j] = new TextureCoordinate(groupTextureCoordinates[j]);
}
}
// transformed mesh tangents
if (groupTangents != null) {
mesh.transformedTangents = new Vector3[groupTangents.length];
for (int j = 0; j < mesh.transformedTangents.length; j++) {
mesh.transformedTangents[j] = new Vector3().set(groupTangents[j]);
}
}
// transformed mesh bitangents
if (groupBitangents != null) {
mesh.transformedBitangents = new Vector3[groupBitangents.length];
for (int j = 0; j < mesh.transformedBitangents.length; j++) {
mesh.transformedBitangents[j] = new Vector3().set(groupBitangents[j]);
}
}
// indices
int indicesCount = 0;
for (FacesEntity facesEntity : group.getFacesEntities()) {
indicesCount += 3 * facesEntity.getFaces().length;
}
mesh.indices = new short[indicesCount];
{
int j = 0;
// create face vertex indices
for (FacesEntity facesEntity : group.getFacesEntities()) for (Face face : facesEntity.getFaces()) for (int vertexIndex : face.getVertexIndices()) {
mesh.indices[j++] = (short) vertexIndex;
}
}
//
mesh.recreatedBuffers = false;
// create mesh upload buffers
if (mesh.animationProcessingTarget != Engine.AnimationProcessingTarget.CPU_NORENDERING) {
mesh.sbIndices = ByteBuffer.allocateDirect(mesh.faces * 3 * Short.SIZE / Byte.SIZE).order(ByteOrder.nativeOrder()).asShortBuffer();
mesh.fbVertices = ByteBuffer.allocateDirect(groupVertices.length * 3 * Float.SIZE / Byte.SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
mesh.fbNormals = ByteBuffer.allocateDirect(groupNormals.length * 3 * Float.SIZE / Byte.SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
mesh.fbTextureCoordinates = groupTextureCoordinates != null ? ByteBuffer.allocateDirect(groupTextureCoordinates.length * 2 * Float.SIZE / Byte.SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer() : null;
mesh.fbTangents = groupTangents != null ? ByteBuffer.allocateDirect(groupTangents.length * 3 * Float.SIZE / Byte.SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer() : null;
mesh.fbBitangents = groupBitangents != null ? ByteBuffer.allocateDirect(groupBitangents.length * 3 * Float.SIZE / Byte.SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer() : null;
// create face vertex indices, will never be changed in engine
for (FacesEntity facesEntity : group.getFacesEntities()) for (Face face : facesEntity.getFaces()) for (int vertexIndex : face.getVertexIndices()) {
mesh.sbIndices.put((short) vertexIndex);
}
mesh.sbIndices.flip();
// create texture coordinates buffer, will never be changed in engine
if (mesh.fbTextureCoordinates != null) {
// construct texture coordinates byte buffer as this will not change usually
for (TextureCoordinate textureCoordinate : groupTextureCoordinates) {
mesh.fbTextureCoordinates.put(textureCoordinate.getArray());
}
mesh.fbTextureCoordinates.flip();
}
}
// group transformations matrix
if (mesh.animationProcessingTarget == Engine.AnimationProcessingTarget.CPU || mesh.animationProcessingTarget == Engine.AnimationProcessingTarget.CPU_NORENDERING) {
// group transformations matrix
mesh.cGroupTransformationsMatrix = transformationMatrices.get(group.getId());
}
// skinning
if (skinning != null) {
// skinning computation caches if computing skinning on CPU
if (mesh.animationProcessingTarget == Engine.AnimationProcessingTarget.CPU || mesh.animationProcessingTarget == Engine.AnimationProcessingTarget.CPU_NORENDERING) {
mesh.cSkinningJointWeight = new float[groupVertices.length][];
mesh.cSkinningJointBindMatrices = new Matrix4x4[groupVertices.length][];
mesh.cSkinningJointTransformationsMatrices = new Matrix4x4[groupVertices.length][];
mesh.cTransformationsMatrix = new Matrix4x4();
// compute joint weight caches
Joint[] joints = skinning.getJoints();
float[] weights = skinning.getWeights();
JointWeight[][] jointsWeights = skinning.getVerticesJointsWeights();
for (int vertexIndex = 0; vertexIndex < groupVertices.length; vertexIndex++) {
int vertexJointWeights = jointsWeights[vertexIndex].length;
if (vertexJointWeights > mesh.cSkinningMaxVertexWeights)
mesh.cSkinningMaxVertexWeights = vertexJointWeights;
mesh.cSkinningJointWeight[vertexIndex] = new float[vertexJointWeights];
mesh.cSkinningJointBindMatrices[vertexIndex] = new Matrix4x4[vertexJointWeights];
mesh.cSkinningJointTransformationsMatrices[vertexIndex] = new Matrix4x4[vertexJointWeights];
int jointWeightIdx = 0;
for (JointWeight jointWeight : jointsWeights[vertexIndex]) {
Joint joint = joints[jointWeight.getJointIndex()];
//
mesh.cSkinningJointWeight[vertexIndex][jointWeightIdx] = weights[jointWeight.getWeightIndex()];
mesh.cSkinningJointBindMatrices[vertexIndex][jointWeightIdx] = joint.getBindMatrix();
mesh.cSkinningJointTransformationsMatrices[vertexIndex][jointWeightIdx] = transformationMatrices.get(joint.getGroupId());
// next
jointWeightIdx++;
}
}
} else // GPU setup
if (mesh.animationProcessingTarget == Engine.AnimationProcessingTarget.GPU) {
// create skinning buffers
mesh.gIbSkinningVerticesJoints = ByteBuffer.allocateDirect(groupVertices.length * 1 * Float.SIZE / Byte.SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
mesh.gFbSkinningVerticesVertexJointsIdxs = ByteBuffer.allocateDirect(groupVertices.length * 4 * Float.SIZE / Byte.SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
mesh.gFbSkinningVerticesVertexJointsWeights = ByteBuffer.allocateDirect(groupVertices.length * 4 * Float.SIZE / Byte.SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
mesh.gFbSkinningJointsTransformationsMatrices = ByteBuffer.allocateDirect(60 * 16 * Float.SIZE / Byte.SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
mesh.gFbSkinningTransformationMatrix = new Matrix4x4();
// fill skinning buffers, joint bind matrices
mesh.skinningJoints = skinning.getJoints().length;
mesh.gSkinningJointBindMatrices = new ArrayList<Matrix4x4>();
for (Joint joint : skinning.getJoints()) {
mesh.gSkinningJointBindMatrices.add(joint.getBindMatrix());
}
//
JointWeight[][] jointsWeights = skinning.getVerticesJointsWeights();
float[] weights = skinning.getWeights();
for (int groupVertexIndex = 0; groupVertexIndex < groupVertices.length; groupVertexIndex++) {
int vertexJoints = jointsWeights[groupVertexIndex].length;
// put number of joints
mesh.gIbSkinningVerticesJoints.put((float) vertexJoints);
// vertex joint idx 1..4
for (int i = 0; i < 4; i++) {
mesh.gFbSkinningVerticesVertexJointsIdxs.put((float) (vertexJoints > i ? jointsWeights[groupVertexIndex][i].getJointIndex() : -1));
}
// vertex joint weight 1..4
for (int i = 0; i < 4; i++) {
mesh.gFbSkinningVerticesVertexJointsWeights.put(vertexJoints > i ? weights[jointsWeights[groupVertexIndex][i].getWeightIndex()] : 0.0f);
}
}
// put number of joints
mesh.gIbSkinningVerticesJoints.flip();
// vertex joint idx 1..4
mesh.gFbSkinningVerticesVertexJointsIdxs.flip();
// vertex joint weight 1..4
mesh.gFbSkinningVerticesVertexJointsWeights.flip();
}
}
// temp vector3
mesh.tmpVector3 = new Vector3();
// issue a recreate buffer and upload to graphics board
mesh.recreateBuffers(group);
//
return mesh;
}
use of net.drewke.tdme.engine.model.TextureCoordinate in project tdme by andreasdr.
the class LevelEditorView method createLevelEditorGroundPlateModel.
/**
* Creates a level editor ground plate
* @return ground
*/
private Model createLevelEditorGroundPlateModel() {
// ground selectedEntity
Model groundPlate = new Model("leveleditor.ground", "leveleditor.ground", UpVector.Y_UP, RotationOrder.XYZ, (BoundingBox) BoundingBox.createBoundingVolume(new Vector3(0f, -0.01f, 0f), new Vector3(1f, +0.01f, 1f)));
// material
Material groundPlateMaterial = new Material("ground");
groundPlateMaterial.getDiffuseColor().setAlpha(0.75f);
groundPlateMaterial.setDiffuseTexture("resources/tools/leveleditor/textures", "groundplate.png");
groundPlateMaterial.getSpecularColor().set(0f, 0f, 0f, 1f);
groundPlate.getMaterials().put("ground", groundPlateMaterial);
// group
Group groundGroup = new Group(groundPlate, null, "ground", "ground");
// faces entity
// ground
FacesEntity groupFacesEntityGround = new FacesEntity(groundGroup, "leveleditor.ground.facesentity");
groupFacesEntityGround.setMaterial(groundPlateMaterial);
// faces entity
ArrayList<FacesEntity> groupFacesEntities = new ArrayList<FacesEntity>();
groupFacesEntities.add(groupFacesEntityGround);
// vertices
ArrayList<Vector3> groundVertices = new ArrayList<Vector3>();
// left, near, ground
groundVertices.add(new Vector3(0.0f, 0.0f, 0.0f));
// left, far, ground
groundVertices.add(new Vector3(0.0f, 0.0f, +groundPlateDepth));
// right far, ground
groundVertices.add(new Vector3(+groundPlateWidth, 0.0f, +groundPlateDepth));
// right, near, ground
groundVertices.add(new Vector3(+groundPlateWidth, 0.0f, 0.0f));
// normals
ArrayList<Vector3> groundNormals = new ArrayList<Vector3>();
// ground
groundNormals.add(new Vector3(0f, 1f, 0f));
// texture coordinates
ArrayList<TextureCoordinate> groundTextureCoordinates = new ArrayList<TextureCoordinate>();
groundTextureCoordinates.add(new TextureCoordinate(0f, 1f));
groundTextureCoordinates.add(new TextureCoordinate(0f, 0f));
groundTextureCoordinates.add(new TextureCoordinate(1f, 0f));
groundTextureCoordinates.add(new TextureCoordinate(1f, 1f));
// faces ground
ArrayList<Face> groundFacesGround = new ArrayList<Face>();
groundFacesGround.add(new Face(groundGroup, 0, 1, 2, 0, 0, 0, 0, 1, 2));
groundFacesGround.add(new Face(groundGroup, 2, 3, 0, 0, 0, 0, 2, 3, 0));
// set up faces entity
groupFacesEntityGround.setFaces(groundFacesGround);
// setup ground group
groundGroup.setVertices(groundVertices);
groundGroup.setNormals(groundNormals);
groundGroup.setTextureCoordinates(groundTextureCoordinates);
groundGroup.setFacesEntities(groupFacesEntities);
// register group
groundPlate.getGroups().put(groundGroup.getId(), groundGroup);
groundPlate.getSubGroups().put(groundGroup.getId(), groundGroup);
// prepare for indexed rendering
ModelHelper.prepareForIndexedRendering(groundPlate);
//
return groundPlate;
}
use of net.drewke.tdme.engine.model.TextureCoordinate in project tdme by andreasdr.
the class WFObjReader method read.
/**
* Reads a wave front object file
* @param path name
* @param file name
* @return model
* @throws IOException
* @throws ModelIOException
*/
public static Model read(String pathName, String fileName) throws IOException, ModelFileIOException {
// create object
Model model = new Model(pathName + File.separator + fileName, fileName, UpVector.Y_UP, RotationOrder.XYZ, null);
ArrayList<Vector3> vertices = new ArrayList<Vector3>();
ArrayList<TextureCoordinate> textureCoordinates = new ArrayList<TextureCoordinate>();
HashMap<String, Material> materials = model.getMaterials();
HashMap<String, Group> subGroups = model.getSubGroups();
HashMap<String, Group> groups = model.getGroups();
// current group
Group group = null;
// model vertices -> group vertices mapping
HashMap<Integer, Integer> modelGroupVerticesMapping = null;
// model texture coordinates -> group texture coordinates mapping
HashMap<Integer, Integer> modelGroupTextureCoordinatesMapping = null;
// current group data
ArrayList<Face> groupFacesEntityFaces = null;
ArrayList<Vector3> groupVertices = null;
ArrayList<Vector3> groupNormals = null;
ArrayList<TextureCoordinate> groupTextureCoordinates = null;
// current group's faces entity
ArrayList<FacesEntity> groupFacesEntities = null;
FacesEntity groupFacesEntity = null;
//
DataInputStream inputStream = new DataInputStream(FileSystem.getInstance().getInputStream(pathName, fileName));
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
//
try {
//
String line;
while ((line = reader.readLine()) != null) {
line = line.trim();
// skip on comments
if (line.startsWith("#")) {
continue;
}
// determine index of first ' ' which will separate command from arguments
int commandEndIdx = line.indexOf(' ');
if (commandEndIdx == -1)
commandEndIdx = line.length();
// determine command
String command = line.substring(0, commandEndIdx).trim().toLowerCase();
// determine arguments if any exist
String arguments = command.length() + 1 > line.length() ? "" : line.substring(command.length() + 1);
// parse
if (command.equals("mtllib")) {
String materialFileName = arguments;
materials = WFObjReader.readMaterials(pathName, materialFileName);
} else if (command.equals("v")) {
StringTokenizer t = new StringTokenizer(arguments, " ");
float x = Float.parseFloat(t.nextToken());
float y = Float.parseFloat(t.nextToken());
float z = Float.parseFloat(t.nextToken());
// add vertex
vertices.add(new Vector3(x, y, z));
} else if (command.equals("vt")) {
StringTokenizer t = new StringTokenizer(arguments, " ");
float u = Float.parseFloat(t.nextToken());
float v = Float.parseFloat(t.nextToken());
textureCoordinates.add(new TextureCoordinate(u, v));
} else if (command.equals("f")) {
StringTokenizer t2;
StringTokenizer t = new StringTokenizer(arguments, " ");
int v0 = -1;
int v1 = -1;
int v2 = -1;
int vt0 = -1;
int vt1 = -1;
int vt2 = -1;
// parse vertex index 0, vertex texture index 0
t2 = new StringTokenizer(t.nextToken(), "/");
v0 = Integer.parseInt(t2.nextToken()) - 1;
if (t2.hasMoreTokens()) {
vt0 = Integer.parseInt(t2.nextToken()) - 1;
}
// parse vertex index 1, vertex texture index 1
t2 = new StringTokenizer(t.nextToken(), "/");
v1 = Integer.parseInt(t2.nextToken()) - 1;
if (t2.hasMoreTokens()) {
vt1 = Integer.parseInt(t2.nextToken()) - 1;
}
// parse vertex index 2, vertex texture index 2
t2 = new StringTokenizer(t.nextToken(), "/");
v2 = Integer.parseInt(t2.nextToken()) - 1;
if (t2.hasMoreTokens()) {
vt2 = Integer.parseInt(t2.nextToken()) - 1;
}
// check if triangulated
if (t.hasMoreTokens()) {
throw new ModelFileIOException("We only support triangulated meshes");
}
Integer mappedVertex = null;
// map v0 to group
mappedVertex = modelGroupVerticesMapping.get(v0);
if (mappedVertex == null) {
groupVertices.add(vertices.get(v0).clone());
v0 = groupVertices.size() - 1;
} else {
v0 = mappedVertex.intValue();
}
// map v1 to group
mappedVertex = modelGroupVerticesMapping.get(v1);
if (mappedVertex == null) {
groupVertices.add(vertices.get(v1).clone());
v1 = groupVertices.size() - 1;
} else {
v1 = mappedVertex.intValue();
}
// map v2 to group
mappedVertex = modelGroupVerticesMapping.get(v2);
if (mappedVertex == null) {
groupVertices.add(vertices.get(v2).clone());
v2 = groupVertices.size() - 1;
} else {
v2 = mappedVertex.intValue();
}
//
Integer mappedTextureCoordinate = null;
// map vt0 to group
mappedTextureCoordinate = modelGroupTextureCoordinatesMapping.get(vt0);
if (mappedTextureCoordinate == null) {
groupTextureCoordinates.add(textureCoordinates.get(vt0).clone());
vt0 = groupTextureCoordinates.size() - 1;
} else {
vt0 = mappedTextureCoordinate.intValue();
}
// map vt1 to group
mappedTextureCoordinate = modelGroupTextureCoordinatesMapping.get(vt1);
if (mappedTextureCoordinate == null) {
groupTextureCoordinates.add(textureCoordinates.get(vt1).clone());
vt1 = groupTextureCoordinates.size() - 1;
} else {
vt1 = mappedTextureCoordinate.intValue();
}
// map vt2 to group
mappedTextureCoordinate = modelGroupTextureCoordinatesMapping.get(vt2);
if (mappedTextureCoordinate == null) {
groupTextureCoordinates.add(textureCoordinates.get(vt2).clone());
vt2 = groupTextureCoordinates.size() - 1;
} else {
vt2 = mappedTextureCoordinate.intValue();
}
// compute vertex normal
Vector3[] faceVertexNormals = ModelHelper.computeNormals(new Vector3[] { groupVertices.get(v0), groupVertices.get(v1), groupVertices.get(v2) });
// store group normals
int n0 = groupNormals.size();
groupNormals.add(faceVertexNormals[0]);
int n1 = groupNormals.size();
groupNormals.add(faceVertexNormals[1]);
int n2 = groupNormals.size();
groupNormals.add(faceVertexNormals[2]);
// create face with vertex indices
// we only support triangulated faces
Face face = new Face(group, v0, v1, v2, n0, n1, n2);
if (vt0 != -1 && vt1 != -1 && vt2 != -1) {
// set optional texture coordinate index
face.setTextureCoordinateIndices(vt0, vt1, vt2);
}
groupFacesEntityFaces.add(face);
} else if (command.equals("g")) {
if (group != null) {
// current faces entity
if (groupFacesEntityFaces.isEmpty() == false) {
groupFacesEntity.setFaces(groupFacesEntityFaces);
groupFacesEntities.add(groupFacesEntity);
}
// group
group.setVertices(groupVertices);
group.setNormals(groupNormals);
group.setTextureCoordinates(groupTextureCoordinates);
group.setFacesEntities(groupFacesEntities);
group.determineFeatures();
}
StringTokenizer t = new StringTokenizer(arguments, " ");
String name = t.nextToken();
groupVertices = new ArrayList<Vector3>();
groupNormals = new ArrayList<Vector3>();
groupTextureCoordinates = new ArrayList<TextureCoordinate>();
groupFacesEntityFaces = new ArrayList<Face>();
group = new Group(model, null, name, name);
groupFacesEntity = new FacesEntity(group, name);
groupFacesEntities = new ArrayList<FacesEntity>();
modelGroupVerticesMapping = new HashMap<Integer, Integer>();
modelGroupTextureCoordinatesMapping = new HashMap<Integer, Integer>();
subGroups.put(name, group);
groups.put(name, group);
} else if (command.equals("usemtl")) {
if (group != null) {
// current faces entity
if (groupFacesEntityFaces.isEmpty() == false) {
groupFacesEntity.setFaces(groupFacesEntityFaces);
groupFacesEntities.add(groupFacesEntity);
}
// set up new one
groupFacesEntity = new FacesEntity(group, "#" + groupFacesEntities.size());
groupFacesEntityFaces = new ArrayList<Face>();
}
groupFacesEntity.setMaterial(materials.get(arguments));
} else {
// not supported
}
}
// finish last group
if (group != null) {
// current faces entity
if (groupFacesEntityFaces.isEmpty() == false) {
groupFacesEntity.setFaces(groupFacesEntityFaces);
groupFacesEntities.add(groupFacesEntity);
}
// group
group.setVertices(groupVertices);
group.setNormals(groupNormals);
group.setTextureCoordinates(groupTextureCoordinates);
group.setFacesEntities(groupFacesEntities);
group.determineFeatures();
}
} finally {
// close resouces
reader.close();
inputStream.close();
}
// prepare for indexed rendering
ModelHelper.prepareForIndexedRendering(model);
//
return model;
}
Aggregations