Open source Star Ruler 2 source code!
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
#priority init 50
|
||||
import systems;
|
||||
|
||||
ElevationMap emap;
|
||||
double epower = 4.0;
|
||||
double egrid = 1000.0;
|
||||
double vgrid = 1000.0;
|
||||
bool drawGrid = false;
|
||||
|
||||
void init() {
|
||||
recalculateElevation();
|
||||
|
||||
addConsoleCommand("grid_smoothing", GridPowerCommand());
|
||||
addConsoleCommand("grid_spacing", GridSpacingCommand());
|
||||
addConsoleCommand("grid_visual", GridVisualCommand());
|
||||
addConsoleCommand("show_grid", ShowGridCommand());
|
||||
}
|
||||
|
||||
void recalculateElevation() {
|
||||
//Elevation map
|
||||
emap.clear();
|
||||
vec2d minPoint, maxPoint;
|
||||
for(uint i = 0, cnt = systemCount; i < cnt; ++i) {
|
||||
auto@ sys = getSystem(i);
|
||||
vec3d pos = sys.position;
|
||||
emap.addPoint(pos, sys.radius);
|
||||
|
||||
minPoint.x = min(minPoint.x, pos.x);
|
||||
minPoint.y = min(minPoint.y, pos.y);
|
||||
maxPoint.x = max(maxPoint.x, pos.x);
|
||||
maxPoint.y = max(maxPoint.y, pos.y);
|
||||
}
|
||||
|
||||
emap.generate(vec2d(max(egrid, (maxPoint.x-minPoint.x)/100.0), max(egrid, (maxPoint.y-minPoint.y)/100.0)), epower);
|
||||
}
|
||||
|
||||
double getElevation(double x, double z) {
|
||||
return emap.get(x, z);
|
||||
}
|
||||
|
||||
double getAverageElevation() {
|
||||
return emap.gridStart.y;
|
||||
}
|
||||
|
||||
bool getElevationIntersect(const line3dd& line, vec3d&out point) {
|
||||
return emap.getClosestPoint(line, point);
|
||||
}
|
||||
|
||||
class GridPowerCommand : ConsoleCommand {
|
||||
void execute(const string& args) {
|
||||
epower = toDouble(args);
|
||||
emap.generate(vec2d(egrid, egrid), epower);
|
||||
}
|
||||
};
|
||||
|
||||
class GridSpacingCommand : ConsoleCommand {
|
||||
void execute(const string& args) {
|
||||
egrid = toDouble(args);
|
||||
emap.generate(vec2d(egrid, egrid), epower);
|
||||
}
|
||||
};
|
||||
|
||||
class GridVisualCommand : ConsoleCommand {
|
||||
void execute(const string& args) {
|
||||
vgrid = toDouble(args);
|
||||
}
|
||||
};
|
||||
|
||||
class ShowGridCommand : ConsoleCommand {
|
||||
void execute(const string& args) {
|
||||
drawGrid = args.length == 0 || toBool(args);
|
||||
}
|
||||
};
|
||||
|
||||
void render(double time) {
|
||||
if(!drawGrid)
|
||||
return;
|
||||
|
||||
//Draw the elevation grid
|
||||
for(int x = -10, xcnt = emap.gridSize.x / vgrid + 10; x < xcnt; ++x) {
|
||||
for(int y = -10, ycnt = emap.gridSize.y / vgrid + 10; y < ycnt; ++y) {
|
||||
vec3d tlpos = emap.gridStart + vec3d(vgrid * x, 0, vgrid * y);
|
||||
vec3d brpos = tlpos + vec3d(vgrid, 0.0, vgrid);
|
||||
|
||||
vec3d tl = vec3d(tlpos.x, emap.get(tlpos.x, tlpos.z), tlpos.z);
|
||||
vec3d tr = vec3d(brpos.x, emap.get(brpos.x, tlpos.z), tlpos.z);
|
||||
vec3d bl = vec3d(tlpos.x, emap.get(tlpos.x, brpos.z), brpos.z);
|
||||
vec3d br = vec3d(brpos.x, emap.get(brpos.x, brpos.z), brpos.z);
|
||||
|
||||
drawPolygonStart(2, material::TestGrid);
|
||||
drawPolygonPoint(tl, vec2f(0.f, 0.f));
|
||||
drawPolygonPoint(tr, vec2f(1.f, 0.f));
|
||||
drawPolygonPoint(br, vec2f(1.f, 1.f));
|
||||
|
||||
drawPolygonPoint(tl, vec2f(0.f, 0.f));
|
||||
drawPolygonPoint(bl, vec2f(0.f, 1.f));
|
||||
drawPolygonPoint(br, vec2f(1.f, 1.f));
|
||||
drawPolygonEnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user