diff --git a/README.md b/README.md index 9a1ea15..de94b02 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 c274cdd..979e1e0 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 c7ee4d5..34e1f62 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 0d95cd3..5e45371 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 4575877..18744aa 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 79b6299..dfc213e 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 fa604c3..2d31d35 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 c51f2e5..ba34f71 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 49100d5..f4b0620 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 6fdaeda..309af9a 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 128721b..7fc3db9 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 888bd90..0f4527a 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 44bb643..c733169 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 0cc3b81..4ed39be 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 c59f9a2..1542328 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 64a370f..0abe69e 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 0814ccf..1fc12ec 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 0c9ab50..c2b7391 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 1c496f4..bcd091b 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 4bdf575..a8491ab 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 4da548e..8d6e6b9 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 a8dd664..4c1585c 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 0000000..8a4467a --- /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 667ee1d..05f4831 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 f670b53..d391f9b 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 970b21a..9b0490a 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 ce06b6a..96792af 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 43a3622..dba6a86 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 0e688dc..b64736a 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 1953bed..8e40818 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 a8dd664..19567d5 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 f43a7b8..32fe8ad 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 ac58e6e..d0f520c 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 37072b7..262e598 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 1070e89..a5f3a73 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 b95a755..ce33e0a 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 3db4ee2..b59977a 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 7ab1fe2..41997c4 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 32a7a08..d1b0862 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 5a0f735..40157c1 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 e50442f..9faa82c 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 e068c6a..a516a7c 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 87c486a..1229f6c 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 82a06c5..92cb66b 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 f90a6ac..eb8b4d2 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 c73afac..e80100d 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 51803e7..5e01856 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 7fd6bd1..cb88eab 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 d24d97d..dd0c9d7 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 028bd7b..e18e15a 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 3e397c6..466eb65 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 3d6c1e4..3b6005e 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 c01d22c..ee1230e 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 94c4878..c597da1 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 22b85de..f0081ac 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 24eb3b5..daff0b1 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 d4f37bc..c004a4b 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 d18b8b7..78992be 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 6639281..9b7099f 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 2f98334..93484c5 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 3170036..05e7a77 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 605bccf..1b714c0 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 593fae8..37819b9 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 4307e41..32b4b8c 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 9aa9dc1..68d5d0a 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 ffd3961..246a8c5 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 b272b48..5571027 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 691080f..45655d1 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 ac2749a..a9f18bc 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 0000000..ab8f3c5 --- /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 0000000..72ec488 --- /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 0000000..cc38016 --- /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 0000000..23d6a30 --- /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 0000000..ad7bac9 --- /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 0000000..3fc0346 --- /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 0000000..2e23c32 --- /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 9d02b25..1479e01 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 80051fc..5c3904c 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 0000000..c13e4aa --- /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 f85176d..f501c67 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 73fb100..20c96be 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 fc085c0..bf6ae1a 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 0c058fb..ce8e590 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 f4ab94e..59becc7 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 fc68f1b..b750732 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 6056c8b..f7814db 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 556d342..6b573da 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 0000000..1492065 --- /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 0000000..202bd15 --- /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 0000000..aeaebf5 --- /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 0000000..023b204 --- /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 0000000..6c8b2bd --- /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 5975d28..a1e55c8 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 38fd724..94ea04e 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