package org.jrenner.fps.terrain; import org.jrenner.fps.Physics; import com.badlogic.gdx.graphics.Camera; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g3d.Environment; import com.badlogic.gdx.graphics.g3d.Model; import com.badlogic.gdx.graphics.g3d.ModelBatch; import com.badlogic.gdx.graphics.g3d.ModelInstance; import com.badlogic.gdx.graphics.g3d.attributes.ColorAttribute; import com.badlogic.gdx.graphics.g3d.attributes.TextureAttribute; import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.math.collision.BoundingBox; import com.badlogic.gdx.physics.bullet.collision.btCollisionObject; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Disposable; public class TerrainChunk implements Disposable{ private static final BoundingBox box = new BoundingBox(); public Vector3 position; public Vector3 dimensions; public float radius; public ModelInstance modelInstance; public btCollisionObject body; private Array<ModelInstance> sceneObjects; public TerrainChunk() { this.sceneObjects = new Array<ModelInstance>(); } public TerrainChunk(ModelInstance model, btCollisionObject obj) { this(); this.modelInstance = model; this.body = obj; calculateBoundingBox(); } // Render a chunk public void render(ModelBatch batch, Environment env) { batch.render(modelInstance, env); for (ModelInstance m : sceneObjects) { batch.render(m, env); } } public TerrainChunk setNormalMap(Texture normal) { modelInstance.materials.get(0).set(TextureAttribute.createNormal(normal)); return this; } public TerrainChunk setSpecularColor(Color specular) { modelInstance.materials.get(0).set(ColorAttribute.createSpecular(specular)); return this; } public TerrainChunk setModelInstance (ModelInstance modelInstance) { this.modelInstance = modelInstance; calculateBoundingBox(); return this; } // TODO Add collision public TerrainChunk addStaticModel(Model model) { sceneObjects.add(new ModelInstance(model)); return this; } // TODO Add collision public TerrainChunk addStaticModel(Model model, String node) { sceneObjects.add(new ModelInstance(model, node)); return this; } private void calculateBoundingBox() { modelInstance.calculateTransforms(); modelInstance.calculateBoundingBox(box); dimensions = new Vector3(box.getDimensions()); radius = dimensions.len() / 2f; position = new Vector3(box.getCenter()); } public boolean isVisible(Camera cam) { return cam.frustum.sphereInFrustum(position, radius); } @Override public void dispose () { Physics.inst.removeBody(body); // This might be bad... modelInstance.model.dispose(); } }