Triplanar mapping textures to marching cubes

This commit is contained in:
austin 2023-04-23 15:51:53 -04:00
parent edaa7c8ce2
commit c30f30b8a0
2 changed files with 58 additions and 47 deletions

View File

@ -30,11 +30,11 @@ public class TerrainChunk {
//row 1
{-1.0f,-1.0f,-1.0f,-1.0f,-1.0f,},
//row 2
{-1.0f,1.0f,1.0f,1.0f,-1.0f,},
{-1.0f,0.3f,0.6f,0.3f,-1.0f,},
//row 3
{-1.0f,1.0f,1.0f,1.0f,-1.0f,},
{-1.0f,0.6f,1.0f,0.6f,-1.0f,},
//row 4
{-1.0f,1.0f,1.0f,1.0f,-1.0f,},
{-1.0f,0.3f,0.6f,0.3f,-1.0f,},
//row 5
{-1.0f,-1.0f,-1.0f,-1.0f,-1.0f,},
},
@ -43,11 +43,11 @@ public class TerrainChunk {
//row 1
{-1.0f,-1.0f,-1.0f,-1.0f,-1.0f,},
//row 2
{-1.0f,1.0f,1.0f,1.0f,-1.0f,},
{-1.0f,0.7f,1.0f,0.7f,-1.0f,},
//row 3
{-1.0f,1.0f,1.0f,1.0f,-1.0f,},
//row 4
{-1.0f,1.0f,1.0f,1.0f,-1.0f,},
{-1.0f,0.7f,1.0f,0.7f,-1.0f,},
//row 5
{-1.0f,-1.0f,-1.0f,-1.0f,-1.0f,},
},
@ -56,11 +56,11 @@ public class TerrainChunk {
//row 1
{-1.0f,-1.0f,-1.0f,-1.0f,-1.0f,},
//row 2
{-1.0f,1.0f,1.0f,1.0f,-1.0f,},
{-1.0f,0.3f,0.6f,0.3f,-1.0f,},
//row 3
{-1.0f,1.0f,1.0f,1.0f,-1.0f,},
{-1.0f,0.6f,1.0f,0.6f,-1.0f,},
//row 4
{-1.0f,1.0f,1.0f,1.0f,-1.0f,},
{-1.0f,0.3f,0.6f,0.3f,-1.0f,},
//row 5
{-1.0f,-1.0f,-1.0f,-1.0f,-1.0f,},
},
@ -83,7 +83,7 @@ public class TerrainChunk {
Entity rVal = EntityUtils.spawnDrawableEntityWithPreexistingModel(modelPath);
EntityUtils.getPosition(rVal).set(1,-2,1);
EntityUtils.getPosition(rVal).set(1,-1,1);
return rVal;
}

View File

@ -8,6 +8,8 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.vecmath.Vector2f;
import org.joml.Matrix4f;
import org.joml.Vector3f;
import org.lwjgl.BufferUtils;
@ -321,6 +323,21 @@ public class TerrainChunkModelGeneration {
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}
};
private static final byte[] BLOCK_PICK_BITS_BY_VERT_INDEX = new byte[]{
(byte)0x67,
(byte)0x26,
(byte)0x23,
(byte)0x37,
(byte)0x45,
(byte)0x04,
(byte)0x01,
(byte)0x15,
(byte)0x57,
(byte)0x46,
(byte)0x02,
(byte)0x13
};
static class Triangle {
int[] indices = new int[3]; //array of size 3
@ -455,7 +472,7 @@ public class TerrainChunkModelGeneration {
Vector3f n = new Vector3f(u.y * v.z - u.z * v.y, u.z * v.x - u.x * v.z, u.x * v.y - u.y * v.x).normalize();
//for each vertex, average the new normal with the normals that are already there
int trianglesSharingIndex0 = trianglesSharingVert.get(index0);
//calculate proportion of each normal
@ -641,27 +658,6 @@ public class TerrainChunkModelGeneration {
temp[2] = normal.z;
NormalArrayBufferData.put(temp);
}
// for(Triangle triangle : triangles){
// //emit 3 normal vectors
// //normal 0
// Vector3f normal = normals.get(triangle.indices[0]);
// temp[0] = normal.x;
// temp[1] = normal.y;
// temp[2] = normal.z;
// NormalArrayBufferData.put(temp);
// //normal 1
// normal = normals.get(triangle.indices[1]);
// temp[0] = normal.x;
// temp[1] = normal.y;
// temp[2] = normal.z;
// NormalArrayBufferData.put(temp);
// //normal 2
// normal = normals.get(triangle.indices[2]);
// temp[0] = normal.x;
// temp[1] = normal.y;
// temp[2] = normal.z;
// NormalArrayBufferData.put(temp);
// }
NormalArrayBufferData.flip();
mesh.buffer_normals(NormalArrayBufferData, 3);
}
@ -672,31 +668,34 @@ public class TerrainChunkModelGeneration {
//
// TEXTURE COORDINATES
//
/*try {
skyboxmesh.textureCoordCount = mesh.mTextureCoords(0).capacity();
try {
mesh.textureCoordCount = normals.size();
FloatBuffer TextureArrayBufferData;
if(skyboxmesh.textureCoordCount > 0){
TextureArrayBufferData = BufferUtils.createFloatBuffer(skyboxmesh.textureCoordCount * 2);
if(mesh.textureCoordCount > 0){
TextureArrayBufferData = BufferUtils.createFloatBuffer(mesh.textureCoordCount * 2);
float[] temp = new float[2];
for (int i = 0; i < skyboxmesh.textureCoordCount; i++) {
AIVector3D normal = texturecoords.get(i);
temp[0] = normal.x();
temp[1] = normal.y();
// temp[2] = normal.z();
for(Vector3f normal : normals){
float absX = Math.abs(normal.x);
float absY = Math.abs(normal.y);
float absZ = Math.abs(normal.z);
if(absX >= absZ && absX >= absY){
temp[0] = normal.z / 2.0f + 0.5f;
temp[1] = normal.y / 2.0f + 0.5f;
} else if(absZ >= absX && absZ >= absY){
temp[0] = normal.x / 2.0f + 0.5f;
temp[1] = normal.y / 2.0f + 0.5f;
} else if(absY >= absX && absY >= absZ){
temp[0] = normal.x / 2.0f + 0.5f;
temp[1] = normal.z / 2.0f + 0.5f;
}
TextureArrayBufferData.put(temp);
}
TextureArrayBufferData.flip();
skyboxmesh.buffer_texture_coords(TextureArrayBufferData);
mesh.buffer_texture_coords(TextureArrayBufferData, 2);
}
} catch (NullPointerException ex){
ex.printStackTrace();
}
skyboxmesh.shader = ShaderProgram.smart_assemble_shader(has_bones, apply_lighting);
skybox_model.materials.add(optionalMaterial);
*/
@ -751,4 +750,16 @@ public class TerrainChunkModelGeneration {
return rVal;
}
private static final int pickBlockIdForVertex(long blockIds, int vertIndex){
int bits = BLOCK_PICK_BITS_BY_VERT_INDEX[vertIndex];
int blockIndexA = bits >> 4;
int blockIndexB = bits & 0xf;
int blockIdA = (int)(blockIds >> 8 * blockIndexA) & 0xff;
int blockIdB = (int)(blockIds >> 8 * blockIndexB) & 0xff;
//assert (blockIdA == airBlockId) != (blockIdB == airBlockId);
//return blockIdA - nonZeroAirBlockId + blockIdB;
return blockIdA + blockIdB;
}
}