[DEV] continue porting internal physics engine

This commit is contained in:
Edouard DUPIN 2020-06-28 21:22:58 +02:00
parent f5ab47bade
commit 52bf5fa9ab
10 changed files with 440 additions and 56 deletions

View File

@ -80,6 +80,40 @@ public class Matrix4f {
this.mat[iii] = values[iii];
}
}
public Matrix4f(Matrix3f matrix) {
this.mat[0] = matrix.mat[0];
this.mat[1] = matrix.mat[1];
this.mat[2] = matrix.mat[2];
this.mat[3] = 0;
this.mat[4] = matrix.mat[3];
this.mat[5] = matrix.mat[4];
this.mat[6] = matrix.mat[5];
this.mat[7] = 0;
this.mat[8] = matrix.mat[6];
this.mat[9] = matrix.mat[7];
this.mat[10] = matrix.mat[8];
this.mat[11] = 0;
this.mat[12] = 0;
this.mat[13] = 0;
this.mat[14] = 0;
this.mat[15] = 1;
// this.mat[0] = matrix.mat[0];
// this.mat[1] = matrix.mat[3];
// this.mat[2] = matrix.mat[6];
// this.mat[3] = 0;
// this.mat[4] = matrix.mat[1];
// this.mat[5] = matrix.mat[4];
// this.mat[6] = matrix.mat[7];
// this.mat[7] = 0;
// this.mat[8] = matrix.mat[2];
// this.mat[9] = matrix.mat[5];
// this.mat[10] = matrix.mat[8];
// this.mat[11] = 0;
// this.mat[12] = 0;
// this.mat[13] = 0;
// this.mat[14] = 0;
// this.mat[15] = 1;
}
/**
* @brief Operator= Asign the current object with an other object
* @param[in] obj Reference on the external object

View File

@ -2,6 +2,8 @@ package org.atriaSoft.etk.math;
import java.util.Arrays;
import org.atriaSoft.gale.test.sample2.Log;
public class Quaternion {
public float x;
public float y;
@ -651,4 +653,11 @@ public class Quaternion {
public String toString() {
return "Quaternion(" + this.x + "," + this.y + "," + this.z + "," + this.w + ")";
}
// a * diff = b
public static Quaternion diff(Quaternion a, Quaternion b) {
//Log.info("diff " + a + " " + b);
Quaternion inv = a.inverse_new();
return inv.multiply(b);
}
}

View File

@ -2,10 +2,8 @@ package org.atriaSoft.gale.context.LWJG_AWT;
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
@ -17,26 +15,18 @@ import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.MemoryImageSource;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.Robot;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import java.nio.IntBuffer;
import org.atriaSoft.etk.Uri;
import org.atriaSoft.etk.math.Vector2f;
import org.atriaSoft.gale.Application;
import org.atriaSoft.gale.Fps;
import org.atriaSoft.gale.backend3d.OpenGL;
import org.atriaSoft.gale.context.Context;
import org.atriaSoft.gale.key.KeyKeyboard;
import org.atriaSoft.gale.key.KeySpecial;

View File

@ -75,6 +75,7 @@ public class ComponentPhysics extends Component {
}
public void updateForNarrowCollision() {
narrowIntersection.clear();
if (aabbIntersection.size() == 0) {
return;
}
@ -85,7 +86,12 @@ public class ComponentPhysics extends Component {
for (PhysicShape shape : shapes) {
shape.updateForNarrowCollision(position.getTransform());
}
narrowIntersection.clear();
}
public boolean isNarrowCollide() {
if (narrowIntersection.size() == 0) {
return false;
}
return true;
}
public boolean checkNarrowCollision() {
if (this.staticObject == true) {
@ -94,7 +100,7 @@ public class ComponentPhysics extends Component {
for (ComponentPhysics elem : aabbIntersection) {
boolean collide = false;
for (PhysicShape shapeCurrent : shapes) {
if (true == elem.checkCollide(shapeCurrent)) {
if (elem.checkCollide(shapeCurrent) == true) {
collide = true;
break;
}
@ -104,7 +110,21 @@ public class ComponentPhysics extends Component {
elem.narrowIntersection.add(this);
}
}
return false;
return isNarrowCollide();
}
public void narrowCollisionCreateContactAndForce() {
if (narrowIntersection.size() == 0) {
return;
}
for (ComponentPhysics elem : narrowIntersection) {
for (PhysicShape shapeCurrent : shapes) {
//TODO: Do a better method we do this many times ...
if (elem.checkCollide(shapeCurrent) == false) {
continue;
}
elem.getCollidePoints(shapeCurrent);
}
}
}
private boolean checkCollide(PhysicShape shapeCurrent) {
@ -153,6 +173,50 @@ public class ComponentPhysics extends Component {
}
return false;
}
private void getCollidePoints(PhysicShape shapeCurrent) {
if (shapeCurrent instanceof PhysicBox) {
PhysicBox shape111 = (PhysicBox)shapeCurrent;
for (PhysicShape shape : shapes) {
if (shape instanceof PhysicBox) {
PhysicBox shape222 = (PhysicBox)shape;
ToolCollisionOBBWithOBB.getCollidePoints(shape111, shape222);
} else if (shape instanceof PhysicSphere) {
} else if (shape instanceof PhysicMapVoxel) {
} else {
Log.error("Not manage collision model... " + shape);
}
}
} else if (shapeCurrent instanceof PhysicSphere) {
for (PhysicShape shape : shapes) {
if (shape instanceof PhysicBox) {
} else if (shape instanceof PhysicSphere) {
} else if (shape instanceof PhysicMapVoxel) {
} else {
Log.error("Not manage collision model... " + shape);
}
}
} else if (shapeCurrent instanceof PhysicMapVoxel) {
for (PhysicShape shape : shapes) {
if (shape instanceof PhysicBox) {
} else if (shape instanceof PhysicSphere) {
} else if (shape instanceof PhysicMapVoxel) {
} else {
Log.error("Not manage collision model... " + shape);
}
}
} else {
Log.error("Not manage collision model... " + shapeCurrent);
}
return;
}
public void applyForces(float timeStep, EngineGravity gravity) {
// get the gravity at the specific position...

View File

@ -71,6 +71,10 @@ public class EngineLight extends Engine {
float maxDistance = 50*50;
for (ComponentLight elem: componentLights) {
Vector3f pos = elem.getPosition();
if (count>=8) {
Log.error("need to update ligth count");
return out;
}
if (pos.distance2(position) < maxDistance) {
out[count] = new Light(elem.getLight().getColor(), pos, elem.getLight().getAttenuation());
count++;

View File

@ -95,6 +95,15 @@ public class EnginePhysics extends Engine {
for (int iii=0; iii< components.size(); iii++) {
ComponentPhysics current = components.get(iii);
boolean collide = current.checkNarrowCollision();
}
for (int iii=0; iii< components.size(); iii++) {
ComponentPhysics current = components.get(iii);
if (current.isNarrowCollide() == false) {
continue;
}
current.narrowCollisionCreateContactAndForce();
}
}

View File

@ -18,16 +18,18 @@ public class PhysicBox extends PhysicShape {
this.size = size;
}
@Override
public void updateAABB(Transform3D transform, PhysicCollisionAABB aabb) {
public void updateAABB(Transform3D transformGlobal, PhysicCollisionAABB aabb) {
// store it, many time usefull...
this.transformGlobal = transformGlobal;
// TODO Auto-generated method stub
aabb.update(transform.multiply(this.transform.multiply(new Vector3f(this.size.x*0.5f,this.size.y*0.5f,this.size.z*0.5f))));
aabb.update(transform.multiply(this.transform.multiply(new Vector3f(-this.size.x*0.5f,this.size.y*0.5f,this.size.z*0.5f))));
aabb.update(transform.multiply(this.transform.multiply(new Vector3f(-this.size.x*0.5f,-this.size.y*0.5f,this.size.z*0.5f))));
aabb.update(transform.multiply(this.transform.multiply(new Vector3f(this.size.x*0.5f,-this.size.y*0.5f,this.size.z*0.5f))));
aabb.update(transform.multiply(this.transform.multiply(new Vector3f(this.size.x*0.5f,this.size.y*0.5f,-this.size.z*0.5f))));
aabb.update(transform.multiply(this.transform.multiply(new Vector3f(-this.size.x*0.5f,this.size.y*0.5f,-this.size.z*0.5f))));
aabb.update(transform.multiply(this.transform.multiply(new Vector3f(-this.size.x*0.5f,-this.size.y*0.5f,-this.size.z*0.5f))));
aabb.update(transform.multiply(this.transform.multiply(new Vector3f(this.size.x*0.5f,-this.size.y*0.5f,-this.size.z*0.5f))));
aabb.update(transformGlobal.multiply(this.transform.multiply(new Vector3f(this.size.x*0.5f,this.size.y*0.5f,this.size.z*0.5f))));
aabb.update(transformGlobal.multiply(this.transform.multiply(new Vector3f(-this.size.x*0.5f,this.size.y*0.5f,this.size.z*0.5f))));
aabb.update(transformGlobal.multiply(this.transform.multiply(new Vector3f(-this.size.x*0.5f,-this.size.y*0.5f,this.size.z*0.5f))));
aabb.update(transformGlobal.multiply(this.transform.multiply(new Vector3f(this.size.x*0.5f,-this.size.y*0.5f,this.size.z*0.5f))));
aabb.update(transformGlobal.multiply(this.transform.multiply(new Vector3f(this.size.x*0.5f,this.size.y*0.5f,-this.size.z*0.5f))));
aabb.update(transformGlobal.multiply(this.transform.multiply(new Vector3f(-this.size.x*0.5f,this.size.y*0.5f,-this.size.z*0.5f))));
aabb.update(transformGlobal.multiply(this.transform.multiply(new Vector3f(-this.size.x*0.5f,-this.size.y*0.5f,-this.size.z*0.5f))));
aabb.update(transformGlobal.multiply(this.transform.multiply(new Vector3f(this.size.x*0.5f,-this.size.y*0.5f,-this.size.z*0.5f))));
}
// only needed for the narrow phase calculation ...
public Vector3f narrowPhaseGlobalPos;
@ -36,15 +38,15 @@ public class PhysicBox extends PhysicShape {
public Vector3f narrowPhaseAxisZ = new Vector3f(1,0,0);
public Vector3f narrowPhaseHalfSize;
@Override
public void updateForNarrowCollision(Transform3D transform) {
this.narrowPhaseGlobalPos = transform.multiply(this.transform.multiply(new Vector3f(0,0,0)));
this.narrowPhaseAxisX = transform.multiply(this.transform.multiply(new Vector3f(1,0,0))).less(this.narrowPhaseGlobalPos);
this.narrowPhaseAxisY = transform.multiply(this.transform.multiply(new Vector3f(0,1,0))).less(this.narrowPhaseGlobalPos);
this.narrowPhaseAxisZ = transform.multiply(this.transform.multiply(new Vector3f(0,0,1))).less(this.narrowPhaseGlobalPos);
public void updateForNarrowCollision(Transform3D transformGlobal) {
this.narrowPhaseGlobalPos = transformGlobal.multiply(this.transform.multiply(new Vector3f(0,0,0)));
this.narrowPhaseAxisX = transformGlobal.multiply(this.transform.multiply(new Vector3f(1,0,0))).less(this.narrowPhaseGlobalPos);
this.narrowPhaseAxisY = transformGlobal.multiply(this.transform.multiply(new Vector3f(0,1,0))).less(this.narrowPhaseGlobalPos);
this.narrowPhaseAxisZ = transformGlobal.multiply(this.transform.multiply(new Vector3f(0,0,1))).less(this.narrowPhaseGlobalPos);
this.narrowPhaseHalfSize = this.size.multiply_new(0.5f);
}
@Override
public void renderDebug(Transform3D transform, ResourceColored3DObject debugDrawProperty) {
debugDrawProperty.drawSquare(this.size.multiply_new(0.5f), this.transform.getOpenGLMatrix().multiply_new(transform.getOpenGLMatrix()), new Color(0,1,0,0.25f));
public void renderDebug(Transform3D transformGlobal, ResourceColored3DObject debugDrawProperty) {
debugDrawProperty.drawSquare(this.size.multiply_new(0.5f), this.transform.getOpenGLMatrix().multiply_new(transformGlobal.getOpenGLMatrix()), new Color(0,1,0,0.25f));
}
}

View File

@ -9,6 +9,7 @@ public abstract class PhysicShape {
// protected Quaternion quaternion;
// protected Vector3f origin;
protected Transform3D transform;
protected Transform3D transformGlobal;
protected float mass = 0;
protected final PhysicShapeType type;
@ -26,6 +27,9 @@ public abstract class PhysicShape {
// this.origin = origin;
this.mass = mass;
}
public Quaternion getQuaternionFull() {
return transformGlobal.getOrientation().multiply_new(transform.getOrientation());
}
public Quaternion getQuaternion() {
return transform.getOrientation();
}
@ -44,6 +48,12 @@ public abstract class PhysicShape {
public void setTransform(Transform3D transform) {
this.transform = transform;
}
public Transform3D getTransformGlobal() {
return transformGlobal;
}
public void setTransformGlobal(Transform3D transform) {
this.transformGlobal = transform;
}
public float getMass() {
return mass;
}

View File

@ -1,7 +1,9 @@
package org.atriaSoft.gameEngine.physics;
import org.atriaSoft.etk.math.Quaternion;
import org.atriaSoft.etk.math.Vector3f;
import org.atriaSoft.gale.test.sample2.Log;
import org.atriaSoft.gameEngine.sample.LoxelEngine.LoxelApplication;
// set the relevant elements of our oriented bounding box
class OBB
@ -123,5 +125,121 @@ public class ToolCollisionOBBWithOBB {
getSeparatingPlane222(RPos, box1.narrowPhaseAxisZ.cross(box2.narrowPhaseAxisZ), box1, box2);
return ! ret;
}
public static void getCollidePoints(PhysicBox box1, PhysicBox box2) {
//Log.info("Try to calculare reverse force ........");
Vector3f RPos = box2.narrowPhaseGlobalPos.less_new(box1.narrowPhaseGlobalPos);
Quaternion quat1 = box1.getQuaternionFull();
Quaternion quat2 = box2.getQuaternionFull();
// Step 1: set the Box 2 in the repere of the Box 1:
//Quaternion quatTransfer = Quaternion.diff(quat2, quat1);
Quaternion quatTransfer = Quaternion.diff(quat1, quat2);
//quatTransfer.normalize();
//LoxelApplication.relativeTest = quatTransfer;
//Vector3f tmp = RPos.add_new(new Vector3f(0,0,14));
// LoxelApplication.relativeTestPos.getTransform().setPosition(tmp);
// LoxelApplication.relativeTestPos.getTransform().setOrientation(quatTransfer);
// LoxelApplication.boxTest.setSize(box1.getSize());
Log.info("" + RPos + quatTransfer);
// /*res = */getCollidePointsAABBCenteredWithOBB(box1.narrowPhaseHalfSize, box2.narrowPhaseHalfSize, quatTransfer, RPos);
/* res = trenasfert in generic plan the new res ...*/
// test origin AABB with OBB collision
// Step 2: set the Box 1 in the repere of the Box 2:
// test origin AABB with OBB collision
RPos = box1.narrowPhaseGlobalPos.less_new(box2.narrowPhaseGlobalPos);
//tmp = RPos.add_new(new Vector3f(0,0,14));
quatTransfer = Quaternion.diff(quat2, quat1);
LoxelApplication.testRpos = RPos;
LoxelApplication.testQTransfert = quatTransfer;
LoxelApplication.box1HalfSize = box2.narrowPhaseHalfSize;
LoxelApplication.box2HalfSize = box1.narrowPhaseHalfSize;
// LoxelApplication.relativeTestPos.getTransform().setPosition(tmp);
// LoxelApplication.relativeTestPos.getTransform().setOrientation(quatTransfer);
// LoxelApplication.boxTest.setSize(box1.getSize());
/*res = */getCollidePointsAABBCenteredWithOBB(box2.narrowPhaseHalfSize, box1.narrowPhaseHalfSize, quatTransfer, RPos);
/* res = trenasfert in generic plan the new res ...*/
}
public static void getCollidePointsAABBCenteredWithOBB(Vector3f box1HalfSize, Vector3f box2HalfSize, Quaternion box2Orientation, Vector3f box2Position) {
// point in AABB
// Vector3f topBackRight = box2Orientation.multiply(new Vector3f(box2Position.x + box2HalfSize.x, box2Position.y + box2HalfSize.y, box2Position.z + box2HalfSize.z));
// Vector3f topBackLeft = box2Orientation.multiply(new Vector3f(box2Position.x - box2HalfSize.x, box2Position.y + box2HalfSize.y, box2Position.z + box2HalfSize.z));
// Vector3f topFrontRight = box2Orientation.multiply(new Vector3f(box2Position.x + box2HalfSize.x, box2Position.y - box2HalfSize.y, box2Position.z + box2HalfSize.z));
// Vector3f topFrontLeft = box2Orientation.multiply(new Vector3f(box2Position.x - box2HalfSize.x, box2Position.y - box2HalfSize.y, box2Position.z + box2HalfSize.z));
// Vector3f bottomBackRight = box2Orientation.multiply(new Vector3f(box2Position.x + box2HalfSize.x, box2Position.y + box2HalfSize.y, box2Position.z - box2HalfSize.z));
// Vector3f bottomBackLeft = box2Orientation.multiply(new Vector3f(box2Position.x - box2HalfSize.x, box2Position.y + box2HalfSize.y, box2Position.z - box2HalfSize.z));
// Vector3f bottomFrontRight = box2Orientation.multiply(new Vector3f(box2Position.x + box2HalfSize.x, box2Position.y - box2HalfSize.y, box2Position.z - box2HalfSize.z));
// Vector3f bottomFrontLeft = box2Orientation.multiply(new Vector3f(box2Position.x - box2HalfSize.x, box2Position.y - box2HalfSize.y, box2Position.z - box2HalfSize.z));
Vector3f topBackRight = box2Orientation.multiply(new Vector3f(+ box2HalfSize.x, + box2HalfSize.y, + box2HalfSize.z)).add(box2Position);
Vector3f topBackLeft = box2Orientation.multiply(new Vector3f(- box2HalfSize.x, + box2HalfSize.y, + box2HalfSize.z)).add(box2Position);
Vector3f topFrontRight = box2Orientation.multiply(new Vector3f(+ box2HalfSize.x, - box2HalfSize.y, + box2HalfSize.z)).add(box2Position);
Vector3f topFrontLeft = box2Orientation.multiply(new Vector3f(- box2HalfSize.x, - box2HalfSize.y, + box2HalfSize.z)).add(box2Position);
Vector3f bottomBackRight = box2Orientation.multiply(new Vector3f(+ box2HalfSize.x, + box2HalfSize.y, - box2HalfSize.z)).add(box2Position);
Vector3f bottomBackLeft = box2Orientation.multiply(new Vector3f(- box2HalfSize.x, + box2HalfSize.y, - box2HalfSize.z)).add(box2Position);
Vector3f bottomFrontRight = box2Orientation.multiply(new Vector3f(+ box2HalfSize.x, - box2HalfSize.y, - box2HalfSize.z)).add(box2Position);
Vector3f bottomFrontLeft = box2Orientation.multiply(new Vector3f(- box2HalfSize.x, - box2HalfSize.y, - box2HalfSize.z)).add(box2Position);
LoxelApplication.testPoints.clear();
LoxelApplication.testPoints.add(topBackRight);
LoxelApplication.testPoints.add(topBackLeft);
LoxelApplication.testPoints.add(topFrontRight);
LoxelApplication.testPoints.add(topFrontLeft);
LoxelApplication.testPoints.add(bottomBackRight);
LoxelApplication.testPoints.add(bottomBackLeft);
LoxelApplication.testPoints.add(bottomFrontRight);
LoxelApplication.testPoints.add(bottomFrontLeft);
LoxelApplication.testPointsBox.clear();
LoxelApplication.testPointsBox.add(new Vector3f(+ box1HalfSize.x, + box1HalfSize.y, + box1HalfSize.z));
LoxelApplication.testPointsBox.add(new Vector3f(- box1HalfSize.x, + box1HalfSize.y, + box1HalfSize.z));
LoxelApplication.testPointsBox.add(new Vector3f(+ box1HalfSize.x, - box1HalfSize.y, + box1HalfSize.z));
LoxelApplication.testPointsBox.add(new Vector3f(- box1HalfSize.x, - box1HalfSize.y, + box1HalfSize.z));
LoxelApplication.testPointsBox.add(new Vector3f(+ box1HalfSize.x, + box1HalfSize.y, - box1HalfSize.z));
LoxelApplication.testPointsBox.add(new Vector3f(- box1HalfSize.x, + box1HalfSize.y, - box1HalfSize.z));
LoxelApplication.testPointsBox.add(new Vector3f(+ box1HalfSize.x, - box1HalfSize.y, - box1HalfSize.z));
LoxelApplication.testPointsBox.add(new Vector3f(- box1HalfSize.x, - box1HalfSize.y, - box1HalfSize.z));
boolean insideTopBackRight = pointInAABB(box1HalfSize, topBackRight);
boolean insideTopBackLeft = pointInAABB(box1HalfSize, topBackLeft);
boolean insideTopFrontRight = pointInAABB(box1HalfSize, topFrontRight);
boolean insideTopFrontLeft = pointInAABB(box1HalfSize, topFrontLeft);
boolean insideBottomBackRight = pointInAABB(box1HalfSize, bottomBackRight);
boolean insideBottomBackLeft = pointInAABB(box1HalfSize, bottomBackLeft);
boolean insideBottomFrontRight = pointInAABB(box1HalfSize, bottomFrontRight);
boolean insideBottomFrontLeft = pointInAABB(box1HalfSize, bottomFrontLeft);
LoxelApplication.testPointsCollide.clear();
LoxelApplication.testPointsCollide.add(insideTopBackRight);
LoxelApplication.testPointsCollide.add(insideTopBackLeft);
LoxelApplication.testPointsCollide.add(insideTopFrontRight);
LoxelApplication.testPointsCollide.add(insideTopFrontLeft);
LoxelApplication.testPointsCollide.add(insideBottomBackRight);
LoxelApplication.testPointsCollide.add(insideBottomBackLeft);
LoxelApplication.testPointsCollide.add(insideBottomFrontRight);
LoxelApplication.testPointsCollide.add(insideBottomFrontLeft);
if (insideTopBackRight == true
|| insideTopBackLeft == true
|| insideTopFrontRight == true
|| insideTopFrontLeft == true
|| insideBottomBackRight == true
|| insideBottomBackLeft == true
|| insideBottomFrontRight == true
|| insideBottomFrontLeft == true) {
// Find a point inside the BOX ...
Log.info("Detect point inside ... " + insideTopBackRight + " " + insideTopBackLeft + " " + insideTopFrontRight + " " + insideTopFrontLeft
+ " " + insideBottomBackRight + " " + insideBottomBackLeft + " " + insideBottomFrontRight + " " + insideBottomFrontLeft);
}
// line in AABB
Log.info("Need to detect line inside ...");
}
public static boolean pointInAABB(Vector3f halfSize, Vector3f point) {
if (point.x > -halfSize.x
&& point.x < halfSize.x
&& point.y > -halfSize.y
&& point.y < halfSize.y
&& point.z > -halfSize.z
&& point.z < halfSize.z) {
return true;
}
return false;
}
}

