/* * Decompiled with CFR 0.152. * * Could not load the following classes: * org.joml.Matrix3f * org.joml.Matrix3fc * org.joml.Matrix4f * org.joml.Matrix4fStack * org.joml.Matrix4fc * org.joml.Quaternionfc * org.joml.Vector3f * org.joml.Vector3fc * org.joml.Vector4f * org.joml.Vector4fc */ package net.minecraft.client.renderer; import com.mojang.blaze3d.buffers.GpuBuffer; import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.systems.RenderPass; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.textures.GpuTextureView; import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.ByteBufferBuilder; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.MeshData; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.math.Axis; import java.util.OptionalDouble; import java.util.OptionalInt; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.EndFlashState; import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.client.renderer.state.SkyRenderState; import net.minecraft.client.renderer.texture.AbstractTexture; import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.client.resources.model.AtlasManager; import net.minecraft.data.AtlasIds; import net.minecraft.resources.Identifier; import net.minecraft.util.ARGB; import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.world.attribute.EnvironmentAttributeProbe; import net.minecraft.world.attribute.EnvironmentAttributes; import net.minecraft.world.level.MoonPhase; import net.minecraft.world.level.dimension.DimensionType; import org.joml.Matrix3f; import org.joml.Matrix3fc; import org.joml.Matrix4f; import org.joml.Matrix4fStack; import org.joml.Matrix4fc; import org.joml.Quaternionfc; import org.joml.Vector3f; import org.joml.Vector3fc; import org.joml.Vector4f; import org.joml.Vector4fc; public class SkyRenderer implements AutoCloseable { private static final Identifier SUN_SPRITE = Identifier.withDefaultNamespace("sun"); private static final Identifier END_FLASH_SPRITE = Identifier.withDefaultNamespace("end_flash"); private static final Identifier END_SKY_LOCATION = Identifier.withDefaultNamespace("textures/environment/end_sky.png"); private static final float SKY_DISC_RADIUS = 512.0f; private static final int SKY_VERTICES = 10; private static final int STAR_COUNT = 1500; private static final float SUN_SIZE = 30.0f; private static final float SUN_HEIGHT = 100.0f; private static final float MOON_SIZE = 20.0f; private static final float MOON_HEIGHT = 100.0f; private static final int SUNRISE_STEPS = 16; private static final int END_SKY_QUAD_COUNT = 6; private static final float END_FLASH_HEIGHT = 100.0f; private static final float END_FLASH_SCALE = 60.0f; private final TextureAtlas celestialsAtlas; private final GpuBuffer starBuffer; private final GpuBuffer topSkyBuffer; private final GpuBuffer bottomSkyBuffer; private final GpuBuffer endSkyBuffer; private final GpuBuffer sunBuffer; private final GpuBuffer moonBuffer; private final GpuBuffer sunriseBuffer; private final GpuBuffer endFlashBuffer; private final RenderSystem.AutoStorageIndexBuffer quadIndices = RenderSystem.getSequentialBuffer(VertexFormat.Mode.QUADS); private final AbstractTexture endSkyTexture; private int starIndexCount; public SkyRenderer(TextureManager textureManager, AtlasManager atlasManager) { this.celestialsAtlas = atlasManager.getAtlasOrThrow(AtlasIds.CELESTIALS); this.starBuffer = this.buildStars(); this.endSkyBuffer = SkyRenderer.buildEndSky(); this.endSkyTexture = this.getTexture(textureManager, END_SKY_LOCATION); this.endFlashBuffer = SkyRenderer.buildEndFlashQuad(this.celestialsAtlas); this.sunBuffer = SkyRenderer.buildSunQuad(this.celestialsAtlas); this.moonBuffer = SkyRenderer.buildMoonPhases(this.celestialsAtlas); this.sunriseBuffer = this.buildSunriseFan(); try (ByteBufferBuilder builder = ByteBufferBuilder.exactlySized(10 * DefaultVertexFormat.POSITION.getVertexSize());){ BufferBuilder bufferBuilder = new BufferBuilder(builder, VertexFormat.Mode.TRIANGLE_FAN, DefaultVertexFormat.POSITION); this.buildSkyDisc(bufferBuilder, 16.0f); try (MeshData meshData = bufferBuilder.buildOrThrow();){ this.topSkyBuffer = RenderSystem.getDevice().createBuffer(() -> "Top sky vertex buffer", 32, meshData.vertexBuffer()); } bufferBuilder = new BufferBuilder(builder, VertexFormat.Mode.TRIANGLE_FAN, DefaultVertexFormat.POSITION); this.buildSkyDisc(bufferBuilder, -16.0f); meshData = bufferBuilder.buildOrThrow(); try { this.bottomSkyBuffer = RenderSystem.getDevice().createBuffer(() -> "Bottom sky vertex buffer", 32, meshData.vertexBuffer()); } finally { if (meshData != null) { meshData.close(); } } } } private AbstractTexture getTexture(TextureManager textureManager, Identifier location) { return textureManager.getTexture(location); } private GpuBuffer buildSunriseFan() { int vertices = 18; int vtxSize = DefaultVertexFormat.POSITION_COLOR.getVertexSize(); try (ByteBufferBuilder byteBufferBuilder = ByteBufferBuilder.exactlySized(18 * vtxSize);){ BufferBuilder bufferBuilder = new BufferBuilder(byteBufferBuilder, VertexFormat.Mode.TRIANGLE_FAN, DefaultVertexFormat.POSITION_COLOR); int centerColor = ARGB.white(1.0f); int ringColor = ARGB.white(0.0f); bufferBuilder.addVertex(0.0f, 100.0f, 0.0f).setColor(centerColor); for (int i = 0; i <= 16; ++i) { float angle = (float)i * ((float)Math.PI * 2) / 16.0f; float sinAngle = Mth.sin(angle); float cosAngle = Mth.cos(angle); bufferBuilder.addVertex(sinAngle * 120.0f, cosAngle * 120.0f, -cosAngle * 40.0f).setColor(ringColor); } MeshData mesh = bufferBuilder.buildOrThrow(); try { GpuBuffer gpuBuffer = RenderSystem.getDevice().createBuffer(() -> "Sunrise/Sunset fan", 32, mesh.vertexBuffer()); if (mesh != null) { mesh.close(); } return gpuBuffer; } catch (Throwable throwable) { if (mesh != null) { try { mesh.close(); } catch (Throwable throwable2) { throwable.addSuppressed(throwable2); } } throw throwable; } } } private static GpuBuffer buildSunQuad(TextureAtlas atlas) { return SkyRenderer.buildCelestialQuad("Sun quad", atlas.getSprite(SUN_SPRITE)); } private static GpuBuffer buildEndFlashQuad(TextureAtlas atlas) { return SkyRenderer.buildCelestialQuad("End flash quad", atlas.getSprite(END_FLASH_SPRITE)); } private static GpuBuffer buildCelestialQuad(String name, TextureAtlasSprite sprite) { VertexFormat format = DefaultVertexFormat.POSITION_TEX; try (ByteBufferBuilder byteBufferBuilder = ByteBufferBuilder.exactlySized(4 * format.getVertexSize());){ BufferBuilder bufferBuilder = new BufferBuilder(byteBufferBuilder, VertexFormat.Mode.QUADS, format); bufferBuilder.addVertex(-1.0f, 0.0f, -1.0f).setUv(sprite.getU0(), sprite.getV0()); bufferBuilder.addVertex(1.0f, 0.0f, -1.0f).setUv(sprite.getU1(), sprite.getV0()); bufferBuilder.addVertex(1.0f, 0.0f, 1.0f).setUv(sprite.getU1(), sprite.getV1()); bufferBuilder.addVertex(-1.0f, 0.0f, 1.0f).setUv(sprite.getU0(), sprite.getV1()); MeshData mesh = bufferBuilder.buildOrThrow(); try { GpuBuffer gpuBuffer = RenderSystem.getDevice().createBuffer(() -> name, 32, mesh.vertexBuffer()); if (mesh != null) { mesh.close(); } return gpuBuffer; } catch (Throwable throwable) { if (mesh != null) { try { mesh.close(); } catch (Throwable throwable2) { throwable.addSuppressed(throwable2); } } throw throwable; } } } private static GpuBuffer buildMoonPhases(TextureAtlas atlas) { MoonPhase[] phases = MoonPhase.values(); VertexFormat format = DefaultVertexFormat.POSITION_TEX; try (ByteBufferBuilder byteBufferBuilder = ByteBufferBuilder.exactlySized(phases.length * 4 * format.getVertexSize());){ BufferBuilder bufferBuilder = new BufferBuilder(byteBufferBuilder, VertexFormat.Mode.QUADS, format); for (MoonPhase phase : phases) { TextureAtlasSprite sprite = atlas.getSprite(Identifier.withDefaultNamespace("moon/" + phase.getSerializedName())); bufferBuilder.addVertex(-1.0f, 0.0f, -1.0f).setUv(sprite.getU1(), sprite.getV1()); bufferBuilder.addVertex(1.0f, 0.0f, -1.0f).setUv(sprite.getU0(), sprite.getV1()); bufferBuilder.addVertex(1.0f, 0.0f, 1.0f).setUv(sprite.getU0(), sprite.getV0()); bufferBuilder.addVertex(-1.0f, 0.0f, 1.0f).setUv(sprite.getU1(), sprite.getV0()); } MeshData mesh = bufferBuilder.buildOrThrow(); try { GpuBuffer gpuBuffer = RenderSystem.getDevice().createBuffer(() -> "Moon phases", 32, mesh.vertexBuffer()); if (mesh != null) { mesh.close(); } return gpuBuffer; } catch (Throwable throwable) { if (mesh != null) { try { mesh.close(); } catch (Throwable throwable2) { throwable.addSuppressed(throwable2); } } throw throwable; } } } private GpuBuffer buildStars() { RandomSource random = RandomSource.create(10842L); float starDistance = 100.0f; try (ByteBufferBuilder byteBufferBuilder = ByteBufferBuilder.exactlySized(DefaultVertexFormat.POSITION.getVertexSize() * 1500 * 4);){ BufferBuilder bufferBuilder = new BufferBuilder(byteBufferBuilder, VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION); for (int i = 0; i < 1500; ++i) { float x = random.nextFloat() * 2.0f - 1.0f; float y = random.nextFloat() * 2.0f - 1.0f; float z = random.nextFloat() * 2.0f - 1.0f; float starSize = 0.15f + random.nextFloat() * 0.1f; float lengthSq = Mth.lengthSquared(x, y, z); if (lengthSq <= 0.010000001f || lengthSq >= 1.0f) continue; Vector3f starCenter = new Vector3f(x, y, z).normalize(100.0f); float zRot = (float)(random.nextDouble() * 3.1415927410125732 * 2.0); Matrix3f rotation = new Matrix3f().rotateTowards((Vector3fc)new Vector3f((Vector3fc)starCenter).negate(), (Vector3fc)new Vector3f(0.0f, 1.0f, 0.0f)).rotateZ(-zRot); bufferBuilder.addVertex((Vector3fc)new Vector3f(starSize, -starSize, 0.0f).mul((Matrix3fc)rotation).add((Vector3fc)starCenter)); bufferBuilder.addVertex((Vector3fc)new Vector3f(starSize, starSize, 0.0f).mul((Matrix3fc)rotation).add((Vector3fc)starCenter)); bufferBuilder.addVertex((Vector3fc)new Vector3f(-starSize, starSize, 0.0f).mul((Matrix3fc)rotation).add((Vector3fc)starCenter)); bufferBuilder.addVertex((Vector3fc)new Vector3f(-starSize, -starSize, 0.0f).mul((Matrix3fc)rotation).add((Vector3fc)starCenter)); } MeshData mesh = bufferBuilder.buildOrThrow(); try { this.starIndexCount = mesh.drawState().indexCount(); GpuBuffer gpuBuffer = RenderSystem.getDevice().createBuffer(() -> "Stars vertex buffer", 40, mesh.vertexBuffer()); if (mesh != null) { mesh.close(); } return gpuBuffer; } catch (Throwable throwable) { if (mesh != null) { try { mesh.close(); } catch (Throwable throwable2) { throwable.addSuppressed(throwable2); } } throw throwable; } } } private void buildSkyDisc(VertexConsumer builder, float yy) { float x = Math.signum(yy) * 512.0f; builder.addVertex(0.0f, yy, 0.0f); for (int i = -180; i <= 180; i += 45) { builder.addVertex(x * Mth.cos((float)i * ((float)Math.PI / 180)), yy, 512.0f * Mth.sin((float)i * ((float)Math.PI / 180))); } } private static GpuBuffer buildEndSky() { try (ByteBufferBuilder byteBufferBuilder = ByteBufferBuilder.exactlySized(24 * DefaultVertexFormat.POSITION_TEX_COLOR.getVertexSize());){ BufferBuilder bufferBuilder = new BufferBuilder(byteBufferBuilder, VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); for (int i = 0; i < 6; ++i) { Matrix4f pose = new Matrix4f(); switch (i) { case 1: { pose.rotationX(1.5707964f); break; } case 2: { pose.rotationX(-1.5707964f); break; } case 3: { pose.rotationX((float)Math.PI); break; } case 4: { pose.rotationZ(1.5707964f); break; } case 5: { pose.rotationZ(-1.5707964f); } } bufferBuilder.addVertex((Matrix4fc)pose, -100.0f, -100.0f, -100.0f).setUv(0.0f, 0.0f).setColor(-14145496); bufferBuilder.addVertex((Matrix4fc)pose, -100.0f, -100.0f, 100.0f).setUv(0.0f, 16.0f).setColor(-14145496); bufferBuilder.addVertex((Matrix4fc)pose, 100.0f, -100.0f, 100.0f).setUv(16.0f, 16.0f).setColor(-14145496); bufferBuilder.addVertex((Matrix4fc)pose, 100.0f, -100.0f, -100.0f).setUv(16.0f, 0.0f).setColor(-14145496); } MeshData meshData = bufferBuilder.buildOrThrow(); try { GpuBuffer gpuBuffer = RenderSystem.getDevice().createBuffer(() -> "End sky vertex buffer", 40, meshData.vertexBuffer()); if (meshData != null) { meshData.close(); } return gpuBuffer; } catch (Throwable throwable) { if (meshData != null) { try { meshData.close(); } catch (Throwable throwable2) { throwable.addSuppressed(throwable2); } } throw throwable; } } } public void renderSkyDisc(int skyColor) { GpuBufferSlice dynamicTransforms = RenderSystem.getDynamicUniforms().writeTransform((Matrix4fc)RenderSystem.getModelViewMatrix(), (Vector4fc)ARGB.vector4fFromARGB32(skyColor), (Vector3fc)new Vector3f(), (Matrix4fc)new Matrix4f()); GpuTextureView colorTexture = Minecraft.getInstance().getMainRenderTarget().getColorTextureView(); GpuTextureView depthTexture = Minecraft.getInstance().getMainRenderTarget().getDepthTextureView(); try (RenderPass renderPass = RenderSystem.getDevice().createCommandEncoder().createRenderPass(() -> "Sky disc", colorTexture, OptionalInt.empty(), depthTexture, OptionalDouble.empty());){ renderPass.setPipeline(RenderPipelines.SKY); RenderSystem.bindDefaultUniforms(renderPass); renderPass.setUniform("DynamicTransforms", dynamicTransforms); renderPass.setVertexBuffer(0, this.topSkyBuffer); renderPass.draw(0, 10); } } public void extractRenderState(ClientLevel level, float partialTicks, Camera camera, SkyRenderState state) { state.skybox = level.dimensionType().skybox(); if (state.skybox == DimensionType.Skybox.NONE) { return; } if (state.skybox == DimensionType.Skybox.END) { EndFlashState endFlashState = level.endFlashState(); if (endFlashState == null) { return; } state.endFlashIntensity = endFlashState.getIntensity(partialTicks); state.endFlashXAngle = endFlashState.getXAngle(); state.endFlashYAngle = endFlashState.getYAngle(); return; } EnvironmentAttributeProbe attributeProbe = camera.attributeProbe(); state.sunAngle = attributeProbe.getValue(EnvironmentAttributes.SUN_ANGLE, partialTicks).floatValue() * ((float)Math.PI / 180); state.moonAngle = attributeProbe.getValue(EnvironmentAttributes.MOON_ANGLE, partialTicks).floatValue() * ((float)Math.PI / 180); state.starAngle = attributeProbe.getValue(EnvironmentAttributes.STAR_ANGLE, partialTicks).floatValue() * ((float)Math.PI / 180); state.rainBrightness = 1.0f - level.getRainLevel(partialTicks); state.starBrightness = attributeProbe.getValue(EnvironmentAttributes.STAR_BRIGHTNESS, partialTicks).floatValue(); state.sunriseAndSunsetColor = camera.attributeProbe().getValue(EnvironmentAttributes.SUNRISE_SUNSET_COLOR, partialTicks); state.moonPhase = attributeProbe.getValue(EnvironmentAttributes.MOON_PHASE, partialTicks); state.skyColor = attributeProbe.getValue(EnvironmentAttributes.SKY_COLOR, partialTicks); state.shouldRenderDarkDisc = this.shouldRenderDarkDisc(partialTicks, level); } private boolean shouldRenderDarkDisc(float deltaPartialTick, ClientLevel level) { return Minecraft.getInstance().player.getEyePosition((float)deltaPartialTick).y - level.getLevelData().getHorizonHeight(level) < 0.0; } public void renderDarkDisc() { Matrix4fStack modelViewStack = RenderSystem.getModelViewStack(); modelViewStack.pushMatrix(); modelViewStack.translate(0.0f, 12.0f, 0.0f); GpuBufferSlice dynamicTransforms = RenderSystem.getDynamicUniforms().writeTransform((Matrix4fc)modelViewStack, (Vector4fc)new Vector4f(0.0f, 0.0f, 0.0f, 1.0f), (Vector3fc)new Vector3f(), (Matrix4fc)new Matrix4f()); GpuTextureView colorTexture = Minecraft.getInstance().getMainRenderTarget().getColorTextureView(); GpuTextureView depthTexture = Minecraft.getInstance().getMainRenderTarget().getDepthTextureView(); try (RenderPass renderPass = RenderSystem.getDevice().createCommandEncoder().createRenderPass(() -> "Sky dark", colorTexture, OptionalInt.empty(), depthTexture, OptionalDouble.empty());){ renderPass.setPipeline(RenderPipelines.SKY); RenderSystem.bindDefaultUniforms(renderPass); renderPass.setUniform("DynamicTransforms", dynamicTransforms); renderPass.setVertexBuffer(0, this.bottomSkyBuffer); renderPass.draw(0, 10); } modelViewStack.popMatrix(); } public void renderSunMoonAndStars(PoseStack poseStack, float sunAngle, float moonAngle, float starAngle, MoonPhase moonPhase, float rainBrightness, float starBrightness) { poseStack.pushPose(); poseStack.mulPose((Quaternionfc)Axis.YP.rotationDegrees(-90.0f)); poseStack.pushPose(); poseStack.mulPose((Quaternionfc)Axis.XP.rotation(sunAngle)); this.renderSun(rainBrightness, poseStack); poseStack.popPose(); poseStack.pushPose(); poseStack.mulPose((Quaternionfc)Axis.XP.rotation(moonAngle)); this.renderMoon(moonPhase, rainBrightness, poseStack); poseStack.popPose(); if (starBrightness > 0.0f) { poseStack.pushPose(); poseStack.mulPose((Quaternionfc)Axis.XP.rotation(starAngle)); this.renderStars(starBrightness, poseStack); poseStack.popPose(); } poseStack.popPose(); } private void renderSun(float rainBrightness, PoseStack poseStack) { Matrix4fStack modelViewStack = RenderSystem.getModelViewStack(); modelViewStack.pushMatrix(); modelViewStack.mul((Matrix4fc)poseStack.last().pose()); modelViewStack.translate(0.0f, 100.0f, 0.0f); modelViewStack.scale(30.0f, 1.0f, 30.0f); GpuBufferSlice dynamicTransforms = RenderSystem.getDynamicUniforms().writeTransform((Matrix4fc)modelViewStack, (Vector4fc)new Vector4f(1.0f, 1.0f, 1.0f, rainBrightness), (Vector3fc)new Vector3f(), (Matrix4fc)new Matrix4f()); GpuTextureView color = Minecraft.getInstance().getMainRenderTarget().getColorTextureView(); GpuTextureView depth = Minecraft.getInstance().getMainRenderTarget().getDepthTextureView(); GpuBuffer indexBuffer = this.quadIndices.getBuffer(6); try (RenderPass renderPass = RenderSystem.getDevice().createCommandEncoder().createRenderPass(() -> "Sky sun", color, OptionalInt.empty(), depth, OptionalDouble.empty());){ renderPass.setPipeline(RenderPipelines.CELESTIAL); RenderSystem.bindDefaultUniforms(renderPass); renderPass.setUniform("DynamicTransforms", dynamicTransforms); renderPass.bindTexture("Sampler0", this.celestialsAtlas.getTextureView(), this.celestialsAtlas.getSampler()); renderPass.setVertexBuffer(0, this.sunBuffer); renderPass.setIndexBuffer(indexBuffer, this.quadIndices.type()); renderPass.drawIndexed(0, 0, 6, 1); } modelViewStack.popMatrix(); } private void renderMoon(MoonPhase moonPhase, float rainBrightness, PoseStack poseStack) { int baseVertex = moonPhase.index() * 4; Matrix4fStack modelViewStack = RenderSystem.getModelViewStack(); modelViewStack.pushMatrix(); modelViewStack.mul((Matrix4fc)poseStack.last().pose()); modelViewStack.translate(0.0f, 100.0f, 0.0f); modelViewStack.scale(20.0f, 1.0f, 20.0f); GpuBufferSlice dynamicTransforms = RenderSystem.getDynamicUniforms().writeTransform((Matrix4fc)modelViewStack, (Vector4fc)new Vector4f(1.0f, 1.0f, 1.0f, rainBrightness), (Vector3fc)new Vector3f(), (Matrix4fc)new Matrix4f()); GpuTextureView color = Minecraft.getInstance().getMainRenderTarget().getColorTextureView(); GpuTextureView depth = Minecraft.getInstance().getMainRenderTarget().getDepthTextureView(); GpuBuffer indexBuffer = this.quadIndices.getBuffer(6); try (RenderPass renderPass = RenderSystem.getDevice().createCommandEncoder().createRenderPass(() -> "Sky moon", color, OptionalInt.empty(), depth, OptionalDouble.empty());){ renderPass.setPipeline(RenderPipelines.CELESTIAL); RenderSystem.bindDefaultUniforms(renderPass); renderPass.setUniform("DynamicTransforms", dynamicTransforms); renderPass.bindTexture("Sampler0", this.celestialsAtlas.getTextureView(), this.celestialsAtlas.getSampler()); renderPass.setVertexBuffer(0, this.moonBuffer); renderPass.setIndexBuffer(indexBuffer, this.quadIndices.type()); renderPass.drawIndexed(baseVertex, 0, 6, 1); } modelViewStack.popMatrix(); } private void renderStars(float starBrightness, PoseStack poseStack) { Matrix4fStack modelViewStack = RenderSystem.getModelViewStack(); modelViewStack.pushMatrix(); modelViewStack.mul((Matrix4fc)poseStack.last().pose()); RenderPipeline renderPipeline = RenderPipelines.STARS; GpuTextureView colorTexture = Minecraft.getInstance().getMainRenderTarget().getColorTextureView(); GpuTextureView depthTexture = Minecraft.getInstance().getMainRenderTarget().getDepthTextureView(); GpuBuffer indexBuffer = this.quadIndices.getBuffer(this.starIndexCount); GpuBufferSlice dynamicTransforms = RenderSystem.getDynamicUniforms().writeTransform((Matrix4fc)modelViewStack, (Vector4fc)new Vector4f(starBrightness, starBrightness, starBrightness, starBrightness), (Vector3fc)new Vector3f(), (Matrix4fc)new Matrix4f()); try (RenderPass renderPass = RenderSystem.getDevice().createCommandEncoder().createRenderPass(() -> "Stars", colorTexture, OptionalInt.empty(), depthTexture, OptionalDouble.empty());){ renderPass.setPipeline(renderPipeline); RenderSystem.bindDefaultUniforms(renderPass); renderPass.setUniform("DynamicTransforms", dynamicTransforms); renderPass.setVertexBuffer(0, this.starBuffer); renderPass.setIndexBuffer(indexBuffer, this.quadIndices.type()); renderPass.drawIndexed(0, 0, this.starIndexCount, 1); } modelViewStack.popMatrix(); } public void renderSunriseAndSunset(PoseStack poseStack, float sunAngle, int sunriseAndSunsetColor) { float alpha = ARGB.alphaFloat(sunriseAndSunsetColor); if (alpha <= 0.001f) { return; } poseStack.pushPose(); poseStack.mulPose((Quaternionfc)Axis.XP.rotationDegrees(90.0f)); float angle = Mth.sin(sunAngle) < 0.0f ? 180.0f : 0.0f; poseStack.mulPose((Quaternionfc)Axis.ZP.rotationDegrees(angle + 90.0f)); Matrix4fStack modelViewStack = RenderSystem.getModelViewStack(); modelViewStack.pushMatrix(); modelViewStack.mul((Matrix4fc)poseStack.last().pose()); modelViewStack.scale(1.0f, 1.0f, alpha); GpuBufferSlice dynamicTransforms = RenderSystem.getDynamicUniforms().writeTransform((Matrix4fc)modelViewStack, (Vector4fc)ARGB.vector4fFromARGB32(sunriseAndSunsetColor), (Vector3fc)new Vector3f(), (Matrix4fc)new Matrix4f()); GpuTextureView color = Minecraft.getInstance().getMainRenderTarget().getColorTextureView(); GpuTextureView depth = Minecraft.getInstance().getMainRenderTarget().getDepthTextureView(); try (RenderPass renderPass = RenderSystem.getDevice().createCommandEncoder().createRenderPass(() -> "Sunrise sunset", color, OptionalInt.empty(), depth, OptionalDouble.empty());){ renderPass.setPipeline(RenderPipelines.SUNRISE_SUNSET); RenderSystem.bindDefaultUniforms(renderPass); renderPass.setUniform("DynamicTransforms", dynamicTransforms); renderPass.setVertexBuffer(0, this.sunriseBuffer); renderPass.draw(0, 18); } modelViewStack.popMatrix(); poseStack.popPose(); } public void renderEndSky() { RenderSystem.AutoStorageIndexBuffer autoIndices = RenderSystem.getSequentialBuffer(VertexFormat.Mode.QUADS); GpuBuffer indexBuffer = autoIndices.getBuffer(36); GpuTextureView colorTexture = Minecraft.getInstance().getMainRenderTarget().getColorTextureView(); GpuTextureView depthTexture = Minecraft.getInstance().getMainRenderTarget().getDepthTextureView(); GpuBufferSlice dynamicTransforms = RenderSystem.getDynamicUniforms().writeTransform((Matrix4fc)RenderSystem.getModelViewMatrix(), (Vector4fc)new Vector4f(1.0f, 1.0f, 1.0f, 1.0f), (Vector3fc)new Vector3f(), (Matrix4fc)new Matrix4f()); try (RenderPass renderPass = RenderSystem.getDevice().createCommandEncoder().createRenderPass(() -> "End sky", colorTexture, OptionalInt.empty(), depthTexture, OptionalDouble.empty());){ renderPass.setPipeline(RenderPipelines.END_SKY); RenderSystem.bindDefaultUniforms(renderPass); renderPass.setUniform("DynamicTransforms", dynamicTransforms); renderPass.bindTexture("Sampler0", this.endSkyTexture.getTextureView(), this.endSkyTexture.getSampler()); renderPass.setVertexBuffer(0, this.endSkyBuffer); renderPass.setIndexBuffer(indexBuffer, autoIndices.type()); renderPass.drawIndexed(0, 0, 36, 1); } } public void renderEndFlash(PoseStack poseStack, float intensity, float xAngle, float yAngle) { poseStack.mulPose((Quaternionfc)Axis.YP.rotationDegrees(180.0f - yAngle)); poseStack.mulPose((Quaternionfc)Axis.XP.rotationDegrees(-90.0f - xAngle)); Matrix4fStack modelViewStack = RenderSystem.getModelViewStack(); modelViewStack.pushMatrix(); modelViewStack.mul((Matrix4fc)poseStack.last().pose()); modelViewStack.translate(0.0f, 100.0f, 0.0f); modelViewStack.scale(60.0f, 1.0f, 60.0f); GpuBufferSlice dynamicTransforms = RenderSystem.getDynamicUniforms().writeTransform((Matrix4fc)modelViewStack, (Vector4fc)new Vector4f(intensity, intensity, intensity, intensity), (Vector3fc)new Vector3f(), (Matrix4fc)new Matrix4f()); GpuTextureView color = Minecraft.getInstance().getMainRenderTarget().getColorTextureView(); GpuTextureView depth = Minecraft.getInstance().getMainRenderTarget().getDepthTextureView(); GpuBuffer indexBuffer = this.quadIndices.getBuffer(6); try (RenderPass renderPass = RenderSystem.getDevice().createCommandEncoder().createRenderPass(() -> "End flash", color, OptionalInt.empty(), depth, OptionalDouble.empty());){ renderPass.setPipeline(RenderPipelines.CELESTIAL); RenderSystem.bindDefaultUniforms(renderPass); renderPass.setUniform("DynamicTransforms", dynamicTransforms); renderPass.bindTexture("Sampler0", this.celestialsAtlas.getTextureView(), this.celestialsAtlas.getSampler()); renderPass.setVertexBuffer(0, this.endFlashBuffer); renderPass.setIndexBuffer(indexBuffer, this.quadIndices.type()); renderPass.drawIndexed(0, 0, 6, 1); } modelViewStack.popMatrix(); } @Override public void close() { this.sunBuffer.close(); this.moonBuffer.close(); this.starBuffer.close(); this.topSkyBuffer.close(); this.bottomSkyBuffer.close(); this.endSkyBuffer.close(); this.sunriseBuffer.close(); this.endFlashBuffer.close(); } }