diff --git a/README.md b/README.md index 9a1ea151..de94b026 100644 --- a/README.md +++ b/README.md @@ -18,20 +18,19 @@ - **Any portion of the decompiled Minecraft 1.8 source code or resources** - **Any portion of Mod Coder Pack and it's config files** - **Data that can be used alone to reconstruct portions of the game's source code** - - **Software configured by default to allow users to play without owning a copy of Minecraft** ## Getting Started: ### To compile the latest version of the client, on Windows: -1. Make sure you have at least Java 11 installed and added to your PATH +1. Make sure you have at least Java 11 installed and added to your PATH, its is recommended to use Java 17 2. Download (clone) this repository to your computer 3. Double click `CompileLatestClient.bat`, a GUI resembling a classic windows installer should open 4. Follow the steps shown to you in the new window to finish compiling ### To compile the latest version of the client, on Linux/macOS: -1. Make sure you have at least Java 11 installed +1. Make sure you have at least Java 11 installed, its is recommended to use Java 17 2. Download (clone) this repository to your computer 3. Open a terminal in the folder the repository was cloned to 4. Type `chmod +x CompileLatestClient.sh` and hit enter @@ -185,7 +184,7 @@ You may want to implement some custom logic for loading/saving certain local sto Be aware that the client will still save the key to the browser's local storage anyway even if you define a custom save handler, and will just attempt to load the key from the browser's local storage normally if you return null, these are meant to be used like event handlers for creating backups of keys instead of completely replacing the local storage save and load functions. -On a normal client you will only ever need to handle local storage keys called `_eaglercraftX.p` (profile), `_eaglercraftX.g` (game settings), `_eaglercraftX.s` (server list), `_eaglercraftX.r` (shared world relays), feel free to just ignore any other keys. It is guaranteed that the data the client stores will always be valid base64, so it is best practice to decode it to raw binary first if possible to reduce it's size before saving it to something like a MySQL database in your backend if you are trying to implement some kind of profile syncing system for your website. The keys already have GZIP compression applied to them by default so don't bother trying to compress them yourself a second time because it won't reduce their size. +On a normal client you will only ever need to handle local storage keys called `p` (profile), `g` (game settings), `s` (server list), `r` (shared world relays), in your hooks functions. Feel free to just ignore any other keys. It is guaranteed that the data the client stores will always be valid base64, so it is best practice to decode it to raw binary first if possible to reduce it's size before saving it to something like a MySQL database in your backend if you are trying to implement some kind of profile syncing system for your website. The keys already have GZIP compression applied to them by default so don't bother trying to compress them yourself a second time because it won't reduce their size. ## Developing a Client diff --git a/client_version b/client_version index c274cddf..979e1e03 100644 --- a/client_version +++ b/client_version @@ -1 +1 @@ -u32 \ No newline at end of file +u34 \ No newline at end of file diff --git a/patches/minecraft/net/minecraft/client/Minecraft.edit.java b/patches/minecraft/net/minecraft/client/Minecraft.edit.java index c7ee4d5e..34e1f62a 100644 --- a/patches/minecraft/net/minecraft/client/Minecraft.edit.java +++ b/patches/minecraft/net/minecraft/client/Minecraft.edit.java @@ -409,9 +409,20 @@ > DELETE 10 @ 10 : 11 -> INSERT 9 : 10 @ 9 +> INSERT 9 : 21 @ 9 -+ SingleplayerServerController.shutdownEaglercraftServer(); ++ if (SingleplayerServerController.isWorldRunning()) { ++ SingleplayerServerController.shutdownEaglercraftServer(); ++ while (SingleplayerServerController.getStatusState() == IntegratedServerState.WORLD_UNLOADING) { ++ EagUtils.sleep(50l); ++ SingleplayerServerController.runTick(); ++ } ++ } ++ if (SingleplayerServerController.isIntegratedServerWorkerAlive() ++ && SingleplayerServerController.canKillWorker()) { ++ SingleplayerServerController.killWorker(); ++ EagUtils.sleep(50l); ++ } > CHANGE 1 : 2 @ 1 : 2 diff --git a/patches/minecraft/net/minecraft/client/gui/GuiOverlayDebug.edit.java b/patches/minecraft/net/minecraft/client/gui/GuiOverlayDebug.edit.java index 0d95cd3d..5e45371f 100644 --- a/patches/minecraft/net/minecraft/client/gui/GuiOverlayDebug.edit.java +++ b/patches/minecraft/net/minecraft/client/gui/GuiOverlayDebug.edit.java @@ -18,7 +18,7 @@ + import java.util.Locale; -> INSERT 1 : 13 @ 1 +> INSERT 1 : 14 @ 1 + import java.util.TimeZone; + @@ -31,6 +31,7 @@ + import net.lax1dude.eaglercraft.v1_8.internal.EnumPlatformType; + import net.lax1dude.eaglercraft.v1_8.opengl.EaglercraftGPU; + import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager; ++ import net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights.DynamicLightsStateManager; + import net.lax1dude.eaglercraft.v1_8.sp.SingleplayerServerController; > CHANGE 5 : 6 @ 5 : 10 @@ -316,7 +317,13 @@ ~ HString.format("Facing: %s (%s) (%.1f / %.1f)", -> CHANGE 5 : 6 @ 5 : 6 +> INSERT 3 : 6 @ 3 + ++ if (DynamicLightsStateManager.isDynamicLightsRender()) { ++ arraylist.add(6, DynamicLightsStateManager.getF3String()); ++ } + +> CHANGE 2 : 3 @ 2 : 3 ~ arraylist.add("Biome: " + chunk.getBiome(blockpos, null).biomeName); diff --git a/patches/minecraft/net/minecraft/client/gui/GuiVideoSettings.edit.java b/patches/minecraft/net/minecraft/client/gui/GuiVideoSettings.edit.java index 45758777..18744aa1 100644 --- a/patches/minecraft/net/minecraft/client/gui/GuiVideoSettings.edit.java +++ b/patches/minecraft/net/minecraft/client/gui/GuiVideoSettings.edit.java @@ -21,10 +21,10 @@ ~ GameSettings.Options.VIEW_BOBBING, GameSettings.Options.GUI_SCALE, GameSettings.Options.GAMMA, ~ GameSettings.Options.RENDER_CLOUDS, GameSettings.Options.PARTICLES, GameSettings.Options.FXAA, ~ GameSettings.Options.MIPMAP_LEVELS, GameSettings.Options.BLOCK_ALTERNATIVES, -~ GameSettings.Options.ENTITY_SHADOWS, GameSettings.Options.FOG, GameSettings.Options.FULLSCREEN, -~ GameSettings.Options.FNAW_SKINS, GameSettings.Options.HUD_FPS, GameSettings.Options.HUD_COORDS, -~ GameSettings.Options.HUD_PLAYER, GameSettings.Options.HUD_STATS, GameSettings.Options.HUD_WORLD, -~ GameSettings.Options.HUD_24H, GameSettings.Options.CHUNK_FIX }; +~ GameSettings.Options.ENTITY_SHADOWS, GameSettings.Options.FOG, GameSettings.Options.EAGLER_DYNAMIC_LIGHTS, +~ GameSettings.Options.FULLSCREEN, GameSettings.Options.FNAW_SKINS, GameSettings.Options.HUD_FPS, +~ GameSettings.Options.HUD_COORDS, GameSettings.Options.HUD_PLAYER, GameSettings.Options.HUD_STATS, +~ GameSettings.Options.HUD_WORLD, GameSettings.Options.HUD_24H, GameSettings.Options.CHUNK_FIX }; > CHANGE 11 : 13 @ 11 : 31 diff --git a/patches/minecraft/net/minecraft/client/particle/EntityFX.edit.java b/patches/minecraft/net/minecraft/client/particle/EntityFX.edit.java index 79b62995..dfc213ef 100644 --- a/patches/minecraft/net/minecraft/client/particle/EntityFX.edit.java +++ b/patches/minecraft/net/minecraft/client/particle/EntityFX.edit.java @@ -36,4 +36,11 @@ ~ public void setParticleIcon(EaglerTextureAtlasSprite icon) { +> INSERT 30 : 34 @ 30 + ++ ++ protected float getEaglerDynamicLightsValueSimple(float partialTicks) { ++ return 0.0f; ++ } + > EOF diff --git a/patches/minecraft/net/minecraft/client/renderer/BlockFluidRenderer.edit.java b/patches/minecraft/net/minecraft/client/renderer/BlockFluidRenderer.edit.java index fa604c31..2d31d355 100644 --- a/patches/minecraft/net/minecraft/client/renderer/BlockFluidRenderer.edit.java +++ b/patches/minecraft/net/minecraft/client/renderer/BlockFluidRenderer.edit.java @@ -5,12 +5,13 @@ # Version: 1.0 # Author: lax1dude -> INSERT 2 : 7 @ 2 +> INSERT 2 : 8 @ 2 + import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite; + import net.lax1dude.eaglercraft.v1_8.opengl.WorldRenderer; + import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.BlockVertexIDs; + import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.DeferredStateManager; ++ import net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights.DynamicLightsStateManager; + import net.minecraft.block.Block; > DELETE 4 @ 4 : 6 @@ -20,10 +21,11 @@ ~ private EaglerTextureAtlasSprite[] atlasSpritesLava = new EaglerTextureAtlasSprite[2]; ~ private EaglerTextureAtlasSprite[] atlasSpritesWater = new EaglerTextureAtlasSprite[2]; -> INSERT 15 : 17 @ 15 +> INSERT 15 : 18 @ 15 + BlockPos tmp = new BlockPos(0, 0, 0); + boolean deferred = DeferredStateManager.isDeferredRenderer(); ++ boolean isDynamicLights = deferred || DynamicLightsStateManager.isDynamicLightsRender(); > INSERT 1 : 3 @ 1 @@ -78,7 +80,7 @@ > CHANGE 31 : 36 @ 31 : 32 -~ if (deferred) +~ if (isDynamicLights) ~ worldRendererIn.genNormals(true, f12 <= -999.0F ? BlockVertexIDs.builtin_water_still_vertex_id ~ : BlockVertexIDs.builtin_water_flow_vertex_id); ~ @@ -86,7 +88,7 @@ > INSERT 8 : 11 @ 8 -+ if (deferred) ++ if (isDynamicLights) + worldRendererIn.genNormals(true, f12 <= -999.0F ? BlockVertexIDs.builtin_water_still_vertex_id + : BlockVertexIDs.builtin_water_flow_vertex_id); @@ -100,7 +102,7 @@ > INSERT 10 : 12 @ 10 -+ if (deferred) ++ if (isDynamicLights) + worldRendererIn.putNormal(0.0f, -1.0f, 0.0f, BlockVertexIDs.builtin_water_still_vertex_id); > CHANGE 23 : 24 @ 23 : 24 @@ -119,7 +121,7 @@ > CHANGE 15 : 29 @ 15 : 23 -~ if (deferred) +~ if (isDynamicLights) ~ worldRendererIn.putNormal(j1, 0.0f, k1, BlockVertexIDs.builtin_water_flow_vertex_id); ~ if (!realistic) { ~ worldRendererIn.pos(d3, d1 + 0.0D, d4).color(f32, f33, f34, 1.0F) @@ -130,7 +132,7 @@ ~ .tex((double) f27, (double) f29).lightmap(k, l).endVertex(); ~ worldRendererIn.pos(d3, d1 + (double) f39, d4).color(f32, f33, f34, 1.0F) ~ .tex((double) f41, (double) f28).lightmap(k, l).endVertex(); -~ if (deferred) +~ if (isDynamicLights) ~ worldRendererIn.putNormal(-j1, 0.0f, -k1, BlockVertexIDs.builtin_water_flow_vertex_id); ~ } diff --git a/patches/minecraft/net/minecraft/client/renderer/BlockModelRenderer.edit.java b/patches/minecraft/net/minecraft/client/renderer/BlockModelRenderer.edit.java index c51f2e55..ba34f71b 100644 --- a/patches/minecraft/net/minecraft/client/renderer/BlockModelRenderer.edit.java +++ b/patches/minecraft/net/minecraft/client/renderer/BlockModelRenderer.edit.java @@ -5,13 +5,14 @@ # Version: 1.0 # Author: lax1dude -> INSERT 4 : 9 @ 4 +> INSERT 4 : 10 @ 4 + + import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager; + import net.lax1dude.eaglercraft.v1_8.opengl.WorldRenderer; + import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.DeferredStateManager; + import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.VertexMarkerState; ++ import net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights.DynamicLightsStateManager; > DELETE 3 @ 3 : 7 @@ -52,20 +53,22 @@ ~ worldRendererIn, list1, bitset, afloat); -> INSERT 9 : 10 @ 9 +> INSERT 9 : 11 @ 9 + boolean isDeferred = DeferredStateManager.isDeferredRenderer(); ++ boolean isDynamicLights = isDeferred || DynamicLightsStateManager.isDynamicLightsRender(); > CHANGE 8 : 9 @ 8 : 9 ~ if (!isDeferred && block$enumoffsettype == Block.EnumOffsetType.XYZ) { -> CHANGE 4 : 8 @ 4 : 6 +> CHANGE 4 : 9 @ 4 : 6 ~ for (int i = 0, l = listQuadsIn.size(); i < l; ++i) { ~ BakedQuad bakedquad = listQuadsIn.get(i); -~ int[] vertData = isDeferred ? bakedquad.getVertexDataWithNormals() : bakedquad.getVertexData(); -~ this.fillQuadBounds(blockIn, vertData, bakedquad.getFace(), quadBounds, boundsFlags, isDeferred ? 8 : 7); +~ int[] vertData = isDynamicLights ? bakedquad.getVertexDataWithNormals() : bakedquad.getVertexData(); +~ this.fillQuadBounds(blockIn, vertData, bakedquad.getFace(), quadBounds, boundsFlags, +~ isDynamicLights ? 8 : 7); > CHANGE 2 : 3 @ 2 : 3 @@ -101,10 +104,11 @@ + private final BlockPos blockpos5 = new BlockPos(0, 0, 0); + -> CHANGE 2 : 4 @ 2 : 3 +> CHANGE 2 : 5 @ 2 : 3 ~ List listQuadsIn, BitSet boundsFlags, float[] quadBounds) { ~ boolean isDeferred = DeferredStateManager.isDeferredRenderer(); +~ boolean isDynamicLights = isDeferred || DynamicLightsStateManager.isDynamicLightsRender(); > CHANGE 11 : 12 @ 11 : 12 @@ -115,9 +119,9 @@ ~ for (int m = 0, n = listQuadsIn.size(); m < n; ++m) { ~ BakedQuad bakedquad = listQuadsIn.get(m); ~ EnumFacing facingIn = bakedquad.getFace(); -~ int[] vertData = isDeferred ? bakedquad.getVertexDataWithNormals() : bakedquad.getVertexData(); +~ int[] vertData = isDynamicLights ? bakedquad.getVertexDataWithNormals() : bakedquad.getVertexData(); ~ blockPosIn.offsetEvenFaster(facingIn, blockpos0); -~ this.fillQuadBounds(blockIn, vertData, facingIn, quadBounds, boundsFlags, isDeferred ? 8 : 7); +~ this.fillQuadBounds(blockIn, vertData, facingIn, quadBounds, boundsFlags, isDynamicLights ? 8 : 7); ~ boolean boundsFlags0 = boundsFlags.get(0); > CHANGE 1 : 2 @ 1 : 5 diff --git a/patches/minecraft/net/minecraft/client/renderer/ChunkRenderContainer.edit.java b/patches/minecraft/net/minecraft/client/renderer/ChunkRenderContainer.edit.java index 49100d5d..f4b0620a 100644 --- a/patches/minecraft/net/minecraft/client/renderer/ChunkRenderContainer.edit.java +++ b/patches/minecraft/net/minecraft/client/renderer/ChunkRenderContainer.edit.java @@ -7,13 +7,14 @@ > DELETE 2 @ 2 : 3 -> CHANGE 1 : 6 @ 1 : 2 +> CHANGE 1 : 7 @ 1 : 2 ~ ~ import com.google.common.collect.Lists; ~ ~ import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager; ~ import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.DeferredStateManager; +~ import net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights.DynamicLightsStateManager; > INSERT 3 : 4 @ 3 @@ -23,17 +24,22 @@ ~ public void preRenderChunk(RenderChunk renderChunkIn, EnumWorldBlockLayer enumworldblocklayer) { -> CHANGE 1 : 11 @ 1 : 4 +> CHANGE 1 : 16 @ 1 : 4 ~ float posX = (float) ((double) blockpos.getX() - this.viewEntityX); ~ float posY = (float) ((double) blockpos.getY() - this.viewEntityY); ~ float posZ = (float) ((double) blockpos.getZ() - this.viewEntityZ); ~ GlStateManager.translate(posX, posY, posZ); ~ if (DeferredStateManager.isInForwardPass()) { -~ posX = (float) (blockpos.getX() - (MathHelper.floor_double(this.viewEntityX / 16.0) << 4)); // TODO +~ posX = (float) (blockpos.getX() - (MathHelper.floor_double(this.viewEntityX / 16.0) << 4)); ~ posY = (float) (blockpos.getY() - (MathHelper.floor_double(this.viewEntityY / 16.0) << 4)); ~ posZ = (float) (blockpos.getZ() - (MathHelper.floor_double(this.viewEntityZ / 16.0) << 4)); ~ DeferredStateManager.reportForwardRenderObjectPosition((int) posX, (int) posY, (int) posZ); +~ } else if (DynamicLightsStateManager.isInDynamicLightsPass()) { +~ posX = (float) (blockpos.getX() - (MathHelper.floor_double(this.viewEntityX / 16.0) << 4)); +~ posY = (float) (blockpos.getY() - (MathHelper.floor_double(this.viewEntityY / 16.0) << 4)); +~ posZ = (float) (blockpos.getZ() - (MathHelper.floor_double(this.viewEntityZ / 16.0) << 4)); +~ DynamicLightsStateManager.reportForwardRenderObjectPosition((int) posX, (int) posY, (int) posZ); ~ } > EOF diff --git a/patches/minecraft/net/minecraft/client/renderer/EntityRenderer.edit.java b/patches/minecraft/net/minecraft/client/renderer/EntityRenderer.edit.java index 6fdaeda0..309af9a3 100644 --- a/patches/minecraft/net/minecraft/client/renderer/EntityRenderer.edit.java +++ b/patches/minecraft/net/minecraft/client/renderer/EntityRenderer.edit.java @@ -16,7 +16,7 @@ ~ import net.lax1dude.eaglercraft.v1_8.EaglercraftRandom; ~ import net.lax1dude.eaglercraft.v1_8.HString; -> INSERT 1 : 28 @ 1 +> INSERT 1 : 29 @ 1 + + import com.google.common.base.Predicate; @@ -42,6 +42,7 @@ + import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.ShadersRenderPassFuture; + import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.gui.GuiShaderConfig; + import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.texture.EmissiveItems; ++ import net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights.DynamicLightsStateManager; + import net.lax1dude.eaglercraft.v1_8.vector.Vector4f; + import net.lax1dude.eaglercraft.v1_8.voice.VoiceTagRenderer; + import net.lax1dude.eaglercraft.v1_8.vector.Matrix4f; @@ -151,7 +152,13 @@ ~ (float) this.mc.displayWidth / (float) this.mc.displayHeight, 0.05F, farPlane); ~ DeferredStateManager.setGBufferNearFarPlanes(0.05f, farPlane); -> CHANGE 57 : 58 @ 57 : 58 +> INSERT 50 : 53 @ 50 + ++ if (DynamicLightsStateManager.isInDynamicLightsPass()) { ++ DynamicLightsStateManager.reportForwardRenderObjectPosition2(0.0f, 0.0f, 0.0f); ++ } + +> CHANGE 7 : 8 @ 7 : 8 ~ GlStateManager.gluPerspective(this.getFOVModifier(partialTicks, false), @@ -176,12 +183,13 @@ ~ this.lightmapColors[i] = short1 << 24 | j | k << 8 | l << 16; -> INSERT 3 : 17 @ 3 +> INSERT 3 : 18 @ 3 + + GlStateManager.setActiveTexture(OpenGlHelper.lightmapTexUnit); + this.mc.getTextureManager().bindTexture(this.locationLightMap); -+ if (mc.gameSettings.fancyGraphics || mc.gameSettings.ambientOcclusion > 0) { ++ if (mc.gameSettings.fancyGraphics || mc.gameSettings.ambientOcclusion > 0 ++ || DynamicLightsStateManager.isDynamicLightsRender()) { + EaglercraftGPU.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + EaglercraftGPU.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } else { @@ -283,11 +291,31 @@ + VoiceTagRenderer.clearTagsDrawnSet(); + -> CHANGE 4 : 5 @ 4 : 5 +> CHANGE 4 : 25 @ 4 : 12 +~ boolean dlights = DynamicLightsStateManager.isDynamicLightsRender(); +~ if (dlights) { +~ updateDynamicLightListEagler(partialTicks); +~ } ~ if (this.mc.gameSettings.anaglyph && !this.mc.gameSettings.shaders) { +~ if (dlights) { +~ GlStateManager.enableExtensionPipeline(); +~ } +~ try { +~ anaglyphField = 0; +~ GlStateManager.colorMask(false, true, true, false); +~ this.renderWorldPass(0, partialTicks, finishTimeNano); +~ anaglyphField = 1; +~ GlStateManager.colorMask(true, false, false, false); +~ this.renderWorldPass(1, partialTicks, finishTimeNano); +~ GlStateManager.colorMask(true, true, true, false); +~ } finally { +~ if (dlights) { +~ GlStateManager.disableExtensionPipeline(); +~ } +~ } -> CHANGE 8 : 24 @ 8 : 9 +> CHANGE 1 : 26 @ 1 : 2 ~ if (this.mc.gameSettings.shaders) { ~ try { @@ -303,7 +331,16 @@ ~ mc.effectRenderer.acceleratedParticleRenderer = EffectRenderer.vanillaAcceleratedParticleRenderer; ~ } else { ~ mc.effectRenderer.acceleratedParticleRenderer = EffectRenderer.vanillaAcceleratedParticleRenderer; -~ this.renderWorldPass(2, partialTicks, finishTimeNano); +~ if (dlights) { +~ GlStateManager.enableExtensionPipeline(); +~ } +~ try { +~ this.renderWorldPass(2, partialTicks, finishTimeNano); +~ } finally { +~ if (dlights) { +~ GlStateManager.disableExtensionPipeline(); +~ } +~ } ~ } > INSERT 2 : 6 @ 2 @@ -313,9 +350,22 @@ + } + -> DELETE 15 @ 15 : 17 +> INSERT 14 : 18 @ 14 -> CHANGE 12 : 15 @ 12 : 14 ++ boolean isDynamicLights = DynamicLightsStateManager.isDynamicLightsRender(); ++ if (isDynamicLights) { ++ DynamicLightsStateManager.setupInverseViewMatrix(); ++ } + +> DELETE 1 @ 1 : 3 + +> INSERT 6 : 9 @ 6 + ++ TileEntityRendererDispatcher.staticPlayerX = d0; // hack, needed for some eagler stuff ++ TileEntityRendererDispatcher.staticPlayerY = d1; ++ TileEntityRendererDispatcher.staticPlayerZ = d2; + +> CHANGE 6 : 9 @ 6 : 8 ~ float vigg = this.getFOVModifier(partialTicks, true); ~ GlStateManager.gluPerspective(vigg, (float) this.mc.displayWidth / (float) this.mc.displayHeight, 0.05F, @@ -335,11 +385,59 @@ + GlStateManager.shadeModel(7424); -> CHANGE 46 : 47 @ 46 : 47 +> INSERT 16 : 19 @ 16 ++ if (isDynamicLights) { ++ GlStateManager.disableExtensionPipeline(); ++ } + +> INSERT 2 : 5 @ 2 + ++ if (isDynamicLights) { ++ GlStateManager.enableExtensionPipeline(); ++ } + +> INSERT 8 : 11 @ 8 + ++ if (isDynamicLights) { ++ GlStateManager.disableExtensionPipeline(); ++ } + +> INSERT 3 : 6 @ 3 + ++ if (isDynamicLights) { ++ GlStateManager.enableExtensionPipeline(); ++ } + +> CHANGE 17 : 25 @ 17 : 18 + +~ if (isDynamicLights) { +~ DynamicLightsStateManager.bindAcceleratedEffectRenderer(effectrenderer); +~ DynamicLightsStateManager.reportForwardRenderObjectPosition2(0.0f, 0.0f, 0.0f); +~ } ~ effectrenderer.renderParticles(entity, partialTicks, 2); +~ if (isDynamicLights) { +~ effectrenderer.acceleratedParticleRenderer = null; +~ } -> CHANGE 44 : 45 @ 44 : 45 +> INSERT 39 : 53 @ 39 + ++ private void updateDynamicLightListEagler(float partialTicks) { ++ DynamicLightsStateManager.clearRenderList(); ++ Entity entity = this.mc.getRenderViewEntity(); ++ double d0 = entity.lastTickPosX + (entity.posX - entity.lastTickPosX) * (double) partialTicks; ++ double d1 = entity.lastTickPosY + (entity.posY - entity.lastTickPosY) * (double) partialTicks; ++ double d2 = entity.lastTickPosZ + (entity.posZ - entity.lastTickPosZ) * (double) partialTicks; ++ AxisAlignedBB entityAABB = new AxisAlignedBB(d0 - 48.0, d1 - 32.0, d2 - 48.0, d0 + 48.0, d1 + 32.0, d2 + 48.0); ++ List entities = this.mc.theWorld.getEntitiesWithinAABB(Entity.class, entityAABB); ++ for (int i = 0, l = entities.size(); i < l; ++i) { ++ entities.get(i).renderDynamicLightsEaglerSimple(partialTicks); ++ } ++ DynamicLightsStateManager.commitLightSourceBuckets(d0, d1, d2); ++ } ++ + +> CHANGE 5 : 6 @ 5 : 6 ~ GlStateManager.gluPerspective(this.getFOVModifier(partialTicks, true), @@ -359,12 +457,15 @@ + boolean df = DeferredStateManager.isInDeferredPass(); -> CHANGE 9 : 25 @ 9 : 13 +> CHANGE 9 : 28 @ 9 : 13 ~ if (!df) { ~ GlStateManager.enableBlend(); ~ GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0); ~ GlStateManager.alphaFunc(516, 0.1F); +~ if (DynamicLightsStateManager.isInDynamicLightsPass()) { +~ DynamicLightsStateManager.reportForwardRenderObjectPosition2(0.0f, 0.0f, 0.0f); +~ } ~ } else { ~ GlStateManager.enableAlpha(); ~ DeferredStateManager.setHDRTranslucentPassBlendFunc(); diff --git a/patches/minecraft/net/minecraft/client/renderer/RenderGlobal.edit.java b/patches/minecraft/net/minecraft/client/renderer/RenderGlobal.edit.java index 128721b7..7fc3db90 100644 --- a/patches/minecraft/net/minecraft/client/renderer/RenderGlobal.edit.java +++ b/patches/minecraft/net/minecraft/client/renderer/RenderGlobal.edit.java @@ -14,7 +14,7 @@ ~ import net.lax1dude.eaglercraft.v1_8.Keyboard; ~ -> INSERT 2 : 22 @ 2 +> INSERT 2 : 23 @ 2 + + import com.google.common.collect.Lists; @@ -34,6 +34,7 @@ + import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.EaglerDeferredConfig; + import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.EaglerDeferredPipeline; + import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.program.SharedPipelineShaders; ++ import net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights.DynamicLightsStateManager; + import net.lax1dude.eaglercraft.v1_8.vector.Vector3f; + import net.lax1dude.eaglercraft.v1_8.vector.Vector4f; @@ -142,7 +143,7 @@ + this.renderDistanceChunks = this.mc.gameSettings.renderDistanceChunks; + -> INSERT 19 : 75 @ 19 +> INSERT 19 : 85 @ 19 + + if (mc.gameSettings.shaders) { @@ -200,6 +201,16 @@ + } + SharedPipelineShaders.free(); + } ++ ++ if (DeferredStateManager.isDeferredRenderer()) { ++ DynamicLightsStateManager.disableDynamicLightsRender(false); ++ } else { ++ if (mc.gameSettings.enableDynamicLights) { ++ DynamicLightsStateManager.enableDynamicLightsRender(); ++ } else { ++ DynamicLightsStateManager.disableDynamicLightsRender(true); ++ } ++ } > DELETE 9 @ 9 : 13 @@ -600,16 +611,25 @@ > DELETE 17 @ 17 : 18 -> CHANGE 155 : 157 @ 155 : 156 +> CHANGE 155 : 159 @ 155 : 156 -~ worldRendererIn.begin(7, DeferredStateManager.isDeferredRenderer() ? VertexFormat.BLOCK_SHADERS -~ : DefaultVertexFormats.BLOCK); +~ worldRendererIn.begin(7, +~ (DeferredStateManager.isDeferredRenderer() || DynamicLightsStateManager.isDynamicLightsRender()) +~ ? VertexFormat.BLOCK_SHADERS +~ : DefaultVertexFormats.BLOCK); > CHANGE 19 : 20 @ 19 : 20 ~ EaglerTextureAtlasSprite textureatlassprite = this.destroyBlockIcons[i]; -> CHANGE 17 : 19 @ 17 : 18 +> INSERT 1 : 5 @ 1 + ++ if (DynamicLightsStateManager.isInDynamicLightsPass()) { ++ DynamicLightsStateManager.reportForwardRenderObjectPosition2(blockpos.x, blockpos.y, ++ blockpos.z); ++ } + +> CHANGE 16 : 18 @ 16 : 17 ~ if (partialTicks == 0 && movingObjectPositionIn != null ~ && movingObjectPositionIn.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { diff --git a/patches/minecraft/net/minecraft/client/renderer/block/model/FaceBakery.edit.java b/patches/minecraft/net/minecraft/client/renderer/block/model/FaceBakery.edit.java index 888bd906..0f4527ad 100644 --- a/patches/minecraft/net/minecraft/client/renderer/block/model/FaceBakery.edit.java +++ b/patches/minecraft/net/minecraft/client/renderer/block/model/FaceBakery.edit.java @@ -5,13 +5,14 @@ # Version: 1.0 # Author: lax1dude -> INSERT 2 : 7 @ 2 +> INSERT 2 : 8 @ 2 + import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerTextureAtlasSprite; + import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.VertexMarkerState; + import net.lax1dude.eaglercraft.v1_8.vector.Matrix4f; + import net.lax1dude.eaglercraft.v1_8.vector.Vector3f; + import net.lax1dude.eaglercraft.v1_8.vector.Vector4f; ++ import net.minecraft.client.Minecraft; > DELETE 1 @ 1 : 6 @@ -70,9 +71,11 @@ ~ float[] sprite, EaglerTextureAtlasSprite modelRotationIn, ModelRotation partRotation, ~ BlockPartRotation uvLocked, boolean shade, boolean parFlag2, Vector3f calcNormal) { -> CHANGE 1 : 2 @ 1 : 2 +> CHANGE 1 : 4 @ 1 : 2 -~ int i = (parFlag2 && stride != 8) ? this.getFaceShadeColor(enumfacing) : -1; +~ int i = (parFlag2 && (stride != 8 || !Minecraft.getMinecraft().gameSettings.shaders)) +~ ? this.getFaceShadeColor(enumfacing) +~ : -1; > CHANGE 7 : 9 @ 7 : 8 @@ -84,12 +87,18 @@ ~ EaglerTextureAtlasSprite sprite, BlockFaceUV faceUV, EnumFacing facing, Vector3f calcNormal) { ~ int i = storeIndex * stride; -> INSERT 4 : 27 @ 4 +> INSERT 4 : 33 @ 4 + if (stride == 8) { -+ faceData[i] = Float.floatToRawIntBits(position.x * VertexMarkerState.localCoordDeriveHackX); -+ faceData[i + 1] = Float.floatToRawIntBits(position.y * VertexMarkerState.localCoordDeriveHackY); -+ faceData[i + 2] = Float.floatToRawIntBits(position.z * VertexMarkerState.localCoordDeriveHackZ); ++ if (!Minecraft.getMinecraft().gameSettings.shaders) { ++ faceData[i] = Float.floatToRawIntBits(position.x); ++ faceData[i + 1] = Float.floatToRawIntBits(position.y); ++ faceData[i + 2] = Float.floatToRawIntBits(position.z); ++ } else { ++ faceData[i] = Float.floatToRawIntBits(position.x * VertexMarkerState.localCoordDeriveHackX); ++ faceData[i + 1] = Float.floatToRawIntBits(position.y * VertexMarkerState.localCoordDeriveHackY); ++ faceData[i + 2] = Float.floatToRawIntBits(position.z * VertexMarkerState.localCoordDeriveHackZ); ++ } + if (calcNormal != null) { + int x = (byte) ((int) (calcNormal.x * 127.0F)) & 255; + int y = (byte) ((int) (calcNormal.y * 127.0F)) & 255; diff --git a/patches/minecraft/net/minecraft/client/renderer/chunk/RenderChunk.edit.java b/patches/minecraft/net/minecraft/client/renderer/chunk/RenderChunk.edit.java index 44bb643a..c7331691 100644 --- a/patches/minecraft/net/minecraft/client/renderer/chunk/RenderChunk.edit.java +++ b/patches/minecraft/net/minecraft/client/renderer/chunk/RenderChunk.edit.java @@ -7,7 +7,7 @@ > DELETE 2 @ 2 : 5 -> CHANGE 3 : 11 @ 3 : 4 +> CHANGE 3 : 12 @ 3 : 4 ~ ~ import com.google.common.collect.Maps; @@ -17,6 +17,7 @@ ~ import net.lax1dude.eaglercraft.v1_8.opengl.VertexFormat; ~ import net.lax1dude.eaglercraft.v1_8.opengl.WorldRenderer; ~ import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.DeferredStateManager; +~ import net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights.DynamicLightsStateManager; > DELETE 4 @ 4 : 7 @@ -152,10 +153,12 @@ ~ this.compileTask.setCompiledChunk(this.compiledChunk); ~ return this.compileTask; -> CHANGE 3 : 5 @ 3 : 4 +> CHANGE 3 : 7 @ 3 : 4 ~ worldRendererIn.begin(7, -~ DeferredStateManager.isDeferredRenderer() ? VertexFormat.BLOCK_SHADERS : DefaultVertexFormats.BLOCK); +~ (DeferredStateManager.isDeferredRenderer() || DynamicLightsStateManager.isDynamicLightsRender()) +~ ? VertexFormat.BLOCK_SHADERS +~ : DefaultVertexFormats.BLOCK); > CHANGE 5 : 7 @ 5 : 6 diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/RenderFallingBlock.edit.java b/patches/minecraft/net/minecraft/client/renderer/entity/RenderFallingBlock.edit.java index 0cc3b81b..4ed39bee 100644 --- a/patches/minecraft/net/minecraft/client/renderer/entity/RenderFallingBlock.edit.java +++ b/patches/minecraft/net/minecraft/client/renderer/entity/RenderFallingBlock.edit.java @@ -5,20 +5,23 @@ # Version: 1.0 # Author: lax1dude -> INSERT 2 : 6 @ 2 +> INSERT 2 : 7 @ 2 + import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager; + import net.lax1dude.eaglercraft.v1_8.opengl.VertexFormat; + import net.lax1dude.eaglercraft.v1_8.opengl.WorldRenderer; + import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.DeferredStateManager; ++ import net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights.DynamicLightsStateManager; > DELETE 4 @ 4 : 5 > DELETE 1 @ 1 : 4 -> CHANGE 28 : 30 @ 28 : 29 +> CHANGE 28 : 32 @ 28 : 29 -~ worldrenderer.begin(7, DeferredStateManager.isDeferredRenderer() ? VertexFormat.BLOCK_SHADERS -~ : DefaultVertexFormats.BLOCK); +~ worldrenderer.begin(7, +~ (DeferredStateManager.isDeferredRenderer() +~ || DynamicLightsStateManager.isDynamicLightsRender()) ? VertexFormat.BLOCK_SHADERS +~ : DefaultVertexFormats.BLOCK); > EOF diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/RenderManager.edit.java b/patches/minecraft/net/minecraft/client/renderer/entity/RenderManager.edit.java index c59f9a20..15423288 100644 --- a/patches/minecraft/net/minecraft/client/renderer/entity/RenderManager.edit.java +++ b/patches/minecraft/net/minecraft/client/renderer/entity/RenderManager.edit.java @@ -7,7 +7,7 @@ > DELETE 2 @ 2 : 3 -> INSERT 1 : 10 @ 1 +> INSERT 1 : 11 @ 1 + + import com.google.common.collect.Maps; @@ -17,6 +17,7 @@ + import net.lax1dude.eaglercraft.v1_8.opengl.OpenGlHelper; + import net.lax1dude.eaglercraft.v1_8.opengl.WorldRenderer; + import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.DeferredStateManager; ++ import net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights.DynamicLightsStateManager; + import net.lax1dude.eaglercraft.v1_8.profile.RenderHighPoly; > INSERT 3 : 4 @ 3 @@ -61,7 +62,14 @@ ~ public Render getEntityRenderObject(Entity entityIn) { -> INSERT 85 : 86 @ 85 +> INSERT 82 : 86 @ 82 + ++ if (DynamicLightsStateManager.isInDynamicLightsPass()) { ++ DynamicLightsStateManager.reportForwardRenderObjectPosition2((float) (d0 - viewerPosX), ++ (float) (d1 - viewerPosY), (float) (d2 - viewerPosZ)); ++ } + +> INSERT 3 : 4 @ 3 + DeferredStateManager.setEmissionConstant(1.0f); diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/layers/LayerSpiderEyes.edit.java b/patches/minecraft/net/minecraft/client/renderer/entity/layers/LayerSpiderEyes.edit.java index 64a370fa..0abe69ef 100644 --- a/patches/minecraft/net/minecraft/client/renderer/entity/layers/LayerSpiderEyes.edit.java +++ b/patches/minecraft/net/minecraft/client/renderer/entity/layers/LayerSpiderEyes.edit.java @@ -67,4 +67,13 @@ + return; + } +> INSERT 3 : 5 @ 3 + ++ GlStateManager.enablePolygonOffset(); ++ GlStateManager.doPolygonOffset(-0.025f, 1.0f); + +> INSERT 20 : 21 @ 20 + ++ GlStateManager.disablePolygonOffset(); + > EOF diff --git a/patches/minecraft/net/minecraft/client/renderer/tileentity/TileEntityRendererDispatcher.edit.java b/patches/minecraft/net/minecraft/client/renderer/tileentity/TileEntityRendererDispatcher.edit.java index 0814ccf0..1fc12ec7 100644 --- a/patches/minecraft/net/minecraft/client/renderer/tileentity/TileEntityRendererDispatcher.edit.java +++ b/patches/minecraft/net/minecraft/client/renderer/tileentity/TileEntityRendererDispatcher.edit.java @@ -7,13 +7,14 @@ > DELETE 2 @ 2 : 3 -> INSERT 1 : 6 @ 1 +> INSERT 1 : 7 @ 1 + + import com.google.common.collect.Maps; + + import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager; + import net.lax1dude.eaglercraft.v1_8.opengl.OpenGlHelper; ++ import net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights.DynamicLightsStateManager; > DELETE 1 @ 1 : 3 @@ -24,4 +25,10 @@ ~ tileentityspecialrenderer = this ~ .getSpecialRendererByClass((Class) teClass.getSuperclass()); +> INSERT 52 : 55 @ 52 + ++ if (DynamicLightsStateManager.isInDynamicLightsPass()) { ++ DynamicLightsStateManager.reportForwardRenderObjectPosition2((float) x, (float) y, (float) z); ++ } + > EOF diff --git a/patches/minecraft/net/minecraft/client/settings/GameSettings.edit.java b/patches/minecraft/net/minecraft/client/settings/GameSettings.edit.java index 0c9ab50f..c2b73915 100644 --- a/patches/minecraft/net/minecraft/client/settings/GameSettings.edit.java +++ b/patches/minecraft/net/minecraft/client/settings/GameSettings.edit.java @@ -91,7 +91,7 @@ ~ public int guiScale = 3; -> INSERT 3 : 17 @ 3 +> INSERT 3 : 18 @ 3 + public boolean hudFps = true; + public boolean hudCoords = true; @@ -107,6 +107,7 @@ + public EaglerDeferredConfig deferredShaderConf = new EaglerDeferredConfig(); + public boolean enableUpdateSvc = true; + public boolean enableFNAWSkins = true; ++ public boolean enableDynamicLights = false; > CHANGE 1 : 7 @ 1 : 2 @@ -157,7 +158,7 @@ > DELETE 20 @ 20 : 37 -> INSERT 13 : 62 @ 13 +> INSERT 13 : 67 @ 13 + if (parOptions == GameSettings.Options.HUD_FPS) { + this.hudFps = !this.hudFps; @@ -208,6 +209,11 @@ + this.enableVsync = !this.enableVsync; + } + ++ if (parOptions == GameSettings.Options.EAGLER_DYNAMIC_LIGHTS) { ++ this.enableDynamicLights = !this.enableDynamicLights; ++ this.mc.renderGlobal.loadRenderers(); ++ } ++ > CHANGE 23 : 24 @ 23 : 34 @@ -217,7 +223,7 @@ > DELETE 2 @ 2 : 4 -> INSERT 8 : 30 @ 8 +> INSERT 8 : 32 @ 8 + case HUD_COORDS: + return this.hudCoords; @@ -241,6 +247,8 @@ + return this.enableFNAWSkins; + case EAGLER_VSYNC: + return this.enableVsync; ++ case EAGLER_DYNAMIC_LIGHTS: ++ return this.enableDynamicLights; > CHANGE 43 : 46 @ 43 : 47 @@ -451,13 +459,17 @@ ~ for (EnumPlayerModelParts enumplayermodelparts : EnumPlayerModelParts._VALUES) { -> INSERT 4 : 10 @ 4 +> INSERT 4 : 14 @ 4 + + if (astring[0].equals("enableFNAWSkins")) { + this.enableFNAWSkins = astring[1].equals("true"); + } + ++ if (astring[0].equals("enableDynamicLights")) { ++ this.enableDynamicLights = astring[1].equals("true"); ++ } ++ + deferredShaderConf.readOption(astring[0], astring[1]); > CHANGE 6 : 13 @ 6 : 7 @@ -509,7 +521,7 @@ > DELETE 13 @ 13 : 24 -> INSERT 5 : 21 @ 5 +> INSERT 5 : 22 @ 5 + printwriter.println("hudFps:" + this.hudFps); + printwriter.println("hudWorld:" + this.hudWorld); @@ -527,6 +539,7 @@ + printwriter.println("voiceSpeakVolume:" + this.voiceSpeakVolume); + printwriter.println("voicePTTKey:" + this.voicePTTKey); + printwriter.println("enableFNAWSkins:" + this.enableFNAWSkins); ++ printwriter.println("enableDynamicLights:" + this.enableDynamicLights); > CHANGE 5 : 8 @ 5 : 6 @@ -576,7 +589,7 @@ > CHANGE 4 : 5 @ 4 : 5 -~ RENDER_DISTANCE("options.renderDistance", true, false, 1.0F, 16.0F, 1.0F), +~ RENDER_DISTANCE("options.renderDistance", true, false, 1.0F, 18.0F, 1.0F), > CHANGE 8 : 10 @ 8 : 12 @@ -592,6 +605,6 @@ ~ FOG("options.fog", false, true), FXAA("options.fxaa", false, false), ~ FULLSCREEN("options.fullscreen", false, true), ~ FNAW_SKINS("options.skinCustomisation.enableFNAWSkins", false, true), -~ EAGLER_VSYNC("options.vsync", false, true); +~ EAGLER_VSYNC("options.vsync", false, true), EAGLER_DYNAMIC_LIGHTS("options.dynamicLights", false, true); > EOF diff --git a/patches/minecraft/net/minecraft/entity/Entity.edit.java b/patches/minecraft/net/minecraft/entity/Entity.edit.java index 1c496f47..bcd091bd 100644 --- a/patches/minecraft/net/minecraft/entity/Entity.edit.java +++ b/patches/minecraft/net/minecraft/entity/Entity.edit.java @@ -5,12 +5,13 @@ # Version: 1.0 # Author: lax1dude -> CHANGE 3 : 8 @ 3 : 5 +> CHANGE 3 : 9 @ 3 : 5 ~ import net.lax1dude.eaglercraft.v1_8.EaglercraftRandom; ~ import net.lax1dude.eaglercraft.v1_8.EaglercraftUUID; ~ import net.lax1dude.eaglercraft.v1_8.HString; ~ import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.DynamicLightManager; +~ import net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights.DynamicLightsStateManager; ~ > INSERT 1 : 2 @ 1 @@ -94,7 +95,24 @@ ~ for (int i = 0, l = list.size(); i < l; ++i) { ~ y = list.get(i).calculateYOffset(this.getEntityBoundingBox(), y); -> CHANGE 650 : 652 @ 650 : 651 +> CHANGE 347 : 353 @ 347 : 348 + +~ int i = 0; +~ if (DynamicLightsStateManager.isDynamicLightsRender()) { +~ i += (int) (getEaglerDynamicLightsValueSimple(var1) * 15.0f); +~ } +~ return this.worldObj.isBlockLoaded(blockpos) ? this.worldObj.getCombinedLight(blockpos, -i) +~ : (i > 15 ? 240 : (i << 4)); + +> CHANGE 4 : 9 @ 4 : 5 + +~ float f = this.worldObj.isBlockLoaded(blockpos) ? this.worldObj.getLightBrightness(blockpos) : 0.0F; +~ if (DynamicLightsStateManager.isDynamicLightsRender()) { +~ f = Math.min(f + getEaglerDynamicLightsValueSimple(var1), 1.0f); +~ } +~ return f; + +> CHANGE 297 : 299 @ 297 : 298 ~ this.entityUniqueID = new EaglercraftUUID(tagCompund.getLong("UUIDMost"), ~ tagCompund.getLong("UUIDLeast")); @@ -125,7 +143,7 @@ ~ public EaglercraftUUID getUniqueID() { -> INSERT 151 : 177 @ 151 +> INSERT 151 : 205 @ 151 + + public void renderDynamicLightsEagler(float partialTicks, boolean isInFrustum) { @@ -135,7 +153,8 @@ + double entityX2 = entityX - TileEntityRendererDispatcher.staticPlayerX; + double entityY2 = entityY - TileEntityRendererDispatcher.staticPlayerY; + double entityZ2 = entityZ - TileEntityRendererDispatcher.staticPlayerZ; -+ if (Math.sqrt(entityX2 * entityX2 + entityY2 * entityY2 + entityZ2 * entityZ2) < 48.0 * 48.0) { ++ if (entityX2 * entityX2 + entityY2 * entityY2 ++ + entityZ2 * entityZ2 < (isInFrustum ? (64.0 * 64.0) : (24.0 * 24.0))) { + renderDynamicLightsEaglerAt(entityX, entityY, entityZ, entityX2, entityY2, entityZ2, partialTicks, + isInFrustum); + } @@ -143,15 +162,42 @@ + + protected void renderDynamicLightsEaglerAt(double entityX, double entityY, double entityZ, double renderX, + double renderY, double renderZ, float partialTicks, boolean isInFrustum) { ++ float size = Math.max(width, height); ++ if (size < 1.0f && !isInFrustum) { ++ return; ++ } + if (this.isBurning()) { -+ float size = Math.max(width, height); -+ if (size < 1.0f && !isInFrustum) { -+ return; -+ } + float mag = 5.0f * size; + DynamicLightManager.renderDynamicLight("entity_" + entityId + "_fire", entityX, entityY + height * 0.75, + entityZ, mag, 0.487f * mag, 0.1411f * mag, false); + } + } ++ ++ public void renderDynamicLightsEaglerSimple(float partialTicks) { ++ double entityX = prevPosX + (posX - prevPosX) * (double) partialTicks; ++ double entityY = prevPosY + (posY - prevPosY) * (double) partialTicks; ++ double entityZ = prevPosZ + (posZ - prevPosZ) * (double) partialTicks; ++ renderDynamicLightsEaglerSimpleAt(entityX, entityY, entityZ, partialTicks); ++ } ++ ++ protected void renderDynamicLightsEaglerSimpleAt(double entityX, double entityY, double entityZ, ++ float partialTicks) { ++ float renderBrightness = this.getEaglerDynamicLightsValueSimple(partialTicks); ++ if (renderBrightness > 0.1f) { ++ DynamicLightsStateManager.renderDynamicLight("entity_" + entityId + "_lightmap", entityX, ++ entityY + height * 0.85, entityZ, renderBrightness * 13.0f); ++ } ++ } ++ ++ protected float getEaglerDynamicLightsValueSimple(float partialTicks) { ++ float size = Math.max(width, height); ++ if (size < 1.0f) { ++ return 0.0f; ++ } ++ if (this.isBurning()) { ++ return size / 2.0f; ++ } ++ return 0.0f; ++ } > EOF diff --git a/patches/minecraft/net/minecraft/entity/EntityLivingBase.edit.java b/patches/minecraft/net/minecraft/entity/EntityLivingBase.edit.java index 4bdf5753..a8491ab4 100644 --- a/patches/minecraft/net/minecraft/entity/EntityLivingBase.edit.java +++ b/patches/minecraft/net/minecraft/entity/EntityLivingBase.edit.java @@ -40,7 +40,7 @@ ~ for (int i = 0; i < inv.length; ++i) { ~ ItemStack itemstack1 = inv[i]; -> INSERT 1254 : 1265 @ 1254 +> INSERT 1254 : 1277 @ 1254 + + protected void renderDynamicLightsEaglerAt(double entityX, double entityY, double entityZ, double renderX, @@ -53,5 +53,17 @@ + } + } + ++ protected float getEaglerDynamicLightsValueSimple(float partialTicks) { ++ float f = super.getEaglerDynamicLightsValueSimple(partialTicks); ++ ItemStack itm = this.getHeldItem(); ++ if (itm != null && itm.stackSize > 0) { ++ Item item = itm.getItem(); ++ if (item != null) { ++ float f2 = item.getHeldItemBrightnessEagler(); ++ f = Math.min(f + f2 * 0.5f, 1.0f) + f2 * 0.5f; ++ } ++ } ++ return f; ++ } > EOF diff --git a/patches/minecraft/net/minecraft/entity/boss/EntityWither.edit.java b/patches/minecraft/net/minecraft/entity/boss/EntityWither.edit.java index 4da548ea..8d6e6b95 100644 --- a/patches/minecraft/net/minecraft/entity/boss/EntityWither.edit.java +++ b/patches/minecraft/net/minecraft/entity/boss/EntityWither.edit.java @@ -21,4 +21,11 @@ ~ for (int i = 0, l = lst.size(); i < l; ++i) { ~ lst.get(i).triggerAchievement(AchievementList.killWither); +> INSERT 13 : 17 @ 13 + ++ protected float getEaglerDynamicLightsValueSimple(float partialTicks) { ++ return 1.0f; ++ } ++ + > EOF diff --git a/patches/minecraft/net/minecraft/entity/item/EntityEnderEye.edit.java b/patches/minecraft/net/minecraft/entity/item/EntityEnderEye.edit.java index a8dd6648..4c1585c0 100644 --- a/patches/minecraft/net/minecraft/entity/item/EntityEnderEye.edit.java +++ b/patches/minecraft/net/minecraft/entity/item/EntityEnderEye.edit.java @@ -5,6 +5,28 @@ # Version: 1.0 # Author: lax1dude -> DELETE 3 @ 3 : 4 +> INSERT 2 : 3 @ 2 + ++ import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.DynamicLightManager; + +> DELETE 1 @ 1 : 2 + +> INSERT 168 : 183 @ 168 + ++ protected float getEaglerDynamicLightsValueSimple(float partialTicks) { ++ return 0.5f; ++ } ++ ++ protected void renderDynamicLightsEaglerAt(double entityX, double entityY, double entityZ, double renderX, ++ double renderY, double renderZ, float partialTicks, boolean isInFrustum) { ++ super.renderDynamicLightsEaglerAt(entityX, entityY, entityZ, renderX, renderY, renderZ, partialTicks, ++ isInFrustum); ++ if (isInFrustum && renderX * renderX + renderY * renderY + renderZ * renderZ < 150.0) { ++ float mag = 0.5f; ++ DynamicLightManager.renderDynamicLight("entity_" + getEntityId() + "_endereye", entityX, entityY + 0.2, ++ entityZ, mag * 0.1990f, mag * 0.7750f, mag * 0.4130f, false); ++ } ++ } ++ > EOF diff --git a/patches/minecraft/net/minecraft/entity/item/EntityFireworkRocket.edit.java b/patches/minecraft/net/minecraft/entity/item/EntityFireworkRocket.edit.java new file mode 100644 index 00000000..8a4467ac --- /dev/null +++ b/patches/minecraft/net/minecraft/entity/item/EntityFireworkRocket.edit.java @@ -0,0 +1,15 @@ + +# Eagler Context Redacted Diff +# Copyright (c) 2024 lax1dude. All rights reserved. + +# Version: 1.0 +# Author: lax1dude + +> INSERT 156 : 160 @ 156 + ++ protected float getEaglerDynamicLightsValueSimple(float partialTicks) { ++ return 1.0f; ++ } ++ + +> EOF diff --git a/patches/minecraft/net/minecraft/entity/item/EntityItem.edit.java b/patches/minecraft/net/minecraft/entity/item/EntityItem.edit.java index 667ee1d2..05f4831a 100644 --- a/patches/minecraft/net/minecraft/entity/item/EntityItem.edit.java +++ b/patches/minecraft/net/minecraft/entity/item/EntityItem.edit.java @@ -25,7 +25,7 @@ ~ for (int i = 0, l = lst.size(); i < l; ++i) { ~ this.combineItems(lst.get(i)); -> INSERT 258 : 267 @ 258 +> INSERT 258 : 280 @ 258 + + public boolean eaglerEmissiveFlag = false; @@ -36,5 +36,18 @@ + isInFrustum); + eaglerEmissiveFlag = Minecraft.getMinecraft().entityRenderer.renderItemEntityLight(this, 0.1f); + } ++ ++ protected float getEaglerDynamicLightsValueSimple(float partialTicks) { ++ float f = super.getEaglerDynamicLightsValueSimple(partialTicks); ++ ItemStack itm = this.getEntityItem(); ++ if (itm != null && itm.stackSize > 0) { ++ Item item = itm.getItem(); ++ if (item != null) { ++ float f2 = item.getHeldItemBrightnessEagler() * 0.75f; ++ f = Math.min(f + f2 * 0.5f, 1.0f) + f2 * 0.5f; ++ } ++ } ++ return f; ++ } > EOF diff --git a/patches/minecraft/net/minecraft/entity/item/EntityItemFrame.edit.java b/patches/minecraft/net/minecraft/entity/item/EntityItemFrame.edit.java index f670b53f..d391f9b2 100644 --- a/patches/minecraft/net/minecraft/entity/item/EntityItemFrame.edit.java +++ b/patches/minecraft/net/minecraft/entity/item/EntityItemFrame.edit.java @@ -9,7 +9,11 @@ + import net.minecraft.client.Minecraft; -> INSERT 189 : 198 @ 189 +> INSERT 5 : 6 @ 5 + ++ import net.minecraft.item.Item; + +> INSERT 184 : 206 @ 184 + + public boolean eaglerEmissiveFlag = false; @@ -20,5 +24,18 @@ + isInFrustum); + eaglerEmissiveFlag = Minecraft.getMinecraft().entityRenderer.renderItemEntityLight(this, 0.1f); + } ++ ++ protected float getEaglerDynamicLightsValueSimple(float partialTicks) { ++ float f = super.getEaglerDynamicLightsValueSimple(partialTicks); ++ ItemStack itm = this.getDisplayedItem(); ++ if (itm != null && itm.stackSize > 0) { ++ Item item = itm.getItem(); ++ if (item != null) { ++ float f2 = item.getHeldItemBrightnessEagler() * 0.75f; ++ f = Math.min(f + f2 * 0.5f, 1.0f) + f2 * 0.5f; ++ } ++ } ++ return f; ++ } > EOF diff --git a/patches/minecraft/net/minecraft/entity/item/EntityMinecartTNT.edit.java b/patches/minecraft/net/minecraft/entity/item/EntityMinecartTNT.edit.java index 970b21a5..9b0490a2 100644 --- a/patches/minecraft/net/minecraft/entity/item/EntityMinecartTNT.edit.java +++ b/patches/minecraft/net/minecraft/entity/item/EntityMinecartTNT.edit.java @@ -11,7 +11,7 @@ > DELETE 3 @ 3 : 4 -> INSERT 159 : 170 @ 159 +> INSERT 159 : 178 @ 159 + + protected void renderDynamicLightsEaglerAt(double entityX, double entityY, double entityZ, double renderX, @@ -24,5 +24,13 @@ + entityZ, dynamicLightMag, dynamicLightMag * 0.7792f, dynamicLightMag * 0.618f, false); + } + } ++ ++ protected float getEaglerDynamicLightsValueSimple(float partialTicks) { ++ float f = super.getEaglerDynamicLightsValueSimple(partialTicks); ++ if (minecartTNTFuse > -1 && minecartTNTFuse / 5 % 2 == 0) { ++ f = Math.min(f + 0.75f, 1.25f); ++ } ++ return f; ++ } > EOF diff --git a/patches/minecraft/net/minecraft/entity/item/EntityTNTPrimed.edit.java b/patches/minecraft/net/minecraft/entity/item/EntityTNTPrimed.edit.java index ce06b6a8..96792afa 100644 --- a/patches/minecraft/net/minecraft/entity/item/EntityTNTPrimed.edit.java +++ b/patches/minecraft/net/minecraft/entity/item/EntityTNTPrimed.edit.java @@ -9,7 +9,7 @@ + import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.DynamicLightManager; -> INSERT 90 : 101 @ 90 +> INSERT 90 : 109 @ 90 + + protected void renderDynamicLightsEaglerAt(double entityX, double entityY, double entityZ, double renderX, @@ -22,5 +22,13 @@ + entityZ, dynamicLightMag, dynamicLightMag * 0.7792f, dynamicLightMag * 0.618f, false); + } + } ++ ++ protected float getEaglerDynamicLightsValueSimple(float partialTicks) { ++ float f = super.getEaglerDynamicLightsValueSimple(partialTicks); ++ if (fuse / 5 % 2 == 0) { ++ f = Math.min(f + 0.75f, 1.25f); ++ } ++ return f; ++ } > EOF diff --git a/patches/minecraft/net/minecraft/entity/item/EntityXPOrb.edit.java b/patches/minecraft/net/minecraft/entity/item/EntityXPOrb.edit.java index 43a36220..dba6a862 100644 --- a/patches/minecraft/net/minecraft/entity/item/EntityXPOrb.edit.java +++ b/patches/minecraft/net/minecraft/entity/item/EntityXPOrb.edit.java @@ -9,7 +9,14 @@ + import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.DynamicLightManager; -> INSERT 205 : 216 @ 205 +> INSERT 55 : 59 @ 55 + ++ protected float getEaglerDynamicLightsValueSimple(float partialTicks) { ++ return 0.25f; ++ } ++ + +> INSERT 150 : 161 @ 150 + + protected void renderDynamicLightsEaglerAt(double entityX, double entityY, double entityZ, double renderX, diff --git a/patches/minecraft/net/minecraft/entity/monster/EntityBlaze.edit.java b/patches/minecraft/net/minecraft/entity/monster/EntityBlaze.edit.java index 0e688dcd..b64736a4 100644 --- a/patches/minecraft/net/minecraft/entity/monster/EntityBlaze.edit.java +++ b/patches/minecraft/net/minecraft/entity/monster/EntityBlaze.edit.java @@ -15,7 +15,14 @@ ~ this.dataWatcher.addObject(16, Byte.valueOf((byte) 0)); -> INSERT 185 : 192 @ 185 +> INSERT 22 : 26 @ 22 + ++ protected float getEaglerDynamicLightsValueSimple(float partialTicks) { ++ return 1.0f; ++ } ++ + +> INSERT 163 : 170 @ 163 + + protected void renderDynamicLightsEaglerAt(double entityX, double entityY, double entityZ, double renderX, diff --git a/patches/minecraft/net/minecraft/entity/monster/EntityCreeper.edit.java b/patches/minecraft/net/minecraft/entity/monster/EntityCreeper.edit.java index 1953bed6..8e40818e 100644 --- a/patches/minecraft/net/minecraft/entity/monster/EntityCreeper.edit.java +++ b/patches/minecraft/net/minecraft/entity/monster/EntityCreeper.edit.java @@ -12,7 +12,7 @@ > DELETE 12 @ 12 : 14 -> INSERT 204 : 217 @ 204 +> INSERT 204 : 226 @ 204 + + protected void renderDynamicLightsEaglerAt(double entityX, double entityY, double entityZ, double renderX, @@ -27,5 +27,14 @@ + DeferredStateManager.setEmissionConstant(1.0f); + } + } ++ ++ protected float getEaglerDynamicLightsValueSimple(float partialTicks) { ++ float f = super.getEaglerDynamicLightsValueSimple(partialTicks); ++ float ff = getCreeperFlashIntensity(partialTicks); ++ if ((int) (ff * 10.0F) % 2 != 0) { ++ f = Math.min(f + 0.5f, 1.15f); ++ } ++ return f; ++ } > EOF diff --git a/patches/minecraft/net/minecraft/entity/monster/EntityMagmaCube.edit.java b/patches/minecraft/net/minecraft/entity/monster/EntityMagmaCube.edit.java index a8dd6648..19567d5c 100644 --- a/patches/minecraft/net/minecraft/entity/monster/EntityMagmaCube.edit.java +++ b/patches/minecraft/net/minecraft/entity/monster/EntityMagmaCube.edit.java @@ -7,4 +7,11 @@ > DELETE 3 @ 3 : 4 +> INSERT 39 : 43 @ 39 + ++ protected float getEaglerDynamicLightsValueSimple(float partialTicks) { ++ return 1.0f; ++ } ++ + > EOF diff --git a/patches/minecraft/net/minecraft/entity/projectile/EntityFireball.edit.java b/patches/minecraft/net/minecraft/entity/projectile/EntityFireball.edit.java index f43a7b8b..32fe8ad4 100644 --- a/patches/minecraft/net/minecraft/entity/projectile/EntityFireball.edit.java +++ b/patches/minecraft/net/minecraft/entity/projectile/EntityFireball.edit.java @@ -27,4 +27,11 @@ ~ for (int i = 0, l = list.size(); i < l; ++i) { +> INSERT 156 : 160 @ 156 + ++ protected float getEaglerDynamicLightsValueSimple(float partialTicks) { ++ return 1.0f; ++ } ++ + > EOF diff --git a/patches/minecraft/net/minecraft/item/Item.edit.java b/patches/minecraft/net/minecraft/item/Item.edit.java index ac58e6ed..d0f520c0 100644 --- a/patches/minecraft/net/minecraft/item/Item.edit.java +++ b/patches/minecraft/net/minecraft/item/Item.edit.java @@ -28,4 +28,11 @@ ~ protected static EaglercraftRandom itemRand = new EaglercraftRandom(); +> INSERT 884 : 888 @ 884 + ++ ++ public float getHeldItemBrightnessEagler() { ++ return 0.0f; ++ } + > EOF diff --git a/patches/minecraft/net/minecraft/item/ItemBlock.edit.java b/patches/minecraft/net/minecraft/item/ItemBlock.edit.java index 37072b7b..262e5986 100644 --- a/patches/minecraft/net/minecraft/item/ItemBlock.edit.java +++ b/patches/minecraft/net/minecraft/item/ItemBlock.edit.java @@ -7,4 +7,11 @@ > DELETE 9 @ 9 : 11 +> INSERT 120 : 124 @ 120 + ++ ++ public float getHeldItemBrightnessEagler() { ++ return this.block.getLightValue() * 0.06667f; ++ } + > EOF diff --git a/patches/minecraft/net/minecraft/server/MinecraftServer.edit.java b/patches/minecraft/net/minecraft/server/MinecraftServer.edit.java index 1070e898..a5f3a732 100644 --- a/patches/minecraft/net/minecraft/server/MinecraftServer.edit.java +++ b/patches/minecraft/net/minecraft/server/MinecraftServer.edit.java @@ -120,7 +120,15 @@ > DELETE 1 @ 1 : 2 -> DELETE 32 @ 32 : 35 +> INSERT 6 : 11 @ 6 + ++ if (worldinfo.isOldEaglercraftRandom()) { ++ LogManager.getLogger("EaglerMinecraftServer") ++ .info("Detected a pre-u34 world, using old EaglercraftRandom implementation for world generation"); ++ } ++ + +> DELETE 26 @ 26 : 29 > CHANGE 3 : 11 @ 3 : 5 diff --git a/patches/minecraft/net/minecraft/world/Teleporter.edit.java b/patches/minecraft/net/minecraft/world/Teleporter.edit.java index b95a755d..ce33e0a8 100644 --- a/patches/minecraft/net/minecraft/world/Teleporter.edit.java +++ b/patches/minecraft/net/minecraft/world/Teleporter.edit.java @@ -17,6 +17,6 @@ > CHANGE 5 : 6 @ 5 : 6 -~ this.random = new EaglercraftRandom(worldIn.getSeed()); +~ this.random = new EaglercraftRandom(worldIn.getSeed(), !worldIn.getWorldInfo().isOldEaglercraftRandom()); > EOF diff --git a/patches/minecraft/net/minecraft/world/World.edit.java b/patches/minecraft/net/minecraft/world/World.edit.java index 3db4ee22..b59977a1 100644 --- a/patches/minecraft/net/minecraft/world/World.edit.java +++ b/patches/minecraft/net/minecraft/world/World.edit.java @@ -64,7 +64,16 @@ ~ return Chunk.getNoSkyLightValue(); -> CHANGE 1299 : 1300 @ 1299 : 1300 +> CHANGE 74 : 80 @ 74 : 75 + +~ if (lightValue < 0) { +~ j += -lightValue; +~ if (j > 15) { +~ j = 15; +~ } +~ } else if (j < lightValue) { + +> CHANGE 1224 : 1225 @ 1224 : 1225 ~ this.worldInfo.setThunderTime((this.rand.nextInt(12000) / 2) + 3600); diff --git a/patches/minecraft/net/minecraft/world/WorldProvider.edit.java b/patches/minecraft/net/minecraft/world/WorldProvider.edit.java index 7ab1fe25..41997c46 100644 --- a/patches/minecraft/net/minecraft/world/WorldProvider.edit.java +++ b/patches/minecraft/net/minecraft/world/WorldProvider.edit.java @@ -7,7 +7,15 @@ > DELETE 6 @ 6 : 11 -> CHANGE 99 : 100 @ 99 : 100 +> INSERT 83 : 84 @ 83 + ++ float f2 = f; + +> CHANGE 1 : 2 @ 1 : 2 + +~ f = f2 + (f - f2) / 3.0F; + +> CHANGE 14 : 15 @ 14 : 15 ~ float f2 = 0.0F; diff --git a/patches/minecraft/net/minecraft/world/biome/BiomeGenMesa.edit.java b/patches/minecraft/net/minecraft/world/biome/BiomeGenMesa.edit.java index 32a7a08e..d1b0862a 100644 --- a/patches/minecraft/net/minecraft/world/biome/BiomeGenMesa.edit.java +++ b/patches/minecraft/net/minecraft/world/biome/BiomeGenMesa.edit.java @@ -24,12 +24,21 @@ ~ public void genTerrainBlocks(World world, EaglercraftRandom random, ChunkPrimer chunkprimer, int i, int j, ~ double d0) { -> CHANGE 5 : 6 @ 5 : 6 +> CHANGE 1 : 2 @ 1 : 2 -~ EaglercraftRandom random1 = new EaglercraftRandom(this.field_150622_aD); +~ this.func_150619_a(world.getSeed(), !world.getWorldInfo().isOldEaglercraftRandom()); -> CHANGE 111 : 112 @ 111 : 112 +> CHANGE 3 : 5 @ 3 : 4 -~ EaglercraftRandom random = new EaglercraftRandom(parLong1); +~ EaglercraftRandom random1 = new EaglercraftRandom(this.field_150622_aD, +~ !world.getWorldInfo().isOldEaglercraftRandom()); + +> CHANGE 108 : 109 @ 108 : 109 + +~ private void func_150619_a(long parLong1, boolean scrambleRNG) { + +> CHANGE 2 : 3 @ 2 : 3 + +~ EaglercraftRandom random = new EaglercraftRandom(parLong1, scrambleRNG); > EOF diff --git a/patches/minecraft/net/minecraft/world/chunk/Chunk.edit.java b/patches/minecraft/net/minecraft/world/chunk/Chunk.edit.java index 5a0f735a..40157c10 100644 --- a/patches/minecraft/net/minecraft/world/chunk/Chunk.edit.java +++ b/patches/minecraft/net/minecraft/world/chunk/Chunk.edit.java @@ -162,7 +162,11 @@ ~ public EaglercraftRandom getRandomWithSeed(long i) { ~ return new EaglercraftRandom(this.worldObj.getSeed() + (long) (this.xPosition * this.xPosition * 4987142) -> CHANGE 92 : 93 @ 92 : 93 +> CHANGE 1 : 2 @ 1 : 2 + +~ + (long) (this.zPosition * 389711) ^ i, !this.worldObj.getWorldInfo().isOldEaglercraftRandom()); + +> CHANGE 90 : 91 @ 90 : 91 ~ BlockPos blockpos = (BlockPos) this.tileEntityPosQueue.remove(0); diff --git a/patches/minecraft/net/minecraft/world/chunk/EmptyChunk.edit.java b/patches/minecraft/net/minecraft/world/chunk/EmptyChunk.edit.java index e50442f4..9faa82c4 100644 --- a/patches/minecraft/net/minecraft/world/chunk/EmptyChunk.edit.java +++ b/patches/minecraft/net/minecraft/world/chunk/EmptyChunk.edit.java @@ -16,9 +16,13 @@ > DELETE 8 @ 8 : 9 -> CHANGE 90 : 92 @ 90 : 92 +> CHANGE 90 : 96 @ 90 : 94 ~ public EaglercraftRandom getRandomWithSeed(long seed) { -~ return new EaglercraftRandom(this.getWorld().getSeed() + (long) (this.xPosition * this.xPosition * 4987142) +~ return new EaglercraftRandom( +~ this.getWorld().getSeed() + (long) (this.xPosition * this.xPosition * 4987142) +~ + (long) (this.xPosition * 5947611) + (long) (this.zPosition * this.zPosition) * 4392871L +~ + (long) (this.zPosition * 389711) ^ seed, +~ !this.getWorld().getWorldInfo().isOldEaglercraftRandom()); > EOF diff --git a/patches/minecraft/net/minecraft/world/gen/ChunkProviderEnd.edit.java b/patches/minecraft/net/minecraft/world/gen/ChunkProviderEnd.edit.java index e068c6a3..a516a7ce 100644 --- a/patches/minecraft/net/minecraft/world/gen/ChunkProviderEnd.edit.java +++ b/patches/minecraft/net/minecraft/world/gen/ChunkProviderEnd.edit.java @@ -17,6 +17,6 @@ > CHANGE 16 : 17 @ 16 : 17 -~ this.endRNG = new EaglercraftRandom(parLong1); +~ this.endRNG = new EaglercraftRandom(parLong1, !worldIn.getWorldInfo().isOldEaglercraftRandom()); > EOF diff --git a/patches/minecraft/net/minecraft/world/gen/ChunkProviderFlat.edit.java b/patches/minecraft/net/minecraft/world/gen/ChunkProviderFlat.edit.java index 87c486a9..1229f6c5 100644 --- a/patches/minecraft/net/minecraft/world/gen/ChunkProviderFlat.edit.java +++ b/patches/minecraft/net/minecraft/world/gen/ChunkProviderFlat.edit.java @@ -15,11 +15,32 @@ ~ private EaglercraftRandom random; -> CHANGE 10 : 11 @ 10 : 11 +> CHANGE 10 : 12 @ 10 : 11 -~ this.random = new EaglercraftRandom(seed); +~ boolean scramble = !worldIn.getWorldInfo().isOldEaglercraftRandom(); +~ this.random = new EaglercraftRandom(seed, scramble); -> CHANGE 110 : 112 @ 110 : 111 +> CHANGE 9 : 10 @ 9 : 10 + +~ this.structureGenerators.add(new MapGenVillage(map1, scramble)); + +> CHANGE 3 : 4 @ 3 : 4 + +~ this.structureGenerators.add(new MapGenScatteredFeature((Map) map.get("biome_1"), scramble)); + +> CHANGE 3 : 4 @ 3 : 4 + +~ this.structureGenerators.add(new MapGenMineshaft((Map) map.get("mineshaft"), scramble)); + +> CHANGE 3 : 4 @ 3 : 4 + +~ this.structureGenerators.add(new MapGenStronghold((Map) map.get("stronghold"), scramble)); + +> CHANGE 3 : 4 @ 3 : 4 + +~ this.structureGenerators.add(new StructureOceanMonument((Map) map.get("oceanmonument"), scramble)); + +> CHANGE 84 : 86 @ 84 : 85 ~ for (int m = 0, n = this.structureGenerators.size(); m < n; ++m) { ~ MapGenStructure mapgenstructure = this.structureGenerators.get(m); diff --git a/patches/minecraft/net/minecraft/world/gen/ChunkProviderGenerate.edit.java b/patches/minecraft/net/minecraft/world/gen/ChunkProviderGenerate.edit.java index 82a06c5c..92cb66b6 100644 --- a/patches/minecraft/net/minecraft/world/gen/ChunkProviderGenerate.edit.java +++ b/patches/minecraft/net/minecraft/world/gen/ChunkProviderGenerate.edit.java @@ -15,8 +15,26 @@ ~ private EaglercraftRandom rand; -> CHANGE 32 : 33 @ 32 : 33 +> CHANGE 15 : 22 @ 15 : 22 -~ this.rand = new EaglercraftRandom(parLong1); +~ private MapGenBase caveGenerator; +~ private MapGenStronghold strongholdGenerator; +~ private MapGenVillage villageGenerator; +~ private MapGenMineshaft mineshaftGenerator; +~ private MapGenScatteredFeature scatteredFeatureGenerator; +~ private MapGenBase ravineGenerator; +~ private StructureOceanMonument oceanMonumentGenerator; + +> CHANGE 10 : 19 @ 10 : 11 + +~ boolean scramble = !worldIn.getWorldInfo().isOldEaglercraftRandom(); +~ this.rand = new EaglercraftRandom(parLong1, scramble); +~ this.caveGenerator = new MapGenCaves(scramble); +~ this.strongholdGenerator = new MapGenStronghold(scramble); +~ this.villageGenerator = new MapGenVillage(scramble); +~ this.mineshaftGenerator = new MapGenMineshaft(scramble); +~ this.scatteredFeatureGenerator = new MapGenScatteredFeature(scramble); +~ this.ravineGenerator = new MapGenRavine(scramble); +~ this.oceanMonumentGenerator = new StructureOceanMonument(scramble); > EOF diff --git a/patches/minecraft/net/minecraft/world/gen/ChunkProviderHell.edit.java b/patches/minecraft/net/minecraft/world/gen/ChunkProviderHell.edit.java index f90a6acd..eb8b4d21 100644 --- a/patches/minecraft/net/minecraft/world/gen/ChunkProviderHell.edit.java +++ b/patches/minecraft/net/minecraft/world/gen/ChunkProviderHell.edit.java @@ -15,8 +15,16 @@ ~ private final EaglercraftRandom hellRNG; -> CHANGE 31 : 32 @ 31 : 32 +> CHANGE 20 : 22 @ 20 : 22 -~ this.hellRNG = new EaglercraftRandom(parLong1); +~ private final MapGenNetherBridge genNetherBridge; +~ private final MapGenBase netherCaveGenerator; + +> CHANGE 9 : 13 @ 9 : 10 + +~ boolean scramble = !worldIn.getWorldInfo().isOldEaglercraftRandom(); +~ this.hellRNG = new EaglercraftRandom(parLong1, scramble); +~ this.genNetherBridge = new MapGenNetherBridge(scramble); +~ this.netherCaveGenerator = new MapGenCavesHell(scramble); > EOF diff --git a/patches/minecraft/net/minecraft/world/gen/MapGenBase.edit.java b/patches/minecraft/net/minecraft/world/gen/MapGenBase.edit.java index c73afacd..e80100d4 100644 --- a/patches/minecraft/net/minecraft/world/gen/MapGenBase.edit.java +++ b/patches/minecraft/net/minecraft/world/gen/MapGenBase.edit.java @@ -11,6 +11,17 @@ > CHANGE 6 : 7 @ 6 : 7 -~ protected EaglercraftRandom rand = new EaglercraftRandom(); +~ protected EaglercraftRandom rand; + +> INSERT 2 : 10 @ 2 + ++ public MapGenBase() { ++ this(true); ++ } ++ ++ public MapGenBase(boolean scramble) { ++ rand = new EaglercraftRandom(scramble); ++ } ++ > EOF diff --git a/patches/minecraft/net/minecraft/world/gen/MapGenCaves.edit.java b/patches/minecraft/net/minecraft/world/gen/MapGenCaves.edit.java index 51803e78..5e018569 100644 --- a/patches/minecraft/net/minecraft/world/gen/MapGenCaves.edit.java +++ b/patches/minecraft/net/minecraft/world/gen/MapGenCaves.edit.java @@ -11,8 +11,16 @@ > DELETE 8 @ 8 : 9 -> CHANGE 15 : 16 @ 15 : 16 +> INSERT 2 : 7 @ 2 -~ EaglercraftRandom random = new EaglercraftRandom(parLong1); ++ ++ public MapGenCaves(boolean scramble) { ++ super(scramble); ++ } ++ + +> CHANGE 13 : 14 @ 13 : 14 + +~ EaglercraftRandom random = new EaglercraftRandom(parLong1, this.rand.isScramble()); > EOF diff --git a/patches/minecraft/net/minecraft/world/gen/MapGenCavesHell.edit.java b/patches/minecraft/net/minecraft/world/gen/MapGenCavesHell.edit.java index 7fd6bd1d..cb88eab8 100644 --- a/patches/minecraft/net/minecraft/world/gen/MapGenCavesHell.edit.java +++ b/patches/minecraft/net/minecraft/world/gen/MapGenCavesHell.edit.java @@ -11,8 +11,16 @@ > DELETE 5 @ 5 : 6 -> CHANGE 15 : 16 @ 15 : 16 +> INSERT 2 : 7 @ 2 -~ EaglercraftRandom random = new EaglercraftRandom(parLong1); ++ ++ public MapGenCavesHell(boolean scramble) { ++ super(scramble); ++ } ++ + +> CHANGE 13 : 14 @ 13 : 14 + +~ EaglercraftRandom random = new EaglercraftRandom(parLong1, this.rand.isScramble()); > EOF diff --git a/patches/minecraft/net/minecraft/world/gen/MapGenRavine.edit.java b/patches/minecraft/net/minecraft/world/gen/MapGenRavine.edit.java index d24d97d8..dd0c9d7f 100644 --- a/patches/minecraft/net/minecraft/world/gen/MapGenRavine.edit.java +++ b/patches/minecraft/net/minecraft/world/gen/MapGenRavine.edit.java @@ -11,8 +11,15 @@ > DELETE 6 @ 6 : 7 -> CHANGE 7 : 8 @ 7 : 8 +> INSERT 4 : 8 @ 4 -~ EaglercraftRandom random = new EaglercraftRandom(parLong1); ++ public MapGenRavine(boolean scramble) { ++ super(scramble); ++ } ++ + +> CHANGE 3 : 4 @ 3 : 4 + +~ EaglercraftRandom random = new EaglercraftRandom(parLong1, this.rand.isScramble()); > EOF diff --git a/patches/minecraft/net/minecraft/world/gen/feature/WorldGenBigTree.edit.java b/patches/minecraft/net/minecraft/world/gen/feature/WorldGenBigTree.edit.java index 028bd7b1..e18e15a4 100644 --- a/patches/minecraft/net/minecraft/world/gen/feature/WorldGenBigTree.edit.java +++ b/patches/minecraft/net/minecraft/world/gen/feature/WorldGenBigTree.edit.java @@ -36,6 +36,6 @@ > CHANGE 2 : 3 @ 2 : 3 -~ this.rand = new EaglercraftRandom(rand.nextLong()); +~ this.rand = new EaglercraftRandom(rand.nextLong(), !worldIn.getWorldInfo().isOldEaglercraftRandom()); > EOF diff --git a/patches/minecraft/net/minecraft/world/gen/structure/MapGenMineshaft.edit.java b/patches/minecraft/net/minecraft/world/gen/structure/MapGenMineshaft.edit.java index 3e397c6f..466eb65f 100644 --- a/patches/minecraft/net/minecraft/world/gen/structure/MapGenMineshaft.edit.java +++ b/patches/minecraft/net/minecraft/world/gen/structure/MapGenMineshaft.edit.java @@ -7,4 +7,14 @@ > DELETE 5 @ 5 : 8 +> CHANGE 4 : 6 @ 4 : 5 + +~ public MapGenMineshaft(boolean scramble) { +~ super(scramble); + +> CHANGE 6 : 8 @ 6 : 7 + +~ public MapGenMineshaft(Map parMap, boolean scramble) { +~ super(scramble); + > EOF diff --git a/patches/minecraft/net/minecraft/world/gen/structure/MapGenNetherBridge.edit.java b/patches/minecraft/net/minecraft/world/gen/structure/MapGenNetherBridge.edit.java index 3d6c1e41..3b6005ee 100644 --- a/patches/minecraft/net/minecraft/world/gen/structure/MapGenNetherBridge.edit.java +++ b/patches/minecraft/net/minecraft/world/gen/structure/MapGenNetherBridge.edit.java @@ -11,7 +11,12 @@ > DELETE 6 @ 6 : 10 -> CHANGE 36 : 37 @ 36 : 37 +> CHANGE 4 : 6 @ 4 : 5 + +~ public MapGenNetherBridge(boolean scramble) { +~ super(scramble); + +> CHANGE 31 : 32 @ 31 : 32 ~ public Start(World worldIn, EaglercraftRandom parRandom, int parInt1, int parInt2) { diff --git a/patches/minecraft/net/minecraft/world/gen/structure/MapGenScatteredFeature.edit.java b/patches/minecraft/net/minecraft/world/gen/structure/MapGenScatteredFeature.edit.java index c01d22c4..ee1230e2 100644 --- a/patches/minecraft/net/minecraft/world/gen/structure/MapGenScatteredFeature.edit.java +++ b/patches/minecraft/net/minecraft/world/gen/structure/MapGenScatteredFeature.edit.java @@ -11,7 +11,17 @@ > DELETE 6 @ 6 : 10 -> CHANGE 45 : 46 @ 45 : 46 +> CHANGE 8 : 10 @ 8 : 9 + +~ public MapGenScatteredFeature(boolean scramble) { +~ super(scramble); + +> CHANGE 6 : 8 @ 6 : 8 + +~ public MapGenScatteredFeature(Map parMap, boolean scramble) { +~ this(scramble); + +> CHANGE 28 : 29 @ 28 : 29 ~ EaglercraftRandom random = this.worldObj.setRandomSeed(i1, j1, 14357617); diff --git a/patches/minecraft/net/minecraft/world/gen/structure/MapGenStronghold.edit.java b/patches/minecraft/net/minecraft/world/gen/structure/MapGenStronghold.edit.java index 94c48788..c597da18 100644 --- a/patches/minecraft/net/minecraft/world/gen/structure/MapGenStronghold.edit.java +++ b/patches/minecraft/net/minecraft/world/gen/structure/MapGenStronghold.edit.java @@ -11,15 +11,25 @@ > DELETE 6 @ 6 : 10 -> CHANGE 14 : 17 @ 14 : 15 +> CHANGE 8 : 10 @ 8 : 9 + +~ public MapGenStronghold(boolean scramble) { +~ super(scramble); + +> CHANGE 5 : 8 @ 5 : 6 ~ BiomeGenBase[] biomes = BiomeGenBase.getBiomeGenArray(); ~ for (int i = 0; i < biomes.length; ++i) { ~ BiomeGenBase biomegenbase = biomes[i]; -> CHANGE 31 : 32 @ 31 : 32 +> CHANGE 7 : 9 @ 7 : 9 -~ EaglercraftRandom random = new EaglercraftRandom(); +~ public MapGenStronghold(Map parMap, boolean scramble) { +~ this(scramble); + +> CHANGE 22 : 23 @ 22 : 23 + +~ EaglercraftRandom random = new EaglercraftRandom(!this.worldObj.getWorldInfo().isOldEaglercraftRandom()); > CHANGE 26 : 28 @ 26 : 27 diff --git a/patches/minecraft/net/minecraft/world/gen/structure/MapGenStructure.edit.java b/patches/minecraft/net/minecraft/world/gen/structure/MapGenStructure.edit.java index 22b85de8..f0081acb 100644 --- a/patches/minecraft/net/minecraft/world/gen/structure/MapGenStructure.edit.java +++ b/patches/minecraft/net/minecraft/world/gen/structure/MapGenStructure.edit.java @@ -17,7 +17,18 @@ > DELETE 11 @ 11 : 16 -> CHANGE 30 : 31 @ 30 : 31 +> INSERT 7 : 15 @ 7 + ++ public MapGenStructure() { ++ super(); ++ } ++ ++ public MapGenStructure(boolean scramble) { ++ super(scramble); ++ } ++ + +> CHANGE 23 : 24 @ 23 : 24 ~ HString.format("%d,%d", new Object[] { Integer.valueOf(i), Integer.valueOf(j) })); diff --git a/patches/minecraft/net/minecraft/world/gen/structure/MapGenVillage.edit.java b/patches/minecraft/net/minecraft/world/gen/structure/MapGenVillage.edit.java index 24eb3b52..daff0b13 100644 --- a/patches/minecraft/net/minecraft/world/gen/structure/MapGenVillage.edit.java +++ b/patches/minecraft/net/minecraft/world/gen/structure/MapGenVillage.edit.java @@ -11,7 +11,17 @@ > DELETE 5 @ 5 : 9 -> CHANGE 44 : 45 @ 44 : 45 +> CHANGE 8 : 10 @ 8 : 9 + +~ public MapGenVillage(boolean scramble) { +~ super(scramble); + +> CHANGE 4 : 6 @ 4 : 6 + +~ public MapGenVillage(Map parMap, boolean scramble) { +~ this(scramble); + +> CHANGE 29 : 30 @ 29 : 30 ~ EaglercraftRandom random = this.worldObj.setRandomSeed(i1, j1, 10387312); diff --git a/patches/minecraft/net/minecraft/world/gen/structure/StructureOceanMonument.edit.java b/patches/minecraft/net/minecraft/world/gen/structure/StructureOceanMonument.edit.java index d4f37bc2..c004a4b8 100644 --- a/patches/minecraft/net/minecraft/world/gen/structure/StructureOceanMonument.edit.java +++ b/patches/minecraft/net/minecraft/world/gen/structure/StructureOceanMonument.edit.java @@ -11,7 +11,17 @@ > DELETE 11 @ 11 : 15 -> CHANGE 45 : 46 @ 45 : 46 +> CHANGE 8 : 10 @ 8 : 9 + +~ public StructureOceanMonument(boolean scramble) { +~ super(scramble); + +> CHANGE 4 : 6 @ 4 : 6 + +~ public StructureOceanMonument(Map parMap, boolean scramble) { +~ this(scramble); + +> CHANGE 30 : 31 @ 30 : 31 ~ EaglercraftRandom random = this.worldObj.setRandomSeed(i1, j1, 10387313); diff --git a/patches/minecraft/net/minecraft/world/storage/WorldInfo.edit.java b/patches/minecraft/net/minecraft/world/storage/WorldInfo.edit.java index d18b8b70..78992be2 100644 --- a/patches/minecraft/net/minecraft/world/storage/WorldInfo.edit.java +++ b/patches/minecraft/net/minecraft/world/storage/WorldInfo.edit.java @@ -10,7 +10,38 @@ + import net.lax1dude.eaglercraft.v1_8.HString; + -> CHANGE 539 : 540 @ 539 : 540 +> INSERT 39 : 42 @ 39 + ++ public static final int eaglerVersionCurrent = 1; ++ private int eaglerVersion = eaglerVersionCurrent; ++ + +> INSERT 116 : 117 @ 116 + ++ this.eaglerVersion = nbt.getInteger("eaglerVersionSerial"); + +> INSERT 102 : 103 @ 102 + ++ nbt.setInteger("eaglerVersionSerial", this.eaglerVersion); + +> INSERT 274 : 288 @ 274 + ++ public int getEaglerVersion() { ++ return this.eaglerVersion; ++ } ++ ++ public boolean isOldEaglercraftRandom() { ++ return this.eaglerVersion == 0; ++ } ++ ++ public static void initEaglerVersion(NBTTagCompound compound) { ++ if (!compound.hasKey("eaglerVersionSerial", 99)) { ++ compound.setInteger("eaglerVersionSerial", eaglerVersionCurrent); ++ } ++ } ++ + +> CHANGE 8 : 9 @ 8 : 9 ~ return HString.format("ID %02d - %s, ver %d. Features enabled: %b", diff --git a/patches/resources/assets/minecraft/lang/en_US.edit.lang b/patches/resources/assets/minecraft/lang/en_US.edit.lang index 6639281c..9b7099f0 100644 --- a/patches/resources/assets/minecraft/lang/en_US.edit.lang +++ b/patches/resources/assets/minecraft/lang/en_US.edit.lang @@ -12,7 +12,7 @@ ~ eaglercraft.recording.start=Record Screen... ~ eaglercraft.soundCategory.voice=Recording Voice -> INSERT 1 : 238 @ 1 +> INSERT 1 : 239 @ 1 + eaglercraft.resourcePack.prompt.title=What do you want to do with '%s'? + eaglercraft.resourcePack.prompt.text=Tip: Hold Shift to skip this screen when selecting a resource pack! @@ -123,6 +123,7 @@ + eaglercraft.options.fastMath.0=OFF + eaglercraft.options.fastMath.1=Low + eaglercraft.options.fastMath.2=High ++ eaglercraft.options.dynamicLights=Dynamic Lights + + eaglercraft.key.function=Function + eaglercraft.key.zoomCamera=Zoom Camera @@ -252,7 +253,7 @@ + eaglercraft.command.clientStub=This command is client side! + -> INSERT 163 : 404 @ 163 +> INSERT 163 : 409 @ 163 + eaglercraft.singleplayer.busy.killTask=Cancel Task + eaglercraft.singleplayer.busy.cancelWarning=Are you sure? @@ -410,7 +411,12 @@ + eaglercraft.singleplayer.demo.create.join=Join Shared World + eaglercraft.singleplayer.demo.create.join.tooltip=Join someone else's world and play multiplayer + -+ eaglercraft.createWorld.seedNote=Note: Vanilla seeds do not work! ++ eaglercraft.createWorld.seedNote=Note: Vanilla seeds now work! ++ ++ eaglercraft.singleplayer.oldseedwarning.title=Old World Detected! ++ eaglercraft.singleplayer.oldseedwarning.msg1=Please use EaglercraftX u32 or older to "Re-Create" this world ++ eaglercraft.singleplayer.oldseedwarning.msg2=The world's seed will not be the same otherwise :( ++ eaglercraft.singleplayer.oldseedwarning.ok=OK + + eaglercraft.singleplayer.outdatedLANServerKick=This is a 1.5.2 LAN world! + diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftRandom.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftRandom.java index 2f983340..93484c5d 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftRandom.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftRandom.java @@ -3,7 +3,7 @@ package net.lax1dude.eaglercraft.v1_8; import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime; /** - * Copyright (c) 2022 lax1dude. All Rights Reserved. + * Copyright (c) 2022-2024 lax1dude. All Rights Reserved. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED @@ -25,19 +25,46 @@ public class EaglercraftRandom { private static final double DOUBLE_UNIT = 0x1.0p-53; private long seed = 69; - - private static int yee = 0; + private final boolean enableScramble; public EaglercraftRandom() { this(PlatformRuntime.randomSeed()); } public EaglercraftRandom(long seed) { + this(seed, true); + } + + public EaglercraftRandom(boolean scramble) { + this(PlatformRuntime.randomSeed(), scramble); + } + + /** + * Older versions of EaglercraftX (and Eaglercraft) are missing the + * "initialScramble" function from their setSeed function, which was what caused + * world generation to not match vanilla. The "enableScramble" boolean is used + * when players play on an old world created before the bug was fixed. + */ + public EaglercraftRandom(long seed, boolean scramble) { + enableScramble = scramble; setSeed(seed); } + private static long initialScramble(long seed) { + return (seed ^ multiplier) & mask; + } + public void setSeed(long yeed) { - seed = yeed; + if(enableScramble) { + seed = initialScramble(yeed); + }else { + seed = yeed; + } + haveNextNextGaussian = true; + } + + public boolean isScramble() { + return enableScramble; } protected int next(int bits) { diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java index 31700363..05e7a779 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java @@ -10,7 +10,7 @@ public class EaglercraftVersion { /// Customize these to fit your fork: public static final String projectForkName = "EaglercraftX"; - public static final String projectForkVersion = "u32"; + public static final String projectForkVersion = "u34"; public static final String projectForkVendor = "lax1dude"; public static final String projectForkURL = "https://gitlab.com/lax1dude/eaglercraftx-1.8"; @@ -20,7 +20,7 @@ public class EaglercraftVersion { public static final String projectOriginName = "EaglercraftX"; public static final String projectOriginAuthor = "lax1dude"; public static final String projectOriginRevision = "1.8"; - public static final String projectOriginVersion = "u32"; + public static final String projectOriginVersion = "u34"; public static final String projectOriginURL = "https://gitlab.com/lax1dude/eaglercraftx-1.8"; // rest in peace @@ -31,7 +31,7 @@ public class EaglercraftVersion { public static final boolean enableUpdateService = true; public static final String updateBundlePackageName = "net.lax1dude.eaglercraft.v1_8.client"; - public static final int updateBundlePackageVersionInt = 32; + public static final int updateBundlePackageVersionInt = 34; public static final String updateLatestLocalStorageKey = "latestUpdate_" + updateBundlePackageName; diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/FixedFunctionPipeline.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/FixedFunctionPipeline.java index 605bccf5..1b714c0f 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/FixedFunctionPipeline.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/FixedFunctionPipeline.java @@ -19,6 +19,7 @@ import net.lax1dude.eaglercraft.v1_8.internal.PlatformRuntime; import net.lax1dude.eaglercraft.v1_8.log4j.LogManager; import net.lax1dude.eaglercraft.v1_8.log4j.Logger; import net.lax1dude.eaglercraft.v1_8.opengl.StreamBuffer.StreamBufferInstance; +import net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights.DynamicLightsStateManager; import net.lax1dude.eaglercraft.v1_8.vector.Matrix4f; import net.lax1dude.eaglercraft.v1_8.vector.Vector4f; import net.minecraft.util.MathHelper; @@ -904,7 +905,9 @@ public class FixedFunctionPipeline { _wglUniform3f(stateLightingAmbientUniform3f, r, g, b); } } - + } + + if(stateEnableMCLighting || DynamicLightsStateManager.isInDynamicLightsPass()) { if(!stateHasAttribNormal) { serial = GlStateManager.stateNormalSerial; if(stateNormalSerial != serial) { diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/GlStateManager.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/GlStateManager.java index 593fae84..37819b91 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/GlStateManager.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/GlStateManager.java @@ -808,6 +808,22 @@ public class GlStateManager { } } + public static final void getFloat(int pname, FloatBuffer params) { + switch(pname) { + case GL_MODELVIEW_MATRIX: + modelMatrixStack[modelMatrixStackPointer].store(params); + break; + case GL_PROJECTION_MATRIX: + projectionMatrixStack[projectionMatrixStackPointer].store(params); + break; + case GL_TEXTURE_MATRIX: + textureMatrixStack[activeTexture][textureMatrixStackPointer[activeTexture]].store(params); + break; + default: + throw new UnsupportedOperationException("glGetFloat can only be used to retrieve matricies!"); + } + } + public static final void ortho(double left, double right, double bottom, double top, double zNear, double zFar) { Matrix4f matrix; switch(stateMatrixMode) { diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/InstancedParticleRenderer.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/InstancedParticleRenderer.java index 4307e41b..32b4b8cd 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/InstancedParticleRenderer.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/InstancedParticleRenderer.java @@ -49,8 +49,8 @@ public class InstancedParticleRenderer { private static IUniformGL u_matrixTransform = null; private static FloatBuffer matrixCopyBuffer = null; private static IUniformGL u_texCoordSize2f_particleSize1f = null; - private static IUniformGL u_transformParam_1_2_3_4_f = null; - private static IUniformGL u_transformParam_5_f = null; + private static IUniformGL u_transformParam_1_2_5_f = null; + private static IUniformGL u_transformParam_3_4_f = null; private static IUniformGL u_color4f = null; private static IBufferArrayGL vertexArray = null; @@ -154,8 +154,8 @@ public class InstancedParticleRenderer { u_matrixTransform = _wglGetUniformLocation(shaderProgram, "u_matrixTransform"); u_texCoordSize2f_particleSize1f = _wglGetUniformLocation(shaderProgram, "u_texCoordSize2f_particleSize1f"); - u_transformParam_1_2_3_4_f = _wglGetUniformLocation(shaderProgram, "u_transformParam_1_2_3_4_f"); - u_transformParam_5_f = _wglGetUniformLocation(shaderProgram, "u_transformParam_5_f"); + u_transformParam_1_2_5_f = _wglGetUniformLocation(shaderProgram, "u_transformParam_1_2_5_f"); + u_transformParam_3_4_f = _wglGetUniformLocation(shaderProgram, "u_transformParam_3_4_f"); u_color4f = _wglGetUniformLocation(shaderProgram, "u_color4f"); _wglUniform1i(_wglGetUniformLocation(shaderProgram, "u_inputTexture"), 0); @@ -260,17 +260,17 @@ public class InstancedParticleRenderer { } if (transformParam1 != stateTransformParam1 || transformParam2 != stateTransformParam2 - || transformParam3 != stateTransformParam3 || transformParam4 != stateTransformParam4) { - _wglUniform4f(u_transformParam_1_2_3_4_f, transformParam1, transformParam2, transformParam3, transformParam4); + || transformParam5 != stateTransformParam5) { + _wglUniform3f(u_transformParam_1_2_5_f, transformParam1, transformParam2, transformParam5); stateTransformParam1 = transformParam1; stateTransformParam2 = transformParam2; - stateTransformParam3 = transformParam3; - stateTransformParam4 = transformParam4; + stateTransformParam5 = transformParam5; } - if (transformParam5 != stateTransformParam5) { - _wglUniform1f(u_transformParam_5_f, transformParam5); - stateTransformParam5 = transformParam5; + if (transformParam3 != stateTransformParam3 || transformParam4 != stateTransformParam4) { + _wglUniform2f(u_transformParam_3_4_f, transformParam3, transformParam4); + stateTransformParam3 = transformParam3; + stateTransformParam4 = transformParam4; } int serial = GlStateManager.stateColorSerial; @@ -319,4 +319,8 @@ public class InstancedParticleRenderer { _wglDrawArraysInstanced(GL_TRIANGLES, 0, 6, particleCount); } + public static void stupidColorSetHack(IUniformGL color4f) { + _wglUniform4f(color4f, GlStateManager.stateColorR, GlStateManager.stateColorG, GlStateManager.stateColorB, GlStateManager.stateColorA); + } + } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/DeferredStateManager.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/DeferredStateManager.java index 9aa9dc15..68d5d0a7 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/DeferredStateManager.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/DeferredStateManager.java @@ -107,7 +107,7 @@ public class DeferredStateManager { } public static final boolean isInDeferredPass() { - return GlStateManager.isExtensionPipeline(); + return EaglerDeferredPipeline.instance != null && GlStateManager.isExtensionPipeline(); } public static final boolean isInForwardPass() { @@ -153,10 +153,17 @@ public class DeferredStateManager { } public static final void reportForwardRenderObjectPosition2(float x, float y, float z) { - float posX = (float)((x + TileEntityRendererDispatcher.staticPlayerX) - (MathHelper.floor_double(TileEntityRendererDispatcher.staticPlayerX / 16.0) << 4)); - float posY = (float)((y + TileEntityRendererDispatcher.staticPlayerY) - (MathHelper.floor_double(TileEntityRendererDispatcher.staticPlayerY / 16.0) << 4)); - float posZ = (float)((z + TileEntityRendererDispatcher.staticPlayerZ) - (MathHelper.floor_double(TileEntityRendererDispatcher.staticPlayerZ / 16.0) << 4)); - reportForwardRenderObjectPosition((int)posX, (int)posY, (int)posZ); + EaglerDeferredPipeline instance = EaglerDeferredPipeline.instance; + if(instance != null && enableForwardRender) { + EaglerDeferredConfig cfg = instance.config; + if(!cfg.is_rendering_dynamicLights || !cfg.shaderPackInfo.DYNAMIC_LIGHTS) { + return; + } + float posX = (float)((x + TileEntityRendererDispatcher.staticPlayerX) - (MathHelper.floor_double(TileEntityRendererDispatcher.staticPlayerX / 16.0) << 4)); + float posY = (float)((y + TileEntityRendererDispatcher.staticPlayerY) - (MathHelper.floor_double(TileEntityRendererDispatcher.staticPlayerY / 16.0) << 4)); + float posZ = (float)((z + TileEntityRendererDispatcher.staticPlayerZ) - (MathHelper.floor_double(TileEntityRendererDispatcher.staticPlayerZ / 16.0) << 4)); + instance.loadLightSourceBucket((int)posX, (int)posY, (int)posZ); + } } public static final void setHDRTranslucentPassBlendFunc() { diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/EaglerDeferredPipeline.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/EaglerDeferredPipeline.java index ffd39616..246a8c54 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/EaglerDeferredPipeline.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/EaglerDeferredPipeline.java @@ -2049,6 +2049,8 @@ public class EaglerDeferredPipeline { } } + truncateOverflowingLightBuffers(); + DeferredStateManager.checkGLError("combineGBuffersAndIlluminate(): RENDER DYNAMIC LIGHTS"); } @@ -2305,6 +2307,19 @@ public class EaglerDeferredPipeline { return radius2 >= 0.0f; } + private void truncateOverflowingLightBuffers() { + for(int i = 0; i < this.lightSourceBuckets.length; ++i) { + List lst = this.lightSourceBuckets[i]; + int k = lst.size(); + if(k > MAX_LIGHTS_PER_CHUNK) { + lst.sort(comparatorLightRadius); + for(int l = MAX_LIGHTS_PER_CHUNK - 1; l >= MAX_LIGHTS_PER_CHUNK; --l) { + lst.remove(l); + } + } + } + } + public void updateLightSourceUBO() { if(currentLightSourceBucket == null) { currentBoundLightSourceBucket = null; @@ -2332,7 +2347,6 @@ public class EaglerDeferredPipeline { } } - private static final List tmpListLights = new ArrayList(32); private static final Comparator comparatorLightRadius = (l1, l2) -> { return l1.radius < l2.radius ? 1 : -1; }; @@ -2340,10 +2354,6 @@ public class EaglerDeferredPipeline { private void populateLightSourceUBOFromBucket(List lights) { int max = lights.size(); if(max > MAX_LIGHTS_PER_CHUNK) { - tmpListLights.clear(); - tmpListLights.addAll(lights); - lights = tmpListLights; - lights.sort(comparatorLightRadius); max = MAX_LIGHTS_PER_CHUNK; } chunkLightingDataCopyBuffer.clear(); diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/ForwardAcceleratedEffectRenderer.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/ForwardAcceleratedEffectRenderer.java index b272b482..55710271 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/ForwardAcceleratedEffectRenderer.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/ForwardAcceleratedEffectRenderer.java @@ -124,8 +124,13 @@ public class ForwardAcceleratedEffectRenderer extends AbstractAcceleratedEffectR shaderProgram.useProgram(); _wglUniform3f(shaderProgram.uniforms.u_texCoordSize2f_particleSize1f, texCoordWidth, texCoordHeight, 0.0625f); - _wglUniform4f(shaderProgram.uniforms.u_transformParam_1_2_3_4_f, f1, f5, f2, f3); - _wglUniform1f(shaderProgram.uniforms.u_transformParam_5_f, f4); + if(shaderProgram.uniforms.u_transformParam_1_2_5_f != null) { + _wglUniform3f(shaderProgram.uniforms.u_transformParam_1_2_5_f, f1, f5, f4); + _wglUniform2f(shaderProgram.uniforms.u_transformParam_3_4_f, f2, f3); + }else { + _wglUniform4f(shaderProgram.uniforms.u_transformParam_1_2_3_4_f, f1, f5, f2, f3); + _wglUniform1f(shaderProgram.uniforms.u_transformParam_5_f, f4); + } if(isMaterialNormalTexture) { _wglUniform2f(shaderProgram.uniforms.u_textureYScale2f, 0.5f, 0.5f); }else { diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/GBufferAcceleratedEffectRenderer.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/GBufferAcceleratedEffectRenderer.java index 691080f9..45655d18 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/GBufferAcceleratedEffectRenderer.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/GBufferAcceleratedEffectRenderer.java @@ -124,8 +124,13 @@ public class GBufferAcceleratedEffectRenderer extends AbstractAcceleratedEffectR shaderProgram.useProgram(); _wglUniform3f(shaderProgram.uniforms.u_texCoordSize2f_particleSize1f, texCoordWidth, texCoordHeight, 0.0625f); - _wglUniform4f(shaderProgram.uniforms.u_transformParam_1_2_3_4_f, f1, f5, f2, f3); - _wglUniform1f(shaderProgram.uniforms.u_transformParam_5_f, f4); + if(shaderProgram.uniforms.u_transformParam_1_2_5_f != null) { + _wglUniform3f(shaderProgram.uniforms.u_transformParam_1_2_5_f, f1, f5, f4); + _wglUniform2f(shaderProgram.uniforms.u_transformParam_3_4_f, f2, f3); + }else { + _wglUniform4f(shaderProgram.uniforms.u_transformParam_1_2_3_4_f, f1, f5, f2, f3); + _wglUniform1f(shaderProgram.uniforms.u_transformParam_5_f, f4); + } if(isMaterialNormalTexture) { _wglUniform2f(shaderProgram.uniforms.u_textureYScale2f, 0.5f, 0.5f); }else { diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/program/PipelineShaderAccelParticleForward.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/program/PipelineShaderAccelParticleForward.java index ac2749ae..a9f18bcf 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/program/PipelineShaderAccelParticleForward.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/deferred/program/PipelineShaderAccelParticleForward.java @@ -69,6 +69,8 @@ public class PipelineShaderAccelParticleForward extends ShaderProgram sourceCache = new HashMap(); private static boolean isHighP = false; diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/DynamicLightBucketLoader.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/DynamicLightBucketLoader.java new file mode 100644 index 00000000..ab8f3c5d --- /dev/null +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/DynamicLightBucketLoader.java @@ -0,0 +1,287 @@ +package net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights; + +import static net.lax1dude.eaglercraft.v1_8.internal.PlatformOpenGL.*; +import static net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums.*; +import static net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.ExtGLEnums.*; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +import net.lax1dude.eaglercraft.v1_8.EagRuntime; +import net.lax1dude.eaglercraft.v1_8.internal.IBufferGL; +import net.lax1dude.eaglercraft.v1_8.internal.buffer.ByteBuffer; +import net.lax1dude.eaglercraft.v1_8.opengl.EaglercraftGPU; +import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.ArrayListSerial; +import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.EaglerDeferredPipeline; +import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.ListSerial; +import net.minecraft.util.MathHelper; + +/** + * Copyright (c) 2023-2024 lax1dude. All Rights Reserved. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ +public class DynamicLightBucketLoader { + + public IBufferGL buffer_chunkLightingData; + private ByteBuffer chunkLightingDataCopyBuffer; + private boolean isChunkLightingEnabled = false; + public ListSerial currentBoundLightSourceBucket; + + public final ListSerial[] lightSourceBuckets; + public ListSerial currentLightSourceBucket; + + public static final int MAX_LIGHTS_PER_CHUNK = 12; + + private final int lightSourceBucketsWidth; + private final int lightSourceBucketsHeight; + + private double currentRenderX = 0.0; + private double currentRenderY = 0.0; + private double currentRenderZ = 0.0; + + public DynamicLightBucketLoader() { + this.lightSourceBucketsWidth = 5; + this.lightSourceBucketsHeight = 3; + int cnt = 5 * 3 * 5; + this.lightSourceBuckets = new ListSerial[cnt]; + } + + public void initialize() { + destroy(); + + buffer_chunkLightingData = _wglGenBuffers(); + EaglercraftGPU.bindGLUniformBuffer(buffer_chunkLightingData); + int lightingDataLength = 4 * MAX_LIGHTS_PER_CHUNK + 4; + chunkLightingDataCopyBuffer = EagRuntime.allocateByteBuffer(lightingDataLength << 2); + for(int i = 0; i < lightingDataLength; ++i) { + chunkLightingDataCopyBuffer.putInt(0); + } + chunkLightingDataCopyBuffer.flip(); + _wglBufferData(_GL_UNIFORM_BUFFER, chunkLightingDataCopyBuffer, GL_DYNAMIC_DRAW); + + for(int i = 0; i < this.lightSourceBuckets.length; ++i) { + this.lightSourceBuckets[i] = new ArrayListSerial(16); + } + } + + public void clearBuckets() { + for(int i = 0; i < this.lightSourceBuckets.length; ++i) { + this.lightSourceBuckets[i].clear(); + } + } + + public void loadLightSourceBucket(int relativeBlockX, int relativeBlockY, int relativeBlockZ) { + int hw = lightSourceBucketsWidth / 2; + int hh = lightSourceBucketsHeight / 2; + int bucketX = (relativeBlockX >> 4) + hw; + int bucketY = (relativeBlockY >> 4) + hh; + int bucketZ = (relativeBlockZ >> 4) + hw; + if(bucketX >= 0 && bucketY >= 0 && bucketZ >= 0 && bucketX < lightSourceBucketsWidth + && bucketY < lightSourceBucketsHeight && bucketZ < lightSourceBucketsWidth) { + currentLightSourceBucket = lightSourceBuckets[bucketY * lightSourceBucketsWidth * lightSourceBucketsWidth + + bucketZ * lightSourceBucketsWidth + bucketX]; + }else { + currentLightSourceBucket = null; + } + updateLightSourceUBO(); + } + + public ListSerial getLightSourceBucketRelativeChunkCoords(int cx, int cy, int cz) { + int hw = lightSourceBucketsWidth / 2; + int hh = lightSourceBucketsHeight / 2; + cx += hw; + cy += hh; + cz += hw; + if(cx < 0 || cx >= lightSourceBucketsWidth || cy < 0 || cy >= lightSourceBucketsHeight || cz < 0 + || cz >= lightSourceBucketsWidth) { + return null; + }else { + return lightSourceBuckets[cy * lightSourceBucketsWidth * lightSourceBucketsWidth + + cz * lightSourceBucketsWidth + cx]; + } + } + + public void addLightSourceToBucket(int cx, int cy, int cz, DynamicLightInstance dl) { + ListSerial lst = getLightSourceBucketRelativeChunkCoords(cx, cy, cz); + if(lst != null) { + lst.add(dl); + } + } + + public void bucketLightSource(float x, float y, float z, DynamicLightInstance dl) { + int bucketX = MathHelper.floor_float(x / 16.0f); + int bucketY = MathHelper.floor_float(y / 16.0f); + int bucketZ = MathHelper.floor_float(z / 16.0f); + addLightSourceToBucket(bucketX, bucketY, bucketZ, dl); + int minX = bucketX, maxX = bucketX; + int minY = bucketY, maxY = bucketY; + int minZ = bucketZ, maxZ = bucketZ; + float lightLocalX = x - (bucketX << 4); + float lightLocalY = y - (bucketY << 4); + float lightLocalZ = z - (bucketZ << 4); + float radius = dl.radius; + boolean outOfBounds = false; + if(lightLocalX - radius < 0.0f) { + minX -= 1; + outOfBounds = true; + addLightSourceToBucket(bucketX - 1, bucketY, bucketZ, dl); + } + if(lightLocalY - radius < 0.0f) { + minY -= 1; + outOfBounds = true; + addLightSourceToBucket(bucketX, bucketY - 1, bucketZ, dl); + } + if(lightLocalZ - radius < 0.0f) { + minZ -= 1; + outOfBounds = true; + addLightSourceToBucket(bucketX, bucketY, bucketZ - 1, dl); + } + if(lightLocalX + radius >= 16.0f) { + maxX += 1; + outOfBounds = true; + addLightSourceToBucket(bucketX + 1, bucketY, bucketZ, dl); + } + if(lightLocalY + radius >= 16.0f) { + maxY += 1; + outOfBounds = true; + addLightSourceToBucket(bucketX, bucketY + 1, bucketZ, dl); + } + if(lightLocalZ + radius >= 16.0f) { + maxZ += 1; + outOfBounds = true; + addLightSourceToBucket(bucketX, bucketY, bucketZ + 1, dl); + } + if(!outOfBounds) { + return; + } + radius *= radius; + for(int yy = minY; yy <= maxY; ++yy) { + for(int zz = minZ; zz <= maxZ; ++zz) { + for(int xx = minX; xx <= maxX; ++xx) { + if((xx == bucketX ? 1 : 0) + (yy == bucketY ? 1 : 0) + (zz == bucketZ ? 1 : 0) > 1) { + continue; + } + List lst = getLightSourceBucketRelativeChunkCoords(xx, yy, zz); + if(lst != null) { + int bucketBoundsX = xx << 4; + int bucketBoundsY = yy << 4; + int bucketBoundsZ = zz << 4; + if (EaglerDeferredPipeline.testAabSphere(bucketBoundsX, bucketBoundsY, bucketBoundsZ, + bucketBoundsX + 16, bucketBoundsY + 16, bucketBoundsZ + 16, x, y, z, radius)) { + lst.add(dl); + } + } + } + } + } + } + + public void truncateOverflowingBuffers() { + for(int i = 0; i < this.lightSourceBuckets.length; ++i) { + List lst = this.lightSourceBuckets[i]; + int k = lst.size(); + if(k > MAX_LIGHTS_PER_CHUNK) { + lst.sort(comparatorLightRadius); + for(int l = MAX_LIGHTS_PER_CHUNK - 1; l >= MAX_LIGHTS_PER_CHUNK; --l) { + lst.remove(l); + } + } + } + } + + public void updateLightSourceUBO() { + if(currentLightSourceBucket == null) { + currentBoundLightSourceBucket = null; + if(isChunkLightingEnabled) { + isChunkLightingEnabled = false; + EaglercraftGPU.bindGLUniformBuffer(buffer_chunkLightingData); + chunkLightingDataCopyBuffer.clear(); + chunkLightingDataCopyBuffer.putInt(0); + chunkLightingDataCopyBuffer.flip(); + _wglBufferSubData(_GL_UNIFORM_BUFFER, 0, chunkLightingDataCopyBuffer); + } + }else { + boolean isNew; + if(!isChunkLightingEnabled) { + isChunkLightingEnabled = true; + isNew = true; + }else { + isNew = currentLightSourceBucket != currentBoundLightSourceBucket; + } + currentBoundLightSourceBucket = currentLightSourceBucket; + if(isNew || currentBoundLightSourceBucket.eaglerCheck()) { + populateLightSourceUBOFromBucket(currentBoundLightSourceBucket); + currentBoundLightSourceBucket.eaglerResetCheck(); + } + } + } + + private static final Comparator comparatorLightRadius = (l1, l2) -> { + return l1.radius < l2.radius ? 1 : -1; + }; + + private void populateLightSourceUBOFromBucket(List lights) { + int max = lights.size(); + if(max > MAX_LIGHTS_PER_CHUNK) { + //tmpListLights.clear(); + //tmpListLights.addAll(lights); + //lights = tmpListLights; + //lights.sort(comparatorLightRadius); + max = MAX_LIGHTS_PER_CHUNK; + } + chunkLightingDataCopyBuffer.clear(); + chunkLightingDataCopyBuffer.putInt(max); + if(max > 0) { + chunkLightingDataCopyBuffer.putInt(0); //padding + chunkLightingDataCopyBuffer.putInt(0); //padding + chunkLightingDataCopyBuffer.putInt(0); //padding + for(int i = 0; i < max; ++i) { + DynamicLightInstance dl = lights.get(i); + chunkLightingDataCopyBuffer.putFloat((float)(dl.posX - currentRenderX)); + chunkLightingDataCopyBuffer.putFloat((float)(dl.posY - currentRenderY)); + chunkLightingDataCopyBuffer.putFloat((float)(dl.posZ - currentRenderZ)); + chunkLightingDataCopyBuffer.putFloat(dl.radius); + } + } + chunkLightingDataCopyBuffer.flip(); + EaglercraftGPU.bindGLUniformBuffer(buffer_chunkLightingData); + _wglBufferSubData(_GL_UNIFORM_BUFFER, 0, chunkLightingDataCopyBuffer); + } + + public void setRenderPos(double currentRenderX, double currentRenderY, double currentRenderZ) { + this.currentRenderX = currentRenderX; + this.currentRenderY = currentRenderY; + this.currentRenderZ = currentRenderZ; + } + + public void bindUniformBuffer(int index) { + EaglercraftGPU.bindGLUniformBuffer(buffer_chunkLightingData); + EaglercraftGPU.bindUniformBufferRange(index, buffer_chunkLightingData, 0, chunkLightingDataCopyBuffer.capacity()); + } + + public void destroy() { + if(chunkLightingDataCopyBuffer != null) { + EagRuntime.freeByteBuffer(chunkLightingDataCopyBuffer); + chunkLightingDataCopyBuffer = null; + } + if(buffer_chunkLightingData != null) { + _wglDeleteBuffers(buffer_chunkLightingData); + buffer_chunkLightingData = null; + } + for(int i = 0; i < this.lightSourceBuckets.length; ++i) { + this.lightSourceBuckets[i] = null; + } + } +} diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/DynamicLightInstance.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/DynamicLightInstance.java new file mode 100644 index 00000000..72ec4883 --- /dev/null +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/DynamicLightInstance.java @@ -0,0 +1,48 @@ +package net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights; + +/** + * Copyright (c) 2024 lax1dude. All Rights Reserved. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ +class DynamicLightInstance { + + public final String lightName; + long lastCacheHit = 0l; + + double posX; + double posY; + double posZ; + float radius; + + public DynamicLightInstance(String lightName) { + this.lightName = lightName; + } + + public void updateLight(double posX, double posY, double posZ, float radius) { + this.lastCacheHit = System.currentTimeMillis(); + this.posX = posX; + this.posY = posY; + this.posZ = posZ; + this.radius = radius; + } + + public void destroy() { + + } + + public float getRadiusInWorld() { + return radius; + } + +} diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/DynamicLightsAcceleratedEffectRenderer.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/DynamicLightsAcceleratedEffectRenderer.java new file mode 100644 index 00000000..cc380163 --- /dev/null +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/DynamicLightsAcceleratedEffectRenderer.java @@ -0,0 +1,230 @@ +package net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights; + +import static net.lax1dude.eaglercraft.v1_8.internal.PlatformOpenGL.*; +import static net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums.*; + +import net.lax1dude.eaglercraft.v1_8.EagRuntime; +import net.lax1dude.eaglercraft.v1_8.internal.IBufferArrayGL; +import net.lax1dude.eaglercraft.v1_8.internal.IBufferGL; +import net.lax1dude.eaglercraft.v1_8.internal.buffer.ByteBuffer; +import net.lax1dude.eaglercraft.v1_8.internal.buffer.FloatBuffer; +import net.lax1dude.eaglercraft.v1_8.log4j.LogManager; +import net.lax1dude.eaglercraft.v1_8.log4j.Logger; +import net.lax1dude.eaglercraft.v1_8.opengl.EaglercraftGPU; +import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager; +import net.lax1dude.eaglercraft.v1_8.opengl.InstancedParticleRenderer; +import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.AbstractAcceleratedEffectRenderer; +import net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights.program.DynamicLightsAccelParticleShader; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GLAllocation; +import net.minecraft.entity.Entity; +import net.minecraft.util.MathHelper; + +/** + * Copyright (c) 2024 lax1dude. All Rights Reserved. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ +public class DynamicLightsAcceleratedEffectRenderer extends AbstractAcceleratedEffectRenderer { + + private static final Logger logger = LogManager.getLogger("DynamicLightsAcceleratedEffectRenderer"); + + private ByteBuffer particleBuffer = null; + private int particleCount = 0; + private boolean particlesHasOverflowed = false; + + private static final int BYTES_PER_PARTICLE = 24; + private static final int PARTICLE_LIMIT = 5461; + + private DynamicLightsAccelParticleShader shaderProgram = null; + + private IBufferArrayGL vertexArray = null; + private IBufferGL vertexBuffer = null; + + private IBufferGL instancesBuffer = null; + + private float f1; + private float f2; + private float f3; + private float f4; + private float f5; + + public static boolean isMaterialNormalTexture = false; + + public void initialize() { + destroy(); + + if(DynamicLightsPipelineCompiler.matrixCopyBuffer == null) { + DynamicLightsPipelineCompiler.matrixCopyBuffer = GLAllocation.createDirectFloatBuffer(16); + } + + shaderProgram = DynamicLightsAccelParticleShader.compile(); + shaderProgram.loadUniforms(); + + particleBuffer = EagRuntime.allocateByteBuffer(PARTICLE_LIMIT * BYTES_PER_PARTICLE); + + vertexArray = _wglGenVertexArrays(); + vertexBuffer = _wglGenBuffers(); + instancesBuffer = _wglGenBuffers(); + + FloatBuffer verts = EagRuntime.allocateFloatBuffer(12); + verts.put(new float[] { + -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, + -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f + }); + verts.flip(); + + EaglercraftGPU.bindGLBufferArray(vertexArray); + + EaglercraftGPU.bindGLArrayBuffer(vertexBuffer); + _wglBufferData(GL_ARRAY_BUFFER, verts, GL_STATIC_DRAW); + + EagRuntime.freeFloatBuffer(verts); + + _wglEnableVertexAttribArray(0); + _wglVertexAttribPointer(0, 2, GL_FLOAT, false, 8, 0); + _wglVertexAttribDivisor(0, 0); + + EaglercraftGPU.bindGLArrayBuffer(instancesBuffer); + _wglBufferData(GL_ARRAY_BUFFER, particleBuffer.remaining(), GL_STREAM_DRAW); + + _wglEnableVertexAttribArray(1); + _wglVertexAttribPointer(1, 3, GL_FLOAT, false, 24, 0); + _wglVertexAttribDivisor(1, 1); + + _wglEnableVertexAttribArray(2); + _wglVertexAttribPointer(2, 2, GL_UNSIGNED_SHORT, false, 24, 12); + _wglVertexAttribDivisor(2, 1); + + _wglEnableVertexAttribArray(3); + _wglVertexAttribPointer(3, 2, GL_UNSIGNED_BYTE, true, 24, 16); + _wglVertexAttribDivisor(3, 1); + + _wglEnableVertexAttribArray(4); + _wglVertexAttribPointer(4, 2, GL_UNSIGNED_BYTE, false, 24, 18); + _wglVertexAttribDivisor(4, 1); + + _wglEnableVertexAttribArray(5); + _wglVertexAttribPointer(5, 4, GL_UNSIGNED_BYTE, true, 24, 20); + _wglVertexAttribDivisor(5, 1); + + } + + @Override + public void draw(float texCoordWidth, float texCoordHeight) { + if(particleCount == 0) { + return; + } + + shaderProgram.useProgram(); + + _wglUniform3f(shaderProgram.uniforms.u_texCoordSize2f_particleSize1f, texCoordWidth, texCoordHeight, 0.0625f); + _wglUniform3f(shaderProgram.uniforms.u_transformParam_1_2_5_f, f1, f5, f4); + _wglUniform2f(shaderProgram.uniforms.u_transformParam_3_4_f, f2, f3); + InstancedParticleRenderer.stupidColorSetHack(shaderProgram.uniforms.u_color4f); + + FloatBuffer buf = DynamicLightsPipelineCompiler.matrixCopyBuffer; + buf.clear(); + GlStateManager.getFloat(GL_MODELVIEW_MATRIX, buf); + buf.flip(); + _wglUniformMatrix4fv(shaderProgram.uniforms.u_modelViewMatrix4f, false, buf); + buf.clear(); + GlStateManager.getFloat(GL_PROJECTION_MATRIX, buf); + buf.flip(); + _wglUniformMatrix4fv(shaderProgram.uniforms.u_projectionMatrix4f, false, buf); + buf.clear(); + DynamicLightsStateManager.inverseViewMatrix.store(buf); + buf.flip(); + _wglUniformMatrix4fv(shaderProgram.uniforms.u_inverseViewMatrix4f, false, buf); + + EaglercraftGPU.bindGLArrayBuffer(instancesBuffer); + EaglercraftGPU.bindGLBufferArray(vertexArray); + + int p = particleBuffer.position(); + int l = particleBuffer.limit(); + + particleBuffer.flip(); + _wglBufferSubData(GL_ARRAY_BUFFER, 0, particleBuffer); + + particleBuffer.position(p); + particleBuffer.limit(l); + + _wglDrawArraysInstanced(GL_TRIANGLES, 0, 6, particleCount); + } + + @Override + public void begin(float partialTicks) { + this.partialTicks = partialTicks; + + particleBuffer.clear(); + particleCount = 0; + particlesHasOverflowed = false; + + Entity et = Minecraft.getMinecraft().getRenderViewEntity(); + if(et != null) { + f1 = MathHelper.cos(et.rotationYaw * 0.017453292F); + f2 = MathHelper.sin(et.rotationYaw * 0.017453292F); + f3 = -f2 * MathHelper.sin(et.rotationPitch * 0.017453292F); + f4 = f1 * MathHelper.sin(et.rotationPitch * 0.017453292F); + f5 = MathHelper.cos(et.rotationPitch * 0.017453292F); + } + } + + @Override + public void drawParticle(float posX, float posY, float posZ, int particleIndexX, int particleIndexY, + int lightMapData, int texSize, float particleSize, int rgba) { + if(particlesHasOverflowed) { + return; + } + if(particleCount >= PARTICLE_LIMIT) { + particlesHasOverflowed = true; + logger.error("Particle buffer has overflowed! Exceeded {} particles, no more particles will be rendered.", PARTICLE_LIMIT); + return; + } + ++particleCount; + ByteBuffer buf = particleBuffer; + buf.putFloat(posX); + buf.putFloat(posY); + buf.putFloat(posZ); + buf.putShort((short)particleIndexX); + buf.putShort((short)particleIndexY); + buf.put((byte)(lightMapData & 0xFF)); + buf.put((byte)((lightMapData >> 16) & 0xFF)); + buf.put((byte)(particleSize * 16.0f)); + buf.put((byte)texSize); + buf.putInt(rgba); + } + + public void destroy() { + if(particleBuffer != null) { + EagRuntime.freeByteBuffer(particleBuffer); + particleBuffer = null; + } + if(shaderProgram != null) { + shaderProgram.destroy(); + shaderProgram = null; + } + if(vertexArray != null) { + _wglDeleteVertexArrays(vertexArray); + vertexArray = null; + } + if(vertexBuffer != null) { + _wglDeleteBuffers(vertexBuffer); + vertexBuffer = null; + } + if(instancesBuffer != null) { + _wglDeleteBuffers(instancesBuffer); + instancesBuffer = null; + } + } +} diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/DynamicLightsPipelineCompiler.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/DynamicLightsPipelineCompiler.java new file mode 100644 index 00000000..23d6a305 --- /dev/null +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/DynamicLightsPipelineCompiler.java @@ -0,0 +1,105 @@ +package net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights; + +import static net.lax1dude.eaglercraft.v1_8.internal.PlatformOpenGL.*; + +import net.lax1dude.eaglercraft.v1_8.internal.IProgramGL; +import net.lax1dude.eaglercraft.v1_8.internal.buffer.FloatBuffer; +import net.lax1dude.eaglercraft.v1_8.opengl.FixedFunctionShader.FixedFunctionState; +import net.lax1dude.eaglercraft.v1_8.opengl.IExtPipelineCompiler; +import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.program.ShaderSource; +import net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights.program.DynamicLightsExtPipelineShader; +import net.lax1dude.eaglercraft.v1_8.vector.Matrix4f; +import net.minecraft.client.renderer.GLAllocation; + +/** + * Copyright (c) 2024 lax1dude. All Rights Reserved. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ +public class DynamicLightsPipelineCompiler implements IExtPipelineCompiler { + + static FloatBuffer matrixCopyBuffer = null; + + private static class PipelineInstance { + + private final int coreBits; + private final int extBits; + + private DynamicLightsExtPipelineShader shader; + + public PipelineInstance(int coreBits, int extBits) { + this.coreBits = coreBits; + this.extBits = extBits; + } + + } + + @Override + public String[] getShaderSource(int stateCoreBits, int stateExtBits, Object[] userPointer) { + if(matrixCopyBuffer == null) { + matrixCopyBuffer = GLAllocation.createDirectFloatBuffer(16); + } + userPointer[0] = new PipelineInstance(stateCoreBits, stateExtBits); + return new String[] { + ShaderSource.getSourceFor(ShaderSource.core_dynamiclights_vsh), + ShaderSource.getSourceFor(ShaderSource.core_dynamiclights_fsh) + }; + } + + @Override + public int getExtensionStatesCount() { + return 0; + } + + @Override + public int getCurrentExtensionStateBits(int stateCoreBits) { + return 0; + } + + @Override + public int getCoreStateMask(int stateExtBits) { + return 0xFFFFFFFF; + } + + @Override + public void initializeNewShader(IProgramGL compiledProg, int stateCoreBits, int stateExtBits, + Object[] userPointer) { + DynamicLightsExtPipelineShader newShader = new DynamicLightsExtPipelineShader(compiledProg, stateCoreBits); + ((PipelineInstance)userPointer[0]).shader = newShader; + newShader.loadUniforms(); + } + + @Override + public void updatePipeline(IProgramGL compiledProg, int stateCoreBits, int stateExtBits, Object[] userPointer) { + if((stateCoreBits & FixedFunctionState.STATE_ENABLE_LIGHTMAP) != 0) { + DynamicLightsExtPipelineShader.Uniforms uniforms = ((PipelineInstance)userPointer[0]).shader.uniforms; + if(uniforms.u_inverseViewMatrix4f != null) { + int serial = DynamicLightsStateManager.inverseViewMatrixSerial; + if(uniforms.inverseViewMatrixSerial != serial) { + uniforms.inverseViewMatrixSerial = serial; + FloatBuffer buf = matrixCopyBuffer; + buf.clear(); + DynamicLightsStateManager.inverseViewMatrix.store(buf); + buf.flip(); + _wglUniformMatrix4fv(uniforms.u_inverseViewMatrix4f, false, buf); + } + } + } + } + + @Override + public void destroyPipeline(IProgramGL shaderProgram, int stateCoreBits, int stateExtBits, Object[] userPointer) { + + } + +} diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/DynamicLightsStateManager.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/DynamicLightsStateManager.java new file mode 100644 index 00000000..ad7bac94 --- /dev/null +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/DynamicLightsStateManager.java @@ -0,0 +1,169 @@ +package net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import net.lax1dude.eaglercraft.v1_8.opengl.FixedFunctionPipeline; +import net.lax1dude.eaglercraft.v1_8.opengl.GlStateManager; +import net.lax1dude.eaglercraft.v1_8.vector.Matrix4f; +import net.minecraft.client.particle.EffectRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.util.MathHelper; + +/** + * Copyright (c) 2024 lax1dude. All Rights Reserved. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ +public class DynamicLightsStateManager { + + static final DynamicLightsPipelineCompiler deferredExtPipeline = new DynamicLightsPipelineCompiler(); + static final Map lightRenderers = new HashMap(); + static final List lightRenderList = new LinkedList(); + static final Matrix4f inverseViewMatrix = new Matrix4f(); + static int inverseViewMatrixSerial = 0; + static DynamicLightBucketLoader bucketLoader = null; + static DynamicLightsAcceleratedEffectRenderer accelParticleRenderer = null; + static int lastTotal = 0; + static long renderTimeout = 5000l; + private static long lastTick = 0l; + + public static final void enableDynamicLightsRender() { + if(bucketLoader == null) { + bucketLoader = new DynamicLightBucketLoader(); + bucketLoader.initialize(); + bucketLoader.bindUniformBuffer(0); + FixedFunctionPipeline.loadExtensionPipeline(deferredExtPipeline); + } + if(accelParticleRenderer == null) { + accelParticleRenderer = new DynamicLightsAcceleratedEffectRenderer(); + accelParticleRenderer.initialize(); + } + } + + public static final void bindAcceleratedEffectRenderer(EffectRenderer renderer) { + renderer.acceleratedParticleRenderer = accelParticleRenderer; + } + + public static final void disableDynamicLightsRender(boolean unloadPipeline) { + if(bucketLoader != null) { + bucketLoader.destroy(); + bucketLoader = null; + if(unloadPipeline) { + FixedFunctionPipeline.loadExtensionPipeline(null); + } + } + if(accelParticleRenderer != null) { + accelParticleRenderer.destroy(); + accelParticleRenderer = null; + } + destroyAll(); + lightRenderList.clear(); + } + + public static final boolean isDynamicLightsRender() { + return bucketLoader != null; + } + + public static final boolean isInDynamicLightsPass() { + return GlStateManager.isExtensionPipeline() && bucketLoader != null; + } + + public static final void reportForwardRenderObjectPosition(int centerX, int centerY, int centerZ) { + if(bucketLoader != null) { + bucketLoader.loadLightSourceBucket(centerX, centerY, centerZ); + } + } + + public static final void reportForwardRenderObjectPosition2(float x, float y, float z) { + if(bucketLoader != null) { + float posX = (float)((x + TileEntityRendererDispatcher.staticPlayerX) - (MathHelper.floor_double(TileEntityRendererDispatcher.staticPlayerX / 16.0) << 4)); + float posY = (float)((y + TileEntityRendererDispatcher.staticPlayerY) - (MathHelper.floor_double(TileEntityRendererDispatcher.staticPlayerY / 16.0) << 4)); + float posZ = (float)((z + TileEntityRendererDispatcher.staticPlayerZ) - (MathHelper.floor_double(TileEntityRendererDispatcher.staticPlayerZ / 16.0) << 4)); + bucketLoader.loadLightSourceBucket((int)posX, (int)posY, (int)posZ); + } + } + + public static final void renderDynamicLight(String lightName, double posX, double posY, double posZ, float radius) { + if(bucketLoader != null) { + DynamicLightInstance dl = lightRenderers.get(lightName); + if(dl == null) { + lightRenderers.put(lightName, dl = new DynamicLightInstance(lightName)); + } + dl.updateLight(posX, posY, posZ, radius); + lightRenderList.add(dl); + } + } + + public static final void clearRenderList() { + lightRenderList.clear(); + } + + public static final void commitLightSourceBuckets(double renderPosX, double renderPosY, double renderPosZ) { + updateTimers(); + lastTotal = lightRenderList.size(); + if(bucketLoader != null) { + bucketLoader.clearBuckets(); + int entityChunkOriginX = MathHelper.floor_double(renderPosX / 16.0) << 4; + int entityChunkOriginY = MathHelper.floor_double(renderPosY / 16.0) << 4; + int entityChunkOriginZ = MathHelper.floor_double(renderPosZ / 16.0) << 4; + Iterator itr = lightRenderList.iterator(); + while(itr.hasNext()) { + DynamicLightInstance dl = itr.next(); + float lightChunkPosX = (float)(dl.posX - entityChunkOriginX); + float lightChunkPosY = (float)(dl.posY - entityChunkOriginY); + float lightChunkPosZ = (float)(dl.posZ - entityChunkOriginZ); + bucketLoader.bucketLightSource(lightChunkPosX, lightChunkPosY, lightChunkPosZ, dl); + } + bucketLoader.setRenderPos(renderPosX, renderPosY, renderPosZ); + bucketLoader.truncateOverflowingBuffers(); + } + lightRenderList.clear(); + } + + public static final void setupInverseViewMatrix() { + Matrix4f.invert(GlStateManager.getModelViewReference(), inverseViewMatrix); + inverseViewMatrixSerial = GlStateManager.getModelViewSerial(); + } + + private static final void updateTimers() { + long millis = System.currentTimeMillis(); + if(millis - lastTick > 1000l) { + lastTick = millis; + Iterator itr = lightRenderers.values().iterator(); + while(itr.hasNext()) { + DynamicLightInstance dl = itr.next(); + if(millis - dl.lastCacheHit > renderTimeout) { + dl.destroy(); + itr.remove(); + } + } + } + } + + public static final void destroyAll() { + Iterator itr = lightRenderers.values().iterator(); + while(itr.hasNext()) { + itr.next().destroy(); + } + lightRenderers.clear(); + } + + public static String getF3String() { + return "DynamicLightsTotal: " + lastTotal; + } + +} diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/program/DynamicLightsAccelParticleShader.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/program/DynamicLightsAccelParticleShader.java new file mode 100644 index 00000000..3fc03463 --- /dev/null +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/program/DynamicLightsAccelParticleShader.java @@ -0,0 +1,95 @@ +package net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights.program; + +import static net.lax1dude.eaglercraft.v1_8.internal.PlatformOpenGL.*; +import static net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums.GL_FRAGMENT_SHADER; +import static net.lax1dude.eaglercraft.v1_8.opengl.RealOpenGLEnums.GL_VERTEX_SHADER; + +import java.util.ArrayList; +import java.util.List; + +import net.lax1dude.eaglercraft.v1_8.internal.IProgramGL; +import net.lax1dude.eaglercraft.v1_8.internal.IShaderGL; +import net.lax1dude.eaglercraft.v1_8.internal.IUniformGL; +import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.program.IProgramUniforms; +import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.program.ShaderCompiler; +import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.program.ShaderProgram; +import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.program.ShaderSource; + +/** + * Copyright (c) 2024 lax1dude. All Rights Reserved. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ +public class DynamicLightsAccelParticleShader extends ShaderProgram { + + public static DynamicLightsAccelParticleShader compile() { + IShaderGL accelParticleVSH = ShaderCompiler.compileShader("accel_particle_dynamiclights", GL_VERTEX_SHADER, + ShaderSource.accel_particle_dynamiclights_vsh); + IShaderGL accelParticleFSH = null; + try { + accelParticleFSH = ShaderCompiler.compileShader("accel_particle_dynamiclights", GL_FRAGMENT_SHADER, + ShaderSource.accel_particle_dynamiclights_fsh); + IProgramGL prog = ShaderCompiler.linkProgram("accel_particle_dynamiclights", accelParticleVSH, accelParticleFSH); + return new DynamicLightsAccelParticleShader(prog); + }finally { + if(accelParticleVSH != null) { + accelParticleVSH.free(); + } + if(accelParticleFSH != null) { + accelParticleFSH.free(); + } + } + } + + private DynamicLightsAccelParticleShader(IProgramGL prog) { + super(prog, new Uniforms()); + } + + public static class Uniforms implements IProgramUniforms { + + public IUniformGL u_color4f = null; + public IUniformGL u_modelViewMatrix4f = null; + public IUniformGL u_projectionMatrix4f = null; + public IUniformGL u_inverseViewMatrix4f = null; + public IUniformGL u_texCoordSize2f_particleSize1f = null; + public IUniformGL u_transformParam_1_2_5_f = null; + public IUniformGL u_transformParam_3_4_f = null; + + public int u_chunkLightingDataBlockBinding = -1; + + private Uniforms() { + } + + @Override + public void loadUniforms(IProgramGL prog) { + u_modelViewMatrix4f = _wglGetUniformLocation(prog, "u_modelViewMatrix4f"); + u_projectionMatrix4f = _wglGetUniformLocation(prog, "u_projectionMatrix4f"); + u_inverseViewMatrix4f = _wglGetUniformLocation(prog, "u_inverseViewMatrix4f"); + u_texCoordSize2f_particleSize1f = _wglGetUniformLocation(prog, "u_texCoordSize2f_particleSize1f"); + u_transformParam_1_2_5_f = _wglGetUniformLocation(prog, "u_transformParam_1_2_5_f"); + u_transformParam_3_4_f = _wglGetUniformLocation(prog, "u_transformParam_3_4_f"); + u_color4f = _wglGetUniformLocation(prog, "u_color4f"); + _wglUniform1i(_wglGetUniformLocation(prog, "u_inputTexture"), 0); + _wglUniform1i(_wglGetUniformLocation(prog, "u_lightmapTexture"), 1); + int blockIndex = _wglGetUniformBlockIndex(prog, "u_chunkLightingData"); + if(blockIndex != -1) { + _wglUniformBlockBinding(prog, blockIndex, 0); + u_chunkLightingDataBlockBinding = 0; + }else { + u_chunkLightingDataBlockBinding = -1; + } + } + + } + +} diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/program/DynamicLightsExtPipelineShader.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/program/DynamicLightsExtPipelineShader.java new file mode 100644 index 00000000..2e23c326 --- /dev/null +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ext/dynamiclights/program/DynamicLightsExtPipelineShader.java @@ -0,0 +1,58 @@ +package net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights.program; + +import static net.lax1dude.eaglercraft.v1_8.internal.PlatformOpenGL.*; + +import net.lax1dude.eaglercraft.v1_8.internal.IProgramGL; +import net.lax1dude.eaglercraft.v1_8.internal.IUniformGL; +import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.program.IProgramUniforms; +import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.program.ShaderProgram; + +/** + * Copyright (c) 2024 lax1dude. All Rights Reserved. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ +public class DynamicLightsExtPipelineShader extends ShaderProgram { + + public final int coreState; + + public DynamicLightsExtPipelineShader(IProgramGL program, int coreState) { + super(program, new Uniforms()); + this.coreState = coreState; + } + + public static class Uniforms implements IProgramUniforms { + + public int u_chunkLightingDataBlockBinding = -1; + + public int inverseViewMatrixSerial = -1; + public IUniformGL u_inverseViewMatrix4f = null; + + Uniforms() { + } + + @Override + public void loadUniforms(IProgramGL prog) { + u_inverseViewMatrix4f = _wglGetUniformLocation(prog, "u_inverseViewMatrix4f"); + int blockIndex = _wglGetUniformBlockIndex(prog, "u_chunkLightingData"); + if(blockIndex != -1) { + _wglUniformBlockBinding(prog, blockIndex, 0); + u_chunkLightingDataBlockBinding = 0; + }else { + u_chunkLightingDataBlockBinding = -1; + } + } + + } + +} diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/SingleplayerServerController.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/SingleplayerServerController.java index 9d02b258..1479e012 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/SingleplayerServerController.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/SingleplayerServerController.java @@ -70,6 +70,8 @@ public class SingleplayerServerController implements ISaveFormat { public static final ClientIntegratedServerNetworkManager localPlayerNetworkManager = new ClientIntegratedServerNetworkManager(PLAYER_CHANNEL); private static final List openLANChannels = new ArrayList(); + private static final IPCPacketManager packetManagerInstance = new IPCPacketManager(); + private SingleplayerServerController() { } @@ -247,7 +249,7 @@ public class SingleplayerServerController implements ISaveFormat { if(packetData.channel.equals(SingleplayerServerController.IPC_CHANNEL)) { IPCPacketBase ipc; try { - ipc = IPCPacketManager.IPCDeserialize(packetData.contents); + ipc = packetManagerInstance.IPCDeserialize(packetData.contents); }catch(IOException ex) { throw new RuntimeException("Failed to deserialize IPC packet", ex); } @@ -402,7 +404,7 @@ public class SingleplayerServerController implements ISaveFormat { public static void sendIPCPacket(IPCPacketBase ipc) { byte[] pkt; try { - pkt = IPCPacketManager.IPCSerialize(ipc); + pkt = packetManagerInstance.IPCSerialize(ipc); }catch (IOException ex) { throw new RuntimeException("Failed to serialize IPC packet", ex); } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/gui/GuiScreenBackupWorldSelection.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/gui/GuiScreenBackupWorldSelection.java index 80051fc0..5c3904ca 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/gui/GuiScreenBackupWorldSelection.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/gui/GuiScreenBackupWorldSelection.java @@ -11,6 +11,7 @@ import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiYesNo; import net.minecraft.client.resources.I18n; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.storage.WorldInfo; /** @@ -38,6 +39,7 @@ public class GuiScreenBackupWorldSelection extends GuiScreen { private GuiButton worldConvert = null; private GuiButton worldBackup = null; private long worldSeed; + private boolean oldRNG; private NBTTagCompound levelDat; private String worldName; @@ -47,6 +49,7 @@ public class GuiScreenBackupWorldSelection extends GuiScreen { this.worldName = worldName; this.levelDat = levelDat; this.worldSeed = levelDat.getCompoundTag("Data").getLong("RandomSeed"); + this.oldRNG = levelDat.getCompoundTag("Data").getInteger("eaglerVersionSerial") == 0; } public void initGui() { @@ -62,7 +65,11 @@ public class GuiScreenBackupWorldSelection extends GuiScreen { this.drawDefaultBackground(); this.drawCenteredString(this.fontRendererObj, I18n.format("singleplayer.backup.title", worldName), this.width / 2, this.height / 5 - 35, 16777215); - this.drawCenteredString(this.fontRendererObj, I18n.format("singleplayer.backup.seed") + " " + worldSeed, this.width / 2, this.height / 5 + 62, 0xAAAAFF); + if(oldRNG) { + this.drawCenteredString(this.fontRendererObj, I18n.format("singleplayer.backup.seed") + " " + worldSeed + " " + EnumChatFormatting.RED + "(pre-u34)", this.width / 2, this.height / 5 + 62, 0xAAAAFF); + }else { + this.drawCenteredString(this.fontRendererObj, I18n.format("singleplayer.backup.seed") + " " + worldSeed, this.width / 2, this.height / 5 + 62, 0xAAAAFF); + } int toolTipColor = 0xDDDDAA; if(worldRecreate.isMouseOver()) { @@ -85,8 +92,13 @@ public class GuiScreenBackupWorldSelection extends GuiScreen { this.mc.displayGuiScreen(selectWorld); }else if(par1GuiButton.id == 1) { GuiCreateWorld cw = new GuiCreateWorld(selectWorld); - cw.func_146318_a(new WorldInfo(this.levelDat.getCompoundTag("Data"))); - this.mc.displayGuiScreen(cw); + WorldInfo inf = new WorldInfo(this.levelDat.getCompoundTag("Data")); + cw.func_146318_a(inf); + if(inf.isOldEaglercraftRandom()) { + this.mc.displayGuiScreen(new GuiScreenOldSeedWarning(cw)); + }else { + this.mc.displayGuiScreen(cw); + } }else if(par1GuiButton.id == 2) { this.mc.displayGuiScreen(new GuiRenameWorld(this.selectWorld, this.worldName, true)); }else if(par1GuiButton.id == 3) { diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/gui/GuiScreenOldSeedWarning.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/gui/GuiScreenOldSeedWarning.java new file mode 100644 index 00000000..c13e4aa4 --- /dev/null +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/gui/GuiScreenOldSeedWarning.java @@ -0,0 +1,48 @@ +package net.lax1dude.eaglercraft.v1_8.sp.gui; + +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.resources.I18n; + +/** + * Copyright (c) 2024 lax1dude. All Rights Reserved. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ +public class GuiScreenOldSeedWarning extends GuiScreen { + + private final GuiScreen cont; + + public GuiScreenOldSeedWarning(GuiScreen cont) { + this.cont = cont; + } + + public void initGui() { + this.buttonList.clear(); + this.buttonList.add(new GuiButton(0, this.width / 2 - 100, this.height / 6 + 96, I18n.format("singleplayer.oldseedwarning.ok"))); + } + + public void drawScreen(int par1, int par2, float par3) { + this.drawDefaultBackground(); + this.drawCenteredString(fontRendererObj, I18n.format("singleplayer.oldseedwarning.title"), this.width / 2, 70, 11184810); + this.drawCenteredString(fontRendererObj, I18n.format("singleplayer.oldseedwarning.msg1"), this.width / 2, 90, 16777215); + this.drawCenteredString(fontRendererObj, I18n.format("singleplayer.oldseedwarning.msg2"), this.width / 2, 105, 16777215); + super.drawScreen(par1, par2, par3); + } + + protected void actionPerformed(GuiButton par1GuiButton) { + if(par1GuiButton.id == 0) { + this.mc.displayGuiScreen(cont); + } + } +} diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/ipc/IPCPacketManager.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/ipc/IPCPacketManager.java index f85176d9..f501c67d 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/ipc/IPCPacketManager.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/ipc/IPCPacketManager.java @@ -25,11 +25,11 @@ public class IPCPacketManager { public static final HashMap> mappings = new HashMap(); - public static final IPCInputStream IPC_INPUT_STREAM = new IPCInputStream(); - public static final IPCOutputStream IPC_OUTPUT_STREAM = new IPCOutputStream(); + public final IPCInputStream IPC_INPUT_STREAM = new IPCInputStream(); + public final IPCOutputStream IPC_OUTPUT_STREAM = new IPCOutputStream(); - public static final DataInputStream IPC_DATA_INPUT_STREAM = new DataInputStream(IPC_INPUT_STREAM); - public static final DataOutputStream IPC_DATA_OUTPUT_STREAM = new DataOutputStream(IPC_OUTPUT_STREAM); + public final DataInputStream IPC_DATA_INPUT_STREAM = new DataInputStream(IPC_INPUT_STREAM); + public final DataOutputStream IPC_DATA_OUTPUT_STREAM = new DataOutputStream(IPC_OUTPUT_STREAM); static { mappings.put(IPCPacket00StartServer.ID, IPCPacket00StartServer::new); @@ -60,7 +60,7 @@ public class IPCPacketManager { mappings.put(IPCPacketFFProcessKeepAlive.ID, IPCPacketFFProcessKeepAlive::new); } - public static byte[] IPCSerialize(IPCPacketBase pkt) throws IOException { + public byte[] IPCSerialize(IPCPacketBase pkt) throws IOException { IPC_OUTPUT_STREAM.feedBuffer(new byte[pkt.size() + 1], pkt.getClass().getSimpleName()); IPC_OUTPUT_STREAM.write(pkt.id()); @@ -69,7 +69,7 @@ public class IPCPacketManager { return IPC_OUTPUT_STREAM.returnBuffer(); } - public static IPCPacketBase IPCDeserialize(byte[] pkt) throws IOException { + public IPCPacketBase IPCDeserialize(byte[] pkt) throws IOException { IPC_INPUT_STREAM.feedBuffer(pkt); int i = IPC_INPUT_STREAM.read(); diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/EaglerIntegratedServerWorker.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/EaglerIntegratedServerWorker.java index 73fb1003..20c96bee 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/EaglerIntegratedServerWorker.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/EaglerIntegratedServerWorker.java @@ -60,6 +60,8 @@ public class EaglerIntegratedServerWorker { private static final Map openChannels = new HashMap(); + private static final IPCPacketManager packetManagerInstance = new IPCPacketManager(); + private static void processAsyncMessageQueue() { List pktList = ServerPlatformSingleplayer.recieveAllPacket(); if(pktList != null) { @@ -69,7 +71,7 @@ public class EaglerIntegratedServerWorker { if(packetData.channel.equals(SingleplayerServerController.IPC_CHANNEL)) { IPCPacketBase ipc; try { - ipc = IPCPacketManager.IPCDeserialize(packetData.contents); + ipc = packetManagerInstance.IPCDeserialize(packetData.contents); }catch(IOException ex) { throw new RuntimeException("Failed to deserialize IPC packet", ex); } @@ -422,7 +424,7 @@ public class EaglerIntegratedServerWorker { public static void sendIPCPacket(IPCPacketBase ipc) { byte[] pkt; try { - pkt = IPCPacketManager.IPCSerialize(ipc); + pkt = packetManagerInstance.IPCSerialize(ipc); }catch (IOException ex) { throw new RuntimeException("Failed to serialize IPC packet", ex); } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/WorldConverterEPK.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/WorldConverterEPK.java index fc085c06..bf6ae1a8 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/WorldConverterEPK.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/WorldConverterEPK.java @@ -12,6 +12,7 @@ import net.lax1dude.eaglercraft.v1_8.sp.server.EaglerIntegratedServerWorker; import net.lax1dude.eaglercraft.v1_8.sp.server.EaglerSaveFormat; import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.storage.WorldInfo; /** * Copyright (c) 2022-2024 lax1dude, ayunami2000. All Rights Reserved. @@ -66,6 +67,9 @@ public class WorldConverterEPK { NBTTagCompound worldDatNBT = CompressedStreamTools.readCompressed(new EaglerInputStream(b)); worldDatNBT.getCompoundTag("Data").setString("LevelName", newName); worldDatNBT.getCompoundTag("Data").setLong("LastPlayed", System.currentTimeMillis()); + if(has152Format) { + WorldInfo.initEaglerVersion(worldDatNBT.getCompoundTag("Data")); + } EaglerOutputStream tmp = new EaglerOutputStream(); CompressedStreamTools.writeCompressed(worldDatNBT, tmp); b = tmp.toByteArray(); diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/WorldConverterMCA.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/WorldConverterMCA.java index 0c058fb3..ce8e5900 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/WorldConverterMCA.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/WorldConverterMCA.java @@ -20,6 +20,7 @@ import net.lax1dude.eaglercraft.v1_8.sp.server.EaglerChunkLoader; import net.lax1dude.eaglercraft.v1_8.sp.server.EaglerIntegratedServerWorker; import net.lax1dude.eaglercraft.v1_8.sp.server.EaglerSaveFormat; import net.minecraft.world.chunk.storage.RegionFile; +import net.minecraft.world.storage.WorldInfo; import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; @@ -98,9 +99,9 @@ public class WorldConverterMCA { gameRulesNBT.setString("colorCodes", s); gameRulesNBT.setString("doSignEditing", s); worldDatNBT.getCompoundTag("Data").setTag("GameRules", gameRulesNBT); - worldDatNBT.getCompoundTag("Data").setString("LevelName", newName); worldDatNBT.getCompoundTag("Data").setLong("LastPlayed", System.currentTimeMillis()); + WorldInfo.initEaglerVersion(worldDatNBT.getCompoundTag("Data")); EaglerOutputStream bo = new EaglerOutputStream(); CompressedStreamTools.writeCompressed(worldDatNBT, bo); b = bo.toByteArray(); diff --git a/sources/resources/assets/eagler/glsl/accel_particle.vsh b/sources/resources/assets/eagler/glsl/accel_particle.vsh index f4ab94e0..59becc7c 100644 --- a/sources/resources/assets/eagler/glsl/accel_particle.vsh +++ b/sources/resources/assets/eagler/glsl/accel_particle.vsh @@ -33,8 +33,8 @@ out vec4 v_color4f; uniform mat4 u_matrixTransform; uniform vec3 u_texCoordSize2f_particleSize1f; -uniform vec4 u_transformParam_1_2_3_4_f; -uniform float u_transformParam_5_f; +uniform vec3 u_transformParam_1_2_5_f; +uniform vec2 u_transformParam_3_4_f; uniform vec4 u_color4f; uniform sampler2D u_lightmapTexture; @@ -51,11 +51,8 @@ void main() { vec3 pos3f = p_position3f; vec2 spos2f = a_position2f * particleSize; - pos3f.x += u_transformParam_1_2_3_4_f.x * spos2f.x; - pos3f.x += u_transformParam_1_2_3_4_f.w * spos2f.y; - pos3f.y += u_transformParam_1_2_3_4_f.y * spos2f.y; - pos3f.z += u_transformParam_1_2_3_4_f.z * spos2f.x; - pos3f.z += u_transformParam_5_f * spos2f.y; + pos3f += u_transformParam_1_2_5_f * spos2f.xyy; + pos3f.zx += u_transformParam_3_4_f * spos2f; gl_Position = u_matrixTransform * vec4(pos3f, 1.0); } diff --git a/sources/resources/assets/eagler/glsl/deferred/accel_particle.vsh b/sources/resources/assets/eagler/glsl/deferred/accel_particle.vsh index fc68f1b6..b7507327 100644 --- a/sources/resources/assets/eagler/glsl/deferred/accel_particle.vsh +++ b/sources/resources/assets/eagler/glsl/deferred/accel_particle.vsh @@ -43,8 +43,8 @@ uniform mat4 u_matrixTransform; #endif uniform vec3 u_texCoordSize2f_particleSize1f; -uniform vec4 u_transformParam_1_2_3_4_f; -uniform float u_transformParam_5_f; +uniform vec3 u_transformParam_1_2_5_f; +uniform vec2 u_transformParam_3_4_f; void main() { v_color4f = p_color4f.bgra; @@ -59,11 +59,8 @@ void main() { vec3 pos3f = p_position3f; vec2 spos2f = a_position2f * particleSize; - pos3f.x += u_transformParam_1_2_3_4_f.x * spos2f.x; - pos3f.x += u_transformParam_1_2_3_4_f.w * spos2f.y; - pos3f.y += u_transformParam_1_2_3_4_f.y * spos2f.y; - pos3f.z += u_transformParam_1_2_3_4_f.z * spos2f.x; - pos3f.z += u_transformParam_5_f * spos2f.y; + pos3f += u_transformParam_1_2_5_f * spos2f.xyy; + pos3f.zx += u_transformParam_3_4_f * spos2f; #ifdef COMPILE_GBUFFER_VSH gl_Position = u_matrixTransform * vec4(pos3f, 1.0); diff --git a/sources/resources/assets/eagler/glsl/deferred/emissive_items.csv b/sources/resources/assets/eagler/glsl/deferred/emissive_items.csv index 6056c8b7..f7814dba 100644 --- a/sources/resources/assets/eagler/glsl/deferred/emissive_items.csv +++ b/sources/resources/assets/eagler/glsl/deferred/emissive_items.csv @@ -6,4 +6,5 @@ minecraft:torch,0,1.0000,0.5983,0.2655,10.0 minecraft:redstone_torch,0,1.0000,0.1578,0.0000,4.0 minecraft:sea_lantern,0,0.5530,0.6468,1.0000,10.0, minecraft:lava_bucket,0,1.0000,0.4461,0.1054,6.0, -minecraft:nether_star,0,0.5711,0.6611,1.0000,6.0 \ No newline at end of file +minecraft:nether_star,0,0.5711,0.6611,1.0000,6.0 +minecraft:ender_eye,0,0.1990,0.7750,0.4130,4.0 \ No newline at end of file diff --git a/sources/resources/assets/eagler/glsl/deferred/shader_pack_info.json b/sources/resources/assets/eagler/glsl/deferred/shader_pack_info.json index 556d342c..6b573dae 100644 --- a/sources/resources/assets/eagler/glsl/deferred/shader_pack_info.json +++ b/sources/resources/assets/eagler/glsl/deferred/shader_pack_info.json @@ -1,7 +1,7 @@ { "name": "§eHigh Performance PBR", "desc": "Pack made from scratch specifically for this client, designed to give what I call the best balance between quality and performance possible in a browser but obviously that's just my opinion", - "vers": "1.1.0", + "vers": "1.2.0", "author": "lax1dude", "api_vers": 1, "features": [ diff --git a/sources/resources/assets/eagler/glsl/dynamiclights/accel_particle_dynamiclights.fsh b/sources/resources/assets/eagler/glsl/dynamiclights/accel_particle_dynamiclights.fsh new file mode 100644 index 00000000..1492065f --- /dev/null +++ b/sources/resources/assets/eagler/glsl/dynamiclights/accel_particle_dynamiclights.fsh @@ -0,0 +1,67 @@ +#line 2 + +/* + * Copyright (c) 2024 lax1dude. All Rights Reserved. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +precision lowp int; +precision mediump float; +precision mediump sampler2D; + +in vec4 v_position4f; +in vec2 v_texCoord2f; +in vec4 v_color4f; +in vec2 v_lightmap2f; + +layout(location = 0) out vec4 output4f; + +uniform sampler2D u_inputTexture; +uniform sampler2D u_lightmapTexture; + +uniform mat4 u_inverseViewMatrix4f; + +layout(std140) uniform u_chunkLightingData { + mediump int u_dynamicLightCount1i; + mediump int _paddingA_; + mediump int _paddingB_; + mediump int _paddingC_; + mediump vec4 u_dynamicLightArray[12]; +}; + +void main() { + vec4 color = texture(u_inputTexture, v_texCoord2f) * v_color4f; + + if(color.a < 0.004) { + discard; + } + + vec4 light; + float diffuse = 0.0; + if(u_dynamicLightCount1i > 0) { + vec4 worldPosition4f = u_inverseViewMatrix4f * v_position4f; + worldPosition4f.xyz /= worldPosition4f.w; + vec3 normalVector3f = normalize(u_inverseViewMatrix4f[2].xyz); + int safeLightCount = u_dynamicLightCount1i > 12 ? 0 : u_dynamicLightCount1i; + for(int i = 0; i < safeLightCount; ++i) { + light = u_dynamicLightArray[i]; + light.xyz = light.xyz - worldPosition4f.xyz; + diffuse += max(dot(normalize(light.xyz), normalVector3f) * 0.8 + 0.2, 0.0) * max(light.w - sqrt(dot(light.xyz, light.xyz)), 0.0); + } + } + + color *= texture(u_lightmapTexture, vec2(min(v_lightmap2f.x + diffuse * 0.066667, 1.0), v_lightmap2f.y)); + + output4f = color; +} diff --git a/sources/resources/assets/eagler/glsl/dynamiclights/accel_particle_dynamiclights.vsh b/sources/resources/assets/eagler/glsl/dynamiclights/accel_particle_dynamiclights.vsh new file mode 100644 index 00000000..202bd153 --- /dev/null +++ b/sources/resources/assets/eagler/glsl/dynamiclights/accel_particle_dynamiclights.vsh @@ -0,0 +1,61 @@ +#line 2 + +/* + * Copyright (c) 2024 lax1dude. All Rights Reserved. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +precision lowp int; +precision highp float; +precision mediump sampler2D; + +layout(location = 0) in vec2 a_position2f; + +layout(location = 1) in vec3 p_position3f; +layout(location = 2) in vec2 p_texCoords2i; +layout(location = 3) in vec2 p_lightMap2f; +layout(location = 4) in vec2 p_particleSize_texCoordsSize_2i; +layout(location = 5) in vec4 p_color4f; + +out vec4 v_position4f; +out vec2 v_texCoord2f; +out vec4 v_color4f; +out vec2 v_lightmap2f; + +uniform mat4 u_modelViewMatrix4f; +uniform mat4 u_projectionMatrix4f; +uniform vec3 u_texCoordSize2f_particleSize1f; +uniform vec3 u_transformParam_1_2_5_f; +uniform vec2 u_transformParam_3_4_f; +uniform vec4 u_color4f; + +void main() { + v_color4f = u_color4f * p_color4f.bgra; + v_lightmap2f = p_lightMap2f; + + vec2 tex2f = a_position2f * 0.5 + 0.5; + tex2f.y = 1.0 - tex2f.y; + tex2f = p_texCoords2i + tex2f * p_particleSize_texCoordsSize_2i.y; + v_texCoord2f = tex2f * u_texCoordSize2f_particleSize1f.xy; + + float particleSize = u_texCoordSize2f_particleSize1f.z * p_particleSize_texCoordsSize_2i.x; + + vec3 pos3f = p_position3f; + vec2 spos2f = a_position2f * particleSize; + pos3f += u_transformParam_1_2_5_f * spos2f.xyy; + pos3f.zx += u_transformParam_3_4_f * spos2f; + + v_position4f = u_modelViewMatrix4f * vec4(pos3f, 1.0); + gl_Position = u_projectionMatrix4f * v_position4f; +} diff --git a/sources/resources/assets/eagler/glsl/dynamiclights/core_dynamiclights.fsh b/sources/resources/assets/eagler/glsl/dynamiclights/core_dynamiclights.fsh new file mode 100644 index 00000000..aeaebf5b --- /dev/null +++ b/sources/resources/assets/eagler/glsl/dynamiclights/core_dynamiclights.fsh @@ -0,0 +1,210 @@ +#line 2 + +/* + * Copyright (c) 2022-2024 lax1dude. All Rights Reserved. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +in vec4 v_position4f; + +#ifdef COMPILE_TEXTURE_ATTRIB +in vec2 v_texture2f; +#endif + +uniform vec4 u_color4f; + +#ifdef COMPILE_BLEND_ADD +uniform vec4 u_colorBlendSrc4f; +uniform vec4 u_colorBlendAdd4f; +#endif + +#ifdef COMPILE_COLOR_ATTRIB +in vec4 v_color4f; +#endif + +#ifdef COMPILE_NORMAL_ATTRIB +in vec3 v_normal3f; +#endif + +#ifdef COMPILE_LIGHTMAP_ATTRIB +in vec2 v_lightmap2f; +#endif + +#ifdef COMPILE_ENABLE_TEXTURE2D +uniform sampler2D u_samplerTexture; +#if !defined(COMPILE_TEXTURE_ATTRIB) && !defined(COMPILE_ENABLE_TEX_GEN) +uniform vec2 u_textureCoords01; +#endif +#endif + +#ifdef COMPILE_ENABLE_LIGHTMAP +uniform sampler2D u_samplerLightmap; +#ifndef COMPILE_LIGHTMAP_ATTRIB +uniform vec2 u_textureCoords02; +#endif +#endif + +#ifdef COMPILE_ENABLE_ALPHA_TEST +uniform float u_alphaTestRef1f; +#endif + +#ifdef COMPILE_ENABLE_MC_LIGHTING +uniform int u_lightsEnabled1i; +uniform vec4 u_lightsDirections4fv[4]; +uniform vec3 u_lightsAmbient3f; +#endif + +#ifndef COMPILE_NORMAL_ATTRIB +uniform vec3 u_uniformNormal3f; +#endif + +#ifdef COMPILE_ENABLE_FOG +uniform vec4 u_fogParameters4f; +uniform vec4 u_fogColor4f; +#endif + +#ifdef COMPILE_ENABLE_TEX_GEN +in vec3 v_objectPosition3f; +uniform ivec4 u_texGenPlane4i; +uniform vec4 u_texGenS4f; +uniform vec4 u_texGenT4f; +uniform vec4 u_texGenR4f; +uniform vec4 u_texGenQ4f; +uniform mat4 u_textureMat4f01; +#endif + +#ifdef COMPILE_ENABLE_ANISOTROPIC_FIX +uniform vec2 u_textureAnisotropicFix; +#endif + +uniform mat4 u_inverseViewMatrix4f; + +layout(std140) uniform u_chunkLightingData { + mediump int u_dynamicLightCount1i; + mediump int _paddingA_; + mediump int _paddingB_; + mediump int _paddingC_; + mediump vec4 u_dynamicLightArray[12]; +}; + +layout(location = 0) out vec4 output4f; + +void main() { + +#ifdef COMPILE_COLOR_ATTRIB + vec4 color = v_color4f * u_color4f; +#else + vec4 color = u_color4f; +#endif + +#ifdef COMPILE_ENABLE_TEX_GEN + vec4 texGenVector; + + vec4 texGenPosSrc[2]; + texGenPosSrc[0] = vec4(v_objectPosition3f, 1.0); + texGenPosSrc[1] = v_position4f; + + texGenVector.x = dot(texGenPosSrc[u_texGenPlane4i.x], u_texGenS4f); + texGenVector.y = dot(texGenPosSrc[u_texGenPlane4i.y], u_texGenT4f); + texGenVector.z = dot(texGenPosSrc[u_texGenPlane4i.z], u_texGenR4f); + texGenVector.w = dot(texGenPosSrc[u_texGenPlane4i.w], u_texGenQ4f); + + texGenVector = u_textureMat4f01 * texGenVector; + color *= texture(u_samplerTexture, texGenVector.xy / texGenVector.w); + +#ifdef COMPILE_ENABLE_ALPHA_TEST + if(color.a < u_alphaTestRef1f) discard; +#endif + +#else + +#ifdef COMPILE_ENABLE_TEXTURE2D +#ifdef COMPILE_TEXTURE_ATTRIB +#ifdef COMPILE_ENABLE_ANISOTROPIC_FIX + // d3d11 doesn't support GL_NEAREST upscaling with anisotropic + // filtering enabled, so it needs this stupid fix to 'work' + vec2 uv = floor(v_texture2f * u_textureAnisotropicFix) + 0.5; + color *= texture(u_samplerTexture, uv / u_textureAnisotropicFix); +#else + color *= texture(u_samplerTexture, v_texture2f); +#endif +#else + color *= texture(u_samplerTexture, u_textureCoords01); +#endif +#endif + +#ifdef COMPILE_NORMAL_ATTRIB + vec3 normal = normalize(v_normal3f); +#else + vec3 normal = u_uniformNormal3f; +#endif + +#ifdef COMPILE_ENABLE_LIGHTMAP + float diffuse = 0.0; + vec4 light; + if(u_dynamicLightCount1i > 0) { + vec4 worldPosition4f = u_inverseViewMatrix4f * v_position4f; + worldPosition4f.xyz /= worldPosition4f.w; + vec3 normalVector3f = normalize(mat3(u_inverseViewMatrix4f) * normal); + int safeLightCount = u_dynamicLightCount1i > 12 ? 0 : u_dynamicLightCount1i; + for(int i = 0; i < safeLightCount; ++i) { + light = u_dynamicLightArray[i]; + light.xyz = light.xyz - worldPosition4f.xyz; + diffuse += max(dot(normalize(light.xyz), normalVector3f) * 0.8 + 0.2, 0.0) * max(light.w - sqrt(dot(light.xyz, light.xyz)), 0.0); + } + } +#ifdef COMPILE_LIGHTMAP_ATTRIB + color *= texture(u_samplerLightmap, vec2(min(v_lightmap2f.x + diffuse * 0.066667, 1.0), v_lightmap2f.y)); +#else + color *= texture(u_samplerLightmap, vec2(min(u_textureCoords02.x + diffuse * 0.066667, 1.0), u_textureCoords02.y)); +#endif +#endif + +#ifdef COMPILE_BLEND_ADD + color = color * u_colorBlendSrc4f + u_colorBlendAdd4f; +#endif + +#ifdef COMPILE_ENABLE_ALPHA_TEST + if(color.a < u_alphaTestRef1f) discard; +#endif + +#endif + +#ifdef COMPILE_ENABLE_MC_LIGHTING +#ifndef COMPILE_ENABLE_LIGHTMAP + vec4 light; + float diffuse = 0.0; +#else + diffuse = 0.0; +#endif + for(int i = 0; i < u_lightsEnabled1i; ++i) { + light = u_lightsDirections4fv[i]; + diffuse += max(dot(light.xyz, normal), 0.0) * light.w; + } + color.rgb *= min(u_lightsAmbient3f + vec3(diffuse), 1.0); +#endif + +#ifdef COMPILE_ENABLE_FOG + vec3 fogPos = v_position4f.xyz / v_position4f.w; + float dist = sqrt(dot(fogPos, fogPos)); + float fogDensity = u_fogParameters4f.y; + float fogStart = u_fogParameters4f.z; + float fogEnd = u_fogParameters4f.w; + float f = u_fogParameters4f.x > 0.0 ? 1.0 - exp(-fogDensity * dist) : + (dist - fogStart) / (fogEnd - fogStart); + color.rgb = mix(color.rgb, u_fogColor4f.rgb, clamp(f, 0.0, 1.0) * u_fogColor4f.a); +#endif + + output4f = color; +} diff --git a/sources/resources/assets/eagler/glsl/dynamiclights/core_dynamiclights.vsh b/sources/resources/assets/eagler/glsl/dynamiclights/core_dynamiclights.vsh new file mode 100644 index 00000000..023b204f --- /dev/null +++ b/sources/resources/assets/eagler/glsl/dynamiclights/core_dynamiclights.vsh @@ -0,0 +1,80 @@ +#line 2 + +/* + * Copyright (c) 2022-2024 lax1dude. All Rights Reserved. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +in vec3 a_position3f; + +out vec4 v_position4f; + +#ifdef COMPILE_ENABLE_TEX_GEN +out vec3 v_objectPosition3f; +#endif + +#ifdef COMPILE_TEXTURE_ATTRIB +in vec2 a_texture2f; +out vec2 v_texture2f; +uniform mat4 u_textureMat4f01; +#endif + +#ifdef COMPILE_COLOR_ATTRIB +in vec4 a_color4f; +out vec4 v_color4f; +#endif + +#ifdef COMPILE_NORMAL_ATTRIB +in vec4 a_normal4f; +out vec3 v_normal3f; +#endif + +#ifdef COMPILE_LIGHTMAP_ATTRIB +in vec2 a_lightmap2f; +out vec2 v_lightmap2f; +uniform mat4 u_textureMat4f02; +#endif + +uniform mat4 u_modelviewMat4f; +uniform mat4 u_projectionMat4f; + +#define TEX_MAT3(mat4In) mat3(mat4In[0].xyw,mat4In[1].xyw,mat4In[3].xyw) + +void main() { +#ifdef COMPILE_ENABLE_TEX_GEN + v_objectPosition3f = a_position3f; +#endif + + v_position4f = u_modelviewMat4f * vec4(a_position3f, 1.0); + +#ifdef COMPILE_TEXTURE_ATTRIB + vec3 v_textureTmp3f = TEX_MAT3(u_textureMat4f01) * vec3(a_texture2f, 1.0); + v_texture2f = v_textureTmp3f.xy / v_textureTmp3f.z; +#endif + +#ifdef COMPILE_COLOR_ATTRIB + v_color4f = a_color4f; +#endif + +#ifdef COMPILE_NORMAL_ATTRIB + v_normal3f = normalize(mat3(u_modelviewMat4f) * a_normal4f.xyz); +#endif + +#ifdef COMPILE_LIGHTMAP_ATTRIB + vec3 v_lightmapTmp3f = TEX_MAT3(u_textureMat4f02) * vec3(a_lightmap2f, 1.0); + v_lightmap2f = v_lightmapTmp3f.xy / v_lightmapTmp3f.z; +#endif + + gl_Position = u_projectionMat4f * v_position4f; +} diff --git a/sources/resources/assets/eagler/mesh/readme.txt b/sources/resources/assets/eagler/mesh/readme.txt new file mode 100644 index 00000000..6c8b2bdc --- /dev/null +++ b/sources/resources/assets/eagler/mesh/readme.txt @@ -0,0 +1,9 @@ +THESE ARE NOT DOOM/GMOD MODELS! + +The FNAW skins are stored in a proprietary format created by lax1dude. + +The format is a container for raw OpenGL vertex buffer and index buffer data intended to be copied directly into the GPU's memory, along with a small amount of metadata. + +Data is rendered in GL_TRIANGLES mode using glDrawElements. + +See "net/lax1dude/eaglercraft/v1_8/opengl/EaglerMeshLoader.java" and "net/lax1dude/eaglercraft/v1_8/opengl/HighPolyMesh.java" for more details. \ No newline at end of file diff --git a/sources/resources/plugin_download.zip b/sources/resources/plugin_download.zip index 5975d288..a1e55c8a 100644 Binary files a/sources/resources/plugin_download.zip and b/sources/resources/plugin_download.zip differ diff --git a/sources/resources/plugin_version.json b/sources/resources/plugin_version.json index 38fd7246..94ea04eb 100644 --- a/sources/resources/plugin_version.json +++ b/sources/resources/plugin_version.json @@ -1 +1 @@ -{"pluginName":"EaglercraftXBungee","pluginVersion":"1.2.3","pluginButton":"Download \"EaglerXBungee-1.2.3.jar\"","pluginFilename":"EaglerXBungee.zip"} \ No newline at end of file +{"pluginName":"EaglercraftXBungee","pluginVersion":"1.2.5","pluginButton":"Download \"EaglerXBungee-1.2.5.jar\"","pluginFilename":"EaglerXBungee.zip"} \ No newline at end of file