List of usage examples for com.badlogic.gdx.graphics Mesh getNumIndices
public int getNumIndices()
From source file:com.andgate.ikou.render.FloorRender.java
License:Open Source License
@Override public void getRenderables(Array<Renderable> renderables, Pool<Renderable> pool) { for (int i = 0; i < sectorMeshes.length; i++) { for (int j = 0; j < sectorMeshes[i].length; j++) { Mesh mesh = sectorMeshes[i][j].getMesh(); if (inFrustum(i, j) && (mesh != null)) { Renderable renderable = pool.obtain(); renderable.material = TileStack.TILE_MATERIAL; renderable.meshPartOffset = 0; renderable.meshPartSize = mesh.getNumIndices(); renderable.primitiveType = GL20.GL_TRIANGLES; renderable.mesh = mesh;//from ww w . jav a2s .c om renderables.add(renderable); renderable.worldTransform.set(floorTransform); } } } }
From source file:com.badlogic.gdx.physics.bullet.demo.simulationobjects.MeshSimulationObject.java
public static btBvhTriangleMeshShape createTriangleMeshShape(Mesh mesh, AtomicReference<btTriangleMesh> triangleMesh) { final btTriangleMesh m = new btTriangleMesh(); final ShortBuffer indices = mesh.getIndicesBuffer(); indices.rewind();//from w ww . j a va 2s . c om final FloatBuffer vertices = mesh.getVerticesBuffer(); vertices.rewind(); // Some meshes have vertices but no indices declared final boolean hasIndices = mesh.getNumIndices() != 0; final int vertexStride = mesh.getVertexSize() / 4; final Vector3 v0 = Pools.VECTOR3.obtain(); final Vector3 v1 = Pools.VECTOR3.obtain(); final Vector3 v2 = Pools.VECTOR3.obtain(); // Set up a small array to keep the loop code simpler final Vector3[] vectors = new Vector3[] { v0, v1, v2 }; short vectorIndex = 0; int i = -1; int verticesRead = 0; while (verticesRead < mesh.getNumVertices()) { if (hasIndices) { i = indices.get(); } else { i++; } vectors[vectorIndex++].set(vertices.get(i * vertexStride), vertices.get(i * vertexStride + 1), vertices.get(i * vertexStride + 2)); if (vectorIndex == vectors.length) { m.addTriangle(v0, v1, v2, true); vectorIndex = 0; } verticesRead++; } Pools.VECTOR3.free(v0); Pools.VECTOR3.free(v1); Pools.VECTOR3.free(v2); triangleMesh.set(m); return new btBvhTriangleMeshShape(m, true); }
From source file:com.lyeeedar.Roguelike3D.Graphics.Models.Shapes.java
License:Open Source License
public static Mesh insertLight(Mesh mesh, LightManager lights, boolean bakeStatics, Matrix4 model_matrix) { VertexAttributes attributes = mesh.getVertexAttributes(); final int vertCount = mesh.getNumVertices(); final int vertexSize = attributes.vertexSize / 4; VertexAttribute[] newAttributes = new VertexAttribute[attributes.size() + 1]; for (int i = 0; i < attributes.size(); i++) { newAttributes[i] = attributes.get(i); }/* w w w . j a v a2 s. co m*/ newAttributes[attributes.size()] = new VertexAttribute(Usage.Generic, 3, "a_baked_light"); final int newVertexSize = vertexSize + 3; float[] verts = new float[vertexSize * vertCount]; mesh.getVertices(verts); short[] indices = new short[mesh.getNumIndices()]; mesh.getIndices(indices); float[] newVerts = new float[newVertexSize * vertCount]; int positionOffset = attributes.getOffset(Usage.Position); int normalOffset = attributes.getOffset(Usage.Normal); Matrix4 normal_matrix = new Matrix4(); normal_matrix.set(model_matrix); Vector3 position = new Vector3(); for (int i = 0; i < vertCount; i++) { int j = 0; for (; j < vertexSize; j++) { newVerts[(i * newVertexSize) + j] = verts[(i * vertexSize) + j]; } position.set(verts[(i * vertexSize) + positionOffset], verts[(i * vertexSize) + positionOffset + 1], verts[(i * vertexSize) + positionOffset + 2]).mul(model_matrix); Vector3 normal = new Vector3(verts[(i * vertexSize) + normalOffset], verts[(i * vertexSize) + normalOffset + 1], verts[(i * vertexSize) + normalOffset + 2]); normal.rot(normal_matrix).nor(); Color light_colour = lights.calculateLightAtPoint(position, normal, bakeStatics); newVerts[(i * newVertexSize) + j + 0] = light_colour.r; newVerts[(i * newVertexSize) + j + 1] = light_colour.g; newVerts[(i * newVertexSize) + j + 2] = light_colour.b; } Mesh newMesh = new Mesh(true, mesh.getNumVertices(), mesh.getNumIndices(), newAttributes); newMesh.setVertices(newVerts); newMesh.setIndices(indices); return newMesh; }
From source file:com.lyeeedar.Roguelike3D.Graphics.Models.Shapes.java
License:Open Source License
public static Mesh insertTangents(Mesh mesh) { VertexAttributes attributes = mesh.getVertexAttributes(); final int vertCount = mesh.getNumVertices(); final int vertexSize = attributes.vertexSize / 4; VertexAttribute[] newAttributes = new VertexAttribute[attributes.size() + 1]; for (int i = 0; i < attributes.size(); i++) { newAttributes[i] = attributes.get(i); }/*from www. j a v a 2 s .c o m*/ newAttributes[attributes.size()] = new VertexAttribute(Usage.Generic, 4, "a_tangent"); final int newVertexSize = vertexSize + 4; float[] verts = new float[vertexSize * vertCount]; mesh.getVertices(verts); short[] indices = new short[mesh.getNumIndices()]; mesh.getIndices(indices); float[] newVerts = new float[newVertexSize * vertCount]; int positionOffset = attributes.getOffset(Usage.Position); int normalOffset = attributes.getOffset(Usage.Normal); int textureOffset = attributes.getOffset(Usage.TextureCoordinates); int tangentOffset = 0; for (int i = 0; i < vertCount; i += 3) { int j = 0; for (; j < vertexSize; j++) { newVerts[(i * newVertexSize) + j] = verts[(i * vertexSize) + j]; newVerts[((i + 1) * newVertexSize) + j] = verts[((i + 1) * vertexSize) + j]; newVerts[((i + 2) * newVertexSize) + j] = verts[((i + 2) * vertexSize) + j]; } tangentOffset = j; } for (int i = 0; i < mesh.getNumIndices(); i += 3) { int i1 = indices[i]; int i2 = indices[i + 1]; int i3 = indices[i + 2]; Vector3 v1 = new Vector3(verts[(i1 * vertexSize) + positionOffset], verts[(i1 * vertexSize) + positionOffset] + 1, verts[(i1 * vertexSize) + positionOffset] + 2); Vector3 v2 = new Vector3(verts[(i2 * vertexSize) + positionOffset], verts[(i2 * vertexSize) + positionOffset] + 1, verts[(i2 * vertexSize) + positionOffset] + 2); Vector3 v3 = new Vector3(verts[(i3 * vertexSize) + positionOffset], verts[(i3 * vertexSize) + positionOffset] + 1, verts[(i3 * vertexSize) + positionOffset] + 2); float[] w1 = { verts[(i1 * vertexSize) + textureOffset], verts[(i1 * vertexSize) + textureOffset] + 1 }; float[] w2 = { verts[(i2 * vertexSize) + textureOffset], verts[(i2 * vertexSize) + textureOffset] + 1 }; float[] w3 = { verts[(i3 * vertexSize) + textureOffset], verts[(i3 * vertexSize) + textureOffset] + 1 }; float x1 = v2.x - v1.x; float x2 = v3.x - v1.x; float y1 = v2.y - v1.y; float y2 = v3.y - v1.y; float z1 = v2.z - v1.z; float z2 = v3.z - v1.z; float s1 = w2[0] - w1[0]; float s2 = w3[0] - w1[0]; float t1 = w2[1] - w1[1]; float t2 = w3[1] - w1[1]; float div = s1 * t2 - s2 * t1; float r = div == 0.0f ? 0.0f : 1.0f / div; Vector3 t = new Vector3((t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r, (t2 * z1 - t1 * z2) * r); Vector3 n = new Vector3(verts[(i1 * vertexSize) + normalOffset], verts[(i1 * vertexSize) + normalOffset] + 1, verts[(i1 * vertexSize) + normalOffset] + 2); //Vector3 tangent = t.cpy().sub(n).mul(n.tmp().dot(t)).nor(); Vector3 tangent = orthoNormalize(n, t); System.out.println(t2); Vector3 tan2 = new Vector3((s1 * x2 - s2 * x1) * r, (s1 * y2 - s2 * y1) * r, (s1 * z2 - s2 * z1) * r); float handedness = (n.tmp().crs(t).dot(tan2) < 0.0f) ? -1.0f : 1.0f; Vector3 c1 = n.cpy().crs(0.0f, 0.0f, 1.0f); Vector3 c2 = n.cpy().crs(0.0f, 1.0f, 0.0f); if (c1.len2() > c2.len2()) { tangent = c1; } else { tangent = c2; } newVerts[(i1 * newVertexSize) + tangentOffset] = tangent.x; newVerts[(i1 * newVertexSize) + tangentOffset + 1] = tangent.y; newVerts[(i1 * newVertexSize) + tangentOffset + 2] = tangent.z; newVerts[(i1 * newVertexSize) + tangentOffset + 3] = handedness; newVerts[(i2 * newVertexSize) + tangentOffset] = tangent.x; newVerts[(i2 * newVertexSize) + tangentOffset + 1] = tangent.y; newVerts[(i2 * newVertexSize) + tangentOffset + 2] = tangent.z; newVerts[(i2 * newVertexSize) + tangentOffset + 3] = handedness; newVerts[(i3 * newVertexSize) + tangentOffset] = tangent.x; newVerts[(i3 * newVertexSize) + tangentOffset + 1] = tangent.y; newVerts[(i3 * newVertexSize) + tangentOffset + 2] = tangent.z; newVerts[(i3 * newVertexSize) + tangentOffset + 3] = handedness; } Mesh newMesh = new Mesh(true, mesh.getNumVertices(), mesh.getNumIndices(), newAttributes); newMesh.setVertices(newVerts); newMesh.setIndices(indices); return newMesh; }
From source file:com.lyeeedar.Roguelike3D.Graphics.Models.Shapes.java
License:Open Source License
public static Mesh copyMesh(Mesh mesh) { VertexAttributes attributes = mesh.getVertexAttributes(); final int vertCount = mesh.getNumVertices(); final int vertexSize = attributes.vertexSize / 4; float[] verts = new float[vertexSize * vertCount]; mesh.getVertices(verts);//from w w w .j a va 2 s. c o m short[] indices = new short[mesh.getNumIndices()]; mesh.getIndices(indices); Mesh newMesh = new Mesh(true, mesh.getNumVertices(), mesh.getNumIndices(), attributes); newMesh.setVertices(verts); newMesh.setIndices(indices); return newMesh; }
From source file:com.mygdx.game.pathfinding.NavMeshGraph.java
License:Apache License
/** * Get an array of the vertex indices from the mesh. Any vertices which share the same position will be counted * as a single vertex and share the same index. That is, position duplicates will be filtered out. * * @param mesh/*w ww . j av a2s . co m*/ * @return */ private static short[] getUniquePositionVertexIndices(Mesh mesh) { FloatBuffer verticesBuffer = mesh.getVerticesBuffer(); int positionOffset = mesh.getVertexAttributes().findByUsage(VertexAttributes.Usage.Position).offset / 4; // Number of array elements which make up a vertex int vertexSize = mesh.getVertexSize() / 4; // The indices tell us which vertices are part of a triangle. short[] indices = new short[mesh.getNumIndices()]; mesh.getIndices(indices); // Marks true if an index has already been compared to avoid unnecessary comparisons Bits handledIndices = new Bits(mesh.getNumIndices()); for (int i = 0; i < indices.length; i++) { short indexI = indices[i]; if (handledIndices.get(indexI)) { // Index handled in an earlier iteration continue; } int vBufIndexI = indexI * vertexSize + positionOffset; float xi = verticesBuffer.get(vBufIndexI++); float yi = verticesBuffer.get(vBufIndexI++); float zi = verticesBuffer.get(vBufIndexI++); for (int j = i + 1; j < indices.length; j++) { short indexJ = indices[j]; int vBufIndexJ = indexJ * vertexSize + positionOffset; float xj = verticesBuffer.get(vBufIndexJ++); float yj = verticesBuffer.get(vBufIndexJ++); float zj = verticesBuffer.get(vBufIndexJ++); if (xi == xj && yi == yj && zi == zj) { indices[j] = indexI; } } handledIndices.set(indexI); } return indices; }
From source file:com.mygdx.game.pathfinding.NavMeshGraph.java
License:Apache License
/** * Creates Vector3 objects from the vertices of the mesh. The resulting array follows the ordering of the provided * index array./*from w w w.ja v a 2 s. c o m*/ * * @param mesh * @param indices * @return */ private static Vector3[] createVertexVectors(Mesh mesh, short[] indices) { FloatBuffer verticesBuffer = mesh.getVerticesBuffer(); int positionOffset = mesh.getVertexAttributes().findByUsage(VertexAttributes.Usage.Position).offset / 4; int vertexSize = mesh.getVertexSize() / 4; Vector3[] vertexVectors = new Vector3[mesh.getNumIndices()]; for (int i = 0; i < indices.length; i++) { short index = indices[i]; int a = index * vertexSize + positionOffset; float x = verticesBuffer.get(a++); float y = verticesBuffer.get(a++); float z = verticesBuffer.get(a); vertexVectors[index] = new Vector3(x, y, z); } return vertexVectors; }
From source file:com.mygdx.game.simulation.Simulation.java
License:Apache License
private void populate() { ObjLoader objLoader = new ObjLoader(); for (int i = 0; i < MAX_SHIPS; i++) { shipModels[i] = objLoader.loadModel(Gdx.files.internal("data/ship.obj")); }/*from w w w. j av a2s. c o m*/ invaderModel = objLoader.loadModel(Gdx.files.internal("data/invader.obj")); blockModel = objLoader.loadModel(Gdx.files.internal("data/block.obj")); shotModel = objLoader.loadModel(Gdx.files.internal("data/shot.obj")); final Texture shipTexture = new Texture(Gdx.files.internal("data/ship.png"), Format.RGB565, true); shipTexture.setFilter(TextureFilter.MipMap, TextureFilter.Linear); final Texture shipTexture2 = new Texture(Gdx.files.internal("data/ship.png"), Format.RGB565, true); shipTexture2.setFilter(TextureFilter.MipMap, TextureFilter.Linear); final Texture invaderTexture = new Texture(Gdx.files.internal("data/invader.png"), Format.RGB565, true); invaderTexture.setFilter(TextureFilter.MipMap, TextureFilter.Linear); for (int i = 0; i < MAX_SHIPS; i++) { shipModels[i].materials.get(0).set(TextureAttribute.createDiffuse(shipTexture)); } invaderModel.materials.get(0).set(TextureAttribute.createDiffuse(invaderTexture)); ((ColorAttribute) blockModel.materials.get(0).get(ColorAttribute.Diffuse)).color.set(0, 0, 1, 0.5f); blockModel.materials.get(0).set(new BlendingAttribute(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA)); shotModel.materials.get(0).set(ColorAttribute.createDiffuse(1, 1, 0, 1f)); final Texture explosionTexture = new Texture(Gdx.files.internal("data/explode.png"), Format.RGBA4444, true); explosionTexture.setFilter(TextureFilter.MipMap, TextureFilter.Linear); final Mesh explosionMesh = new Mesh(true, 4 * 16, 6 * 16, new VertexAttribute(Usage.Position, 3, "a_position"), new VertexAttribute(Usage.TextureCoordinates, 2, "a_texCoord0")); float[] vertices = new float[4 * 16 * (3 + 2)]; short[] indices = new short[6 * 16]; int idx = 0; int index = 0; for (int row = 0; row < 4; row++) { for (int column = 0; column < 4; column++) { vertices[idx++] = 1; vertices[idx++] = 1; vertices[idx++] = 0; vertices[idx++] = 0.25f + column * 0.25f; vertices[idx++] = 0 + row * 0.25f; vertices[idx++] = -1; vertices[idx++] = 1; vertices[idx++] = 0; vertices[idx++] = 0 + column * 0.25f; vertices[idx++] = 0 + row * 0.25f; vertices[idx++] = -1; vertices[idx++] = -1; vertices[idx++] = 0; vertices[idx++] = 0f + column * 0.25f; vertices[idx++] = 0.25f + row * 0.25f; vertices[idx++] = 1; vertices[idx++] = -1; vertices[idx++] = 0; vertices[idx++] = 0.25f + column * 0.25f; vertices[idx++] = 0.25f + row * 0.25f; final int t = (4 * row + column) * 4; indices[index++] = (short) (t); indices[index++] = (short) (t + 1); indices[index++] = (short) (t + 2); indices[index++] = (short) (t); indices[index++] = (short) (t + 2); indices[index++] = (short) (t + 3); } } explosionMesh.setVertices(vertices); explosionMesh.setIndices(indices); Material explosionMeshMaterial = new Material( new BlendingAttribute(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA), TextureAttribute.createDiffuse(explosionTexture)); explosionModel = new Model(); MeshPart meshPart = new MeshPart(); meshPart.id = "part1"; meshPart.offset = 0; meshPart.size = explosionMesh.getNumIndices(); meshPart.primitiveType = GL20.GL_TRIANGLES; meshPart.mesh = explosionMesh; NodePart partMaterial = new NodePart(); partMaterial.material = explosionMeshMaterial; partMaterial.meshPart = meshPart; Node node = new Node(); node.id = "node1"; node.parts.add(partMaterial); explosionModel.meshes.add(explosionMesh); explosionModel.materials.add(explosionMeshMaterial); explosionModel.nodes.add(node); explosionModel.meshParts.add(meshPart); explosionModel.manageDisposable(explosionMesh); for (int i = 0; i < MAX_SHIPS; i++) { ships[i] = new Ship(shipModels[i]); ships[i].transform.rotate(1, 0, 0, 180); } for (int row = 0; row < 4; row++) { for (int column = 0; column < 8; column++) { Invader invader = new Invader(invaderModel, -PLAYFIELD_MAX_X / 2 + column * 2f, 0, PLAYFIELD_MIN_Z + row * 2f); invaders.add(invader); } } for (int shield = 0; shield < 3; shield++) { blocks.add(new Block(blockModel, -10 + shield * 10 - 1, 0, -2)); blocks.add(new Block(blockModel, -10 + shield * 10 - 1, 0, -3)); blocks.add(new Block(blockModel, -10 + shield * 10 + 0, 0, -3)); blocks.add(new Block(blockModel, -10 + shield * 10 + 1, 0, -3)); blocks.add(new Block(blockModel, -10 + shield * 10 + 1, 0, -2)); } }
From source file:gaia.cu9.ari.gaiaorbit.util.g3d.ModelBuilder2.java
License:Apache License
/** Adds the specified mesh part to the current node. The Mesh will be managed by the model and disposed when the model is * disposed. The resources the Material might contain are not managed, use {@link #manage(Disposable)} to add those to the * model.//from w w w. j a v a2s. c o m * @return The added MeshPart. */ public MeshPart part(final String id, final Mesh mesh, int primitiveType, final Material material) { return part(id, mesh, primitiveType, 0, mesh.getNumIndices(), material); }
From source file:gaia.cu9.ari.gaiaorbit.util.g3d.ModelBuilder2.java
License:Apache License
@Deprecated public static Model createFromMesh(final Mesh mesh, int primitiveType, final Material material) { return createFromMesh(mesh, 0, mesh.getNumIndices(), primitiveType, material); }