prism meshgen + farmplot gen
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
4116336cd6
commit
732e0c51e9
@ -2037,6 +2037,8 @@ Convex y-aligned prism intersection checking
|
|||||||
Fix block LOD chunk rendering (scaling not applying)
|
Fix block LOD chunk rendering (scaling not applying)
|
||||||
Scaffolding for laying out farm plots around towns
|
Scaffolding for laying out farm plots around towns
|
||||||
Region interface
|
Region interface
|
||||||
|
Town layout non-statically generates farm plots
|
||||||
|
Y-aligned prism meshgen
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import java.util.LinkedList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.joml.Vector2f;
|
import org.joml.Vector2f;
|
||||||
|
import org.joml.Vector3d;
|
||||||
import org.joml.Vector3f;
|
import org.joml.Vector3f;
|
||||||
import org.lwjgl.BufferUtils;
|
import org.lwjgl.BufferUtils;
|
||||||
|
|
||||||
@ -277,4 +278,151 @@ public class GeometryMeshGen {
|
|||||||
return mesh;
|
return mesh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generates a prism mesh
|
||||||
|
* @param points The points of the base of the prism
|
||||||
|
* @param height The height of the prism
|
||||||
|
* @return The mesh of the prism
|
||||||
|
*/
|
||||||
|
public static Mesh genPrism(Vector3d[] points, double height){
|
||||||
|
//error check
|
||||||
|
if(points.length < 3){
|
||||||
|
throw new Error("Invalid number of points! " + points.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
//allocate top level objects
|
||||||
|
Mesh mesh = new Mesh("prism");
|
||||||
|
OpenGLState openGLState = Globals.renderingEngine.getOpenGLState();
|
||||||
|
mesh.generateVAO(openGLState);
|
||||||
|
|
||||||
|
//calculate centerpoint
|
||||||
|
Vector3d centerpoint = new Vector3d(points[0]);
|
||||||
|
for(int i = 1; i < points.length; i++){
|
||||||
|
centerpoint = centerpoint.add(points[i]);
|
||||||
|
centerpoint = centerpoint.mul(1.0f / (float)points.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//allocate buffers
|
||||||
|
FloatBuffer vertBuffer = BufferUtils.createFloatBuffer((points.length + 2) * 2 * 3);
|
||||||
|
FloatBuffer normalBuffer = BufferUtils.createFloatBuffer((points.length + 2) * 2 * 3);
|
||||||
|
FloatBuffer uvBuffer = BufferUtils.createFloatBuffer((points.length + 2) * 2 * 2);
|
||||||
|
IntBuffer faceBuffer = BufferUtils.createIntBuffer(points.length * 12);
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
//add data for center point
|
||||||
|
//
|
||||||
|
vertBuffer.put((float)centerpoint.x);
|
||||||
|
vertBuffer.put((float)centerpoint.y);
|
||||||
|
vertBuffer.put((float)centerpoint.z);
|
||||||
|
vertBuffer.put((float)centerpoint.x);
|
||||||
|
vertBuffer.put((float)(centerpoint.y + height));
|
||||||
|
vertBuffer.put((float)centerpoint.z);
|
||||||
|
normalBuffer.put(0f);
|
||||||
|
normalBuffer.put(-1f);
|
||||||
|
normalBuffer.put(0f);
|
||||||
|
normalBuffer.put(0f);
|
||||||
|
normalBuffer.put(11f);
|
||||||
|
normalBuffer.put(0f);
|
||||||
|
uvBuffer.put(0);
|
||||||
|
uvBuffer.put(0);
|
||||||
|
uvBuffer.put(0);
|
||||||
|
uvBuffer.put(0);
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
//iterate along points
|
||||||
|
//
|
||||||
|
for(int i = 0; i < points.length - 1; i++){
|
||||||
|
Vector3d point1 = points[i];
|
||||||
|
//add vert data
|
||||||
|
vertBuffer.put((float)point1.x);
|
||||||
|
vertBuffer.put((float)point1.y);
|
||||||
|
vertBuffer.put((float)point1.z);
|
||||||
|
vertBuffer.put((float)point1.x);
|
||||||
|
vertBuffer.put((float)(point1.y + height));
|
||||||
|
vertBuffer.put((float)point1.z);
|
||||||
|
normalBuffer.put(0f);
|
||||||
|
normalBuffer.put(-1f);
|
||||||
|
normalBuffer.put(0f);
|
||||||
|
normalBuffer.put(0f);
|
||||||
|
normalBuffer.put(11f);
|
||||||
|
normalBuffer.put(0f);
|
||||||
|
uvBuffer.put(1);
|
||||||
|
uvBuffer.put(1);
|
||||||
|
uvBuffer.put(1);
|
||||||
|
uvBuffer.put(1);
|
||||||
|
//add face data
|
||||||
|
//bottom triangle
|
||||||
|
faceBuffer.put(0);
|
||||||
|
faceBuffer.put(((i + 0) * 2) + 0);
|
||||||
|
faceBuffer.put(((i + 1) * 2) + 0);
|
||||||
|
//top triangle
|
||||||
|
faceBuffer.put(1);
|
||||||
|
faceBuffer.put(((i + 0) * 2) + 1);
|
||||||
|
faceBuffer.put(((i + 1) * 2) + 1);
|
||||||
|
//perimeter face 1
|
||||||
|
faceBuffer.put(((i + 0) * 2) + 0);
|
||||||
|
faceBuffer.put(((i + 1) * 2) + 0);
|
||||||
|
faceBuffer.put(((i + 0) * 2) + 1);
|
||||||
|
//perimeter face 2
|
||||||
|
faceBuffer.put(((i + 1) * 2) + 0);
|
||||||
|
faceBuffer.put(((i + 0) * 2) + 1);
|
||||||
|
faceBuffer.put(((i + 1) * 2) + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
//Handle wrap-around
|
||||||
|
//
|
||||||
|
Vector3d lastPoint = points[points.length - 1];
|
||||||
|
vertBuffer.put((float)lastPoint.x);
|
||||||
|
vertBuffer.put((float)lastPoint.y);
|
||||||
|
vertBuffer.put((float)lastPoint.z);
|
||||||
|
vertBuffer.put((float)lastPoint.x);
|
||||||
|
vertBuffer.put((float)(lastPoint.y + height));
|
||||||
|
vertBuffer.put((float)lastPoint.z);
|
||||||
|
normalBuffer.put(0f);
|
||||||
|
normalBuffer.put(-1f);
|
||||||
|
normalBuffer.put(0f);
|
||||||
|
normalBuffer.put(0f);
|
||||||
|
normalBuffer.put(11f);
|
||||||
|
normalBuffer.put(0f);
|
||||||
|
uvBuffer.put(1);
|
||||||
|
uvBuffer.put(1);
|
||||||
|
uvBuffer.put(1);
|
||||||
|
uvBuffer.put(1);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//actually store in mesh
|
||||||
|
int elementCount = points.length * 12;
|
||||||
|
try {
|
||||||
|
//actually buffer vertices
|
||||||
|
if(vertBuffer.position() > 0){
|
||||||
|
vertBuffer.flip();
|
||||||
|
mesh.bufferVertices(vertBuffer, 3);
|
||||||
|
}
|
||||||
|
//actually buffer normals
|
||||||
|
if(normalBuffer != null && normalBuffer.position() > 0){
|
||||||
|
normalBuffer.flip();
|
||||||
|
mesh.bufferNormals(normalBuffer, 3);
|
||||||
|
}
|
||||||
|
//actually buffer UVs
|
||||||
|
if(uvBuffer != null && uvBuffer.position() > 0){
|
||||||
|
uvBuffer.flip();
|
||||||
|
mesh.bufferTextureCoords(uvBuffer, 2);
|
||||||
|
}
|
||||||
|
//buffer element indices
|
||||||
|
if(faceBuffer.position() > 0){
|
||||||
|
faceBuffer.flip();
|
||||||
|
mesh.bufferFaces(faceBuffer, elementCount);
|
||||||
|
}
|
||||||
|
} catch (NullPointerException ex){
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return mesh;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,6 +7,7 @@ import electrosphere.server.macro.civilization.Civilization;
|
|||||||
import electrosphere.server.macro.spatial.MacroAreaObject;
|
import electrosphere.server.macro.spatial.MacroAreaObject;
|
||||||
import electrosphere.server.macro.spatial.MacroLODObject;
|
import electrosphere.server.macro.spatial.MacroLODObject;
|
||||||
import electrosphere.server.macro.structure.VirtualStructure;
|
import electrosphere.server.macro.structure.VirtualStructure;
|
||||||
|
import electrosphere.util.math.region.Region;
|
||||||
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -70,6 +71,11 @@ public class Town implements MacroAreaObject, MacroLODObject {
|
|||||||
*/
|
*/
|
||||||
private List<TownJob> jobs = new LinkedList<TownJob>();
|
private List<TownJob> jobs = new LinkedList<TownJob>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The list of farm plot regions
|
||||||
|
*/
|
||||||
|
private List<Region> farmPlots = new LinkedList<Region>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The id of the parent civilization
|
* The id of the parent civilization
|
||||||
*/
|
*/
|
||||||
@ -131,6 +137,22 @@ public class Town implements MacroAreaObject, MacroLODObject {
|
|||||||
return residents.stream().map((Integer id) -> Globals.serverState.characterService.getCharacter(id)).filter((Character chara) -> chara != null).collect(Collectors.toList());
|
return residents.stream().map((Integer id) -> Globals.serverState.characterService.getCharacter(id)).filter((Character chara) -> chara != null).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the farm plots in the town
|
||||||
|
* @return The list of farm plots
|
||||||
|
*/
|
||||||
|
public List<Region> getFarmPlots(){
|
||||||
|
return farmPlots;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a farm plot region
|
||||||
|
* @param farmPlotRegion The region for the farm plot
|
||||||
|
*/
|
||||||
|
public void addFarmPlot(Region farmPlotRegion){
|
||||||
|
this.farmPlots.add(farmPlotRegion);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a job to the town
|
* Adds a job to the town
|
||||||
* @param job The job
|
* @param job The job
|
||||||
|
|||||||
@ -21,6 +21,7 @@ import electrosphere.server.macro.race.Race;
|
|||||||
import electrosphere.server.macro.structure.VirtualStructure;
|
import electrosphere.server.macro.structure.VirtualStructure;
|
||||||
import electrosphere.util.math.HashUtils;
|
import electrosphere.util.math.HashUtils;
|
||||||
import electrosphere.util.math.VoronoiUtils;
|
import electrosphere.util.math.VoronoiUtils;
|
||||||
|
import electrosphere.util.math.region.RegionPrism;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lays out town objects
|
* Lays out town objects
|
||||||
@ -52,6 +53,11 @@ public class TownLayout {
|
|||||||
*/
|
*/
|
||||||
private static final int HASH_OFFSET = 1000;
|
private static final int HASH_OFFSET = 1000;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default height of a farm plot
|
||||||
|
*/
|
||||||
|
private static final float FARM_PLOT_DEFAULT_HEIGHT = 20.0f;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Offset used to search for town centers
|
* Offset used to search for town centers
|
||||||
*/
|
*/
|
||||||
@ -406,7 +412,13 @@ public class TownLayout {
|
|||||||
* @param point4 The fourth point
|
* @param point4 The fourth point
|
||||||
*/
|
*/
|
||||||
private static void generateFarmPlot(Realm realm, Town town, Vector3d point1, Vector3d point2, Vector3d point3, Vector3d point4){
|
private static void generateFarmPlot(Realm realm, Town town, Vector3d point1, Vector3d point2, Vector3d point3, Vector3d point4){
|
||||||
|
RegionPrism region = RegionPrism.create(new Vector3d[]{
|
||||||
|
new Vector3d(point1).add(0,FARM_PLOT_DEFAULT_HEIGHT/2.0f,0),
|
||||||
|
new Vector3d(point2).add(0,FARM_PLOT_DEFAULT_HEIGHT/2.0f,0),
|
||||||
|
new Vector3d(point3).add(0,FARM_PLOT_DEFAULT_HEIGHT/2.0f,0),
|
||||||
|
new Vector3d(point4).add(0,FARM_PLOT_DEFAULT_HEIGHT/2.0f,0),
|
||||||
|
}, FARM_PLOT_DEFAULT_HEIGHT);
|
||||||
|
town.addFarmPlot(region);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user