posToSkip = MC_RENDER.getRenderedChunks();
// remove everything outside the skipRadius,
@@ -429,8 +407,7 @@ public class LodUtil
{
if (x <= centerChunk.getX() - skipRadius || x >= centerChunk.getX() + skipRadius
|| z <= centerChunk.getZ() - skipRadius || z >= centerChunk.getZ() + skipRadius)
- posToSkip.remove(new ChunkPos(x, z));
-
+ posToSkip.remove(new ChunkPosWrapper(x, z));
}
}
}
@@ -438,38 +415,6 @@ public class LodUtil
}
- /**
- * This method returns the ChunkPos of all chunks that Minecraft
- * is going to render this frame.
- *
- * Note: This isn't perfect. It will return some chunks that are outside
- * the clipping plane. (For example, if you are high above the ground some chunks
- * will be incorrectly added, even though they are outside render range).
- */
- public static HashSet getRenderedChunks()
- {
- HashSet loadedPos = new HashSet<>();
-
- // Wow, those are some long names!
-
- // go through every RenderInfo to get the compiled chunks
- WorldRenderer renderer = mc.getLevelRenderer();
- for (WorldRenderer.LocalRenderInformationContainer worldRenderer$LocalRenderInformationContainer : renderer.renderChunks)
- {
- CompiledChunk compiledChunk = worldRenderer$LocalRenderInformationContainer.chunk.getCompiledChunk();
- if (!compiledChunk.hasNoRenderableLayers())
- {
- // add the ChunkPos for every rendered chunk
- BlockPos bpos = worldRenderer$LocalRenderInformationContainer.chunk.getOrigin();
-
- loadedPos.add(new ChunkPos(bpos));
- }
- }
-
-
- return loadedPos;
- }
-
/**
* This method find if a given chunk is a border chunk of the renderable ones
* @param vanillaRenderedChunks matrix of the vanilla rendered chunks
@@ -498,10 +443,10 @@ public class LodUtil
/** This is copied from Minecraft's MathHelper class */
public static float fastInvSqrt(float numb)
{
- float half = 0.5F * numb;
- int i = Float.floatToIntBits(numb);
- i = 1597463007 - (i >> 1);
- numb = Float.intBitsToFloat(i);
- return numb * (1.5F - half * numb * numb);
- }
+ float half = 0.5F * numb;
+ int i = Float.floatToIntBits(numb);
+ i = 1597463007 - (i >> 1);
+ numb = Float.intBitsToFloat(i);
+ return numb * (1.5F - half * numb * numb);
+ }
}
diff --git a/src/main/java/com/seibel/lod/core/wrapperAdapters/block/AbstractBlockPosWrapper.java b/src/main/java/com/seibel/lod/core/wrapperAdapters/block/AbstractBlockPosWrapper.java
new file mode 100644
index 000000000..ba005186b
--- /dev/null
+++ b/src/main/java/com/seibel/lod/core/wrapperAdapters/block/AbstractBlockPosWrapper.java
@@ -0,0 +1,27 @@
+package com.seibel.lod.core.wrapperAdapters.block;
+
+import com.seibel.lod.core.enums.LodDirection;
+
+public abstract class AbstractBlockPosWrapper
+{
+ public AbstractBlockPosWrapper()
+ {
+
+ }
+
+ public AbstractBlockPosWrapper(int x, int y, int z)
+ {
+
+ }
+
+ public abstract void set(int x, int y, int z);
+
+ public abstract int getX();
+ public abstract int getY();
+ public abstract int getZ();
+
+ public abstract int get(LodDirection.Axis axis);
+
+ /** returns itself */
+ public abstract AbstractBlockPosWrapper offset(int x, int y, int z);
+}
diff --git a/src/main/java/com/seibel/lod/core/wrapperAdapters/minecraft/IMinecraftRenderWrapper.java b/src/main/java/com/seibel/lod/core/wrapperAdapters/minecraft/IMinecraftRenderWrapper.java
new file mode 100644
index 000000000..a7e777dd0
--- /dev/null
+++ b/src/main/java/com/seibel/lod/core/wrapperAdapters/minecraft/IMinecraftRenderWrapper.java
@@ -0,0 +1,49 @@
+package com.seibel.lod.core.wrapperAdapters.minecraft;
+
+import java.util.HashSet;
+
+import com.seibel.lod.core.objects.math.Mat4f;
+import com.seibel.lod.core.objects.math.Vec3d;
+import com.seibel.lod.core.objects.math.Vec3f;
+import com.seibel.lod.core.wrapperAdapters.block.AbstractBlockPosWrapper;
+import com.seibel.lod.wrappers.chunk.ChunkPosWrapper;
+
+/**
+ * Contains everything related to
+ * rendering in Minecraft.
+ *
+ * @author James Seibel
+ * @version 11-18-2021
+ */
+public interface IMinecraftRenderWrapper
+{
+ public Vec3f getLookAtVector();
+
+ public AbstractBlockPosWrapper getCameraBlockPosition();
+
+ public boolean playerHasBlindnessEffect();
+
+ public Vec3d getCameraExactPosition();
+
+ public Mat4f getDefaultProjectionMatrix(float partialTicks);
+
+ public double getGamma();
+
+ public double getFov(float partialTicks);
+
+ /** Measured in chunks */
+ public int getRenderDistance();
+
+ public int getScreenWidth();
+ public int getScreenHeight();
+
+ /**
+ * This method returns the ChunkPos of all chunks that Minecraft
+ * is going to render this frame.
+ *
+ * Note: This isn't perfect. It will return some chunks that are outside
+ * the clipping plane. (For example, if you are high above the ground some chunks
+ * will be incorrectly added, even though they are outside render range).
+ */
+ public HashSet getRenderedChunks();
+}
diff --git a/src/main/java/com/seibel/lod/core/wrapperAdapters/minecraft/IMinecraftWrapper.java b/src/main/java/com/seibel/lod/core/wrapperAdapters/minecraft/IMinecraftWrapper.java
index fef941410..5c5dd6022 100644
--- a/src/main/java/com/seibel/lod/core/wrapperAdapters/minecraft/IMinecraftWrapper.java
+++ b/src/main/java/com/seibel/lod/core/wrapperAdapters/minecraft/IMinecraftWrapper.java
@@ -66,6 +66,10 @@ public interface IMinecraftWrapper
public boolean hasSinglePlayerServer();
+ public String getCurrentServerName();
+ public String getCurrentServerIp();
+ public String getCurrentServerVersion();
+
/** Returns the dimension the player is currently in */
public DimensionTypeWrapper getCurrentDimension();
@@ -112,9 +116,6 @@ public interface IMinecraftWrapper
public WorldWrapper getWrappedClientWorld();
- /** Measured in chunks */
- public int getRenderDistance();
-
public File getGameDirectory();
public IProfiler getProfiler();
@@ -140,8 +141,12 @@ public interface IMinecraftWrapper
*/
public void crashMinecraft(String errorMessage, Throwable exception);
-
-
+
+
+
+
+
+
diff --git a/src/main/java/com/seibel/lod/wrappers/DependencySetup.java b/src/main/java/com/seibel/lod/wrappers/DependencySetup.java
index 8f35e82bc..a7498e269 100644
--- a/src/main/java/com/seibel/lod/wrappers/DependencySetup.java
+++ b/src/main/java/com/seibel/lod/wrappers/DependencySetup.java
@@ -3,9 +3,11 @@ package com.seibel.lod.wrappers;
import com.seibel.lod.core.wrapperAdapters.SingletonHandler;
import com.seibel.lod.core.wrapperAdapters.block.IBlockColorSingletonWrapper;
import com.seibel.lod.core.wrapperAdapters.config.ILodConfigWrapperSingleton;
+import com.seibel.lod.core.wrapperAdapters.minecraft.IMinecraftRenderWrapper;
import com.seibel.lod.core.wrapperAdapters.minecraft.IMinecraftWrapper;
import com.seibel.lod.wrappers.block.BlockColorSingletonWrapper;
import com.seibel.lod.wrappers.config.LodConfigWrapperSingleton;
+import com.seibel.lod.wrappers.minecraft.MinecraftRenderWrapper;
import com.seibel.lod.wrappers.minecraft.MinecraftWrapper;
/**
@@ -24,5 +26,6 @@ public class DependencySetup
SingletonHandler.bind(ILodConfigWrapperSingleton.class, LodConfigWrapperSingleton.INSTANCE);
SingletonHandler.bind(IBlockColorSingletonWrapper.class, BlockColorSingletonWrapper.INSTANCE);
SingletonHandler.bind(IMinecraftWrapper.class, MinecraftWrapper.INSTANCE);
+ SingletonHandler.bind(IMinecraftRenderWrapper.class, MinecraftRenderWrapper.INSTANCE);
}
}
diff --git a/src/main/java/com/seibel/lod/wrappers/minecraft/MinecraftRenderWrapper.java b/src/main/java/com/seibel/lod/wrappers/minecraft/MinecraftRenderWrapper.java
new file mode 100644
index 000000000..cfc30b7cd
--- /dev/null
+++ b/src/main/java/com/seibel/lod/wrappers/minecraft/MinecraftRenderWrapper.java
@@ -0,0 +1,137 @@
+package com.seibel.lod.wrappers.minecraft;
+
+import java.util.HashSet;
+
+import com.seibel.lod.core.objects.math.Mat4f;
+import com.seibel.lod.core.objects.math.Vec3d;
+import com.seibel.lod.core.objects.math.Vec3f;
+import com.seibel.lod.core.wrapperAdapters.block.AbstractBlockPosWrapper;
+import com.seibel.lod.core.wrapperAdapters.minecraft.IMinecraftRenderWrapper;
+import com.seibel.lod.wrappers.block.BlockPosWrapper;
+import com.seibel.lod.wrappers.chunk.ChunkPosWrapper;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.ActiveRenderInfo;
+import net.minecraft.client.renderer.GameRenderer;
+import net.minecraft.client.renderer.WorldRenderer;
+import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher.CompiledChunk;
+import net.minecraft.potion.Effects;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.vector.Vector3d;
+import net.minecraft.util.math.vector.Vector3f;
+
+/**
+ * A singleton that contains everything
+ * related to rendering in Minecraft.
+ *
+ * @author James Seibel
+ * @version 11-18-2021
+ */
+public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
+{
+ public static final MinecraftRenderWrapper INSTANCE = new MinecraftRenderWrapper();
+
+ private final GameRenderer gameRenderer = Minecraft.getInstance().gameRenderer;
+ private final static Minecraft mc = Minecraft.getInstance();
+
+
+
+ @Override
+ public Vec3f getLookAtVector()
+ {
+ ActiveRenderInfo camera = gameRenderer.getMainCamera();
+ Vector3f cameraDir = camera.getLookVector();
+ return new Vec3f(cameraDir.x(), cameraDir.y(), cameraDir.z());
+ }
+
+ @Override
+ public AbstractBlockPosWrapper getCameraBlockPosition()
+ {
+ ActiveRenderInfo camera = gameRenderer.getMainCamera();
+ BlockPos blockPos = camera.getBlockPosition();
+ return new BlockPosWrapper(blockPos.getX(), blockPos.getY(), blockPos.getZ());
+ }
+
+ @Override
+ public boolean playerHasBlindnessEffect()
+ {
+ return mc.player.getActiveEffectsMap().get(Effects.BLINDNESS) != null;
+ }
+
+ @Override
+ public Vec3d getCameraExactPosition()
+ {
+ ActiveRenderInfo camera = gameRenderer.getMainCamera();
+ Vector3d projectedView = camera.getPosition();
+
+ return new Vec3d(projectedView.x, projectedView.y, projectedView.z);
+ }
+
+ @Override
+ public Mat4f getDefaultProjectionMatrix(float partialTicks)
+ {
+ return McObjectConverter.Convert(gameRenderer.getProjectionMatrix(gameRenderer.getMainCamera(), partialTicks, true));
+ }
+
+ @Override
+ public double getGamma()
+ {
+ return mc.options.gamma;
+ }
+
+ @Override
+ public double getFov(float partialTicks)
+ {
+ return gameRenderer.getFov(gameRenderer.getMainCamera(), partialTicks, true);
+ }
+
+ /** Measured in chunks */
+ @Override
+ public int getRenderDistance()
+ {
+ return mc.options.renderDistance;
+ }
+
+ @Override
+ public int getScreenWidth()
+ {
+ return mc.getWindow().getWidth();
+ }
+ @Override
+ public int getScreenHeight()
+ {
+ return mc.getWindow().getHeight();
+ }
+
+ /**
+ * This method returns the ChunkPos of all chunks that Minecraft
+ * is going to render this frame.
+ *
+ * Note: This isn't perfect. It will return some chunks that are outside
+ * the clipping plane. (For example, if you are high above the ground some chunks
+ * will be incorrectly added, even though they are outside render range).
+ */
+ @Override
+ public HashSet getRenderedChunks()
+ {
+ HashSet loadedPos = new HashSet<>();
+
+ // Wow, those are some long names!
+
+ // go through every RenderInfo to get the compiled chunks
+ WorldRenderer renderer = mc.levelRenderer;
+ for (WorldRenderer.LocalRenderInformationContainer worldRenderer$LocalRenderInformationContainer : renderer.renderChunks)
+ {
+ CompiledChunk compiledChunk = worldRenderer$LocalRenderInformationContainer.chunk.getCompiledChunk();
+ if (!compiledChunk.hasNoRenderableLayers())
+ {
+ // add the ChunkPos for every rendered chunk
+ BlockPos bpos = worldRenderer$LocalRenderInformationContainer.chunk.getOrigin();
+
+ loadedPos.add(new ChunkPosWrapper(bpos));
+ }
+ }
+
+ return loadedPos;
+ }
+}
diff --git a/src/main/java/com/seibel/lod/wrappers/minecraft/MinecraftWrapper.java b/src/main/java/com/seibel/lod/wrappers/minecraft/MinecraftWrapper.java
index c137fbeae..23bafd476 100644
--- a/src/main/java/com/seibel/lod/wrappers/minecraft/MinecraftWrapper.java
+++ b/src/main/java/com/seibel/lod/wrappers/minecraft/MinecraftWrapper.java
@@ -121,6 +121,24 @@ public class MinecraftWrapper implements IMinecraftWrapper
return mc.hasSingleplayerServer();
}
+ @Override
+ public String getCurrentServerName()
+ {
+ return mc.getCurrentServer().name;
+ }
+
+ @Override
+ public String getCurrentServerIp()
+ {
+ return mc.getCurrentServer().ip;
+ }
+
+ @Override
+ public String getCurrentServerVersion()
+ {
+ return mc.getCurrentServer().version.getString();
+ }
+
/** Returns the dimension the player is currently in */
@Override
public DimensionTypeWrapper getCurrentDimension()
@@ -259,13 +277,6 @@ public class MinecraftWrapper implements IMinecraftWrapper
return WorldWrapper.getWorldWrapper(mc.level);
}
- /** Measured in chunks */
- @Override
- public int getRenderDistance()
- {
- return mc.options.renderDistance;
- }
-
@Override
public File getGameDirectory()
{
@@ -364,6 +375,7 @@ public class MinecraftWrapper implements IMinecraftWrapper
Minecraft.crash(report);
}
+