mirror of
https://github.com/PixelGuys/Cubyz.git
synced 2025-08-03 19:28:49 -04:00
Implemented Albert IntegratedQuantum's Theory of Collisions
This commit is contained in:
parent
25775236fa
commit
b82f682745
4
.gitignore
vendored
4
.gitignore
vendored
@ -24,4 +24,6 @@ hs_err_pid*
|
|||||||
|
|
||||||
#Eclipse workspace/projects files
|
#Eclipse workspace/projects files
|
||||||
.metadata/
|
.metadata/
|
||||||
.recommenders/
|
.recommenders/
|
||||||
|
|
||||||
|
cubyz-client/logs/
|
@ -6,6 +6,7 @@ import org.joml.AABBf;
|
|||||||
import org.joml.Vector3f;
|
import org.joml.Vector3f;
|
||||||
|
|
||||||
import io.cubyz.IRenderablePair;
|
import io.cubyz.IRenderablePair;
|
||||||
|
import io.cubyz.blocks.BlockInstance;
|
||||||
import io.cubyz.world.World;
|
import io.cubyz.world.World;
|
||||||
|
|
||||||
public abstract class Entity {
|
public abstract class Entity {
|
||||||
@ -21,7 +22,7 @@ public abstract class Entity {
|
|||||||
|
|
||||||
protected IRenderablePair renderPair;
|
protected IRenderablePair renderPair;
|
||||||
|
|
||||||
protected int width = 1, height = 2;
|
protected int width = 1, height = 2, depth = 1;
|
||||||
|
|
||||||
public float getSpeed() {
|
public float getSpeed() {
|
||||||
return entitySpeed;
|
return entitySpeed;
|
||||||
@ -63,6 +64,156 @@ public abstract class Entity {
|
|||||||
return renderPair;
|
return renderPair;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// port of IntegratedQuantum's mathematical works for collision detection
|
||||||
|
// Thanks ;)
|
||||||
|
protected float _getX(float x) {
|
||||||
|
float wi = (float) width;
|
||||||
|
float he = (float) height;
|
||||||
|
int absX = (int) (position.x + 0.5F);
|
||||||
|
int absY = (int) (position.y + 0.5F);
|
||||||
|
int absZ = (int) (position.z + 0.5F);
|
||||||
|
float relX = position.x + 0.5F - absX;
|
||||||
|
float relZ = position.z + 0.5F - absZ;
|
||||||
|
if (x < 0) {
|
||||||
|
if (relX < 0.3F) {
|
||||||
|
relX++;
|
||||||
|
absX--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (relX+x > 0.3F) {
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
float maxX = 0.301F - relX; // This small deviation from the desired value is to prevent imprecision in float calculation to create bugs.
|
||||||
|
if (relZ < 0.3) {
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
if (checkBlock(absX - 1, absY + i, absZ - 1)) {
|
||||||
|
return maxX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (relZ > 0.7) {
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
if (checkBlock(absX - 1, absY + i, absZ + 1)) {
|
||||||
|
return maxX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
if (checkBlock(absX - 1, absY + i, absZ)) {
|
||||||
|
return maxX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (relX > 0.7F) {
|
||||||
|
relX--;
|
||||||
|
absX++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (relX+x < 0.7F) {
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
float maxX = 0.699F - relX;
|
||||||
|
if (relZ < 0.3) {
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
if (checkBlock(absX + 1, absY + i, absZ - 1)) {
|
||||||
|
return maxX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (relZ > 0.7) {
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
if( checkBlock(absX + 1, absY + i, absZ + 1)) {
|
||||||
|
return maxX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 3; i++) {
|
||||||
|
if (checkBlock(absX + 1, absY + i, absZ)) {
|
||||||
|
return maxX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected float _getZ(float z) {
|
||||||
|
int absX = (int) (position.x + 0.5F);
|
||||||
|
int absY = (int) (position.y + 0.5F);
|
||||||
|
int absZ = (int) (position.z + 0.5F);
|
||||||
|
float relX = position.x + 0.5F - absX;
|
||||||
|
float relZ = position.z + 0.5F - absZ;
|
||||||
|
if(z < 0) {
|
||||||
|
if(relZ < 0.3F) {
|
||||||
|
relZ++;
|
||||||
|
absZ--;
|
||||||
|
}
|
||||||
|
if(relZ + z > 0.3F) {
|
||||||
|
return z;
|
||||||
|
}
|
||||||
|
float maxZ = 0.301F - relZ;
|
||||||
|
if(relX < 0.3) {
|
||||||
|
for(int i = 0; i < 3; i++) {
|
||||||
|
if (checkBlock(absX - 1, absY + i, absZ - 1)) {
|
||||||
|
return maxZ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(relX > 0.7) {
|
||||||
|
for(int i = 0; i < 3; i++) {
|
||||||
|
if(checkBlock(absX+1, absY+i, absZ-1)) {
|
||||||
|
return maxZ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(int i = 0; i < 3; i++) {
|
||||||
|
if(checkBlock(absX, absY+i, absZ-1)) {
|
||||||
|
return maxZ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(relZ > 0.7F) {
|
||||||
|
relZ--;
|
||||||
|
absZ++;
|
||||||
|
}
|
||||||
|
if(relZ+z < 0.7F) {
|
||||||
|
return z;
|
||||||
|
}
|
||||||
|
float maxZ = 0.699F - relZ;
|
||||||
|
if(relX < 0.3) {
|
||||||
|
for(int i = 0; i < 3; i++) {
|
||||||
|
if(checkBlock(absX-width, absY+i, absZ+depth)) {
|
||||||
|
return maxZ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(relX > 0.7) {
|
||||||
|
for(int i = 0; i < height; i++) {
|
||||||
|
if(checkBlock(absX+width, absY+i, absZ+depth)) {
|
||||||
|
return maxZ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(int i = 0; i < height; i++) {
|
||||||
|
if(checkBlock(absX, absY+i, absZ+depth)) {
|
||||||
|
return maxZ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return z;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean checkBlock(int x, int y, int z) {
|
||||||
|
BlockInstance bi = world.getBlock(x, y, z);
|
||||||
|
if(bi != null && bi.getBlock().isSolid()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public void update() {
|
public void update() {
|
||||||
aabb.minX = position.x();
|
aabb.minX = position.x();
|
||||||
aabb.maxX = position.x() + width;
|
aabb.maxX = position.x() + width;
|
||||||
@ -70,8 +221,6 @@ public abstract class Entity {
|
|||||||
aabb.maxY = position.y() + height;
|
aabb.maxY = position.y() + height;
|
||||||
aabb.minZ = position.z();
|
aabb.minZ = position.z();
|
||||||
aabb.maxZ = position.z() + width;
|
aabb.maxZ = position.z() + width;
|
||||||
//spatial.setPosition(position.x(), position.y(), position.z());
|
|
||||||
//spatial.setRotation(rotation.x(), rotation.y(), rotation.z());
|
|
||||||
|
|
||||||
if (renderPair != null) {
|
if (renderPair != null) {
|
||||||
Consumer<Entity> upd = (Consumer<Entity>) renderPair.get("renderPairUpdate");
|
Consumer<Entity> upd = (Consumer<Entity>) renderPair.get("renderPairUpdate");
|
||||||
|
@ -24,14 +24,14 @@ public class Player extends Entity implements ICommandSource {
|
|||||||
this.local = local;
|
this.local = local;
|
||||||
// try {
|
// try {
|
||||||
// mesh = loadMesh("uglyplayer");
|
// mesh = loadMesh("uglyplayer");
|
||||||
// Material mat = new Material(new Vector4f(0.1F, 0.5F, 0.5F, 0.0F), 1.0F); //NOTE: Normal > 0.1F || 0.5F || 0.5F || 0.0F || 1.0F
|
// Material mat = new Material(new Vector4f(0.1F, 0.5F, 0.5F, 0.0F), 1.0F);
|
||||||
// mesh.setBoundingRadius(10.0F); //NOTE: Normal > 10.0F
|
// mesh.setBoundingRadius(10.0F);
|
||||||
// mesh.setMaterial(mat);
|
// mesh.setMaterial(mat);
|
||||||
// } catch (Exception e) {
|
// } catch (Exception e) {
|
||||||
// e.printStackTrace();
|
// e.printStackTrace();
|
||||||
// }
|
// }
|
||||||
// spatial = new Spatial(mesh);
|
// spatial = new Spatial(mesh);
|
||||||
// spatial.setScale(0.5F); //NOTE: Normal > 0.5F
|
// spatial.setScale(0.5F);
|
||||||
setRegistryName("cubz:player");
|
setRegistryName("cubz:player");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,12 +41,12 @@ public class Player extends Entity implements ICommandSource {
|
|||||||
|
|
||||||
public void move(Vector3f inc, Vector3f rot) {
|
public void move(Vector3f inc, Vector3f rot) {
|
||||||
if (inc.z != 0) {
|
if (inc.z != 0) {
|
||||||
position.x += (float) Math.sin(Math.toRadians(rot.y)) * -1.0F * inc.z; //NOTE: Normal > -1.0F
|
position.x += _getX((float) Math.sin(Math.toRadians(rot.y)) * -1.0F * inc.z);
|
||||||
position.z += (float) Math.cos(Math.toRadians(rot.y)) * inc.z;
|
position.z += _getZ((float) Math.cos(Math.toRadians(rot.y)) * inc.z);
|
||||||
}
|
}
|
||||||
if (inc.x != 0) {
|
if (inc.x != 0) {
|
||||||
position.x += (float) Math.sin(Math.toRadians(rot.y - 90)) * -1.0F * inc.x; //NOTE: Normal > 90 || -1.0F
|
position.x += _getX((float) Math.sin(Math.toRadians(rot.y - 90)) * -1.0F * inc.x);
|
||||||
position.z += (float) Math.cos(Math.toRadians(rot.y - 90)) * inc.x; //NOTE: Normal > 90
|
position.z += _getZ((float) Math.cos(Math.toRadians(rot.y - 90)) * inc.x);
|
||||||
}
|
}
|
||||||
if (inc.y != 0) {
|
if (inc.y != 0) {
|
||||||
vy = inc.y;
|
vy = inc.y;
|
||||||
@ -59,16 +59,40 @@ public class Player extends Entity implements ICommandSource {
|
|||||||
if (!flying) {
|
if (!flying) {
|
||||||
vy -= 0.015F;
|
vy -= 0.015F;
|
||||||
}
|
}
|
||||||
Vector3i bp = new Vector3i((int) Math.ceil(position.x), (int) Math.ceil(position.y)-1, (int) Math.ceil(position.z));
|
if (vy < 0) {
|
||||||
if (world.getBlock(bp) != null) {
|
Vector3i bp = new Vector3i((int) Math.round(position.x), (int) position.y, (int) Math.round(position.z));
|
||||||
AABBf other = new AABBf();
|
float relX = position.x + 0.5F - bp.x;
|
||||||
other.setMin(new Vector3f(bp));
|
float relZ = position.z + 0.5F - bp.z;
|
||||||
other.setMax(new Vector3f(bp.x + 1.0F, bp.y + 1.0F, bp.z + 1.0F)); //NOTE: Normal > 1.0F || 1.0F || 1.0F
|
if(checkBlock(bp.x, bp.y, bp.z)) {
|
||||||
boolean b = aabb.testAABB(other);
|
vy = 0;
|
||||||
if (b) {
|
}
|
||||||
if (vy < 0) {
|
else if (relX < 0.3) {
|
||||||
|
if (checkBlock(bp.x - 1, bp.y, bp.z)) {
|
||||||
vy = 0;
|
vy = 0;
|
||||||
}
|
}
|
||||||
|
else if (relZ < 0.3 && checkBlock(bp.x - 1, bp.y, bp.z - 1)) {
|
||||||
|
vy = 0;
|
||||||
|
}
|
||||||
|
else if (relZ > 0.7 && checkBlock(bp.x - 1, bp.y, bp.z + 1)) {
|
||||||
|
vy = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (relX > 0.7) {
|
||||||
|
if (checkBlock(bp.x + 1, bp.y, bp.z)) {
|
||||||
|
vy = 0;
|
||||||
|
}
|
||||||
|
else if (relZ < 0.3 && checkBlock(bp.x + 1, bp.y, bp.z - 1)) {
|
||||||
|
vy = 0;
|
||||||
|
}
|
||||||
|
else if (relZ > 0.7 && checkBlock(bp.x + 1, bp.y, bp.z + 1)) {
|
||||||
|
vy = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (relZ < 0.3 && checkBlock(bp.x, bp.y, bp.z - 1)) {
|
||||||
|
vy = 0;
|
||||||
|
}
|
||||||
|
else if (relZ > 0.7 && checkBlock(bp.x, bp.y, bp.z + 1)) {
|
||||||
|
vy = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
position.add(0, vy, 0);
|
position.add(0, vy, 0);
|
||||||
|
@ -59,13 +59,23 @@ public class LocalWorld extends World {
|
|||||||
if (!loadList.isEmpty()) {
|
if (!loadList.isEmpty()) {
|
||||||
ChunkAction popped = loadList.pop();
|
ChunkAction popped = loadList.pop();
|
||||||
if (popped.type == ChunkActionType.GENERATE) {
|
if (popped.type == ChunkActionType.GENERATE) {
|
||||||
//CubzLogger.instance.fine("Generating " + popped.chunk);
|
CubzLogger.instance.fine("Generating " + popped.chunk.getX() + "," + popped.chunk.getZ());
|
||||||
if (!popped.chunk.isGenerated()) {
|
if (!popped.chunk.isGenerated()) {
|
||||||
synchronousGenerate(popped.chunk);
|
synchronousGenerate(popped.chunk);
|
||||||
|
} else {
|
||||||
|
if (!popped.chunk.isLoaded()) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (popped.type == ChunkActionType.UNLOAD) {
|
else if (popped.type == ChunkActionType.UNLOAD) {
|
||||||
//CubzLogger.instance.fine("Unloading " + popped.chunk);
|
CubzLogger.instance.fine("Unloading " + popped.chunk.getX() + "," + popped.chunk.getZ());
|
||||||
|
for (BlockInstance bi : popped.chunk.list()) {
|
||||||
|
Block b = bi.getBlock();
|
||||||
|
visibleSpatials.get(b).remove(bi);
|
||||||
|
spatials.remove(bi);
|
||||||
|
}
|
||||||
|
popped.chunk.setLoaded(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
System.out.print("");
|
System.out.print("");
|
||||||
@ -247,19 +257,18 @@ public class LocalWorld extends World {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void seek(int x, int z) {
|
public void seek(int x, int z) {
|
||||||
for (int x1 = x - 32; x1 < x + 32; x1++) {
|
int renderDistance = 2-1;
|
||||||
for (int z1 = z - 32; z1 < z + 32; z1++) {
|
int blockDistance = renderDistance*16;
|
||||||
|
for (int x1 = x - blockDistance-16; x1 < x + blockDistance+16; x1++) {
|
||||||
|
for (int z1 = z - blockDistance-16; z1 < z + blockDistance+16; z1++) {
|
||||||
Chunk ch = getChunk(x1/16,z1/16);
|
Chunk ch = getChunk(x1/16,z1/16);
|
||||||
if (!ch.isGenerated()) {
|
if (x1>x-blockDistance&&x1<x+blockDistance&&z1>z-blockDistance&&z1<z+blockDistance) {
|
||||||
queueChunk(new ChunkAction(ch, ChunkActionType.GENERATE));
|
if (!ch.isGenerated()) {
|
||||||
}
|
queueChunk(new ChunkAction(ch, ChunkActionType.GENERATE));
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
for (int x1 = x - 48; x1 < x + 48; x1++) {
|
if (ch.isLoaded()) {
|
||||||
for (int z1 = z - 48; z1 < z + 48; z1++) {
|
queueChunk(new ChunkAction(ch, ChunkActionType.UNLOAD));
|
||||||
if (x1 < x - 32 || x1 > x + 32) {
|
|
||||||
if (z1 < z - 32 || z1 > z + 32) {
|
|
||||||
//unload(x1 / 16, z1 / 16);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user