1 2package com.badlogic.gdx.tests.g3d; 3 4import com.badlogic.gdx.Gdx; 5import com.badlogic.gdx.Input.Keys; 6import com.badlogic.gdx.graphics.Color; 7import com.badlogic.gdx.graphics.GL20; 8import com.badlogic.gdx.graphics.Mesh; 9import com.badlogic.gdx.graphics.Texture; 10import com.badlogic.gdx.graphics.VertexAttribute; 11import com.badlogic.gdx.graphics.VertexAttributes; 12import com.badlogic.gdx.graphics.VertexAttributes.Usage; 13import com.badlogic.gdx.graphics.g3d.Environment; 14import com.badlogic.gdx.graphics.g3d.Material; 15import com.badlogic.gdx.graphics.g3d.Model; 16import com.badlogic.gdx.graphics.g3d.ModelBatch; 17import com.badlogic.gdx.graphics.g3d.ModelInstance; 18import com.badlogic.gdx.graphics.g3d.attributes.BlendingAttribute; 19import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute; 20import com.badlogic.gdx.graphics.g3d.attributes.TextureAttribute; 21import com.badlogic.gdx.graphics.g3d.environment.DirectionalLight; 22import com.badlogic.gdx.graphics.g3d.model.Animation; 23import com.badlogic.gdx.graphics.g3d.model.Node; 24import com.badlogic.gdx.graphics.g3d.utils.AnimationController; 25import com.badlogic.gdx.graphics.g3d.utils.MeshBuilder; 26import com.badlogic.gdx.graphics.g3d.utils.MeshPartBuilder; 27import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder; 28import com.badlogic.gdx.graphics.glutils.ShapeRenderer; 29import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType; 30import com.badlogic.gdx.math.Matrix4; 31import com.badlogic.gdx.math.Quaternion; 32import com.badlogic.gdx.math.Vector3; 33import com.badlogic.gdx.utils.Array; 34import com.badlogic.gdx.utils.ObjectMap; 35import com.badlogic.gdx.utils.Pool; 36import com.badlogic.gdx.utils.StringBuilder; 37 38/** @author Xoppa */ 39public class MeshBuilderTest extends BaseG3dHudTest { 40 Model model; 41 Environment environment; 42 43 @Override 44 public void create () { 45 super.create(); 46 environment = new Environment(); 47 environment.set(new ColorAttribute(ColorAttribute.AmbientLight, 0.4f, 0.4f, 0.4f, 1.f)); 48 environment.add(new DirectionalLight().set(0.8f, 0.8f, 0.8f, -0.5f, -1.0f, -0.8f)); 49 50 modelsWindow.setVisible(false); 51 52 Texture texture = new Texture(Gdx.files.internal("data/badlogic.jpg")); 53 54 Material material = new Material(TextureAttribute.createDiffuse(texture)); 55 56 MeshBuilder meshBuilder = new MeshBuilder(); 57 meshBuilder.begin(Usage.Position | Usage.Normal | Usage.ColorPacked | Usage.TextureCoordinates, GL20.GL_TRIANGLES); 58 meshBuilder.box(1f, 1f, 1f); 59 Mesh mesh = new Mesh(true, meshBuilder.getNumVertices(), meshBuilder.getNumIndices(), meshBuilder.getAttributes()); 60 mesh = meshBuilder.end(mesh); 61 62 ModelBuilder modelBuilder = new ModelBuilder(); 63 modelBuilder.begin(); 64 modelBuilder.manage(texture); 65 66 modelBuilder.node().id = "box"; 67 MeshPartBuilder mpb = modelBuilder.part("box", GL20.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates 68 | Usage.ColorPacked, material); 69 mpb.setColor(Color.RED); 70 mpb.box(1f, 1f, 1f); 71 72 modelBuilder.node().id = "sphere"; 73 mpb = modelBuilder.part("sphere", GL20.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates 74 | Usage.ColorPacked, material); 75 mpb.sphere(2f, 2f, 2f, 10, 5); 76 77 modelBuilder.node().id = "cone"; 78 mpb = modelBuilder.part("cone", GL20.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates 79 | Usage.ColorPacked, material); 80 mpb.setVertexTransform(new Matrix4().rotate(Vector3.X, -45f)); 81 mpb.cone(2f, 3f, 1f, 8); 82 83 modelBuilder.node().id = "cylinder"; 84 mpb = modelBuilder.part("cylinder", GL20.GL_TRIANGLES, Usage.Position | Usage.Normal | Usage.TextureCoordinates 85 | Usage.ColorPacked, material); 86 mpb.setUVRange(1f, 1f, 0f, 0f); 87 mpb.cylinder(2f, 4f, 3f, 15); 88 89 modelBuilder.node().id = "mesh"; 90 mpb = modelBuilder.part("mesh", GL20.GL_TRIANGLES, mesh.getVertexAttributes(), material); 91 Matrix4 transform = new Matrix4(); 92 mpb.setVertexTransform(transform.setToTranslation(0, 2, 0)); 93 mpb.addMesh(mesh); 94 mpb.setColor(Color.BLUE); 95 mpb.setVertexTransform(transform.setToTranslation(1, 1, 0)); 96 mpb.addMesh(mesh); 97 mpb.setColor(null); 98 mpb.setVertexTransform(transform.setToTranslation(-1, 1, 0).rotate(Vector3.X, 45)); 99 mpb.addMesh(mesh); 100 mpb.setVertexTransform(transform.setToTranslation(0, 1, 1)); 101 mpb.setUVRange(0.75f, 0.75f, 0.25f, 0.25f); 102 mpb.addMesh(mesh); 103 104 model = modelBuilder.end(); 105 106 instances.add(new ModelInstance(model, new Matrix4().trn(0f, 0f, 0f), "mesh", true)); 107 instances.add(new ModelInstance(model, new Matrix4().trn(-5f, 0f, -5f), "box", true)); 108 instances.add(new ModelInstance(model, new Matrix4().trn(5f, 0f, -5f), "sphere", true)); 109 instances.add(new ModelInstance(model, new Matrix4().trn(-5f, 0f, 5f), "cone", true)); 110 instances.add(new ModelInstance(model, new Matrix4().trn(5f, 0f, 5f), "cylinder", true)); 111 } 112 113 @Override 114 protected void render (ModelBatch batch, Array<ModelInstance> instances) { 115 batch.render(instances, environment); 116 } 117 118 @Override 119 protected void onModelClicked (String name) { 120 } 121 122 @Override 123 public void dispose () { 124 super.dispose(); 125 model.dispose(); 126 } 127} 128