foliage work
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit
This commit is contained in:
parent
eed0170894
commit
8c5874b6a3
@ -1,7 +1,13 @@
|
|||||||
{
|
{
|
||||||
"name" : "test1",
|
"name" : "test1",
|
||||||
"sampler" : {
|
"sampler" : {
|
||||||
"name" : "Invoke",
|
"name" : "Add",
|
||||||
"target" : "test2"
|
"first" : {
|
||||||
|
"name" : "Const",
|
||||||
|
"value" : 0.2
|
||||||
|
},
|
||||||
|
"second" : {
|
||||||
|
"name" : "OpenSimplex"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -26,7 +26,7 @@
|
|||||||
"name" : "Add",
|
"name" : "Add",
|
||||||
"first" : {
|
"first" : {
|
||||||
"name" : "Const",
|
"name" : "Const",
|
||||||
"value" : 1.0
|
"value" : 0.2
|
||||||
},
|
},
|
||||||
"second" : {
|
"second" : {
|
||||||
"name" : "OpenSimplex"
|
"name" : "OpenSimplex"
|
||||||
|
|||||||
@ -1120,6 +1120,11 @@ Add functionality for texture freeing from asset manager
|
|||||||
Increase foliage chunk range
|
Increase foliage chunk range
|
||||||
Swtich collision engine to use reentrant lock
|
Swtich collision engine to use reentrant lock
|
||||||
|
|
||||||
|
(11/22/2024)
|
||||||
|
Foliage manager non-collision engine height lookups
|
||||||
|
Fix foliage manager not respecting graphics settings
|
||||||
|
Small noise sampling refactor
|
||||||
|
|
||||||
|
|
||||||
# TODO
|
# TODO
|
||||||
|
|
||||||
|
|||||||
@ -173,7 +173,7 @@ public class FoliageCellManager {
|
|||||||
*/
|
*/
|
||||||
public void update(){
|
public void update(){
|
||||||
Globals.profiler.beginCpuSample("FoliageCellManager.update");
|
Globals.profiler.beginCpuSample("FoliageCellManager.update");
|
||||||
if(shouldUpdate && Globals.playerEntity != null){
|
if(shouldUpdate && Globals.playerEntity != null && Globals.userSettings.getGraphicsPerformanceEnableFoliageManager()){
|
||||||
Vector3d playerPos = EntityUtils.getPosition(Globals.playerEntity);
|
Vector3d playerPos = EntityUtils.getPosition(Globals.playerEntity);
|
||||||
Vector3i absVoxelPos = Globals.clientWorldData.convertRealToAbsoluteVoxelSpace(playerPos);
|
Vector3i absVoxelPos = Globals.clientWorldData.convertRealToAbsoluteVoxelSpace(playerPos);
|
||||||
int distCache = this.getDistCache(this.lastPlayerPos, absVoxelPos);
|
int distCache = this.getDistCache(this.lastPlayerPos, absVoxelPos);
|
||||||
|
|||||||
@ -66,6 +66,16 @@ public class FoliageModel {
|
|||||||
*/
|
*/
|
||||||
static final int SINGLE_FOLIAGE_DATA_SIZE_BYTES = 3 * 4 + 2 * 4;
|
static final int SINGLE_FOLIAGE_DATA_SIZE_BYTES = 3 * 4 + 2 * 4;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cutoff to place foliage at, weight-wise
|
||||||
|
*/
|
||||||
|
static final double FOLIAGE_CUTOFF = 0.0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cutoff for the cummulative weight to place foliage at
|
||||||
|
*/
|
||||||
|
static final double FOLIAGE_CUMMULATIVE_WEIGHT_CUTOFF = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The target number of foliage to place per cell
|
* The target number of foliage to place per cell
|
||||||
*/
|
*/
|
||||||
@ -184,6 +194,7 @@ public class FoliageModel {
|
|||||||
currWorldPos, currRealPos, currVoxelPos,
|
currWorldPos, currRealPos, currVoxelPos,
|
||||||
scale, placementRandomizer,
|
scale, placementRandomizer,
|
||||||
x, y, z,
|
x, y, z,
|
||||||
|
data.getType(currVoxelPos.x,currVoxelPos.y,currVoxelPos.z),
|
||||||
floatBufferView, data
|
floatBufferView, data
|
||||||
);
|
);
|
||||||
drawCount = drawCount + numGenerated;
|
drawCount = drawCount + numGenerated;
|
||||||
@ -237,38 +248,97 @@ public class FoliageModel {
|
|||||||
Vector3i worldPos, Vector3d realPos, Vector3i voxelPos,
|
Vector3i worldPos, Vector3d realPos, Vector3i voxelPos,
|
||||||
int scale, Random placementRandomizer,
|
int scale, Random placementRandomizer,
|
||||||
int vX, int vY, int vZ,
|
int vX, int vY, int vZ,
|
||||||
|
int targetVoxelType,
|
||||||
FloatBuffer floatBufferView, ChunkData chunkData
|
FloatBuffer floatBufferView, ChunkData chunkData
|
||||||
){
|
){
|
||||||
int rVal = 0;
|
int rVal = 0;
|
||||||
|
|
||||||
//construct simple grid to place foliage on
|
//construct simple grid to place foliage on
|
||||||
Vector3d sample_00 = Globals.clientSceneWrapper.getCollisionEngine().rayCastPosition(new Vector3d(realPos).add(-SAMPLE_OFFSET,SAMPLE_START_HEIGHT,-SAMPLE_OFFSET), new Vector3d(0,-1,0), RAY_LENGTH);
|
// Vector3d sample_00 = Globals.clientSceneWrapper.getCollisionEngine().rayCastPosition(new Vector3d(realPos).add(-SAMPLE_OFFSET,SAMPLE_START_HEIGHT,-SAMPLE_OFFSET), new Vector3d(0,-1,0), RAY_LENGTH);
|
||||||
Vector3d sample_01 = Globals.clientSceneWrapper.getCollisionEngine().rayCastPosition(new Vector3d(realPos).add(-SAMPLE_OFFSET,SAMPLE_START_HEIGHT, 0), new Vector3d(0,-1,0), RAY_LENGTH);
|
// Vector3d sample_01 = Globals.clientSceneWrapper.getCollisionEngine().rayCastPosition(new Vector3d(realPos).add(-SAMPLE_OFFSET,SAMPLE_START_HEIGHT, 0), new Vector3d(0,-1,0), RAY_LENGTH);
|
||||||
Vector3d sample_02 = Globals.clientSceneWrapper.getCollisionEngine().rayCastPosition(new Vector3d(realPos).add(-SAMPLE_OFFSET,SAMPLE_START_HEIGHT, SAMPLE_OFFSET), new Vector3d(0,-1,0), RAY_LENGTH);
|
// Vector3d sample_02 = Globals.clientSceneWrapper.getCollisionEngine().rayCastPosition(new Vector3d(realPos).add(-SAMPLE_OFFSET,SAMPLE_START_HEIGHT, SAMPLE_OFFSET), new Vector3d(0,-1,0), RAY_LENGTH);
|
||||||
Vector3d sample_10 = Globals.clientSceneWrapper.getCollisionEngine().rayCastPosition(new Vector3d(realPos).add( 0,SAMPLE_START_HEIGHT,-SAMPLE_OFFSET), new Vector3d(0,-1,0), RAY_LENGTH);
|
// Vector3d sample_10 = Globals.clientSceneWrapper.getCollisionEngine().rayCastPosition(new Vector3d(realPos).add( 0,SAMPLE_START_HEIGHT,-SAMPLE_OFFSET), new Vector3d(0,-1,0), RAY_LENGTH);
|
||||||
Vector3d sample_11 = Globals.clientSceneWrapper.getCollisionEngine().rayCastPosition(new Vector3d(realPos).add( 0,SAMPLE_START_HEIGHT, 0), new Vector3d(0,-1,0), RAY_LENGTH);
|
// Vector3d sample_11 = Globals.clientSceneWrapper.getCollisionEngine().rayCastPosition(new Vector3d(realPos).add( 0,SAMPLE_START_HEIGHT, 0), new Vector3d(0,-1,0), RAY_LENGTH);
|
||||||
Vector3d sample_12 = Globals.clientSceneWrapper.getCollisionEngine().rayCastPosition(new Vector3d(realPos).add( 0,SAMPLE_START_HEIGHT, SAMPLE_OFFSET), new Vector3d(0,-1,0), RAY_LENGTH);
|
// Vector3d sample_12 = Globals.clientSceneWrapper.getCollisionEngine().rayCastPosition(new Vector3d(realPos).add( 0,SAMPLE_START_HEIGHT, SAMPLE_OFFSET), new Vector3d(0,-1,0), RAY_LENGTH);
|
||||||
Vector3d sample_20 = Globals.clientSceneWrapper.getCollisionEngine().rayCastPosition(new Vector3d(realPos).add( SAMPLE_OFFSET,SAMPLE_START_HEIGHT,-SAMPLE_OFFSET), new Vector3d(0,-1,0), RAY_LENGTH);
|
// Vector3d sample_20 = Globals.clientSceneWrapper.getCollisionEngine().rayCastPosition(new Vector3d(realPos).add( SAMPLE_OFFSET,SAMPLE_START_HEIGHT,-SAMPLE_OFFSET), new Vector3d(0,-1,0), RAY_LENGTH);
|
||||||
Vector3d sample_21 = Globals.clientSceneWrapper.getCollisionEngine().rayCastPosition(new Vector3d(realPos).add( SAMPLE_OFFSET,SAMPLE_START_HEIGHT, 0), new Vector3d(0,-1,0), RAY_LENGTH);
|
// Vector3d sample_21 = Globals.clientSceneWrapper.getCollisionEngine().rayCastPosition(new Vector3d(realPos).add( SAMPLE_OFFSET,SAMPLE_START_HEIGHT, 0), new Vector3d(0,-1,0), RAY_LENGTH);
|
||||||
Vector3d sample_22 = Globals.clientSceneWrapper.getCollisionEngine().rayCastPosition(new Vector3d(realPos).add( SAMPLE_OFFSET,SAMPLE_START_HEIGHT, SAMPLE_OFFSET), new Vector3d(0,-1,0), RAY_LENGTH);
|
// Vector3d sample_22 = Globals.clientSceneWrapper.getCollisionEngine().rayCastPosition(new Vector3d(realPos).add( SAMPLE_OFFSET,SAMPLE_START_HEIGHT, SAMPLE_OFFSET), new Vector3d(0,-1,0), RAY_LENGTH);
|
||||||
|
|
||||||
|
boolean sample_11 = true;
|
||||||
|
boolean sample_12 = true;
|
||||||
|
boolean sample_21 = true;
|
||||||
|
boolean sample_22 = true;
|
||||||
//get the heights of each sample
|
//get the heights of each sample
|
||||||
float height_11 = (float)(sample_11 != null ? sample_11.y : 0);
|
float weight_11 = (chunkData.getWeight(voxelPos) + 1) / 2.0f;
|
||||||
float height_00 = (float)(sample_00 != null ? sample_00.y : height_11);
|
float height_11 = weight_11 + voxelPos.y + worldPos.y * ServerTerrainChunk.CHUNK_DIMENSION;
|
||||||
float height_01 = (float)(sample_01 != null ? sample_01.y : height_11);
|
|
||||||
float height_02 = (float)(sample_02 != null ? sample_02.y : height_11);
|
float height_12 = height_11;
|
||||||
float height_10 = (float)(sample_10 != null ? sample_10.y : height_11);
|
float weight_12 = 0;
|
||||||
float height_12 = (float)(sample_12 != null ? sample_12.y : height_11);
|
if(voxelPos.z < ServerTerrainChunk.CHUNK_DATA_GENERATOR_SIZE - 1){
|
||||||
float height_20 = (float)(sample_20 != null ? sample_20.y : height_11);
|
if(voxelPos.y < ServerTerrainChunk.CHUNK_DATA_GENERATOR_SIZE - 1 && chunkData.getWeight(voxelPos.x, voxelPos.y + 1, voxelPos.z + 1) > FOLIAGE_CUTOFF && chunkData.getType(voxelPos.x, voxelPos.y + 1, voxelPos.z + 1) == targetVoxelType){
|
||||||
float height_21 = (float)(sample_21 != null ? sample_21.y : height_11);
|
weight_12 = (chunkData.getWeight(voxelPos.x, voxelPos.y + 1, voxelPos.z + 1) + 1) / 2.0f;
|
||||||
float height_22 = (float)(sample_22 != null ? sample_22.y : height_11);
|
height_12 = weight_12 + voxelPos.y + 1 + worldPos.y * ServerTerrainChunk.CHUNK_DIMENSION;
|
||||||
|
} else if(chunkData.getWeight(voxelPos.x, voxelPos.y, voxelPos.z + 1) > FOLIAGE_CUTOFF && chunkData.getType(voxelPos.x, voxelPos.y, voxelPos.z + 1) == targetVoxelType){
|
||||||
|
weight_12 = (chunkData.getWeight(voxelPos.x, voxelPos.y, voxelPos.z + 1) + 1) / 2.0f;
|
||||||
|
height_12 = weight_12 + voxelPos.y + worldPos.y * ServerTerrainChunk.CHUNK_DIMENSION;
|
||||||
|
} else if(voxelPos.y > 0 && chunkData.getWeight(voxelPos.x, voxelPos.y - 1, voxelPos.z + 1) > FOLIAGE_CUTOFF && chunkData.getType(voxelPos.x, voxelPos.y - 1, voxelPos.z + 1) == targetVoxelType){
|
||||||
|
weight_12 = (chunkData.getWeight(voxelPos.x, voxelPos.y - 1, voxelPos.z + 1) + 1) / 2.0f;
|
||||||
|
height_12 = weight_12 + voxelPos.y - 1 + worldPos.y * ServerTerrainChunk.CHUNK_DIMENSION;
|
||||||
|
} else {
|
||||||
|
sample_12 = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sample_12 = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
float height_21 = height_11;
|
||||||
|
float weight_21 = 0;
|
||||||
|
if(voxelPos.x < ServerTerrainChunk.CHUNK_DATA_GENERATOR_SIZE - 1){
|
||||||
|
if(voxelPos.y < ServerTerrainChunk.CHUNK_DATA_GENERATOR_SIZE - 1 && chunkData.getWeight(voxelPos.x + 1, voxelPos.y + 1, voxelPos.z) > FOLIAGE_CUTOFF && chunkData.getType(voxelPos.x + 1, voxelPos.y + 1, voxelPos.z) == targetVoxelType){
|
||||||
|
weight_21 = (chunkData.getWeight(voxelPos.x + 1, voxelPos.y + 1, voxelPos.z) + 1) / 2.0f;
|
||||||
|
height_21 = weight_21 + voxelPos.y + 1 + worldPos.y * ServerTerrainChunk.CHUNK_DIMENSION;
|
||||||
|
} else if(chunkData.getWeight(voxelPos.x + 1, voxelPos.y, voxelPos.z) > FOLIAGE_CUTOFF && chunkData.getType(voxelPos.x + 1, voxelPos.y, voxelPos.z) == targetVoxelType){
|
||||||
|
weight_21 = (chunkData.getWeight(voxelPos.x + 1, voxelPos.y, voxelPos.z) + 1) / 2.0f;
|
||||||
|
height_21 = weight_21 + voxelPos.y + worldPos.y * ServerTerrainChunk.CHUNK_DIMENSION;
|
||||||
|
} else if(voxelPos.y > 0 && chunkData.getWeight(voxelPos.x + 1, voxelPos.y - 1, voxelPos.z) > FOLIAGE_CUTOFF && chunkData.getType(voxelPos.x + 1, voxelPos.y - 1, voxelPos.z) == targetVoxelType){
|
||||||
|
weight_21 = (chunkData.getWeight(voxelPos.x + 1, voxelPos.y - 1, voxelPos.z) + 1) / 2.0f;
|
||||||
|
height_21 = weight_21 + voxelPos.y - 1 + worldPos.y * ServerTerrainChunk.CHUNK_DIMENSION;
|
||||||
|
} else {
|
||||||
|
sample_21 = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sample_21 = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
float height_22 = height_11;
|
||||||
|
float weight_22 = 0;
|
||||||
|
if(voxelPos.x < ServerTerrainChunk.CHUNK_DATA_GENERATOR_SIZE - 1 && voxelPos.z < ServerTerrainChunk.CHUNK_DATA_GENERATOR_SIZE - 1){
|
||||||
|
if(voxelPos.y < ServerTerrainChunk.CHUNK_DATA_GENERATOR_SIZE - 1 && chunkData.getWeight(voxelPos.x + 1, voxelPos.y + 1, voxelPos.z + 1) > FOLIAGE_CUTOFF && chunkData.getType(voxelPos.x + 1, voxelPos.y + 1, voxelPos.z + 1) == targetVoxelType){
|
||||||
|
weight_22 = (chunkData.getWeight(voxelPos.x + 1, voxelPos.y + 1, voxelPos.z + 1) + 1) / 2.0f;
|
||||||
|
height_22 = weight_22 + voxelPos.y + 1 + worldPos.y * ServerTerrainChunk.CHUNK_DIMENSION;
|
||||||
|
} else if(chunkData.getWeight(voxelPos.x + 1, voxelPos.y, voxelPos.z + 1) > FOLIAGE_CUTOFF && chunkData.getType(voxelPos.x + 1, voxelPos.y, voxelPos.z + 1) == targetVoxelType){
|
||||||
|
weight_22 = (chunkData.getWeight(voxelPos.x + 1, voxelPos.y, voxelPos.z + 1) + 1) / 2.0f;
|
||||||
|
height_22 = weight_22 + voxelPos.y + worldPos.y * ServerTerrainChunk.CHUNK_DIMENSION;
|
||||||
|
} else if(voxelPos.y > 0 && chunkData.getWeight(voxelPos.x + 1, voxelPos.y - 1, voxelPos.z + 1) > FOLIAGE_CUTOFF && chunkData.getType(voxelPos.x + 1, voxelPos.y - 1, voxelPos.z + 1) == targetVoxelType){
|
||||||
|
weight_22 = (chunkData.getWeight(voxelPos.x + 1, voxelPos.y - 1, voxelPos.z + 1) + 1) / 2.0f;
|
||||||
|
height_22 = weight_22 + voxelPos.y - 1 + worldPos.y * ServerTerrainChunk.CHUNK_DIMENSION;
|
||||||
|
} else {
|
||||||
|
sample_22 = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sample_22 = false;
|
||||||
|
}
|
||||||
|
|
||||||
//each height is in real world coordinates that are absolute
|
//each height is in real world coordinates that are absolute
|
||||||
//when rendering, there's already a y offset for the center of the field of grass (based on the model matrix)
|
//when rendering, there's already a y offset for the center of the field of grass (based on the model matrix)
|
||||||
//so when offseting the position of the blade of grass RELATIVE to the overall instance being drawn, need to subtract the real world coordinates of the overall instance
|
//so when offseting the position of the blade of grass RELATIVE to the overall instance being drawn, need to subtract the real world coordinates of the overall instance
|
||||||
//in other words realPos SPECIFICALLY for the y dimension, for x and z you don't need to worry about it
|
//in other words realPos SPECIFICALLY for the y dimension, for x and z you don't need to worry about it
|
||||||
|
|
||||||
|
float cummulativeWeight = weight_11 + weight_12 + weight_21 + weight_22;
|
||||||
|
|
||||||
//if we don't find data for the center sample, can't place grass so don't create entity
|
//if we don't find data for the center sample, can't place grass so don't create entity
|
||||||
if(sample_11 != null){
|
//generate positions to place
|
||||||
//generate positions to place
|
if(sample_11 && sample_12 && sample_21 && sample_22 && cummulativeWeight > FOLIAGE_CUMMULATIVE_WEIGHT_CUTOFF){
|
||||||
for(int x = 0; x < TARGET_FOLIAGE_SPACING; x=x+scale){
|
for(int x = 0; x < TARGET_FOLIAGE_SPACING; x=x+scale){
|
||||||
for(int z = 0; z < TARGET_FOLIAGE_SPACING; z=z+scale){
|
for(int z = 0; z < TARGET_FOLIAGE_SPACING; z=z+scale){
|
||||||
//get position to place
|
//get position to place
|
||||||
@ -276,81 +346,39 @@ public class FoliageModel {
|
|||||||
double rand2 = placementRandomizer.nextDouble();
|
double rand2 = placementRandomizer.nextDouble();
|
||||||
double relativePositionOnGridX = x / (1.0 * TARGET_FOLIAGE_SPACING) + rand1 / TARGET_FOLIAGE_SPACING;
|
double relativePositionOnGridX = x / (1.0 * TARGET_FOLIAGE_SPACING) + rand1 / TARGET_FOLIAGE_SPACING;
|
||||||
double relativePositionOnGridZ = z / (1.0 * TARGET_FOLIAGE_SPACING) + rand2 / TARGET_FOLIAGE_SPACING;
|
double relativePositionOnGridZ = z / (1.0 * TARGET_FOLIAGE_SPACING) + rand2 / TARGET_FOLIAGE_SPACING;
|
||||||
double offsetX = relativePositionOnGridX - 0.5;
|
|
||||||
double offsetZ = relativePositionOnGridZ - 0.5;
|
|
||||||
//determine quadrant we're placing in
|
//determine quadrant we're placing in
|
||||||
double offsetY = 0;
|
double offsetY = 0;
|
||||||
boolean addBlade = false;
|
boolean addBlade = false;
|
||||||
if(relativePositionOnGridX >=0.5){
|
double manualAdjustment = -0.55;
|
||||||
if(relativePositionOnGridZ >= 0.5){
|
// System.out.println(relativePositionOnGridX + " " + relativePositionOnGridZ);
|
||||||
relativePositionOnGridX = relativePositionOnGridX - 0.5;
|
//if we have heights for all four surrounding spots, interpolate for y value
|
||||||
relativePositionOnGridZ = relativePositionOnGridZ - 0.5;
|
offsetY =
|
||||||
relativePositionOnGridX /= 0.5;
|
height_11 * (1-relativePositionOnGridX) * (1-relativePositionOnGridZ) +
|
||||||
relativePositionOnGridZ /= 0.5;
|
height_12 * (1-relativePositionOnGridX) * ( relativePositionOnGridZ) +
|
||||||
// System.out.println(relativePositionOnGridX + " " + relativePositionOnGridZ);
|
height_21 * ( relativePositionOnGridX) * (1-relativePositionOnGridZ) +
|
||||||
//if we have heights for all four surrounding spots, interpolate for y value
|
height_22 * ( relativePositionOnGridX) * ( relativePositionOnGridZ) +
|
||||||
if(sample_11 != null && sample_12 != null && sample_21 != null && sample_22 != null){
|
manualAdjustment
|
||||||
offsetY =
|
;
|
||||||
height_11 * (1-relativePositionOnGridX) * (1-relativePositionOnGridZ) +
|
addBlade = true;
|
||||||
height_12 * (1-relativePositionOnGridX) * ( relativePositionOnGridZ) +
|
// double percent =
|
||||||
height_21 * ( relativePositionOnGridX) * (1-relativePositionOnGridZ) +
|
// (1-relativePositionOnGridX) * (1-relativePositionOnGridZ) +
|
||||||
height_22 * ( relativePositionOnGridX) * ( relativePositionOnGridZ);
|
// (1-relativePositionOnGridX) * ( relativePositionOnGridZ) +
|
||||||
addBlade = true;
|
// ( relativePositionOnGridX) * (1-relativePositionOnGridZ) +
|
||||||
}
|
// ( relativePositionOnGridX) * ( relativePositionOnGridZ);
|
||||||
} else {
|
// if(
|
||||||
relativePositionOnGridX = relativePositionOnGridX - 0.5;
|
// percent < 0.99 || percent > 1.01
|
||||||
relativePositionOnGridX /= 0.5;
|
// ){
|
||||||
relativePositionOnGridZ /= 0.5;
|
// System.out.println(percent);
|
||||||
//if we have heights for all four surrounding spots, interpolate for y value
|
// }
|
||||||
if(sample_10 != null && sample_11 != null && sample_20 != null && sample_21 != null){
|
|
||||||
offsetY =
|
|
||||||
height_10 * (1-relativePositionOnGridX) * (1-relativePositionOnGridZ) +
|
|
||||||
height_11 * (1-relativePositionOnGridX) * ( relativePositionOnGridZ) +
|
|
||||||
height_20 * ( relativePositionOnGridX) * (1-relativePositionOnGridZ) +
|
|
||||||
height_21 * ( relativePositionOnGridX) * ( relativePositionOnGridZ);
|
|
||||||
addBlade = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(relativePositionOnGridZ >= 0.5){
|
|
||||||
relativePositionOnGridZ = relativePositionOnGridZ - 0.5;
|
|
||||||
relativePositionOnGridX /= 0.5;
|
|
||||||
relativePositionOnGridZ /= 0.5;
|
|
||||||
//if we have heights for all four surrounding spots, interpolate for y value
|
|
||||||
if(sample_01 != null && sample_02 != null && sample_11 != null && sample_12 != null){
|
|
||||||
offsetY =
|
|
||||||
height_01 * (1-relativePositionOnGridX) * (1-relativePositionOnGridZ) +
|
|
||||||
height_02 * (1-relativePositionOnGridX) * ( relativePositionOnGridZ) +
|
|
||||||
height_11 * ( relativePositionOnGridX) * (1-relativePositionOnGridZ) +
|
|
||||||
height_12 * ( relativePositionOnGridX) * ( relativePositionOnGridZ);
|
|
||||||
addBlade = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
relativePositionOnGridX /= 0.5;
|
|
||||||
relativePositionOnGridZ /= 0.5;
|
|
||||||
//if we have heights for all four surrounding spots, interpolate for y value
|
|
||||||
if(sample_00 != null && sample_01 != null && sample_10 != null && sample_11 != null){
|
|
||||||
offsetY =
|
|
||||||
height_00 * (1-relativePositionOnGridX) * (1-relativePositionOnGridZ) +
|
|
||||||
height_01 * (1-relativePositionOnGridX) * ( relativePositionOnGridZ) +
|
|
||||||
height_10 * ( relativePositionOnGridX) * (1-relativePositionOnGridZ) +
|
|
||||||
height_11 * ( relativePositionOnGridX) * ( relativePositionOnGridZ);
|
|
||||||
addBlade = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(addBlade){
|
if(addBlade){
|
||||||
// if(realPos.y == 20 && sample_11 != null){
|
|
||||||
// System.out.println("asdf");
|
|
||||||
// }
|
|
||||||
//convert y to relative to chunk
|
//convert y to relative to chunk
|
||||||
offsetY = offsetY - realPos.y;
|
offsetY = offsetY - realPos.y;
|
||||||
double rotVar = placementRandomizer.nextDouble() * Math.PI * 2;
|
double rotVar = placementRandomizer.nextDouble() * Math.PI * 2;
|
||||||
double rotVar2 = placementRandomizer.nextDouble();
|
double rotVar2 = placementRandomizer.nextDouble();
|
||||||
if(floatBufferView.limit() >= floatBufferView.position() + SINGLE_FOLIAGE_DATA_SIZE_BYTES / 4){
|
if(floatBufferView.limit() >= floatBufferView.position() + SINGLE_FOLIAGE_DATA_SIZE_BYTES / 4){
|
||||||
floatBufferView.put((float)offsetX + vX);
|
floatBufferView.put((float)relativePositionOnGridX + vX);
|
||||||
floatBufferView.put((float)offsetY + vY);
|
floatBufferView.put((float)offsetY + vY);
|
||||||
floatBufferView.put((float)offsetZ + vZ);
|
floatBufferView.put((float)relativePositionOnGridZ + vZ);
|
||||||
floatBufferView.put((float)rotVar);
|
floatBufferView.put((float)rotVar);
|
||||||
floatBufferView.put((float)rotVar2);
|
floatBufferView.put((float)rotVar2);
|
||||||
rVal++;
|
rVal++;
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
package electrosphere.server.terrain.generation.voxelphase;
|
package electrosphere.server.terrain.generation.voxelphase;
|
||||||
|
|
||||||
import electrosphere.engine.Globals;
|
|
||||||
import electrosphere.game.data.biome.BiomeData;
|
import electrosphere.game.data.biome.BiomeData;
|
||||||
import electrosphere.game.data.voxel.sampler.SamplerFile;
|
import electrosphere.game.data.voxel.sampler.SamplerFile;
|
||||||
import electrosphere.server.terrain.generation.interfaces.GeneratedVoxel;
|
import electrosphere.server.terrain.generation.interfaces.GeneratedVoxel;
|
||||||
@ -53,48 +52,35 @@ public class NoiseVoxelGen implements VoxelGenerator {
|
|||||||
) {
|
) {
|
||||||
double strideMultiplier = Math.pow(2,stride);
|
double strideMultiplier = Math.pow(2,stride);
|
||||||
double heightDiff = realY - surfaceHeight;
|
double heightDiff = realY - surfaceHeight;
|
||||||
Globals.profiler.endCpuSample();
|
double sample = this.sampler.getValue(0, realX, realY, realZ);
|
||||||
|
if(sample <= 0){
|
||||||
|
voxel.weight = -1.0f;
|
||||||
|
voxel.type = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
if(heightDiff < -strideMultiplier * SURFACE_VOXEL_WIDTH){
|
if(heightDiff < -strideMultiplier * SURFACE_VOXEL_WIDTH){
|
||||||
//below surface
|
//below surface
|
||||||
double sample = this.sampler.getValue(0, realX, realY, realZ);
|
double finalSurface = MathUtils.clamp(sample,0,1);
|
||||||
if(sample > 0){
|
voxel.weight = (float)finalSurface * 2 - 1;
|
||||||
double finalSurface = MathUtils.clamp(sample,0,1);
|
voxel.type = 1;
|
||||||
voxel.weight = (float)finalSurface * 2 - 1;
|
|
||||||
voxel.type = 1;
|
|
||||||
} else {
|
|
||||||
voxel.weight = -1.0f;
|
|
||||||
voxel.type = 0;
|
|
||||||
}
|
|
||||||
} else if(heightDiff > 0) {
|
} else if(heightDiff > 0) {
|
||||||
//above surface
|
//above surface
|
||||||
voxel.weight = -1.0f;
|
voxel.weight = -1.0f;
|
||||||
voxel.type = 0;
|
voxel.type = 0;
|
||||||
} else if(heightDiff < -strideMultiplier){
|
} else if(heightDiff < -strideMultiplier){
|
||||||
//generate full-size surface-type voxel
|
//generate full-size surface-type voxel
|
||||||
double sample = this.sampler.getValue(0, realX, realY, realZ);
|
double finalHeight = MathUtils.clamp(sample,0,1);
|
||||||
if(sample > 0){
|
voxel.weight = (float)finalHeight * 2 - 1;
|
||||||
double finalHeight = MathUtils.clamp(sample,0,1);
|
voxel.type = 2;
|
||||||
voxel.weight = (float)finalHeight * 2 - 1;
|
|
||||||
voxel.type = 2;
|
|
||||||
} else {
|
|
||||||
voxel.weight = -1.0f;
|
|
||||||
voxel.type = 0;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
//surface
|
//surface
|
||||||
double sample = this.sampler.getValue(0, realX, realY, realZ);
|
double surfacePercent = -heightDiff / strideMultiplier;
|
||||||
if(sample > 0){
|
if(surfacePercent > 1.0 || surfacePercent < 0){
|
||||||
double surfacePercent = -heightDiff / strideMultiplier;
|
throw new Error("surfacePercent " + surfacePercent + " " + realY + " " + surfaceHeight + " " + heightDiff + " " + strideMultiplier);
|
||||||
if(surfacePercent > 1.0 || surfacePercent < 0){
|
|
||||||
throw new Error("surfacePercent " + surfacePercent + " " + realY + " " + surfaceHeight + " " + heightDiff + " " + strideMultiplier);
|
|
||||||
}
|
|
||||||
double finalHeight = MathUtils.clamp(sample,0,1) * surfacePercent;
|
|
||||||
voxel.weight = (float)finalHeight * 2 - 1;
|
|
||||||
voxel.type = 2;
|
|
||||||
} else {
|
|
||||||
voxel.weight = -1.0f;
|
|
||||||
voxel.type = 0;
|
|
||||||
}
|
}
|
||||||
|
double finalHeight = MathUtils.clamp(sample,0,1) * surfacePercent;
|
||||||
|
voxel.weight = (float)finalHeight * 2 - 1;
|
||||||
|
voxel.type = 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user