Compare commits
2 Commits
2aee7077a9
...
a9899d82e7
Author | SHA1 | Date | |
---|---|---|---|
a9899d82e7 | |||
8afc38178a |
8
.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
/bin/
|
||||||
|
hs_err_*
|
||||||
|
|
||||||
|
*.bck
|
||||||
|
*~
|
||||||
|
tmp/
|
||||||
|
*.part
|
||||||
|
|
46
res/cube-one.obj
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# Blender v2.82 (sub 7) OBJ File: 'cube.blend'
|
||||||
|
# www.blender.org
|
||||||
|
mtllib cube.mtl
|
||||||
|
o Cube
|
||||||
|
v 0.499999 0.499999 -0.499999
|
||||||
|
v 0.499999 -0.499999 -0.499999
|
||||||
|
v 0.499999 0.499999 0.499999
|
||||||
|
v 0.499999 -0.499999 0.499999
|
||||||
|
v -0.499999 0.499999 -0.499999
|
||||||
|
v -0.499999 -0.499999 -0.499999
|
||||||
|
v -0.499999 0.499999 0.499999
|
||||||
|
v -0.499999 -0.499999 0.499999
|
||||||
|
vt 0.875000 0.500000
|
||||||
|
vt 0.625000 0.750000
|
||||||
|
vt 0.625000 0.500000
|
||||||
|
vt 0.375000 1.000000
|
||||||
|
vt 0.375000 0.750000
|
||||||
|
vt 0.625000 0.000000
|
||||||
|
vt 0.375000 0.250000
|
||||||
|
vt 0.375000 0.000000
|
||||||
|
vt 0.375000 0.500000
|
||||||
|
vt 0.125000 0.750000
|
||||||
|
vt 0.125000 0.500000
|
||||||
|
vt 0.625000 0.250000
|
||||||
|
vt 0.875000 0.750000
|
||||||
|
vt 0.625000 1.000000
|
||||||
|
vn 0.0000 1.0000 0.0000
|
||||||
|
vn 0.0000 0.0000 1.0000
|
||||||
|
vn -1.0000 0.0000 0.0000
|
||||||
|
vn 0.0000 -1.0000 0.0000
|
||||||
|
vn 1.0000 0.0000 0.0000
|
||||||
|
vn 0.0000 0.0000 -1.0000
|
||||||
|
usemtl Material
|
||||||
|
s off
|
||||||
|
f 5/1/1 3/2/1 1/3/1
|
||||||
|
f 3/2/2 8/4/2 4/5/2
|
||||||
|
f 7/6/3 6/7/3 8/8/3
|
||||||
|
f 2/9/4 8/10/4 6/11/4
|
||||||
|
f 1/3/5 4/5/5 2/9/5
|
||||||
|
f 5/12/6 2/9/6 6/7/6
|
||||||
|
f 5/1/1 7/13/1 3/2/1
|
||||||
|
f 3/2/2 7/14/2 8/4/2
|
||||||
|
f 7/6/3 5/12/3 6/7/3
|
||||||
|
f 2/9/4 4/5/4 8/10/4
|
||||||
|
f 1/3/5 3/2/5 4/5/5
|
||||||
|
f 5/12/6 1/3/6 2/9/6
|
@ -8,12 +8,13 @@ import org.atriaSoft.gale.Log;
|
|||||||
import org.atriaSoft.gale.context.Context;
|
import org.atriaSoft.gale.context.Context;
|
||||||
|
|
||||||
public abstract class Resource {
|
public abstract class Resource {
|
||||||
|
protected static String NO_NAME_RESOURCE = "---";
|
||||||
protected static int MAXRESOURCELEVEL = 5;
|
protected static int MAXRESOURCELEVEL = 5;
|
||||||
private static int idGenerated = 10;
|
private static int idGenerated = 10;
|
||||||
protected long uid = -1; //!< unique ID definition
|
protected long uid = -1; //!< unique ID definition
|
||||||
protected int count = 1;
|
protected int count = 1;
|
||||||
protected int resourceLevel = MAXRESOURCELEVEL-1; //!< Level of the resource ==> for update priority [0..5] 0 must be update first.
|
protected int resourceLevel = MAXRESOURCELEVEL-1; //!< Level of the resource ==> for update priority [0..5] 0 must be update first.
|
||||||
protected String name; //!< name of the resource ...
|
protected String name = NO_NAME_RESOURCE; //!< name of the resource ...
|
||||||
protected boolean resourceHasBeenInit = false; //!< Know if the init function has bben called
|
protected boolean resourceHasBeenInit = false; //!< Know if the init function has bben called
|
||||||
protected List<String> listType = new ArrayList<String>();
|
protected List<String> listType = new ArrayList<String>();
|
||||||
/**
|
/**
|
||||||
|
@ -161,10 +161,18 @@ public class ResourceManager {
|
|||||||
public Resource localKeep(String filename) {
|
public Resource localKeep(String filename) {
|
||||||
Log.verbose("KEEP (DEFAULT) : file : '" + filename + "' in " + this.resourceList.size() + " resources");
|
Log.verbose("KEEP (DEFAULT) : file : '" + filename + "' in " + this.resourceList.size() + " resources");
|
||||||
for (Resource it : this.resourceList) {
|
for (Resource it : this.resourceList) {
|
||||||
if (it != null) {
|
if (it == null) {
|
||||||
if (it.getName() == filename) {
|
continue;
|
||||||
return it;
|
}
|
||||||
}
|
if (it.getName() == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
//Log.verbose("compare : " + filename + " ==???== " + it.getName());
|
||||||
|
if (it.getName().contentEquals(Resource.NO_NAME_RESOURCE)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (it.getName().contentEquals(filename)) {
|
||||||
|
return it;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
@ -176,7 +176,7 @@ public class ResourceTexture extends Resource {
|
|||||||
}
|
}
|
||||||
GL13.glActiveTexture(textureIdBinding[idTexture]);
|
GL13.glActiveTexture(textureIdBinding[idTexture]);
|
||||||
GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.texId);
|
GL11.glBindTexture(GL11.GL_TEXTURE_2D, this.texId);
|
||||||
if (dataColorSpace == TextureColorMode.rgba) {
|
if (dataColorSpace == TextureColorMode.rgb) {
|
||||||
OpenGL.enable(OpenGL.Flag.flag_cullFace);
|
OpenGL.enable(OpenGL.Flag.flag_cullFace);
|
||||||
OpenGL.enable(OpenGL.Flag.flag_back);
|
OpenGL.enable(OpenGL.Flag.flag_back);
|
||||||
}
|
}
|
||||||
@ -185,7 +185,7 @@ public class ResourceTexture extends Resource {
|
|||||||
if (this.loaded == false) {
|
if (this.loaded == false) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (dataColorSpace == TextureColorMode.rgba) {
|
if (dataColorSpace == TextureColorMode.rgb) {
|
||||||
OpenGL.disable(OpenGL.Flag.flag_cullFace);
|
OpenGL.disable(OpenGL.Flag.flag_cullFace);
|
||||||
OpenGL.disable(OpenGL.Flag.flag_back);
|
OpenGL.disable(OpenGL.Flag.flag_back);
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@ import org.atriaSoft.gale.key.KeyType;
|
|||||||
import org.atriaSoft.gameEngine.camera.Camera;
|
import org.atriaSoft.gameEngine.camera.Camera;
|
||||||
import org.atriaSoft.gameEngine.engines.EngineRender;
|
import org.atriaSoft.gameEngine.engines.EngineRender;
|
||||||
import org.atriaSoft.gameEngine.engines.EngineAI;
|
import org.atriaSoft.gameEngine.engines.EngineAI;
|
||||||
|
import org.atriaSoft.gameEngine.engines.EngineDynamicMeshs;
|
||||||
import org.atriaSoft.gameEngine.engines.EngineLight;
|
import org.atriaSoft.gameEngine.engines.EngineLight;
|
||||||
import org.atriaSoft.gameEngine.engines.EngineParticle;
|
import org.atriaSoft.gameEngine.engines.EngineParticle;
|
||||||
import org.atriaSoft.gameEngine.engines.EnginePhysics;
|
import org.atriaSoft.gameEngine.engines.EnginePhysics;
|
||||||
@ -26,7 +27,7 @@ public class Environement {
|
|||||||
public Signal<Float> signalPlayTimeChange = new Signal<Float>();
|
public Signal<Float> signalPlayTimeChange = new Signal<Float>();
|
||||||
private GameStatus propertyStatus = GameStatus.gameStop; // !< the display is running (not in pause)
|
private GameStatus propertyStatus = GameStatus.gameStop; // !< the display is running (not in pause)
|
||||||
public float propertyRatio = 1.0f; // !< Speed ratio
|
public float propertyRatio = 1.0f; // !< Speed ratio
|
||||||
protected List<Engine> engine = new ArrayList<Engine>(); // !< EGE sub engine interface (like physique, rendering,
|
protected List<Engine> engines = new ArrayList<Engine>(); // !< EGE sub engine interface (like physique, rendering,
|
||||||
// audio, ...).
|
// audio, ...).
|
||||||
private List<Entity> listEntity = new ArrayList<Entity>(); // !< List of all entity added in the Game
|
private List<Entity> listEntity = new ArrayList<Entity>(); // !< List of all entity added in the Game
|
||||||
List<ControlInterface> controls = new ArrayList<ControlInterface>();
|
List<ControlInterface> controls = new ArrayList<ControlInterface>();
|
||||||
@ -42,6 +43,7 @@ public class Environement {
|
|||||||
// we add the 4 classical engines (the order is used to the global rendering cycle ...
|
// we add the 4 classical engines (the order is used to the global rendering cycle ...
|
||||||
addEngine(new EnginePhysics(this));
|
addEngine(new EnginePhysics(this));
|
||||||
addEngine(new EngineAI(this));
|
addEngine(new EngineAI(this));
|
||||||
|
addEngine(new EngineDynamicMeshs(this));
|
||||||
addEngine(new EngineRender(this));
|
addEngine(new EngineRender(this));
|
||||||
addEngine(new EngineParticle(this));
|
addEngine(new EngineParticle(this));
|
||||||
addEngine(new EngineLight(this));
|
addEngine(new EngineLight(this));
|
||||||
@ -81,31 +83,31 @@ public class Environement {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// check if not exist
|
// check if not exist
|
||||||
for (Engine it : engine) {
|
for (Engine it : engines) {
|
||||||
if (it.getType().contains(ref.getType())) {
|
if (it.getType().contains(ref.getType())) {
|
||||||
it = ref;
|
it = ref;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// add it at the end ...
|
// add it at the end ...
|
||||||
engine.add(ref);
|
engines.add(ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void rmEngine(Engine ref) {
|
public void rmEngine(Engine ref) {
|
||||||
engine.remove(ref);
|
engines.remove(ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void rmEngine(String type) {
|
public void rmEngine(String type) {
|
||||||
for (Engine it : engine) {
|
for (Engine it : engines) {
|
||||||
if (it.getType().contains(type)) {
|
if (it.getType().contains(type)) {
|
||||||
engine.remove(it);
|
engines.remove(it);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Engine getEngine(String type) {
|
public Engine getEngine(String type) {
|
||||||
for (Engine it : engine) {
|
for (Engine it : engines) {
|
||||||
if (it.getType().contains(type)) {
|
if (it.getType().contains(type)) {
|
||||||
return it;
|
return it;
|
||||||
}
|
}
|
||||||
@ -115,7 +117,7 @@ public class Environement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void engineComponentRemove(Component ref) {
|
public void engineComponentRemove(Component ref) {
|
||||||
for (Engine it: engine) {
|
for (Engine it: engines) {
|
||||||
if (it.getType().contentEquals(ref.getType())) {
|
if (it.getType().contentEquals(ref.getType())) {
|
||||||
it.componentRemove(ref);
|
it.componentRemove(ref);
|
||||||
return;
|
return;
|
||||||
@ -124,7 +126,7 @@ public class Environement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void engineComponentAdd(Component ref) {
|
public void engineComponentAdd(Component ref) {
|
||||||
for (Engine it: engine) {
|
for (Engine it: engines) {
|
||||||
if (it.getType().contentEquals(ref.getType())) {
|
if (it.getType().contentEquals(ref.getType())) {
|
||||||
it.componentAdd(ref);
|
it.componentAdd(ref);
|
||||||
return;
|
return;
|
||||||
@ -140,7 +142,7 @@ public class Environement {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
OpenGL.setCameraMatrix(camera.getConvertionMatrix());
|
OpenGL.setCameraMatrix(camera.getConvertionMatrix());
|
||||||
for (Engine it: engine) {
|
for (Engine it: engines) {
|
||||||
//Log.verbose(" render: " + it.getType());
|
//Log.verbose(" render: " + it.getType());
|
||||||
it.render(deltaMilli, camera);
|
it.render(deltaMilli, camera);
|
||||||
}
|
}
|
||||||
@ -408,6 +410,8 @@ public class Environement {
|
|||||||
EventTime event = new EventTime(lastCallTime, lastCallTime-startTime, lastCallTime-lastUpdate, lastCallTime-lastUpdate);
|
EventTime event = new EventTime(lastCallTime, lastCallTime-startTime, lastCallTime-lastUpdate, lastCallTime-lastUpdate);
|
||||||
for (ControlInterface elem : controls) {
|
for (ControlInterface elem : controls) {
|
||||||
elem.periodicCall(event);
|
elem.periodicCall(event);
|
||||||
|
}for (Engine engine : engines) {
|
||||||
|
engine.update((lastCallTime-lastUpdate)/100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,65 @@
|
|||||||
|
package org.atriaSoft.gameEngine.components;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.atriaSoft.etk.Uri;
|
||||||
|
import org.atriaSoft.gameEngine.Component;
|
||||||
|
import org.atriaSoft.gameEngine.engines.EngineDynamicMeshs;
|
||||||
|
import org.atriaSoft.gameEngine.resource.ResourceStaticMesh;
|
||||||
|
import org.atriaSoft.gameEngine.resource.ResourceStaticMeshObj;
|
||||||
|
|
||||||
|
public class ComponentDynamicMeshs extends Component {
|
||||||
|
protected Map<String, ResourceStaticMesh> meshs = new HashMap<String, ResourceStaticMesh>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return EngineDynamicMeshs.ENGINE_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ComponentDynamicMeshs() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> getKeys() {
|
||||||
|
return meshs.keySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMesh(String name, ResourceStaticMesh mesh) {
|
||||||
|
this.meshs.put(name, mesh);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResourceStaticMesh getMesh(String name) {
|
||||||
|
return meshs.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void bindForRendering(String name) {
|
||||||
|
ResourceStaticMesh mesh = meshs.get(name);
|
||||||
|
if (mesh == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mesh.bindForRendering();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unBindForRendering(String name) {
|
||||||
|
ResourceStaticMesh mesh = meshs.get(name);
|
||||||
|
if (mesh == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mesh.unBindForRendering();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void render(String name) {
|
||||||
|
ResourceStaticMesh mesh = meshs.get(name);
|
||||||
|
if (mesh == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mesh.render();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update(float timeStep) {}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
16
src/org/atriaSoft/gameEngine/components/ComponentMap.java
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package org.atriaSoft.gameEngine.components;
|
||||||
|
|
||||||
|
import org.atriaSoft.gameEngine.Component;
|
||||||
|
import org.atriaSoft.gameEngine.engines.EngineMap;
|
||||||
|
|
||||||
|
public class ComponentMap extends Component {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return EngineMap.ENGINE_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void update(float timeStep) {};
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package org.atriaSoft.gameEngine.components;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.atriaSoft.gameEngine.Component;
|
||||||
|
import org.atriaSoft.gameEngine.Material;
|
||||||
|
|
||||||
|
public class ComponentMaterials extends Component {
|
||||||
|
// the material is not a resource, it can change in time... with AI or selection...
|
||||||
|
private Map<String, Material> materials = new HashMap<String, Material>();
|
||||||
|
|
||||||
|
public ComponentMaterials(Material material) {
|
||||||
|
super();
|
||||||
|
|
||||||
|
}
|
||||||
|
public ComponentMaterials() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return "materials";
|
||||||
|
}
|
||||||
|
public Material getMaterial(String name) {
|
||||||
|
return materials.get(name);
|
||||||
|
}
|
||||||
|
public void setMaterial(String name, Material material) {
|
||||||
|
this.materials.put(name, material);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -18,4 +18,6 @@ public abstract class ComponentRender extends Component {
|
|||||||
return this.propertyDebugNormal;
|
return this.propertyDebugNormal;
|
||||||
}
|
}
|
||||||
public abstract void render();
|
public abstract void render();
|
||||||
|
public void update(float timeStep) {};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,115 @@
|
|||||||
|
package org.atriaSoft.gameEngine.components;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.atriaSoft.etk.Uri;
|
||||||
|
import org.atriaSoft.etk.math.Matrix4f;
|
||||||
|
import org.atriaSoft.etk.math.Vector3f;
|
||||||
|
import org.atriaSoft.gale.backend3d.OpenGL;
|
||||||
|
import org.atriaSoft.gale.resource.ResourceProgram;
|
||||||
|
import org.atriaSoft.gameEngine.Component;
|
||||||
|
import org.atriaSoft.gameEngine.Light;
|
||||||
|
import org.atriaSoft.gameEngine.Material;
|
||||||
|
import org.atriaSoft.gameEngine.engines.EngineLight;
|
||||||
|
|
||||||
|
public class ComponentRenderTexturedMaterialsDynamicMeshs extends ComponentRender {
|
||||||
|
private static final int numberOfLight = 8;
|
||||||
|
ComponentDynamicMeshs meshs = null;
|
||||||
|
ComponentTextures textures = null;
|
||||||
|
ComponentMaterials materials = null;
|
||||||
|
ComponentPosition position = null;
|
||||||
|
ResourceProgram program = null;
|
||||||
|
EngineLight lightEngine;
|
||||||
|
private int GLMatrixTransformation;
|
||||||
|
private int GLMatrixProjection;
|
||||||
|
private int GLMatrixView;
|
||||||
|
private int GLambientFactor;
|
||||||
|
private int GLdiffuseFactor;
|
||||||
|
private int GLspecularFactor;
|
||||||
|
private int GLshininess;
|
||||||
|
private GlLightIndex[] GLlights;
|
||||||
|
|
||||||
|
public ComponentRenderTexturedMaterialsDynamicMeshs(Uri vertexShader, Uri fragmentShader, EngineLight lightEngine) {
|
||||||
|
this.lightEngine = lightEngine;
|
||||||
|
this.program = ResourceProgram.create(vertexShader, fragmentShader);
|
||||||
|
if (this.program != null) {
|
||||||
|
this.GLMatrixTransformation = this.program.getUniform("in_matrixTransformation");
|
||||||
|
this.GLMatrixProjection = this.program.getUniform("in_matrixProjection");
|
||||||
|
this.GLMatrixView = this.program.getUniform("in_matrixView");
|
||||||
|
this.GLambientFactor = this.program.getUniform("in_material.ambientFactor");
|
||||||
|
this.GLdiffuseFactor = this.program.getUniform("in_material.diffuseFactor");
|
||||||
|
this.GLspecularFactor = this.program.getUniform("in_material.specularFactor");
|
||||||
|
this.GLshininess = this.program.getUniform("in_material.shininess");
|
||||||
|
this.GLlights = new GlLightIndex[numberOfLight];
|
||||||
|
for (int iii=0; iii<numberOfLight; iii++) {
|
||||||
|
int color = this.program.getUniform("in_lights[" + iii + "].color");
|
||||||
|
int position = this.program.getUniform("in_lights[" + iii + "].position");
|
||||||
|
int attenuation = this.program.getUniform("in_lights[" + iii + "].attenuation");
|
||||||
|
this.GLlights[iii] = new GlLightIndex(color, position, attenuation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void addFriendComponent(Component component) {
|
||||||
|
if (component.getType().contentEquals("dynamic-meshs")) {
|
||||||
|
meshs = (ComponentDynamicMeshs)component;
|
||||||
|
}
|
||||||
|
if (component.getType().contentEquals("textures")) {
|
||||||
|
textures = (ComponentTextures)component;
|
||||||
|
}
|
||||||
|
if (component.getType().contentEquals("materials")) {
|
||||||
|
materials = (ComponentMaterials)component;
|
||||||
|
}
|
||||||
|
if (component.getType().contentEquals("position")) {
|
||||||
|
position = (ComponentPosition)component;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void removeFriendComponent(Component component) {
|
||||||
|
// nothing to do.
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void render() {
|
||||||
|
this.program.use();
|
||||||
|
Light[] lights = this.lightEngine.getNearest(position.getTransform().getPosition());
|
||||||
|
Matrix4f projectionMatrix = OpenGL.getMatrix();
|
||||||
|
Matrix4f viewMatrix = OpenGL.getCameraMatrix();
|
||||||
|
Matrix4f transformationMatrix = position.getTransform().getOpenGLMatrix();
|
||||||
|
Set<String> keys = this.meshs.getKeys();
|
||||||
|
|
||||||
|
for (int iii=0; iii<numberOfLight; iii++) {
|
||||||
|
if (lights[iii] != null) {
|
||||||
|
this.program.uniformVector(this.GLlights[iii].GLposition, lights[iii].getPositionDelta());
|
||||||
|
this.program.uniformVector(this.GLlights[iii].GLcolor, lights[iii].getColor());
|
||||||
|
this.program.uniformVector(this.GLlights[iii].GLattenuation, lights[iii].getAttenuation());
|
||||||
|
} else {
|
||||||
|
this.program.uniformVector(this.GLlights[iii].GLposition, new Vector3f(0,0,0));
|
||||||
|
this.program.uniformVector(this.GLlights[iii].GLcolor, new Vector3f(0,0,0));
|
||||||
|
this.program.uniformVector(this.GLlights[iii].GLattenuation, new Vector3f(1,0,0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.program.uniformMatrix(this.GLMatrixView, viewMatrix);
|
||||||
|
this.program.uniformMatrix(this.GLMatrixProjection, projectionMatrix);
|
||||||
|
// Change the position for each element with the same pipeline you need to render ...
|
||||||
|
this.program.uniformMatrix(this.GLMatrixTransformation, transformationMatrix);
|
||||||
|
|
||||||
|
for (String key : keys) {
|
||||||
|
this.meshs.bindForRendering(key);
|
||||||
|
this.textures.bindForRendering(key);
|
||||||
|
Material mat = this.materials.getMaterial(key);
|
||||||
|
this.program.uniformVector(GLambientFactor, mat.getAmbientFactor());
|
||||||
|
this.program.uniformVector(GLdiffuseFactor, mat.getDiffuseFactor());
|
||||||
|
this.program.uniformVector(GLspecularFactor, mat.getSpecularFactor());
|
||||||
|
this.program.uniformFloat(GLshininess, mat.getShininess());
|
||||||
|
// update of flags is done asynchronously ==> need update before drawing...
|
||||||
|
OpenGL.updateAllFlags();
|
||||||
|
// Request the draw all the elements:
|
||||||
|
this.meshs.render(key);
|
||||||
|
this.textures.unBindForRendering(key);
|
||||||
|
this.meshs.unBindForRendering(key);
|
||||||
|
}
|
||||||
|
this.program.unUse();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -9,16 +9,6 @@ import org.atriaSoft.gameEngine.Component;
|
|||||||
import org.atriaSoft.gameEngine.Light;
|
import org.atriaSoft.gameEngine.Light;
|
||||||
import org.atriaSoft.gameEngine.Material;
|
import org.atriaSoft.gameEngine.Material;
|
||||||
import org.atriaSoft.gameEngine.engines.EngineLight;
|
import org.atriaSoft.gameEngine.engines.EngineLight;
|
||||||
class GlLightIndex {
|
|
||||||
int GLcolor;
|
|
||||||
int GLposition;
|
|
||||||
int GLattenuation;
|
|
||||||
public GlLightIndex(int gLcolor, int gLposition, int gLattenuation) {
|
|
||||||
GLcolor = gLcolor;
|
|
||||||
GLposition = gLposition;
|
|
||||||
GLattenuation = gLattenuation;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public class ComponentRenderTexturedMaterialsStaticMesh extends ComponentRender {
|
public class ComponentRenderTexturedMaterialsStaticMesh extends ComponentRender {
|
||||||
private static final int numberOfLight = 8;
|
private static final int numberOfLight = 8;
|
||||||
ComponentStaticMesh mesh = null;
|
ComponentStaticMesh mesh = null;
|
||||||
|
@ -0,0 +1,115 @@
|
|||||||
|
package org.atriaSoft.gameEngine.components;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.atriaSoft.etk.Uri;
|
||||||
|
import org.atriaSoft.etk.math.Matrix4f;
|
||||||
|
import org.atriaSoft.etk.math.Vector3f;
|
||||||
|
import org.atriaSoft.gale.backend3d.OpenGL;
|
||||||
|
import org.atriaSoft.gale.resource.ResourceProgram;
|
||||||
|
import org.atriaSoft.gameEngine.Component;
|
||||||
|
import org.atriaSoft.gameEngine.Light;
|
||||||
|
import org.atriaSoft.gameEngine.Material;
|
||||||
|
import org.atriaSoft.gameEngine.engines.EngineLight;
|
||||||
|
|
||||||
|
public class ComponentRenderTexturedMaterialsStaticMeshs extends ComponentRender {
|
||||||
|
private static final int numberOfLight = 8;
|
||||||
|
ComponentStaticMeshs meshs = null;
|
||||||
|
ComponentTextures textures = null;
|
||||||
|
ComponentMaterials materials = null;
|
||||||
|
ComponentPosition position = null;
|
||||||
|
ResourceProgram program = null;
|
||||||
|
EngineLight lightEngine;
|
||||||
|
private int GLMatrixTransformation;
|
||||||
|
private int GLMatrixProjection;
|
||||||
|
private int GLMatrixView;
|
||||||
|
private int GLambientFactor;
|
||||||
|
private int GLdiffuseFactor;
|
||||||
|
private int GLspecularFactor;
|
||||||
|
private int GLshininess;
|
||||||
|
private GlLightIndex[] GLlights;
|
||||||
|
|
||||||
|
public ComponentRenderTexturedMaterialsStaticMeshs(Uri vertexShader, Uri fragmentShader, EngineLight lightEngine) {
|
||||||
|
this.lightEngine = lightEngine;
|
||||||
|
this.program = ResourceProgram.create(vertexShader, fragmentShader);
|
||||||
|
if (this.program != null) {
|
||||||
|
this.GLMatrixTransformation = this.program.getUniform("in_matrixTransformation");
|
||||||
|
this.GLMatrixProjection = this.program.getUniform("in_matrixProjection");
|
||||||
|
this.GLMatrixView = this.program.getUniform("in_matrixView");
|
||||||
|
this.GLambientFactor = this.program.getUniform("in_material.ambientFactor");
|
||||||
|
this.GLdiffuseFactor = this.program.getUniform("in_material.diffuseFactor");
|
||||||
|
this.GLspecularFactor = this.program.getUniform("in_material.specularFactor");
|
||||||
|
this.GLshininess = this.program.getUniform("in_material.shininess");
|
||||||
|
this.GLlights = new GlLightIndex[numberOfLight];
|
||||||
|
for (int iii=0; iii<numberOfLight; iii++) {
|
||||||
|
int color = this.program.getUniform("in_lights[" + iii + "].color");
|
||||||
|
int position = this.program.getUniform("in_lights[" + iii + "].position");
|
||||||
|
int attenuation = this.program.getUniform("in_lights[" + iii + "].attenuation");
|
||||||
|
this.GLlights[iii] = new GlLightIndex(color, position, attenuation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void addFriendComponent(Component component) {
|
||||||
|
if (component.getType().contentEquals("static-meshs")) {
|
||||||
|
meshs = (ComponentStaticMeshs)component;
|
||||||
|
}
|
||||||
|
if (component.getType().contentEquals("textures")) {
|
||||||
|
textures = (ComponentTextures)component;
|
||||||
|
}
|
||||||
|
if (component.getType().contentEquals("materials")) {
|
||||||
|
materials = (ComponentMaterials)component;
|
||||||
|
}
|
||||||
|
if (component.getType().contentEquals("position")) {
|
||||||
|
position = (ComponentPosition)component;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void removeFriendComponent(Component component) {
|
||||||
|
// nothing to do.
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void render() {
|
||||||
|
this.program.use();
|
||||||
|
Light[] lights = this.lightEngine.getNearest(position.getTransform().getPosition());
|
||||||
|
Matrix4f projectionMatrix = OpenGL.getMatrix();
|
||||||
|
Matrix4f viewMatrix = OpenGL.getCameraMatrix();
|
||||||
|
Matrix4f transformationMatrix = position.getTransform().getOpenGLMatrix();
|
||||||
|
Set<String> keys = this.meshs.getKeys();
|
||||||
|
|
||||||
|
for (int iii=0; iii<numberOfLight; iii++) {
|
||||||
|
if (lights[iii] != null) {
|
||||||
|
this.program.uniformVector(this.GLlights[iii].GLposition, lights[iii].getPositionDelta());
|
||||||
|
this.program.uniformVector(this.GLlights[iii].GLcolor, lights[iii].getColor());
|
||||||
|
this.program.uniformVector(this.GLlights[iii].GLattenuation, lights[iii].getAttenuation());
|
||||||
|
} else {
|
||||||
|
this.program.uniformVector(this.GLlights[iii].GLposition, new Vector3f(0,0,0));
|
||||||
|
this.program.uniformVector(this.GLlights[iii].GLcolor, new Vector3f(0,0,0));
|
||||||
|
this.program.uniformVector(this.GLlights[iii].GLattenuation, new Vector3f(1,0,0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.program.uniformMatrix(this.GLMatrixView, viewMatrix);
|
||||||
|
this.program.uniformMatrix(this.GLMatrixProjection, projectionMatrix);
|
||||||
|
// Change the position for each element with the same pipeline you need to render ...
|
||||||
|
this.program.uniformMatrix(this.GLMatrixTransformation, transformationMatrix);
|
||||||
|
|
||||||
|
for (String key : keys) {
|
||||||
|
this.meshs.bindForRendering(key);
|
||||||
|
this.textures.bindForRendering(key);
|
||||||
|
Material mat = this.materials.getMaterial(key);
|
||||||
|
this.program.uniformVector(GLambientFactor, mat.getAmbientFactor());
|
||||||
|
this.program.uniformVector(GLdiffuseFactor, mat.getDiffuseFactor());
|
||||||
|
this.program.uniformVector(GLspecularFactor, mat.getSpecularFactor());
|
||||||
|
this.program.uniformFloat(GLshininess, mat.getShininess());
|
||||||
|
// update of flags is done asynchronously ==> need update before drawing...
|
||||||
|
OpenGL.updateAllFlags();
|
||||||
|
// Request the draw all the elements:
|
||||||
|
this.meshs.render(key);
|
||||||
|
this.textures.unBindForRendering(key);
|
||||||
|
this.meshs.unBindForRendering(key);
|
||||||
|
}
|
||||||
|
this.program.unUse();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,67 @@
|
|||||||
|
package org.atriaSoft.gameEngine.components;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.atriaSoft.etk.Uri;
|
||||||
|
import org.atriaSoft.gameEngine.Log;
|
||||||
|
import org.atriaSoft.gameEngine.Component;
|
||||||
|
import org.atriaSoft.gameEngine.resource.ResourceStaticMesh;
|
||||||
|
import org.atriaSoft.gameEngine.resource.ResourceStaticMeshObj;
|
||||||
|
|
||||||
|
public class ComponentStaticMeshs extends Component {
|
||||||
|
private Map<String, ResourceStaticMesh> meshs = new HashMap<String, ResourceStaticMesh>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return "static-meshs";
|
||||||
|
}
|
||||||
|
|
||||||
|
public ComponentStaticMeshs(Uri meshUrl) {
|
||||||
|
// TODO : load Mesh
|
||||||
|
Log.critical("Can not Load the Mesh for now ... " + meshUrl);
|
||||||
|
ResourceStaticMeshObj mesh = ResourceStaticMeshObj.create(meshUrl);
|
||||||
|
setMesh("default", mesh);
|
||||||
|
}
|
||||||
|
public ComponentStaticMeshs() {
|
||||||
|
// nothing to do ...
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> getKeys() {
|
||||||
|
return meshs.keySet();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMesh(String name, ResourceStaticMesh mesh) {
|
||||||
|
this.meshs.put(name, mesh);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResourceStaticMesh getMesh(String name) {
|
||||||
|
return meshs.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void bindForRendering(String name) {
|
||||||
|
ResourceStaticMesh mesh = meshs.get(name);
|
||||||
|
if (mesh == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mesh.bindForRendering();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unBindForRendering(String name) {
|
||||||
|
ResourceStaticMesh mesh = meshs.get(name);
|
||||||
|
if (mesh == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mesh.unBindForRendering();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void render(String name) {
|
||||||
|
ResourceStaticMesh mesh = meshs.get(name);
|
||||||
|
if (mesh == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
mesh.render();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
package org.atriaSoft.gameEngine.components;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.atriaSoft.etk.Uri;
|
||||||
|
import org.atriaSoft.gale.resource.ResourceTexture;
|
||||||
|
import org.atriaSoft.gale.test.sample2.Log;
|
||||||
|
import org.atriaSoft.gameEngine.Component;
|
||||||
|
import org.atriaSoft.gameEngine.Material;
|
||||||
|
|
||||||
|
public class ComponentTextures extends Component {
|
||||||
|
private Map<String, ResourceTexture> textures = new HashMap<String, ResourceTexture>();
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return "textures";
|
||||||
|
}
|
||||||
|
public ComponentTextures() {
|
||||||
|
|
||||||
|
}
|
||||||
|
public void setTexture(String name, Uri textureName) {
|
||||||
|
ResourceTexture texture = ResourceTexture.createFromPng(textureName);
|
||||||
|
if (texture == null) {
|
||||||
|
Log.error("can not instanciate Texture ...");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
textures.put(name, texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void bindForRendering(String name) {
|
||||||
|
this.textures.get(name).bindForRendering(0);
|
||||||
|
|
||||||
|
}
|
||||||
|
public void unBindForRendering(String name) {
|
||||||
|
this.textures.get(name).unBindForRendering();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
12
src/org/atriaSoft/gameEngine/components/GlLightIndex.java
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
package org.atriaSoft.gameEngine.components;
|
||||||
|
|
||||||
|
public class GlLightIndex {
|
||||||
|
int GLcolor;
|
||||||
|
int GLposition;
|
||||||
|
int GLattenuation;
|
||||||
|
public GlLightIndex(int gLcolor, int gLposition, int gLattenuation) {
|
||||||
|
GLcolor = gLcolor;
|
||||||
|
GLposition = gLposition;
|
||||||
|
GLattenuation = gLattenuation;
|
||||||
|
}
|
||||||
|
}
|
@ -13,7 +13,7 @@ public class EngineAI extends Engine {
|
|||||||
public static final String ENGINE_NAME = "ia";
|
public static final String ENGINE_NAME = "ia";
|
||||||
private float accumulator = 0;
|
private float accumulator = 0;
|
||||||
private static float TIME_STEP = 5.0f;
|
private static float TIME_STEP = 5.0f;
|
||||||
private Vector<ComponentAI> components;
|
private Vector<ComponentAI> components = new Vector<ComponentAI>();
|
||||||
public EngineAI(Environement env) {
|
public EngineAI(Environement env) {
|
||||||
super(env);
|
super(env);
|
||||||
// TODO Auto-generated constructor stub
|
// TODO Auto-generated constructor stub
|
||||||
@ -38,7 +38,7 @@ public class EngineAI extends Engine {
|
|||||||
accumulator += (float)deltaMili*0.0001f;
|
accumulator += (float)deltaMili*0.0001f;
|
||||||
// While there is enough accumulated time to take one or several physics steps
|
// While there is enough accumulated time to take one or several physics steps
|
||||||
while (accumulator >= TIME_STEP) {
|
while (accumulator >= TIME_STEP) {
|
||||||
Log.warning("Generate for " + accumulator + " / " + TIME_STEP + " for:" + components.size());
|
//Log.warning("AI: Generate for " + accumulator + " / " + TIME_STEP + " for:" + components.size());
|
||||||
// call every object to usdate their constant forces applyed
|
// call every object to usdate their constant forces applyed
|
||||||
for (ComponentAI it: components) {
|
for (ComponentAI it: components) {
|
||||||
it.update(TIME_STEP);
|
it.update(TIME_STEP);
|
||||||
|
69
src/org/atriaSoft/gameEngine/engines/EngineDynamicMeshs.java
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
package org.atriaSoft.gameEngine.engines;
|
||||||
|
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
import org.atriaSoft.gameEngine.Component;
|
||||||
|
import org.atriaSoft.gameEngine.Engine;
|
||||||
|
import org.atriaSoft.gameEngine.Environement;
|
||||||
|
import org.atriaSoft.gameEngine.camera.Camera;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentDynamicMeshs;
|
||||||
|
|
||||||
|
public class EngineDynamicMeshs extends Engine {
|
||||||
|
public static final String ENGINE_NAME = "dynamic-meshs";
|
||||||
|
private static float TIME_STEP = 5.0f;
|
||||||
|
private float accumulator = TIME_STEP;
|
||||||
|
private Vector<ComponentDynamicMeshs> components = new Vector<ComponentDynamicMeshs>();
|
||||||
|
public EngineDynamicMeshs(Environement env) {
|
||||||
|
super(env);
|
||||||
|
// TODO Auto-generated constructor stub
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void componentRemove(Component ref) {
|
||||||
|
components.remove(ref);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void componentAdd(Component ref) {
|
||||||
|
if (ref instanceof ComponentDynamicMeshs == true) {
|
||||||
|
components.add((ComponentDynamicMeshs)ref);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(long deltaMili) {
|
||||||
|
|
||||||
|
//Log.warning("engine update : " + deltaMili + " " + accumulator + " >= " + TIME_STEP);
|
||||||
|
// Add the time difference in the accumulator
|
||||||
|
accumulator += (float)deltaMili*0.0001f;
|
||||||
|
// While there is enough accumulated time to take one or several physics steps
|
||||||
|
while (accumulator >= TIME_STEP) {
|
||||||
|
//Log.warning("Generate for " + accumulator + " / " + TIME_STEP + " for:" + components.size());
|
||||||
|
// call every object to usdate their constant forces applyed
|
||||||
|
for (ComponentDynamicMeshs it: components) {
|
||||||
|
it.update(TIME_STEP);
|
||||||
|
}
|
||||||
|
// Decrease the accumulated time
|
||||||
|
accumulator -= TIME_STEP;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void render(long deltaMili, Camera camera) {
|
||||||
|
// nothing to do ...
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void renderDebug(long deltaMili, Camera camera) {
|
||||||
|
// nothing to do ...
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return ENGINE_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
71
src/org/atriaSoft/gameEngine/engines/EngineMap.java
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
package org.atriaSoft.gameEngine.engines;
|
||||||
|
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
import org.atriaSoft.etk.math.Vector3f;
|
||||||
|
import org.atriaSoft.gameEngine.Component;
|
||||||
|
import org.atriaSoft.gameEngine.Engine;
|
||||||
|
import org.atriaSoft.gameEngine.Environement;
|
||||||
|
import org.atriaSoft.gameEngine.Light;
|
||||||
|
import org.atriaSoft.gameEngine.Log;
|
||||||
|
import org.atriaSoft.gameEngine.camera.Camera;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentAI;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentMap;
|
||||||
|
|
||||||
|
public class EngineMap extends Engine {
|
||||||
|
public static final String ENGINE_NAME = "map";
|
||||||
|
private float accumulator = 0;
|
||||||
|
private static float TIME_STEP = 5.0f;
|
||||||
|
private Vector<ComponentMap> components = new Vector<ComponentMap>();
|
||||||
|
public EngineMap(Environement env) {
|
||||||
|
super(env);
|
||||||
|
// TODO Auto-generated constructor stub
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void componentRemove(Component ref) {
|
||||||
|
components.remove(ref);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void componentAdd(Component ref) {
|
||||||
|
if (ref instanceof ComponentMap == true) {
|
||||||
|
components.add((ComponentMap)ref);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(long deltaMili) {
|
||||||
|
// Add the time difference in the accumulator
|
||||||
|
accumulator += (float)deltaMili*0.0001f;
|
||||||
|
// While there is enough accumulated time to take one or several physics steps
|
||||||
|
while (accumulator >= TIME_STEP) {
|
||||||
|
// Log.warning("MAP: Generate for " + accumulator + " / " + TIME_STEP + " for:" + components.size());
|
||||||
|
// call every object to update their constant forces applied
|
||||||
|
for (ComponentMap it: components) {
|
||||||
|
it.update(TIME_STEP);
|
||||||
|
}
|
||||||
|
// Decrease the accumulated time
|
||||||
|
accumulator -= TIME_STEP;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void render(long deltaMili, Camera camera) {
|
||||||
|
// nothing to do ...
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void renderDebug(long deltaMili, Camera camera) {
|
||||||
|
// nothing to do ...
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return ENGINE_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -7,6 +7,7 @@ import org.atriaSoft.gameEngine.Component;
|
|||||||
import org.atriaSoft.gameEngine.Engine;
|
import org.atriaSoft.gameEngine.Engine;
|
||||||
import org.atriaSoft.gameEngine.Environement;
|
import org.atriaSoft.gameEngine.Environement;
|
||||||
import org.atriaSoft.gameEngine.camera.Camera;
|
import org.atriaSoft.gameEngine.camera.Camera;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentAI;
|
||||||
import org.atriaSoft.gameEngine.components.ComponentRender;
|
import org.atriaSoft.gameEngine.components.ComponentRender;
|
||||||
|
|
||||||
class ResultNearestElement {
|
class ResultNearestElement {
|
||||||
@ -16,6 +17,8 @@ class ResultNearestElement {
|
|||||||
|
|
||||||
public class EngineRender extends Engine {
|
public class EngineRender extends Engine {
|
||||||
public static final String ENGINE_NAME = "render";
|
public static final String ENGINE_NAME = "render";
|
||||||
|
private float accumulator = 0;
|
||||||
|
private static float TIME_STEP = 5.0f;
|
||||||
private Vector<ComponentRender> components = new Vector<ComponentRender>();
|
private Vector<ComponentRender> components = new Vector<ComponentRender>();
|
||||||
private Vector<ResultNearestElement> displayElementOrdered = new Vector<ResultNearestElement>();
|
private Vector<ResultNearestElement> displayElementOrdered = new Vector<ResultNearestElement>();
|
||||||
//private ResourceColored3DObject debugDrawProperty;
|
//private ResourceColored3DObject debugDrawProperty;
|
||||||
@ -39,7 +42,18 @@ public class EngineRender extends Engine {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update(long deltaMili) {
|
public void update(long deltaMili) {
|
||||||
// TODO Auto-generated method stub
|
// Add the time difference in the accumulator
|
||||||
|
accumulator += (float)deltaMili*0.0001f;
|
||||||
|
// While there is enough accumulated time to take one or several physics steps
|
||||||
|
while (accumulator >= TIME_STEP) {
|
||||||
|
// Log.warning("RENDER: Generate for " + accumulator + " / " + TIME_STEP + " for:" + components.size());
|
||||||
|
// call every object to usdate their constant forces applyed
|
||||||
|
for (ComponentRender it: components) {
|
||||||
|
it.update(TIME_STEP);
|
||||||
|
}
|
||||||
|
// Decrease the accumulated time
|
||||||
|
accumulator -= TIME_STEP;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,212 @@
|
|||||||
|
package org.atriaSoft.gameEngine.map;
|
||||||
|
|
||||||
|
import org.atriaSoft.etk.math.Vector2f;
|
||||||
|
import org.atriaSoft.etk.math.Vector3f;
|
||||||
|
import org.atriaSoft.etk.math.Vector3i;
|
||||||
|
import org.atriaSoft.gale.backend3d.OpenGL.RenderMode;
|
||||||
|
import org.atriaSoft.gale.test.sample2.Log;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentDynamicMeshs;
|
||||||
|
import org.atriaSoft.gameEngine.resource.ResourceListTexturedMesh;
|
||||||
|
|
||||||
|
public class ComponentDynamicMeshsVoxelMap extends ComponentDynamicMeshs {
|
||||||
|
private VoxelChunk chunk;
|
||||||
|
ResourceListTexturedMesh unbreakable = ResourceListTexturedMesh.create(RenderMode.triangle);
|
||||||
|
ResourceListTexturedMesh stone = ResourceListTexturedMesh.create(RenderMode.triangle);
|
||||||
|
ResourceListTexturedMesh dirt = ResourceListTexturedMesh.create(RenderMode.triangle);
|
||||||
|
ResourceListTexturedMesh grass = ResourceListTexturedMesh.create(RenderMode.triangle);
|
||||||
|
|
||||||
|
public ComponentDynamicMeshsVoxelMap(VoxelChunk chunk) {
|
||||||
|
super();
|
||||||
|
this.chunk = chunk;
|
||||||
|
this.setMesh("unbreakable", unbreakable);
|
||||||
|
this.setMesh("stone", stone);
|
||||||
|
this.setMesh("dirt", dirt);
|
||||||
|
this.setMesh("grass", grass);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawPlane(Vector3i base, int xxx, int yyy, int zzz, int type) {
|
||||||
|
//Log.warning("Add plane Z : " + (base.x + xxx) + ", " + (base.y + yyy) + ", " + (base.z + zzz));
|
||||||
|
Vector3f v1 = new Vector3f(base.x + xxx , base.y + yyy , base.z + zzz);
|
||||||
|
Vector3f v2 = new Vector3f(base.x + xxx , base.y + yyy+1, base.z + zzz);
|
||||||
|
Vector3f v3 = new Vector3f(base.x + xxx+1, base.y + yyy+1, base.z + zzz);
|
||||||
|
Vector3f v4 = new Vector3f(base.x + xxx+1, base.y + yyy , base.z + zzz);
|
||||||
|
Vector2f t1 = new Vector2f(0, 0);
|
||||||
|
Vector2f t2 = new Vector2f(0, 1);
|
||||||
|
Vector2f t3 = new Vector2f(1, 1);
|
||||||
|
Vector2f t4 = new Vector2f(1, 0);
|
||||||
|
Vector3f n1 = new Vector3f(0, 0, -1);
|
||||||
|
if (type == VoxelType.NATIVE_UNBREAKABLE) {
|
||||||
|
unbreakable.addQuad(v1, v2, v3, v4, t1, t2, t3, t4, n1);
|
||||||
|
} else if (type == VoxelType.NATIVE_DIRT) {
|
||||||
|
dirt.addQuad(v1, v2, v3, v4, t1, t2, t3, t4, n1);
|
||||||
|
} else if (type == VoxelType.NATIVE_STONE) {
|
||||||
|
stone.addQuad(v1, v2, v3, v4, t1, t2, t3, t4, n1);
|
||||||
|
} else if (type == VoxelType.NATIVE_GRASS) {
|
||||||
|
grass.addQuad(v1, v2, v3, v4, t1, t2, t3, t4, n1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void drawPlane_anti(Vector3i base, int xxx, int yyy, int zzz, int type) {
|
||||||
|
//Log.warning("Add plane Z : " + (base.x + xxx) + ", " + (base.y + yyy) + ", " + (base.z + zzz));
|
||||||
|
Vector3f v1 = new Vector3f(base.x + xxx , base.y + yyy , base.z + zzz);
|
||||||
|
Vector3f v2 = new Vector3f(base.x + xxx , base.y + yyy+1, base.z + zzz);
|
||||||
|
Vector3f v3 = new Vector3f(base.x + xxx+1, base.y + yyy+1, base.z + zzz);
|
||||||
|
Vector3f v4 = new Vector3f(base.x + xxx+1, base.y + yyy , base.z + zzz);
|
||||||
|
Vector2f t1 = new Vector2f(0, 0);
|
||||||
|
Vector2f t2 = new Vector2f(0, 1);
|
||||||
|
Vector2f t3 = new Vector2f(1, 1);
|
||||||
|
Vector2f t4 = new Vector2f(1, 0);
|
||||||
|
Vector3f n1 = new Vector3f(0, 0, 1);
|
||||||
|
if (type == VoxelType.NATIVE_UNBREAKABLE) {
|
||||||
|
unbreakable.addQuad(v1, v4, v3, v2, t1, t4, t3, t2, n1);
|
||||||
|
} else if (type == VoxelType.NATIVE_DIRT) {
|
||||||
|
dirt.addQuad(v1, v4, v3, v2, t1, t4, t3, t2, n1);
|
||||||
|
} else if (type == VoxelType.NATIVE_STONE) {
|
||||||
|
stone.addQuad(v1, v4, v3, v2, t1, t4, t3, t2, n1);
|
||||||
|
} else if (type == VoxelType.NATIVE_GRASS) {
|
||||||
|
grass.addQuad(v1, v4, v3, v2, t1, t4, t3, t2, n1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void drawPlaneVerticalX(Vector3i base, int xxx, int yyy, int zzz, int type) {
|
||||||
|
//Log.warning("Add plane X : " + (base.x + xxx) + ", " + (base.y + yyy) + ", " + (base.z + zzz));
|
||||||
|
Vector3f v1 = new Vector3f(base.x + xxx , base.y + yyy , base.z + zzz);
|
||||||
|
Vector3f v2 = new Vector3f(base.x + xxx , base.y + yyy , base.z + zzz+1);
|
||||||
|
Vector3f v3 = new Vector3f(base.x + xxx , base.y + yyy+1, base.z + zzz+1);
|
||||||
|
Vector3f v4 = new Vector3f(base.x + xxx , base.y + yyy+1, base.z + zzz);
|
||||||
|
Vector2f t1 = new Vector2f(0, 0);
|
||||||
|
Vector2f t2 = new Vector2f(0, 1);
|
||||||
|
Vector2f t3 = new Vector2f(1, 1);
|
||||||
|
Vector2f t4 = new Vector2f(1, 0);
|
||||||
|
Vector3f n1 = new Vector3f(-1, 0, 0);
|
||||||
|
if (type == VoxelType.NATIVE_UNBREAKABLE) {
|
||||||
|
unbreakable.addQuad(v1, v2, v3, v4, t1, t2, t3, t4, n1);
|
||||||
|
} else if (type == VoxelType.NATIVE_DIRT) {
|
||||||
|
dirt.addQuad(v1, v2, v3, v4, t1, t2, t3, t4, n1);
|
||||||
|
} else if (type == VoxelType.NATIVE_STONE) {
|
||||||
|
stone.addQuad(v1, v2, v3, v4, t1, t2, t3, t4, n1);
|
||||||
|
} else if (type == VoxelType.NATIVE_GRASS) {
|
||||||
|
grass.addQuad(v1, v2, v3, v4, t1, t2, t3, t4, n1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void drawPlaneVerticalX_anti(Vector3i base, int xxx, int yyy, int zzz, int type) {
|
||||||
|
//Log.warning("Add plane X : " + (base.x + xxx) + ", " + (base.y + yyy) + ", " + (base.z + zzz));
|
||||||
|
Vector3f v1 = new Vector3f(base.x + xxx , base.y + yyy , base.z + zzz);
|
||||||
|
Vector3f v2 = new Vector3f(base.x + xxx , base.y + yyy , base.z + zzz+1);
|
||||||
|
Vector3f v3 = new Vector3f(base.x + xxx , base.y + yyy+1, base.z + zzz+1);
|
||||||
|
Vector3f v4 = new Vector3f(base.x + xxx , base.y + yyy+1, base.z + zzz);
|
||||||
|
Vector2f t1 = new Vector2f(0, 0);
|
||||||
|
Vector2f t2 = new Vector2f(0, 1);
|
||||||
|
Vector2f t3 = new Vector2f(1, 1);
|
||||||
|
Vector2f t4 = new Vector2f(1, 0);
|
||||||
|
Vector3f n1 = new Vector3f(1, 0, 0);
|
||||||
|
if (type == VoxelType.NATIVE_UNBREAKABLE) {
|
||||||
|
unbreakable.addQuad(v1, v4, v3, v2, t1, t4, t3, t2, n1);
|
||||||
|
} else if (type == VoxelType.NATIVE_DIRT) {
|
||||||
|
dirt.addQuad(v1, v4, v3, v2, t1, t4, t3, t2, n1);
|
||||||
|
} else if (type == VoxelType.NATIVE_STONE) {
|
||||||
|
stone.addQuad(v1, v4, v3, v2, t1, t4, t3, t2, n1);
|
||||||
|
} else if (type == VoxelType.NATIVE_GRASS) {
|
||||||
|
grass.addQuad(v1, v4, v3, v2, t1, t4, t3, t2, n1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void drawPlaneVerticalY(Vector3i base, int xxx, int yyy, int zzz, int type) {
|
||||||
|
//Log.warning("Add plane Y : " + (base.x + xxx) + ", " + (base.y + yyy) + ", " + (base.z + zzz));
|
||||||
|
Vector3f v1 = new Vector3f(base.x + xxx , base.y + yyy , base.z + zzz);
|
||||||
|
Vector3f v2 = new Vector3f(base.x + xxx , base.y + yyy , base.z + zzz+1);
|
||||||
|
Vector3f v3 = new Vector3f(base.x + xxx+1, base.y + yyy , base.z + zzz+1);
|
||||||
|
Vector3f v4 = new Vector3f(base.x + xxx+1, base.y + yyy , base.z + zzz);
|
||||||
|
Vector2f t1 = new Vector2f(0, 0);
|
||||||
|
Vector2f t2 = new Vector2f(0, 1);
|
||||||
|
Vector2f t3 = new Vector2f(1, 1);
|
||||||
|
Vector2f t4 = new Vector2f(1, 0);
|
||||||
|
Vector3f n1 = new Vector3f(0, 1, 0);
|
||||||
|
if (type == VoxelType.NATIVE_UNBREAKABLE) {
|
||||||
|
unbreakable.addQuad(v1, v2, v3, v4, t1, t2, t3, t4, n1);
|
||||||
|
} else if (type == VoxelType.NATIVE_DIRT) {
|
||||||
|
dirt.addQuad(v1, v2, v3, v4, t1, t2, t3, t4, n1);
|
||||||
|
} else if (type == VoxelType.NATIVE_STONE) {
|
||||||
|
stone.addQuad(v1, v2, v3, v4, t1, t2, t3, t4, n1);
|
||||||
|
} else if (type == VoxelType.NATIVE_GRASS) {
|
||||||
|
grass.addQuad(v1, v2, v3, v4, t1, t2, t3, t4, n1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void drawPlaneVerticalY_anti(Vector3i base, int xxx, int yyy, int zzz, int type) {
|
||||||
|
//Log.warning("Add plane Y : " + (base.x + xxx) + ", " + (base.y + yyy) + ", " + (base.z + zzz));
|
||||||
|
Vector3f v1 = new Vector3f(base.x + xxx , base.y + yyy , base.z + zzz);
|
||||||
|
Vector3f v2 = new Vector3f(base.x + xxx , base.y + yyy , base.z + zzz+1);
|
||||||
|
Vector3f v3 = new Vector3f(base.x + xxx+1, base.y + yyy , base.z + zzz+1);
|
||||||
|
Vector3f v4 = new Vector3f(base.x + xxx+1, base.y + yyy , base.z + zzz);
|
||||||
|
Vector2f t1 = new Vector2f(0, 0);
|
||||||
|
Vector2f t2 = new Vector2f(0, 1);
|
||||||
|
Vector2f t3 = new Vector2f(1, 1);
|
||||||
|
Vector2f t4 = new Vector2f(1, 0);
|
||||||
|
Vector3f n1 = new Vector3f(0, -1, 0);
|
||||||
|
if (type == VoxelType.NATIVE_UNBREAKABLE) {
|
||||||
|
unbreakable.addQuad(v1, v4, v3, v2, t1, t4, t3, t2, n1);
|
||||||
|
} else if (type == VoxelType.NATIVE_DIRT) {
|
||||||
|
dirt.addQuad(v1, v4, v3, v2, t1, t4, t3, t2, n1);
|
||||||
|
} else if (type == VoxelType.NATIVE_STONE) {
|
||||||
|
stone.addQuad(v1, v4, v3, v2, t1, t4, t3, t2, n1);
|
||||||
|
} else if (type == VoxelType.NATIVE_GRASS) {
|
||||||
|
grass.addQuad(v1, v4, v3, v2, t1, t4, t3, t2, n1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(float timeStep) {
|
||||||
|
Log.warning("update : " + timeStep);
|
||||||
|
if (chunk.haveChange() == false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Log.warning(" ==> YES");
|
||||||
|
Voxel[][][] data = chunk.getData();
|
||||||
|
unbreakable.clear();
|
||||||
|
stone.clear();
|
||||||
|
dirt.clear();
|
||||||
|
grass.clear();
|
||||||
|
for (int xxx=0; xxx < VoxelChunk.VOXEL_CHUNK_SIZE; xxx++) {
|
||||||
|
for (int yyy=0; yyy < VoxelChunk.VOXEL_CHUNK_SIZE; yyy++) {
|
||||||
|
for (int zzz=0; zzz < VoxelChunk.VOXEL_CHUNK_SIZE; zzz++) {
|
||||||
|
Voxel current = data[xxx][yyy][zzz];
|
||||||
|
if (current.active == false) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Voxel bottom = chunk.getVoxel(xxx, yyy, zzz-1);
|
||||||
|
if (bottom == null || bottom.active == false) {
|
||||||
|
drawPlane(chunk.getPosition(), xxx, yyy, zzz, current.type);
|
||||||
|
}
|
||||||
|
Voxel up = chunk.getVoxel(xxx, yyy, zzz+1);
|
||||||
|
if (up == null || up.active == false) {
|
||||||
|
drawPlane_anti(chunk.getPosition(), xxx, yyy, zzz+1, current.type);
|
||||||
|
}
|
||||||
|
Voxel left = chunk.getVoxel(xxx-1, yyy, zzz);
|
||||||
|
if (left == null || left.active == false) {
|
||||||
|
drawPlaneVerticalX(chunk.getPosition(), xxx, yyy, zzz, current.type);
|
||||||
|
}
|
||||||
|
Voxel right = chunk.getVoxel(xxx+1, yyy, zzz);
|
||||||
|
if (right == null || right.active == false) {
|
||||||
|
drawPlaneVerticalX_anti(chunk.getPosition(), xxx+1, yyy, zzz, current.type);
|
||||||
|
}
|
||||||
|
Voxel front = chunk.getVoxel(xxx, yyy-1, zzz);
|
||||||
|
if (front == null || front.active == false) {
|
||||||
|
drawPlaneVerticalY_anti(chunk.getPosition(), xxx, yyy, zzz, current.type);
|
||||||
|
}
|
||||||
|
Voxel back = chunk.getVoxel(xxx, yyy+1, zzz);
|
||||||
|
if (back == null || back.active == false) {
|
||||||
|
drawPlaneVerticalY(chunk.getPosition(), xxx, yyy+1, zzz, current.type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
unbreakable.flush();
|
||||||
|
stone.flush();
|
||||||
|
dirt.flush();
|
||||||
|
grass.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void render(String name) {
|
||||||
|
//Log.warning("Render : " + name);
|
||||||
|
super.render(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package org.atriaSoft.gameEngine.map;
|
||||||
|
|
||||||
|
import org.atriaSoft.etk.Uri;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentRenderTexturedMaterialsStaticMeshs;
|
||||||
|
import org.atriaSoft.gameEngine.engines.EngineLight;
|
||||||
|
|
||||||
|
public class ComponentRenderVoxelMesh extends ComponentRenderTexturedMaterialsStaticMeshs {
|
||||||
|
|
||||||
|
public ComponentRenderVoxelMesh(Uri vertexShader, Uri fragmentShader, EngineLight lightEngine, VoxelChunk chunk) {
|
||||||
|
super(vertexShader, fragmentShader, lightEngine);
|
||||||
|
// TODO Auto-generated constructor stub
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(float timeStep) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
77
src/org/atriaSoft/gameEngine/map/MapVoxel.java
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
package org.atriaSoft.gameEngine.map;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.atriaSoft.etk.Uri;
|
||||||
|
import org.atriaSoft.etk.math.Transform3D;
|
||||||
|
import org.atriaSoft.etk.math.Vector3i;
|
||||||
|
import org.atriaSoft.etk.math.Vector3f;
|
||||||
|
import org.atriaSoft.gameEngine.Entity;
|
||||||
|
import org.atriaSoft.gameEngine.Environement;
|
||||||
|
import org.atriaSoft.gameEngine.Light;
|
||||||
|
import org.atriaSoft.gameEngine.Material;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentLight;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentLightSun;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentMaterials;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentPosition;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentRenderTexturedMaterialsDynamicMeshs;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentRenderTexturedMaterialsStaticMeshs;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentRenderTexturedStaticMesh;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentStaticMesh;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentStaticMeshs;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentTexture;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentTextures;
|
||||||
|
import org.atriaSoft.gameEngine.engines.EngineLight;
|
||||||
|
import org.atriaSoft.gameEngine.engines.EngineMap;
|
||||||
|
|
||||||
|
public class MapVoxel extends EngineMap {
|
||||||
|
//List<VoxelChunk> listOfChunks = new ArrayList<VoxelChunk>();
|
||||||
|
ComponentTextures textures;
|
||||||
|
|
||||||
|
public MapVoxel(Environement env){
|
||||||
|
super(env);
|
||||||
|
// for basic test ... after generate dynamic ...
|
||||||
|
textures = new ComponentTextures();
|
||||||
|
}
|
||||||
|
public void init() {
|
||||||
|
textures.setTexture("stone", new Uri("DATA", "blocks/stone.png"));
|
||||||
|
textures.setTexture("grass", new Uri("DATA", "blocks/dirt_podzol_top.png"));
|
||||||
|
textures.setTexture("dirt", new Uri("DATA", "blocks/dirt.png"));
|
||||||
|
textures.setTexture("watter", new Uri("DATA", "blocks/water_static.png"));
|
||||||
|
textures.setTexture("unbreakable", new Uri("DATA", "blocks/stone_diorite.png"));
|
||||||
|
|
||||||
|
// addNewChunk(new Vector3i(-1,-1, 0));
|
||||||
|
// addNewChunk(new Vector3i(-1, 0, 0));
|
||||||
|
// addNewChunk(new Vector3i(-1, 1, 0));
|
||||||
|
// addNewChunk(new Vector3i( 0,-1, 0));
|
||||||
|
addNewChunk(new Vector3i( 0, 0, 0));
|
||||||
|
// addNewChunk(new Vector3i( 0, 1, 0));
|
||||||
|
// addNewChunk(new Vector3i( 1,-1, 0));
|
||||||
|
// addNewChunk(new Vector3i( 1, 0, 0));
|
||||||
|
// addNewChunk(new Vector3i( 1, 1, 0));
|
||||||
|
}
|
||||||
|
private void addNewChunk(Vector3i position) {
|
||||||
|
// simple sun to have a global light ...
|
||||||
|
Entity tmpEntity = new Entity(this.env);
|
||||||
|
tmpEntity.addComponent(new ComponentPosition(new Transform3D(new Vector3f(position.x,position.y,0))));
|
||||||
|
VoxelChunk tmpVoxelChunk = new VoxelChunk(this, position);
|
||||||
|
tmpEntity.addComponent(tmpVoxelChunk);
|
||||||
|
ComponentDynamicMeshsVoxelMap mesh = new ComponentDynamicMeshsVoxelMap(tmpVoxelChunk);
|
||||||
|
tmpEntity.addComponent(mesh);
|
||||||
|
tmpEntity.addComponent(textures);
|
||||||
|
ComponentMaterials materials = new ComponentMaterials();
|
||||||
|
materials.setMaterial("stone", new Material());
|
||||||
|
materials.setMaterial("grass", new Material());
|
||||||
|
materials.setMaterial("dirt", new Material());
|
||||||
|
materials.setMaterial("watter", new Material());
|
||||||
|
materials.setMaterial("unbreakable", new Material());
|
||||||
|
tmpEntity.addComponent(materials);
|
||||||
|
tmpEntity.addComponent(new ComponentRenderTexturedMaterialsDynamicMeshs(
|
||||||
|
new Uri("DATA", "basicMaterial.vert"),
|
||||||
|
new Uri("DATA", "basicMaterial.frag"),
|
||||||
|
(EngineLight)env.getEngine(EngineLight.ENGINE_NAME)));
|
||||||
|
this.env.addEntity(tmpEntity);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
11
src/org/atriaSoft/gameEngine/map/Voxel.java
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
package org.atriaSoft.gameEngine.map;
|
||||||
|
|
||||||
|
public class Voxel {
|
||||||
|
public int type = VoxelType.NATIVE_UNKNOWN;
|
||||||
|
public boolean active = true;
|
||||||
|
public Voxel(int type, boolean active) {
|
||||||
|
this.type = type;
|
||||||
|
this.active = active;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
75
src/org/atriaSoft/gameEngine/map/VoxelChunk.java
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
package org.atriaSoft.gameEngine.map;
|
||||||
|
|
||||||
|
import org.atriaSoft.etk.math.Vector2i;
|
||||||
|
import org.atriaSoft.etk.math.Vector3i;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentMap;
|
||||||
|
|
||||||
|
// This chunk in designed in 2D no upper chunk, and no lower chunk...
|
||||||
|
public class VoxelChunk extends ComponentMap {
|
||||||
|
|
||||||
|
public final static int VOXEL_CHUNK_SIZE = 32;
|
||||||
|
private Voxel[][][] data = new Voxel[VOXEL_CHUNK_SIZE][VOXEL_CHUNK_SIZE][VOXEL_CHUNK_SIZE];
|
||||||
|
private final Vector3i position;
|
||||||
|
//private VoxelChunk[] neibours = new VoxelChunk[8];
|
||||||
|
private final MapVoxel globalMap;
|
||||||
|
|
||||||
|
private boolean haveChange = false;
|
||||||
|
|
||||||
|
public VoxelChunk(MapVoxel globalMap, Vector3i position) {
|
||||||
|
this.globalMap = globalMap;
|
||||||
|
this.position = position;
|
||||||
|
basicFill();
|
||||||
|
haveChange = true;
|
||||||
|
}
|
||||||
|
// this is a default fill tho have a usable map ==> only 3 layers ...
|
||||||
|
private void basicFill() {
|
||||||
|
for (int xxx=0; xxx < VOXEL_CHUNK_SIZE; xxx++) {
|
||||||
|
for (int yyy=0; yyy < VOXEL_CHUNK_SIZE; yyy++) {
|
||||||
|
for (int zzz=0; zzz < VOXEL_CHUNK_SIZE; zzz++) {
|
||||||
|
if(zzz < 1) {
|
||||||
|
data[xxx][yyy][zzz] = new Voxel(VoxelType.NATIVE_UNBREAKABLE, true);
|
||||||
|
} else if(zzz < 8) {
|
||||||
|
data[xxx][yyy][zzz] = new Voxel(VoxelType.NATIVE_STONE, true);
|
||||||
|
} else if(zzz < 12) {
|
||||||
|
data[xxx][yyy][zzz] = new Voxel(VoxelType.NATIVE_DIRT, true);
|
||||||
|
} else if(zzz < 13) {
|
||||||
|
data[xxx][yyy][zzz] = new Voxel(VoxelType.NATIVE_GRASS, true);
|
||||||
|
} else {
|
||||||
|
data[xxx][yyy][zzz] = new Voxel(VoxelType.NATIVE_UNKNOWN, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Voxel[][][] getData() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
public boolean haveChange() {
|
||||||
|
boolean tmp = haveChange;
|
||||||
|
haveChange = false;
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
public Voxel getVoxel(int xxx, int yyy, int zzz) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
if (xxx < 0) {
|
||||||
|
return null;
|
||||||
|
}if (xxx >= VOXEL_CHUNK_SIZE) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (yyy < 0) {
|
||||||
|
return null;
|
||||||
|
}if (yyy >= VOXEL_CHUNK_SIZE) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (zzz < 0) {
|
||||||
|
return null;
|
||||||
|
}if (zzz >= VOXEL_CHUNK_SIZE) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return data[xxx][yyy][zzz];
|
||||||
|
}
|
||||||
|
public Vector3i getPosition() {
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
}
|
15
src/org/atriaSoft/gameEngine/map/VoxelType.java
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
package org.atriaSoft.gameEngine.map;
|
||||||
|
|
||||||
|
public class VoxelType {
|
||||||
|
public static final int NATIVE_UNKNOWN = 0;
|
||||||
|
public static final int NATIVE_BASIC_ID = 10000;
|
||||||
|
public static final int NATIVE_UNBREAKABLE = NATIVE_BASIC_ID;
|
||||||
|
public static final int NATIVE_DIRT = NATIVE_BASIC_ID + 1;
|
||||||
|
public static final int NATIVE_GRASS = NATIVE_BASIC_ID + 2;
|
||||||
|
public static final int NATIVE_STONE = NATIVE_BASIC_ID + 3;
|
||||||
|
public static final int NATIVE_SAND = NATIVE_BASIC_ID + 4;
|
||||||
|
public static final int NATIVE_WOOD = NATIVE_BASIC_ID + 101;
|
||||||
|
public static final int NATIVE_LEAF = NATIVE_BASIC_ID + 102;
|
||||||
|
public static final int NATIVE_WATTER = NATIVE_BASIC_ID + 201;
|
||||||
|
public static final int NATIVE_MAGMA = NATIVE_BASIC_ID + 202;
|
||||||
|
}
|
@ -0,0 +1,111 @@
|
|||||||
|
package org.atriaSoft.gameEngine.resource;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.atriaSoft.etk.Uri;
|
||||||
|
import org.atriaSoft.etk.math.Vector3f;
|
||||||
|
import org.atriaSoft.etk.math.Vector2f;
|
||||||
|
import org.atriaSoft.gale.Log;
|
||||||
|
import org.atriaSoft.gale.backend3d.OpenGL.RenderMode;
|
||||||
|
import org.atriaSoft.gale.resource.Resource;
|
||||||
|
import org.atriaSoft.gale.resource.ResourceVirtualArrayObject;
|
||||||
|
|
||||||
|
|
||||||
|
public class ResourceListTexturedMesh extends ResourceStaticMesh {
|
||||||
|
protected List<Vector3f> vertices = new ArrayList<Vector3f>();
|
||||||
|
protected List<Vector2f> textureCoords = new ArrayList<Vector2f>();
|
||||||
|
protected List<Vector3f> normals = new ArrayList<Vector3f>();
|
||||||
|
protected List<Integer> indices = new ArrayList<Integer>();
|
||||||
|
|
||||||
|
protected ResourceListTexturedMesh(Uri uriFile) {
|
||||||
|
super(uriFile);
|
||||||
|
addResourceType("ResourceListTexturedMesh");
|
||||||
|
}
|
||||||
|
protected ResourceListTexturedMesh(RenderMode mode) {
|
||||||
|
super(mode);
|
||||||
|
addResourceType("ResourceListTexturedMesh");
|
||||||
|
}
|
||||||
|
|
||||||
|
private float[] toFloatArray(List<Float> values) {
|
||||||
|
float[] out = new float[values.size()];
|
||||||
|
for (int iii=0; iii<values.size(); iii++) {
|
||||||
|
out[iii] = values.get(iii);
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
private int[] toIntArray(List<Integer> values) {
|
||||||
|
int[] out = new int[values.size()];
|
||||||
|
for (int iii=0; iii<values.size(); iii++) {
|
||||||
|
out[iii] = values.get(iii);
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
private float[] toFloatV3(List<Vector3f> values) {
|
||||||
|
float[] out = new float[values.size()*3];
|
||||||
|
for (int iii=0; iii<values.size(); iii++) {
|
||||||
|
Vector3f tmp = values.get(iii);
|
||||||
|
out[iii*3] = tmp.x;
|
||||||
|
out[iii*3+1] = tmp.y;
|
||||||
|
out[iii*3+2] = tmp.z;
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
private float[] toFloatV2(List<Vector2f> values) {
|
||||||
|
float[] out = new float[values.size()*2];
|
||||||
|
for (int iii=0; iii<values.size(); iii++) {
|
||||||
|
Vector2f tmp = values.get(iii);
|
||||||
|
out[iii*2] = tmp.x;
|
||||||
|
out[iii*2+1] = tmp.y;
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief Send the data to the graphic card.
|
||||||
|
*/
|
||||||
|
public void flush() {
|
||||||
|
// request to the manager to be call at the next update ...
|
||||||
|
vao = ResourceVirtualArrayObject.create(toFloatV3(this.vertices), toFloatV2(this.textureCoords), toFloatV3(this.normals), toIntArray(this.indices));
|
||||||
|
vao.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addTriangle(Vector3f v1, Vector3f v2, Vector3f v3, Vector2f t1, Vector2f t2, Vector2f t3, Vector3f n1, Vector3f n2, Vector3f n3) {
|
||||||
|
vertices.add(v1);
|
||||||
|
vertices.add(v2);
|
||||||
|
vertices.add(v3);
|
||||||
|
textureCoords.add(t1);
|
||||||
|
textureCoords.add(t2);
|
||||||
|
textureCoords.add(t3);
|
||||||
|
normals.add(n1);
|
||||||
|
normals.add(n2);
|
||||||
|
normals.add(n3);
|
||||||
|
indices.add(vertices.size()-3);
|
||||||
|
indices.add(vertices.size()-2);
|
||||||
|
indices.add(vertices.size()-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addQuad(Vector3f v1, Vector3f v2, Vector3f v3, Vector3f v4, Vector2f t1, Vector2f t2, Vector2f t3, Vector2f t4, Vector3f n1, Vector3f n2, Vector3f n3, Vector3f n4) {
|
||||||
|
addTriangle(v1, v2, v3, t1, t2, t3, n1, n2, n3);
|
||||||
|
addTriangle(v1, v3, v4, t1, t3, t4, n1, n3, n4);
|
||||||
|
}
|
||||||
|
public void addQuad(Vector3f v1, Vector3f v2, Vector3f v3, Vector3f v4, Vector2f t1, Vector2f t2, Vector2f t3, Vector2f t4, Vector3f n1) {
|
||||||
|
addTriangle(v1, v2, v3, t1, t2, t3, n1, n1, n1);
|
||||||
|
addTriangle(v1, v3, v4, t1, t3, t4, n1, n1, n1);
|
||||||
|
}
|
||||||
|
public void clear() {
|
||||||
|
vertices.clear();
|
||||||
|
textureCoords.clear();
|
||||||
|
normals.clear();
|
||||||
|
indices.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ResourceListTexturedMesh create(RenderMode mode) {
|
||||||
|
ResourceListTexturedMesh resource = new ResourceListTexturedMesh(mode);
|
||||||
|
if (resource.resourceHasBeenCorectlyInit() == false) {
|
||||||
|
Log.critical("resource Is not correctly init: ResourceVirtualBufferObject");
|
||||||
|
}
|
||||||
|
getManager().localAdd(resource);
|
||||||
|
return resource;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
29
src/org/atriaSoft/gameEngine/sample/LoxelEngine/Log.java
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
package org.atriaSoft.gameEngine.sample.LoxelEngine;
|
||||||
|
|
||||||
|
public class Log {
|
||||||
|
private static String LIBNAME = "Sample1";
|
||||||
|
public static void print(String data) {
|
||||||
|
System.out.println(data);
|
||||||
|
}
|
||||||
|
public static void critical(String data) {
|
||||||
|
System.out.println("[C] " + LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
public static void error(String data) {
|
||||||
|
System.out.println("[E] " + LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
public static void warning(String data) {
|
||||||
|
System.out.println("[W] " + LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
public static void info(String data) {
|
||||||
|
System.out.println("[I] " + LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
public static void debug(String data) {
|
||||||
|
System.out.println("[D] " + LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
public static void verbose(String data) {
|
||||||
|
System.out.println("[V] " + LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
public static void todo(String data) {
|
||||||
|
System.out.println("[TODO] " + LIBNAME + " | " + data);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,184 @@
|
|||||||
|
package org.atriaSoft.gameEngine.sample.LoxelEngine;
|
||||||
|
|
||||||
|
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.backend3d.OpenGL;
|
||||||
|
import org.atriaSoft.gale.backend3d.OpenGL.Flag;
|
||||||
|
import org.atriaSoft.gale.context.Context;
|
||||||
|
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.ComponentLight;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentLightSun;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentMaterial;
|
||||||
|
import org.atriaSoft.gameEngine.components.ComponentPosition;
|
||||||
|
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.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;
|
||||||
|
|
||||||
|
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 ControlCameraSimple simpleControl;
|
||||||
|
private Material materialCube;
|
||||||
|
private ComponentPosition lightPosition;
|
||||||
|
private float angleLight = 0;
|
||||||
|
private MapVoxel map;
|
||||||
|
public LoxelApplication(){
|
||||||
|
creationDone = false;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void onCreate(Context _context) {
|
||||||
|
env = new Environement();
|
||||||
|
this.canDraw = true;
|
||||||
|
setSize(new Vector2f(800, 600));
|
||||||
|
setTitle("Low Poly sample");
|
||||||
|
map = new MapVoxel(this.env);
|
||||||
|
this.env.addEngine(map);
|
||||||
|
map.init();
|
||||||
|
|
||||||
|
// 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,0)));
|
||||||
|
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);
|
||||||
|
|
||||||
|
Entity gird = new Entity(this.env);
|
||||||
|
gird.addComponent(new ComponentPosition(new Transform3D(new Vector3f(0,0,0))));
|
||||||
|
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 basicTree = new Entity(this.env);
|
||||||
|
objectPosition = new ComponentPosition(new Transform3D(new Vector3f(0,0,0)));
|
||||||
|
basicTree.addComponent(objectPosition);
|
||||||
|
materialCube = new Material();
|
||||||
|
basicTree.addComponent(new ComponentMaterial(materialCube));
|
||||||
|
basicTree.addComponent(new ComponentStaticMesh(new Uri("RES", "cube.obj")));
|
||||||
|
basicTree.addComponent(new ComponentTexture(new Uri("RES", "grass.png")));
|
||||||
|
basicTree.addComponent(new ComponentRenderTexturedMaterialsStaticMesh(
|
||||||
|
new Uri("DATA", "basicMaterial.vert"),
|
||||||
|
new Uri("DATA", "basicMaterial.frag"),
|
||||||
|
(EngineLight)env.getEngine(EngineLight.ENGINE_NAME)));
|
||||||
|
env.addEntity(basicTree);
|
||||||
|
|
||||||
|
|
||||||
|
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 ControlCameraSimple(mainView);
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
//materialCube.setAmbientFactor(new Vector3f(1.0f,1.0f,1.0f));
|
||||||
|
// apply a little rotation to show the element move
|
||||||
|
//objectPosition.getTransform().applyRotation(basicRotation);
|
||||||
|
//objectPosition.getTransform().applyRotation(basicRotation2);
|
||||||
|
angleLight += 0.01;
|
||||||
|
lightPosition.getTransform().getPosition().x = (float)Math.cos(angleLight) * 7.0f;
|
||||||
|
lightPosition.getTransform().getPosition().y = (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.0f, 1.0f, 0.0f, 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");
|
||||||
|
|
||||||
|
// Restore context of matrix
|
||||||
|
OpenGL.pop();
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void onPointer(KeySpecial special,
|
||||||
|
KeyType type,
|
||||||
|
int pointerID,
|
||||||
|
Vector2f pos,
|
||||||
|
KeyStatus state) {
|
||||||
|
env.onPointer(special, type, pointerID, pos, state);
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void onKeyboard(KeySpecial special,
|
||||||
|
KeyKeyboard type,
|
||||||
|
Character value,
|
||||||
|
KeyStatus state) {
|
||||||
|
env.onKeyboard(special, type, value, state);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
#version 400 core
|
||||||
|
|
||||||
|
#ifdef GL_ES
|
||||||
|
precision mediump float;
|
||||||
|
precision mediump int;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
in vec2 io_textureCoords;
|
||||||
|
|
||||||
|
uniform sampler2D in_textureBase;
|
||||||
|
|
||||||
|
// output:
|
||||||
|
out vec4 out_Color;
|
||||||
|
|
||||||
|
void main(void) {
|
||||||
|
out_Color = texture(in_textureBase, io_textureCoords);
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
#version 400 core
|
||||||
|
|
||||||
|
#ifdef GL_ES
|
||||||
|
precision mediump float;
|
||||||
|
precision mediump int;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Input:
|
||||||
|
in vec3 in_position;
|
||||||
|
in vec2 in_textureCoords;
|
||||||
|
uniform mat4 in_matrixTransformation;
|
||||||
|
uniform mat4 in_matrixProjection;
|
||||||
|
uniform mat4 in_matrixView;
|
||||||
|
|
||||||
|
// output:
|
||||||
|
out vec2 io_textureCoords;
|
||||||
|
|
||||||
|
void main(void) {
|
||||||
|
gl_Position = in_matrixProjection * in_matrixView * in_matrixTransformation * vec4(in_position, 1.0);
|
||||||
|
io_textureCoords = in_textureCoords;
|
||||||
|
}
|
@ -0,0 +1,80 @@
|
|||||||
|
#version 400 core
|
||||||
|
|
||||||
|
#ifdef GL_ES
|
||||||
|
precision mediump float;
|
||||||
|
precision mediump int;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct Light {
|
||||||
|
vec3 color;
|
||||||
|
vec3 position;
|
||||||
|
vec3 attenuation;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Material {
|
||||||
|
vec3 ambientFactor;
|
||||||
|
vec3 diffuseFactor;
|
||||||
|
vec3 specularFactor;
|
||||||
|
float shininess;
|
||||||
|
};
|
||||||
|
const int MAX_LIGHT_NUMBER = 8;
|
||||||
|
|
||||||
|
|
||||||
|
in vec2 io_textureCoords;
|
||||||
|
in vec3 io_surfaceNormal;
|
||||||
|
in vec3 io_toCameraVector;
|
||||||
|
in vec3 io_toLightVector[MAX_LIGHT_NUMBER];
|
||||||
|
// FOW: Fog Of War result calculation
|
||||||
|
in float io_fowVisibility;
|
||||||
|
|
||||||
|
// texture properties
|
||||||
|
uniform sampler2D in_textureBase;
|
||||||
|
// Material
|
||||||
|
uniform Material in_material;
|
||||||
|
// 2 light for suns and other for locals ...
|
||||||
|
uniform Light in_lights[MAX_LIGHT_NUMBER];
|
||||||
|
// global color of the sky ... needed to have a better color for the FOW
|
||||||
|
//uniform vec3 in_sky_color;
|
||||||
|
const vec3 in_sky_color = vec3(1.0,1.0,1.0);
|
||||||
|
|
||||||
|
// output:
|
||||||
|
out vec4 out_Color;
|
||||||
|
|
||||||
|
void main(void) {
|
||||||
|
// disable transparency elements in the texture ...
|
||||||
|
// Can be set at the start of the shader ...
|
||||||
|
vec4 textureColour = texture(in_textureBase, io_textureCoords);
|
||||||
|
if (textureColour.a < 0.5) {
|
||||||
|
discard;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 unitNormal = normalize(io_surfaceNormal);
|
||||||
|
vec3 unitVectorToCamera = normalize(io_toCameraVector);
|
||||||
|
vec3 totalDiffuse = vec3(0.0);
|
||||||
|
vec3 totalSpecular = vec3(0.0);
|
||||||
|
for(int iii=0; iii<MAX_LIGHT_NUMBER; iii++) {
|
||||||
|
float distance = length(io_toLightVector[iii]);
|
||||||
|
float attenuationFactor = in_lights[iii].attenuation.x + (in_lights[iii].attenuation.y * distance) + (in_lights[iii].attenuation.z * distance * distance);
|
||||||
|
vec3 unitLightVector = normalize(io_toLightVector[iii]);
|
||||||
|
float nDot1 = dot(unitNormal, unitLightVector);
|
||||||
|
float brightness = max(nDot1, 0.0);
|
||||||
|
vec3 lightDirection = -unitLightVector;
|
||||||
|
vec3 reflectedLightDirection = reflect(lightDirection, unitNormal);
|
||||||
|
float specularFactor = dot(reflectedLightDirection, unitVectorToCamera);
|
||||||
|
specularFactor = max(specularFactor, 0.0);
|
||||||
|
float damperFactor = pow(specularFactor, in_material.shininess);
|
||||||
|
vec3 diffuse = (brightness * in_lights[iii].color) / attenuationFactor;;
|
||||||
|
vec3 finalSpecular = (damperFactor * in_material.specularFactor.x * in_lights[iii].color) / attenuationFactor; // TODO: Remove the x ....
|
||||||
|
totalDiffuse = totalDiffuse + diffuse;
|
||||||
|
totalSpecular = totalSpecular + finalSpecular;
|
||||||
|
}
|
||||||
|
// the 0.2 represent the ambiant lightning ==> maybe set an uniform for this
|
||||||
|
totalDiffuse = max(totalDiffuse, 0.3);
|
||||||
|
|
||||||
|
out_Color = vec4(totalDiffuse,1.0) * textureColour + vec4(totalSpecular, 1.0);
|
||||||
|
out_Color = mix(vec4(in_sky_color,1.0), out_Color, io_fowVisibility);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,59 @@
|
|||||||
|
#version 400 core
|
||||||
|
|
||||||
|
#ifdef GL_ES
|
||||||
|
precision mediump float;
|
||||||
|
precision mediump int;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct Light {
|
||||||
|
vec3 color;
|
||||||
|
vec3 position;
|
||||||
|
vec3 attenuation;
|
||||||
|
};
|
||||||
|
const int MAX_LIGHT_NUMBER = 8;
|
||||||
|
|
||||||
|
// Input:
|
||||||
|
in vec3 in_position;
|
||||||
|
in vec3 in_normal;
|
||||||
|
in vec2 in_textureCoords;
|
||||||
|
// 2 light for suns and other for locals ...
|
||||||
|
uniform Light in_lights[MAX_LIGHT_NUMBER];
|
||||||
|
|
||||||
|
uniform mat4 in_matrixTransformation;
|
||||||
|
uniform mat4 in_matrixProjection;
|
||||||
|
uniform mat4 in_matrixView;
|
||||||
|
|
||||||
|
//uniform float in_numberOfRows;
|
||||||
|
//uniform vec2 in_offset;
|
||||||
|
const float in_numberOfRows = 1;
|
||||||
|
const vec2 in_offset = vec2(0.0,0.0);
|
||||||
|
|
||||||
|
// Configuration of the FOV ==> TODO: Set it in parameter uniform ...
|
||||||
|
const float c_density = 0.007;
|
||||||
|
const float c_gradient = 1.5;
|
||||||
|
|
||||||
|
// output:
|
||||||
|
out vec2 io_textureCoords;
|
||||||
|
out vec3 io_surfaceNormal;
|
||||||
|
out vec3 io_toCameraVector;
|
||||||
|
out vec3 io_toLightVector[MAX_LIGHT_NUMBER];
|
||||||
|
// FOW: Fog Of War result calculation
|
||||||
|
out float io_fowVisibility;
|
||||||
|
|
||||||
|
void main(void) {
|
||||||
|
vec4 worldPosition = in_matrixTransformation * vec4(in_position, 1.0);
|
||||||
|
vec4 positionRelativeToCam = in_matrixView * worldPosition;
|
||||||
|
gl_Position = in_matrixProjection * positionRelativeToCam;
|
||||||
|
io_textureCoords = (in_textureCoords/in_numberOfRows) + in_offset;
|
||||||
|
|
||||||
|
io_surfaceNormal = (in_matrixTransformation * vec4(in_normal, 0.0)).xyz;
|
||||||
|
for(int iii=0;iii<MAX_LIGHT_NUMBER;iii++) {
|
||||||
|
io_toLightVector[iii] = in_lights[iii].position - worldPosition.xyz;
|
||||||
|
}
|
||||||
|
io_toCameraVector = (inverse(in_matrixView) * vec4(0.0,0.0,0.0,1.0)).xyz - worldPosition.xyz;
|
||||||
|
|
||||||
|
float distance = length(positionRelativeToCam.xyz);
|
||||||
|
|
||||||
|
io_fowVisibility = exp(-pow((distance*c_density),c_gradient));
|
||||||
|
io_fowVisibility = clamp(io_fowVisibility, 0.0, 1.0);
|
||||||
|
}
|
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/.DS_Store
vendored
Normal file
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/anvil_base.png
Executable file
After Width: | Height: | Size: 9.5 KiB |
After Width: | Height: | Size: 8.8 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 74 KiB |
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"animation": {
|
||||||
|
"frametime": 5,
|
||||||
|
"interpolate": true
|
||||||
|
}
|
||||||
|
}
|
After Width: | Height: | Size: 5.9 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 6.1 KiB |
After Width: | Height: | Size: 6.4 KiB |
After Width: | Height: | Size: 7.4 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 7.5 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/brick.png
Executable file
After Width: | Height: | Size: 20 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/cactus_bottom.png
Executable file
After Width: | Height: | Size: 3.8 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/cactus_side.png
Executable file
After Width: | Height: | Size: 14 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/cactus_top.png
Executable file
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 5.7 KiB |
After Width: | Height: | Size: 7.0 KiB |
After Width: | Height: | Size: 8.1 KiB |
After Width: | Height: | Size: 12 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/carrots_stage_0.png
Executable file
After Width: | Height: | Size: 7.2 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/carrots_stage_1.png
Executable file
After Width: | Height: | Size: 10 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/carrots_stage_2.png
Executable file
After Width: | Height: | Size: 12 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/carrots_stage_3.png
Executable file
After Width: | Height: | Size: 19 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/cauldron_bottom.png
Executable file
After Width: | Height: | Size: 2.4 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/cauldron_inner.png
Executable file
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 12 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/cauldron_top.png
Executable file
After Width: | Height: | Size: 2.2 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/chorus_flower.png
Executable file
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 19 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/chorus_plant.png
Executable file
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 27 KiB |
After Width: | Height: | Size: 27 KiB |
After Width: | Height: | Size: 40 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/cocoa_stage_0.png
Executable file
After Width: | Height: | Size: 5.8 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/cocoa_stage_1.png
Executable file
After Width: | Height: | Size: 9.9 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/cocoa_stage_2.png
Executable file
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 190 KiB |
@ -0,0 +1,72 @@
|
|||||||
|
{
|
||||||
|
"animation": {
|
||||||
|
"frametime": 2,
|
||||||
|
"interpolate": false,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"index": 0,
|
||||||
|
"time": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 1,
|
||||||
|
"time": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 2,
|
||||||
|
"time": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 3,
|
||||||
|
"time": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 4,
|
||||||
|
"time": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 5,
|
||||||
|
"time": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 6,
|
||||||
|
"time": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 7,
|
||||||
|
"time": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 8,
|
||||||
|
"time": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 9,
|
||||||
|
"time": 10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 10,
|
||||||
|
"time": 5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 11,
|
||||||
|
"time": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 12,
|
||||||
|
"time": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 13,
|
||||||
|
"time": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 14,
|
||||||
|
"time": 10
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"index": 15,
|
||||||
|
"time": 4
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/comparator_off.png
Executable file
After Width: | Height: | Size: 17 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/comparator_on.png
Executable file
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 19 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/destroy_stage_0.png
Executable file
After Width: | Height: | Size: 2.1 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/destroy_stage_1.png
Executable file
After Width: | Height: | Size: 3.2 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/destroy_stage_2.png
Executable file
After Width: | Height: | Size: 5.8 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/destroy_stage_3.png
Executable file
After Width: | Height: | Size: 11 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/destroy_stage_4.png
Executable file
After Width: | Height: | Size: 14 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/destroy_stage_5.png
Executable file
After Width: | Height: | Size: 18 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/destroy_stage_6.png
Executable file
After Width: | Height: | Size: 20 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/destroy_stage_7.png
Executable file
After Width: | Height: | Size: 21 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/destroy_stage_8.png
Executable file
After Width: | Height: | Size: 22 KiB |
BIN
src/org/atriaSoft/gameEngine/sample/LoxelEngine/res/blocks/destroy_stage_9.png
Executable file
After Width: | Height: | Size: 21 KiB |
@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"animation": {
|
||||||
|
"frametime": 2,
|
||||||
|
"interpolate": true,
|
||||||
|
"frames": [
|
||||||
|
{
|
||||||
|
"index": 0,
|
||||||
|
"time": 4
|
||||||
|
},
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
{
|
||||||
|
"index": 3,
|
||||||
|
"time": 3
|
||||||
|
},
|
||||||
|
2,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|