package org.atriaSoft.gameEngine.sample.LoxelEngine; import java.util.ArrayList; import java.util.List; import org.atriaSoft.etk.Color; import org.atriaSoft.etk.Uri; import org.atriaSoft.etk.math.Matrix4f; import org.atriaSoft.etk.math.Quaternion; import org.atriaSoft.etk.math.Transform3D; import org.atriaSoft.etk.math.Vector2f; import org.atriaSoft.etk.math.Vector3f; import org.atriaSoft.gale.Application; import org.atriaSoft.gale.Gale; import org.atriaSoft.gale.backend3d.OpenGL; import org.atriaSoft.gale.backend3d.OpenGL.Flag; import org.atriaSoft.gale.context.Context; import org.atriaSoft.gameEngine.ControlCameraPlayer; import org.atriaSoft.gameEngine.ControlCameraSimple; import org.atriaSoft.gameEngine.Entity; import org.atriaSoft.gameEngine.Environement; import org.atriaSoft.gameEngine.GameStatus; import org.atriaSoft.gameEngine.Light; import org.atriaSoft.gameEngine.Material; import org.atriaSoft.gameEngine.camera.Camera; import org.atriaSoft.gameEngine.components.ComponentGravityStatic; import org.atriaSoft.gameEngine.components.ComponentLight; import org.atriaSoft.gameEngine.components.ComponentLightSun; import org.atriaSoft.gameEngine.components.ComponentMaterial; import org.atriaSoft.gameEngine.components.ComponentPhysics; import org.atriaSoft.gameEngine.components.ComponentPlayer; import org.atriaSoft.gameEngine.components.ComponentPosition; import org.atriaSoft.gameEngine.components.ComponentPositionPlayer; import org.atriaSoft.gameEngine.components.ComponentRenderColoredStaticMesh; import org.atriaSoft.gameEngine.components.ComponentRenderTexturedMaterialsStaticMesh; import org.atriaSoft.gameEngine.components.ComponentRenderTexturedStaticMesh; import org.atriaSoft.gameEngine.components.ComponentStaticMesh; import org.atriaSoft.gameEngine.components.ComponentTexture; import org.atriaSoft.gameEngine.engines.EngineLight; import org.atriaSoft.gameEngine.map.MapVoxel; import org.atriaSoft.gameEngine.physics.PhysicBox; import org.atriaSoft.gameEngine.tools.MeshGenerator; import org.atriaSoft.gale.key.KeyKeyboard; import org.atriaSoft.gale.key.KeySpecial; import org.atriaSoft.gale.key.KeyStatus; import org.atriaSoft.gale.key.KeyType; import org.atriaSoft.gale.resource.ResourceColored3DObject; public class LoxelApplication extends Application { private Environement env; private ComponentPosition objectPosition; private Quaternion basicRotation = Quaternion.identity(); private Quaternion basicRotation2 = Quaternion.identity(); private boolean creationDone; private ControlCameraPlayer simpleControl; private ComponentPosition lightPosition; private float angleLight = 0; private MapVoxel map; private ComponentPlayer objectPlayer; // public static ComponentPosition relativeTestPos; // public static PhysicBox boxTest; public static List testPoints = new ArrayList(); public static List testPointsBox = new ArrayList(); public static List testPointsCollide = new ArrayList(); public static Vector3f testRpos; public static Quaternion testQTransfert; public static Vector3f box1HalfSize; public static Vector3f box2HalfSize; private ResourceColored3DObject debugDrawProperty; public LoxelApplication(){ creationDone = false; } @Override public void onCreate(Context _context) { // set the system global max speed ComponentPhysics.globalMaxSpeed = 3; Gale.getContext().grabPointerEvents(true, new Vector2f(0,0)); env = new Environement(); this.canDraw = true; setSize(new Vector2f(800, 600)); setTitle("Loxel sample"); map = new MapVoxel(this.env); // this.env.addEngine(map); // map.init(); // simple sun to have a global light ... Entity globalGravity = new Entity(this.env); globalGravity.addComponent(new ComponentGravityStatic(new Vector3f(0,0,-1))); env.addEntity(globalGravity); // simple sun to have a global light ... Entity sun = new Entity(this.env); sun.addComponent(new ComponentPosition(new Transform3D(new Vector3f(1000,1000,1000)))); sun.addComponent(new ComponentLightSun(new Light(new Vector3f(0.4f,0.4f,0.4f), new Vector3f(0,0,0), new Vector3f(0.8f,0,0)))); env.addEntity(sun); // add a cube to show where in the light ... Entity localLight = new Entity(this.env); lightPosition = new ComponentPosition(new Transform3D(new Vector3f(-10,-10,17))); // localLight.addComponent(lightPosition); // localLight.addComponent(new ComponentStaticMesh(new Uri("RES", "cube.obj"))); // localLight.addComponent(new ComponentTexture(new Uri("RES", "grass.png"))); // localLight.addComponent(new ComponentLight(new Light(new Vector3f(0,1,0), new Vector3f(0,0,0), new Vector3f(0.8f,0.03f,0.002f)))); // localLight.addComponent(new ComponentRenderTexturedStaticMesh( // new Uri("DATA", "basic.vert"), // new Uri("DATA", "basic.frag"))); // env.addEntity(localLight); { // add a cube to test collision ... Entity localBox = new Entity(this.env); localBox.addComponent(new ComponentPosition(new Transform3D(new Vector3f(-2,-2,14)))); localBox.addComponent(new ComponentStaticMesh(new Uri("RES", "cube-one.obj"))); localBox.addComponent(new ComponentTexture(new Uri("DATA", "blocks/clay.png"))); localBox.addComponent(new ComponentLight(new Light(new Vector3f(0,1,0), new Vector3f(0,0,0), new Vector3f(0.8f,0.03f,0.002f)))); localBox.addComponent(new ComponentRenderTexturedStaticMesh( new Uri("DATA", "basic.vert"), new Uri("DATA", "basic.frag"))); ComponentPhysics physics2 = new ComponentPhysics(true); PhysicBox box2 = new PhysicBox(); box2.setSize(new Vector3f(1,1,1)); box2.setOrigin(new Vector3f(0,0,0)); box2.setMass(1); physics2.addShape(box2); localBox.addComponent(physics2); env.addEntity(localBox); } { // add a cube to test collision ... Entity localBox = new Entity(this.env); localBox.addComponent(new ComponentPosition(new Transform3D(new Vector3f(2,-2,12.5f)))); localBox.addComponent(new ComponentStaticMesh(new Uri("RES", "cube-one.obj"))); localBox.addComponent(new ComponentTexture(new Uri("DATA", "blocks/clay.png"))); localBox.addComponent(new ComponentLight(new Light(new Vector3f(0,1,0), new Vector3f(0,0,0), new Vector3f(0.8f,0.03f,0.002f)))); localBox.addComponent(new ComponentRenderTexturedStaticMesh( new Uri("DATA", "basic.vert"), new Uri("DATA", "basic.frag"))); ComponentPhysics physics2 = new ComponentPhysics(true); PhysicBox box2 = new PhysicBox(); box2.setSize(new Vector3f(1,1,1)); box2.setOrigin(new Vector3f(0,0,0)); box2.setMass(1); physics2.addShape(box2); localBox.addComponent(physics2); env.addEntity(localBox); } { // add a cube to test collision ... Entity localBox = new Entity(this.env); localBox.addComponent(new ComponentPosition(new Transform3D(new Vector3f(-2,2,14.5f)))); localBox.addComponent(new ComponentStaticMesh(new Uri("RES", "cube-one.obj"))); localBox.addComponent(new ComponentTexture(new Uri("DATA", "blocks/clay.png"))); localBox.addComponent(new ComponentRenderTexturedStaticMesh( new Uri("DATA", "basic.vert"), new Uri("DATA", "basic.frag"))); ComponentPhysics physics2 = new ComponentPhysics(true); PhysicBox box2 = new PhysicBox(); box2.setSize(new Vector3f(1,1,1)); box2.setOrigin(new Vector3f(0,0,0)); box2.setMass(1); physics2.addShape(box2); localBox.addComponent(physics2); env.addEntity(localBox); } { // add a cube to test collision ... Entity localBox = new Entity(this.env); localBox.addComponent(new ComponentPosition(new Transform3D(new Vector3f(-5,-5,14)))); localBox.addComponent(new ComponentStaticMesh(new Uri("RES", "cube-one.obj"))); localBox.addComponent(new ComponentTexture(new Uri("DATA", "blocks/clay.png"))); localBox.addComponent(new ComponentRenderTexturedStaticMesh( new Uri("DATA", "basic.vert"), new Uri("DATA", "basic.frag"))); ComponentPhysics physics2 = new ComponentPhysics(true); PhysicBox box2 = new PhysicBox(); box2.setSize(new Vector3f(4,4,4)); box2.setOrigin(new Vector3f(0,0,0)); box2.setMass(1); physics2.addShape(box2); localBox.addComponent(physics2); env.addEntity(localBox); } { // add a cube to test collision ... Entity localBox = new Entity(this.env); Quaternion transform = new Quaternion(0.5f,0.2f,0.4f,1); transform.normalize(); localBox.addComponent(new ComponentPosition(new Transform3D(new Vector3f(5,-5,14),transform))); localBox.addComponent(new ComponentStaticMesh(new Uri("RES", "cube-one.obj"))); localBox.addComponent(new ComponentTexture(new Uri("DATA", "blocks/clay.png"))); localBox.addComponent(new ComponentRenderTexturedStaticMesh( new Uri("DATA", "basic.vert"), new Uri("DATA", "basic.frag"))); ComponentPhysics physics2 = new ComponentPhysics(true); PhysicBox box2 = new PhysicBox(); box2.setSize(new Vector3f(1,1,1)); box2.setOrigin(new Vector3f(0,0,0)); box2.setMass(1); physics2.addShape(box2); localBox.addComponent(physics2); env.addEntity(localBox); } // { // // add a cube to test collision ... // Entity localBox = new Entity(this.env); // relativeTestPos = new ComponentPosition(new Transform3D(new Vector3f(0,0,14),new Quaternion(0.5f,0.2f,0.4f,1))); // localBox.addComponent(relativeTestPos); //// localBox.addComponent(new ComponentStaticMesh(new Uri("RES", "cube-one.obj"))); //// localBox.addComponent(new ComponentTexture(new Uri("DATA", "blocks/clay.png"))); //// localBox.addComponent(new ComponentLight(new Light(new Vector3f(0,1,0), new Vector3f(0,0,0), new Vector3f(0.8f,0.03f,0.002f)))); //// localBox.addComponent(new ComponentRenderTexturedStaticMesh( //// new Uri("DATA", "basic.vert"), //// new Uri("DATA", "basic.frag"))); // ComponentPhysics physics2 = new ComponentPhysics(true); // boxTest = new PhysicBox(); // boxTest.setSize(new Vector3f(1,1,1)); // boxTest.setOrigin(new Vector3f(0,0,0)); // boxTest.setMass(1); // physics2.addShape(boxTest); // localBox.addComponent(physics2); // env.addEntity(localBox); // } // { // Entity localBox = new Entity(this.env); // localBox.addComponent(new ComponentPosition(new Transform3D(new Vector3f(0,0,14)))); // localBox.addComponent(new ComponentStaticMesh(new Uri("RES", "cube-one.obj"))); // localBox.addComponent(new ComponentTexture(new Uri("DATA", "blocks/clay.png"))); // localBox.addComponent(new ComponentRenderTexturedStaticMesh( // new Uri("DATA", "basic.vert"), // new Uri("DATA", "basic.frag"))); // env.addEntity(localBox); // } Entity gird = new Entity(this.env); gird.addComponent(new ComponentPosition(new Transform3D(new Vector3f(0,0,13)))); gird.addComponent(new ComponentStaticMesh(MeshGenerator.createGrid(5))); gird.addComponent(new ComponentRenderColoredStaticMesh( new Uri("DATA_EGE", "wireColor.vert"), new Uri("DATA_EGE", "wireColor.frag"))); env.addEntity(gird); Entity player = new Entity(this.env); objectPosition = new ComponentPositionPlayer(new Transform3D(new Vector3f(5,5,13))); player.addComponent(objectPosition); objectPlayer = new ComponentPlayer(); player.addComponent(objectPlayer); player.addComponent(new ComponentMaterial(new Material())); //player.addComponent(new ComponentStaticMesh(new Uri("RES", "person.obj"))); player.addComponent(new ComponentStaticMesh(new Uri("RES", "person_-yfw_zup.obj"))); player.addComponent(new ComponentTexture(new Uri("RES", "playerTexture.png"))); player.addComponent(new ComponentRenderTexturedMaterialsStaticMesh( new Uri("DATA", "basicMaterial.vert"), new Uri("DATA", "basicMaterial.frag"), (EngineLight)env.getEngine(EngineLight.ENGINE_NAME))); ComponentPhysics physics = new ComponentPhysics(true); PhysicBox box = new PhysicBox(); box.setSize(new Vector3f(0.6f,0.6f,1.8f)); box.setOrigin(new Vector3f(0,0,0.9f)); box.setMass(1); physics.addShape(box); player.addComponent(physics); env.addEntity(player); Camera mainView = new Camera(); env.addCamera("default", mainView); mainView.setPitch((float)Math.PI*-0.25f); mainView.setPosition(new Vector3f(0,-5,5)); this.simpleControl = new ControlCameraPlayer(mainView, player); env.addControlInterface(simpleControl); // start the engine. env.setPropertyStatus(GameStatus.gameStart); basicRotation.setEulerAngles(new Vector3f(0.005f,0.005f,0.01f)); basicRotation2.setEulerAngles(new Vector3f(0.003f,0.01f,0.001f)); // ready to let Gale & Ege manage the display Log.info("==> Init APPL (END)"); creationDone = true; } @Override public void onRegenerateDisplay(Context context) { //Log.verbose("Regenerate Gale Application"); if (this.creationDone == false) { return; } angleLight += 0.01; lightPosition.getTransform().getPosition().x = 5 + (float)Math.cos(angleLight) * 7.0f; lightPosition.getTransform().getPosition().y = 5 + (float)Math.sin(angleLight) * 7.0f; env.periodicCall(); markDrawingIsNeeded(); } @Override public void onDraw(Context _context) { //Log.info("==> appl Draw ..."); Vector2f size = getSize(); if (this.creationDone == false) { OpenGL.setViewPort(new Vector2f(0,0), size); Color bgColor = new Color(0.8f, 0.5f, 0.5f, 1.0f); OpenGL.clearColor(bgColor); return; } // Store openGl context. OpenGL.push(); // set projection matrix: Matrix4f tmpProjection = Matrix4f.createMatrixPerspective(3.14f*0.5f, getAspectRatio(), 0.1f, 50000); OpenGL.setMatrix(tmpProjection); // set the basic openGL view port: (Draw in all the windows...) OpenGL.setViewPort(new Vector2f(0,0), size); // clear background Color bgColor = new Color(0.18f, 0.43f, 0.95f, 1.0f); OpenGL.clearColor(bgColor); // real clear request: OpenGL.clear(OpenGL.ClearFlag.clearFlag_colorBuffer); OpenGL.clear(OpenGL.ClearFlag.clearFlag_depthBuffer); OpenGL.enable(Flag.flag_depthTest); env.render(20, "default"); if (this.debugDrawProperty == null) { debugDrawProperty = ResourceColored3DObject.create(); } // now render the point test collision ... for (int iii=0; iii