diff --git a/core/src/mindustry/graphics/g3d/HexMesh.java b/core/src/mindustry/graphics/g3d/HexMesh.java index 5436cdc79d..02a35973f0 100644 --- a/core/src/mindustry/graphics/g3d/HexMesh.java +++ b/core/src/mindustry/graphics/g3d/HexMesh.java @@ -21,7 +21,7 @@ public class HexMesh extends PlanetMesh{ @Override public void preRender(PlanetParams params){ Shaders.planet.planet = planet; - Shaders.planet.emissive = planet.generator != null; + Shaders.planet.emissive = planet.generator != null && planet.generator.isEmissive(); Shaders.planet.lightDir.set(planet.solarSystem.position).sub(planet.position).rotate(Vec3.Y, planet.getRotation()).nor(); Shaders.planet.ambientColor.set(planet.solarSystem.lightColor); } diff --git a/core/src/mindustry/graphics/g3d/HexMesher.java b/core/src/mindustry/graphics/g3d/HexMesher.java index a6192f41df..22a98184ea 100644 --- a/core/src/mindustry/graphics/g3d/HexMesher.java +++ b/core/src/mindustry/graphics/g3d/HexMesher.java @@ -18,6 +18,10 @@ public interface HexMesher{ } + default boolean isEmissive(){ + return false; + } + default boolean skip(Vec3 position){ return false; } diff --git a/core/src/mindustry/graphics/g3d/MeshBuilder.java b/core/src/mindustry/graphics/g3d/MeshBuilder.java index 9b497bc04e..cb9be7b418 100644 --- a/core/src/mindustry/graphics/g3d/MeshBuilder.java +++ b/core/src/mindustry/graphics/g3d/MeshBuilder.java @@ -89,9 +89,11 @@ public class MeshBuilder{ generator.seed = generator.baseSeed; } + boolean emit = mesher.isEmissive(); + if(grid.tiles.length * 6 >= 65535) throw new RuntimeException("Due to index size limits, only meshes with a maximum of 65535 vertices are supported. If you want more than that, make your own non-indexed mesh builder."); - Mesh mesh = begin(grid.tiles.length * 6, grid.tiles.length * 4 * 3, true, true); + Mesh mesh = begin(grid.tiles.length * 6, grid.tiles.length * 4 * 3, true, emit); float[] heights; @@ -103,13 +105,12 @@ public class MeshBuilder{ //cache heights in an array to prevent redundant calls to getHeight for(int i = 0; i < grid.corners.length; i++){ - heights[i] = mesher.getHeight(grid.corners[i].v); + heights[i] = (1f + mesher.getHeight(grid.corners[i].v) * intensity) * radius; } - int position = 0; short[] shorts = new short[12]; - float[] floats = new float[3 + (gl30 ? 1 : 3) + 1 + 1]; + float[] floats = new float[3 + (gl30 ? 1 : 3) + 1 + (emit ? 1 : 0)]; Vec3 nor = new Vec3(); Color tmpCol = new Color(); @@ -122,9 +123,9 @@ public class MeshBuilder{ Corner[] c = tile.corners; float - h1 = (1f + heights[c[0].id] * intensity) * radius, - h2 = (1f + heights[c[2].id] * intensity) * radius, - h3 = (1f + heights[c[4].id] * intensity) * radius; + h1 = heights[c[0].id], + h2 = heights[c[2].id], + h3 = heights[c[4].id]; Vec3 v1 = c[0].v, @@ -140,12 +141,17 @@ public class MeshBuilder{ tmpCol.set(1f, 1f, 1f, 1f); mesher.getColor(tile.v, tmpCol); float color = tmpCol.toFloatBits(); - tmpCol.set(0f, 0f, 0f, 0f); - mesher.getEmissiveColor(tile.v, tmpCol); - float emissive = tmpCol.toFloatBits(); + + float emissive = 0f; + + if(emit){ + tmpCol.set(0f, 0f, 0f, 0f); + mesher.getEmissiveColor(tile.v, tmpCol); + emissive = tmpCol.toFloatBits(); + } for(var corner : c){ - float height = (1f + heights[corner.id] * intensity) * radius; + float height = heights[corner.id]; vert(mesh, floats, corner.v.x * height, corner.v.y * height, corner.v.z * height, nor, color, emissive); } @@ -213,21 +219,8 @@ public class MeshBuilder{ return mesh; } - private static void normal(Vec3 v1, Vec3 v2, Vec3 v3, Vec3 out){ - float - x = v2.x - v1.x, - y = v2.y - v1.y, - z = v2.z - v1.z, - vx = v3.x - v1.x, - vy = v3.y - v1.y, - vz = v3.z - v1.z; - - float - cx = y * vz - z * vy, - cy = z * vx - x * vz, - cz = x * vy - y * vx; - - out.set(cx, cy, cz).nor(); + private static Vec3 normal(Vec3 v1, Vec3 v2, Vec3 v3, Vec3 out){ + return out.set(v2).sub(v1).crs(v3.x - v1.x, v3.y - v1.y, v3.z - v1.z).nor(); } private static void normal(float v1x, float v1y, float v1z, float v2x, float v2y, float v2z, float v3x, float v3y, float v3z, Vec3 out){ @@ -256,23 +249,24 @@ public class MeshBuilder{ floats[3] = packNormals(normal.x, normal.y, normal.z); floats[4] = color; - floats[5] = emissive; + if(floats.length > 5) floats[5] = emissive; }else{ floats[3] = normal.x; floats[4] = normal.x; floats[5] = normal.x; floats[6] = color; - floats[7] = emissive; + if(floats.length > 7) floats[7] = emissive; } mesh.getVerticesBuffer().put(floats); } private static float packNormals(float x, float y, float z){ - int xs = x < 0 ? 1 : 0; - int ys = y < 0 ? 1 : 0; - int zs = z < 0 ? 1 : 0; + int xs = x < -1f/512f ? 1 : 0; + int ys = y < -1f/512f ? 1 : 0; + int zs = z < -1f/512f ? 1 : 0; + int vi = zs << 29 | ((int)(z * 511 + (zs << 9)) & 511) << 20 | ys << 19 | ((int)(y * 511 + (ys << 9)) & 511) << 10 | diff --git a/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java b/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java index fb2467c2ee..247553a6bf 100644 --- a/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java +++ b/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java @@ -80,6 +80,11 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ sector.planet.reloadMeshAsync(); } + @Override + public boolean isEmissive(){ + return true; + } + @Override public boolean allowLanding(Sector sector){ return sector.planet.allowLaunchToNumbered && (sector.hasBase() || sector.near().contains(s -> s.hasBase() &&