region interface
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
9ee7c9e208
commit
4116336cd6
@ -2036,6 +2036,7 @@ Fix jobs data, simplify block chunk gen algo
|
||||
Convex y-aligned prism intersection checking
|
||||
Fix block LOD chunk rendering (scaling not applying)
|
||||
Scaffolding for laying out farm plots around towns
|
||||
Region interface
|
||||
|
||||
|
||||
|
||||
|
||||
59
src/main/java/electrosphere/util/math/region/Region.java
Normal file
59
src/main/java/electrosphere/util/math/region/Region.java
Normal file
@ -0,0 +1,59 @@
|
||||
package electrosphere.util.math.region;
|
||||
|
||||
import org.joml.AABBd;
|
||||
import org.joml.Sphered;
|
||||
import org.joml.Vector3d;
|
||||
|
||||
/**
|
||||
* A region of 3d space
|
||||
*/
|
||||
public interface Region {
|
||||
|
||||
/**
|
||||
* The type of selection
|
||||
*/
|
||||
public static enum RegionType {
|
||||
/**
|
||||
* A rectangle
|
||||
*/
|
||||
RECTANGULAR,
|
||||
/**
|
||||
* A y-aligned prism
|
||||
*/
|
||||
Y_ALIGNED_PRISM,
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the type of region
|
||||
* @return The type of region
|
||||
*/
|
||||
public RegionType getType();
|
||||
|
||||
/**
|
||||
* Checks if the region contains a point
|
||||
* @param point The point
|
||||
* @return true if it contains the point, false otherwise
|
||||
*/
|
||||
public boolean intersects(Vector3d point);
|
||||
|
||||
/**
|
||||
* Checks if this region intersects another region
|
||||
* @param other The other region
|
||||
* @return true if one intersects another, false otherwise
|
||||
*/
|
||||
public boolean intersects(Region other);
|
||||
|
||||
/**
|
||||
* Checks if this region intersects a sphere
|
||||
* @param sphere The sphere to check
|
||||
* @return true if intersects the sphere, false otherwise
|
||||
*/
|
||||
public boolean intersects(Sphered sphere);
|
||||
|
||||
/**
|
||||
* Gets the axis-aligned bounding box for the region
|
||||
* @return The axis-aligned bounding box
|
||||
*/
|
||||
public AABBd getAABB();
|
||||
|
||||
}
|
||||
@ -0,0 +1,96 @@
|
||||
package electrosphere.util.math.region;
|
||||
|
||||
import org.joml.AABBd;
|
||||
import org.joml.Sphered;
|
||||
import org.joml.Vector3d;
|
||||
|
||||
import electrosphere.util.math.GeomUtils;
|
||||
|
||||
/**
|
||||
* A prism region
|
||||
*/
|
||||
public class RegionPrism implements Region {
|
||||
|
||||
|
||||
/**
|
||||
* The height of the prism
|
||||
*/
|
||||
private double height;
|
||||
|
||||
/**
|
||||
* The points that make up the base polygon of the prism
|
||||
*/
|
||||
private Vector3d[] points;
|
||||
|
||||
/**
|
||||
* The aabb for the prism
|
||||
*/
|
||||
private AABBd aabb;
|
||||
|
||||
/**
|
||||
* Private constructor
|
||||
*/
|
||||
private RegionPrism(){ }
|
||||
|
||||
/**
|
||||
* Creates a prism region
|
||||
* @param points The points that define the base polygon of the prism
|
||||
* @param height The height of the prism
|
||||
* @return The region
|
||||
*/
|
||||
public static RegionPrism create(Vector3d[] points, double height){
|
||||
RegionPrism rVal = new RegionPrism();
|
||||
rVal.height = height;
|
||||
rVal.points = points;
|
||||
//compute aabb
|
||||
rVal.aabb = new AABBd(points[0].x,points[0].y,points[0].z,points[0].x,points[0].y,points[0].z);
|
||||
for(int i = 1; i < points.length; i++){
|
||||
if(rVal.aabb.minX > points[i].x){
|
||||
rVal.aabb.minX = points[i].x;
|
||||
}
|
||||
if(rVal.aabb.minX > points[i].y){
|
||||
rVal.aabb.minX = points[i].y;
|
||||
}
|
||||
if(rVal.aabb.minX > points[i].z){
|
||||
rVal.aabb.minX = points[i].z;
|
||||
}
|
||||
if(rVal.aabb.maxX < points[i].x){
|
||||
rVal.aabb.maxX = points[i].x;
|
||||
}
|
||||
if(rVal.aabb.maxX < points[i].y){
|
||||
rVal.aabb.maxX = points[i].y;
|
||||
}
|
||||
if(rVal.aabb.maxX < points[i].z){
|
||||
rVal.aabb.maxX = points[i].z;
|
||||
}
|
||||
}
|
||||
return rVal;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RegionType getType() {
|
||||
return RegionType.Y_ALIGNED_PRISM;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean intersects(Vector3d point) {
|
||||
return GeomUtils.pointIntersectsConvexPrism(point,points,height);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean intersects(Region other) {
|
||||
throw new UnsupportedOperationException("Unimplemented method 'intersects'");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean intersects(Sphered sphere) {
|
||||
// TODO Auto-generated method stub
|
||||
throw new UnsupportedOperationException("Unimplemented method 'intersects'");
|
||||
}
|
||||
|
||||
@Override
|
||||
public AABBd getAABB() {
|
||||
return this.aabb;
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,71 @@
|
||||
package electrosphere.util.math.region;
|
||||
|
||||
import org.joml.AABBd;
|
||||
import org.joml.Sphered;
|
||||
import org.joml.Vector3d;
|
||||
|
||||
/**
|
||||
* A rectangular region
|
||||
*/
|
||||
public class RegionRectangular implements Region {
|
||||
|
||||
/**
|
||||
* The AABB of the area selection
|
||||
*/
|
||||
private AABBd aabb;
|
||||
|
||||
/**
|
||||
* Private constructor
|
||||
*/
|
||||
private RegionRectangular(){ }
|
||||
|
||||
/**
|
||||
* Creates a rectangular selection
|
||||
* @param start The start point
|
||||
* @param end The end point
|
||||
* @return The selection
|
||||
*/
|
||||
public static RegionRectangular create(Vector3d start, Vector3d end){
|
||||
if(start.x > end.x){
|
||||
throw new Error("Start x is less than end x! " + start.x + " " + end.x);
|
||||
}
|
||||
if(start.y > end.y){
|
||||
throw new Error("Start y is less than end y! " + start.y + " " + end.y);
|
||||
}
|
||||
if(start.z > end.z){
|
||||
throw new Error("Start y is less than end y! " + start.z + " " + end.z);
|
||||
}
|
||||
RegionRectangular rVal = new RegionRectangular();
|
||||
rVal.aabb = new AABBd(start, end);
|
||||
return rVal;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RegionType getType() {
|
||||
return RegionType.RECTANGULAR;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean intersects(Vector3d point) {
|
||||
return aabb.testPoint(point);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean intersects(Region other) {
|
||||
if(other.getType() != RegionType.RECTANGULAR){
|
||||
throw new Error("One of the areas to test is not rectangular! " + other.getType());
|
||||
}
|
||||
return aabb.testAABB(other.getAABB());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean intersects(Sphered sphere) {
|
||||
return aabb.testSphere(sphere.x, sphere.y, sphere.z, sphere.r);
|
||||
}
|
||||
|
||||
@Override
|
||||
public AABBd getAABB() {
|
||||
return this.aabb;
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user