View File

@ -1,5 +1,8 @@
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;
@ -41,6 +44,7 @@ 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;
@ -53,6 +57,16 @@ public class LoxelApplication extends Application {
private float angleLight = 0;
private MapVoxel map;
private ComponentPlayer objectPlayer;
// public static ComponentPosition relativeTestPos;
// public static PhysicBox boxTest;
public static List<Vector3f> testPoints = new ArrayList<Vector3f>();
public static List<Vector3f> testPointsBox = new ArrayList<Vector3f>();
public static List<Boolean> testPointsCollide = new ArrayList<Boolean>();
public static Vector3f testRpos;
public static Quaternion testQTransfert;
public static Vector3f box1HalfSize;
public static Vector3f box2HalfSize;
private ResourceColored3DObject debugDrawProperty;
public LoxelApplication(){
creationDone = false;
}
@ -66,8 +80,8 @@ public class LoxelApplication extends Application {
setSize(new Vector2f(800, 600));
setTitle("Loxel sample");
map = new MapVoxel(this.env);
this.env.addEngine(map);
map.init();
// this.env.addEngine(map);
// map.init();
// simple sun to have a global light ...
Entity globalGravity = new Entity(this.env);
@ -83,32 +97,139 @@ public class LoxelApplication extends Application {
// 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);
// 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(-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(-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))));
@ -200,6 +321,29 @@ public class LoxelApplication extends Application {
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<LoxelApplication.testPoints.size(); iii++) {
Vector3f elem = LoxelApplication.testPoints.get(iii);
boolean collide = LoxelApplication.testPointsCollide.get(iii);
if (collide == true) {
debugDrawProperty.drawSquare(new Vector3f(0.1f,0.1f,0.1f), Matrix4f.identity().multiply_new(Matrix4f.createMatrixTranslate(new Vector3f(elem.x,elem.y,elem.z+14))), new Color(1,0,0,1));
} else {
debugDrawProperty.drawSquare(new Vector3f(0.1f,0.1f,0.1f), Matrix4f.identity().multiply_new(Matrix4f.createMatrixTranslate(new Vector3f(elem.x,elem.y,elem.z+14))), new Color(1,1,1,1));
}
}
for (Vector3f elem : LoxelApplication.testPointsBox) {
debugDrawProperty.drawSquare(new Vector3f(0.1f,0.1f,0.1f), Matrix4f.identity().multiply_new(Matrix4f.createMatrixTranslate(new Vector3f(elem.x,elem.y,elem.z+14))), new Color(0,0,1,1));
}
if (testRpos != null) {
//debugDrawProperty.drawSquare(box2HalfSize, new Matrix4f(testQTransfert.getMatrix()).multiply_new(Matrix4f.createMatrixTranslate(new Vector3f(testRpos.x,testRpos.y,testRpos.z+14))), new Color(0,1,0,0.5f));
debugDrawProperty.drawSquare(box2HalfSize, Matrix4f.createMatrixTranslate(new Vector3f(testRpos.x,testRpos.y,testRpos.z)).multiply(new Matrix4f(testQTransfert.getMatrix())).multiply(Matrix4f.createMatrixTranslate(new Vector3f(0,0,14))), new Color(0,1,0,0.5f));
debugDrawProperty.drawSquare(box1HalfSize, Matrix4f.identity().multiply_new(Matrix4f.createMatrixTranslate(new Vector3f(0,0,14))), new Color(0,0,1,0.5f));
}
// Restore context of matrix
OpenGL.pop();
}