diff --git a/core/src/mindustry/graphics/g3d/HexMesher.java b/core/src/mindustry/graphics/g3d/HexMesher.java index 459c414b89..034f324b09 100644 --- a/core/src/mindustry/graphics/g3d/HexMesher.java +++ b/core/src/mindustry/graphics/g3d/HexMesher.java @@ -7,4 +7,7 @@ import arc.math.geom.*; public interface HexMesher{ float getHeight(Vec3 position); Color getColor(Vec3 position); + 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 1eeec3e891..44cb059120 100644 --- a/core/src/mindustry/graphics/g3d/MeshBuilder.java +++ b/core/src/mindustry/graphics/g3d/MeshBuilder.java @@ -48,6 +48,9 @@ public class MeshBuilder{ begin(grid.tiles.length * 12 * (3 + 3 + 1)); for(Ptile tile : grid.tiles){ + if(mesher.skip(tile.v)){ + continue; + } Corner[] c = tile.corners; diff --git a/core/src/mindustry/graphics/g3d/PlanetRenderer.java b/core/src/mindustry/graphics/g3d/PlanetRenderer.java index 75673c4b13..a72c47fcdc 100644 --- a/core/src/mindustry/graphics/g3d/PlanetRenderer.java +++ b/core/src/mindustry/graphics/g3d/PlanetRenderer.java @@ -156,22 +156,11 @@ public class PlanetRenderer implements Disposable{ } if(cam.frustum.containsSphere(planet.position, planet.clipRadius) && planet.parent != null && planet.hasAtmosphere && Core.settings.getBool("atmosphere")){ - Gl.depthMask(false); - - Blending.additive.apply(); - - Shaders.atmosphere.camera = cam; - Shaders.atmosphere.planet = planet; - Shaders.atmosphere.bind(); - Shaders.atmosphere.apply(); - - atmosphere.render(Shaders.atmosphere, Gl.triangles); - - Blending.normal.apply(); - - Gl.depthMask(true); + planet.drawAtmosphere(atmosphere, cam); } + planet.drawClouds(cam.combined, planet.getTransform(mat)); + for(Planet child : planet.children){ renderTransparent(child); } diff --git a/core/src/mindustry/type/Planet.java b/core/src/mindustry/type/Planet.java index 06c4dbffb8..da3a035e25 100644 --- a/core/src/mindustry/type/Planet.java +++ b/core/src/mindustry/type/Planet.java @@ -3,6 +3,7 @@ package mindustry.type; import arc.*; import arc.func.*; import arc.graphics.*; +import arc.graphics.g3d.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; @@ -21,6 +22,8 @@ public class Planet extends UnlockableContent{ private static final Vec3 intersectResult = new Vec3(); /** Mesh used for rendering. Created on load() - will be null on the server! */ public @Nullable GenericMesh mesh; + /** Mesh used for rendering planet clouds. Null if no clouds are present. */ + public @Nullable GenericMesh cloudMesh; /** Position in global coordinates. Will be 0,0,0 until the Universe updates it. */ public Vec3 position = new Vec3(); /** Grid used for the sectors on the planet. Null if this planet can't be landed on. */ @@ -86,7 +89,7 @@ public class Planet extends UnlockableContent{ /** Satellites orbiting this planet. */ public Seq satellites = new Seq<>(); /** Loads the mesh. Clientside only. Defaults to a boring sphere mesh. */ - protected Prov meshLoader = () -> new ShaderSphereMesh(this, Shaders.unlit, 2); + protected Prov meshLoader = () -> new ShaderSphereMesh(this, Shaders.unlit, 2), cloudMeshLoader = () -> null; public Planet(String name, Planet parent, float radius){ super(name); @@ -235,6 +238,7 @@ public class Planet extends UnlockableContent{ super.load(); mesh = meshLoader.get(); + cloudMesh = cloudMeshLoader.get(); } @Override @@ -300,4 +304,28 @@ public class Planet extends UnlockableContent{ public void draw(Mat3D projection, Mat3D transform){ mesh.render(projection, transform); } + + public void drawAtmosphere(Mesh atmosphere, Camera3D cam){ + //atmosphere does not contribute to depth buffer + Gl.depthMask(false); + + Blending.additive.apply(); + + Shaders.atmosphere.camera = cam; + Shaders.atmosphere.planet = this; + Shaders.atmosphere.bind(); + Shaders.atmosphere.apply(); + + atmosphere.render(Shaders.atmosphere, Gl.triangles); + + Blending.normal.apply(); + + Gl.depthMask(true); + } + + public void drawClouds(Mat3D projection, Mat3D transform){ + if(cloudMesh != null){ + cloudMesh.render(projection, transform); + } + } }