diff --git a/src/main/java/com/replaymod/core/versions/MCVer.java b/src/main/java/com/replaymod/core/versions/MCVer.java index 0f2ed434..4af23393 100644 --- a/src/main/java/com/replaymod/core/versions/MCVer.java +++ b/src/main/java/com/replaymod/core/versions/MCVer.java @@ -15,6 +15,7 @@ import net.minecraft.client.multiplayer.WorldClient; import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.resources.ResourcePackRepository; import net.minecraft.crash.CrashReportCategory; import net.minecraft.entity.Entity; @@ -22,6 +23,7 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.network.Packet; import net.minecraft.network.PacketBuffer; +import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; import net.minecraft.world.WorldType; import net.minecraft.world.chunk.Chunk; @@ -37,8 +39,10 @@ import net.minecraft.client.renderer.BufferBuilder; //#else //$$ import net.minecraft.client.renderer.VertexBuffer; //#endif +import net.minecraft.client.particle.Particle; import net.minecraft.util.math.MathHelper; //#else +//$$ import net.minecraft.client.particle.EntityFX; //$$ import net.minecraft.client.renderer.WorldRenderer; //$$ import net.minecraft.util.MathHelper; //#endif @@ -188,6 +192,13 @@ public class MCVer { //$$ = WorldType.DEBUG_WORLD; //#endif + public static ResourceLocation LOCATION_BLOCKS_TEXTURE + //#if MC>=10904 + = TextureMap.LOCATION_BLOCKS_TEXTURE; + //#else + //$$ = TextureMap.locationBlocksTexture; + //#endif + public static EntityPlayerSP player(Minecraft mc) { //#if MC>=11102 return mc.player; @@ -396,6 +407,23 @@ public class MCVer { //$$ worldRenderer.addVertexWithUV(x, y, z, u, v); //#endif } + + //#if MC>=11200 + public static BufferBuilder getBuffer(Tessellator tessellator) { + //#else + //$$ public static WorldRenderer getBuffer(Tessellator tessellator) { + //#endif + //#if MC>=10904 + //#if MC>=11200 + return Tessellator.getInstance().getBuffer(); + //#else + //$$ return Tessellator.getInstance().getBuffer(); + //#endif + //#else + //$$ return Tessellator.getInstance().getWorldRenderer(); + //#endif + } + public static int floor(double val) { //#if MC>=11102 return MathHelper.floor(val); @@ -411,4 +439,28 @@ public class MCVer { public static float sin(float val) { return MathHelper.sin(val); } + + public static double interpPosX() { + //#if MC>=10904 + return Particle.interpPosX; + //#else + //$$ return EntityFX.interpPosX; + //#endif + } + + public static double interpPosY() { + //#if MC>=10904 + return Particle.interpPosY; + //#else + //$$ return EntityFX.interpPosY; + //#endif + } + + public static double interpPosZ() { + //#if MC>=10904 + return Particle.interpPosZ; + //#else + //$$ return EntityFX.interpPosZ; + //#endif + } } diff --git a/src/main/java/com/replaymod/render/blend/BlendMeshBuilder.java b/src/main/java/com/replaymod/render/blend/BlendMeshBuilder.java index fcbb8380..945f108b 100644 --- a/src/main/java/com/replaymod/render/blend/BlendMeshBuilder.java +++ b/src/main/java/com/replaymod/render/blend/BlendMeshBuilder.java @@ -3,20 +3,33 @@ package com.replaymod.render.blend; import com.replaymod.render.blend.data.DMaterial; import com.replaymod.render.blend.data.DMesh; import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.client.renderer.vertex.VertexFormatElement; import org.lwjgl.opengl.GL11; import org.lwjgl.util.vector.Vector2f; import org.lwjgl.util.vector.Vector3f; +//#if MC>=11200 +import net.minecraft.client.renderer.BufferBuilder; +//#else +//$$ import net.minecraft.client.renderer.WorldRenderer; +//#endif + import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.IntBuffer; import java.util.ArrayList; import java.util.List; -public class BlendMeshBuilder extends WorldRenderer { +import static com.replaymod.core.versions.MCVer.*; + +public class BlendMeshBuilder + //#if MC>=11200 + extends BufferBuilder + //#else + //$$ extends WorldRenderer + //#endif +{ private final DMesh mesh; private final List vertices = new ArrayList<>(); private final List uvs = new ArrayList<>(); @@ -25,6 +38,9 @@ public class BlendMeshBuilder extends WorldRenderer { private boolean isDrawing; private boolean wellBehaved; private int mode; + //#if MC>=11200 + private double x, y, z; + //#endif private float u, v; private int color = 0xffffffff; // Default not in parent class but probably set implicitly somewhere due to re-use @@ -42,7 +58,11 @@ public class BlendMeshBuilder extends WorldRenderer { } @Override - public void startDrawing(int mode) { + //#if MC>=11200 + public void begin(int mode, VertexFormat vertexFormat) { + //#else + //$$ public void startDrawing(int mode) { + //#endif if (isDrawing) { if (!wellBehaved) { // Someone probably finished drawing with the global instance instead of this one, @@ -58,7 +78,7 @@ public class BlendMeshBuilder extends WorldRenderer { if (!wellBehaved) { // In case the calling code finishes with Tessellator.getInstance().draw() - Tessellator.getInstance().getWorldRenderer().startDrawingQuads(); + BufferBuilder_beginPosTexCol(mode); } } @@ -69,16 +89,22 @@ public class BlendMeshBuilder extends WorldRenderer { } @Override - public int finishDrawing() { + //#if MC>=11200 + public void finishDrawing() { + //#else + //$$ public int finishDrawing() { + //#endif if (!isDrawing) { throw new IllegalStateException("Not building!"); } else { if (!wellBehaved) { - Tessellator.getInstance().getWorldRenderer().finishDrawing(); + getBuffer(Tessellator.getInstance()).finishDrawing(); } doFinish(); - return -1; + //#if MC<11200 + //$$ return -1; + //#endif } } @@ -133,26 +159,70 @@ public class BlendMeshBuilder extends WorldRenderer { } } + //#if MC>=11200 + // TODO these should all behave differently depending on the order in which they're called + // e.g. tex may be called multiple times, if there are multiple active texture units @Override - public void setTextureUV(double u, double v) { + public BlendMeshBuilder tex(double u, double v) { this.u = (float) u; this.v = (float) (1 - v); + return this; } @Override - public void setColorRGBA(int r, int g, int b, int a) { + public BufferBuilder lightmap(int p_187314_1_, int p_187314_2_) { + // TODO we probably do care about this + return this; + } + + @Override + public BlendMeshBuilder color(int r, int g, int b, int a) { this.color = r | (g << 8) | (b << 16) | (a << 24); + return this; } @Override - public void addVertex(double x, double y, double z) { - x -= offset.x; - y -= offset.y; - z -= offset.z; + public BufferBuilder normal(float x, float y, float z) { + // TODO do we care about normals? + return this; + } + + @Override + public BlendMeshBuilder pos(double x, double y, double z) { + this.x = x - offset.x; + this.y = y - offset.y; + this.z = z - offset.z; + return this; + } + + @Override + public void endVertex() { vertices.add(new DMesh.Vertex((float) x, (float) -z, (float) y)); uvs.add(new Vector2f(u, v)); colors.add(color); } + //#else + //$$ @Override + //$$ public void setTextureUV(double u, double v) { + //$$ this.u = (float) u; + //$$ this.v = (float) (1 - v); + //$$ } + //$$ + //$$ @Override + //$$ public void setColorRGBA(int r, int g, int b, int a) { + //$$ this.color = r | (g << 8) | (b << 16) | (a << 24); + //$$ } + //$$ + //$$ @Override + //$$ public void addVertex(double x, double y, double z) { + //$$ x -= offset.x; + //$$ y -= offset.y; + //$$ z -= offset.z; + //$$ vertices.add(new DMesh.Vertex((float) x, (float) -z, (float) y)); + //$$ uvs.add(new Vector2f(u, v)); + //$$ colors.add(color); + //$$ } + //#endif @Override @SuppressWarnings("unchecked") @@ -164,12 +234,19 @@ public class BlendMeshBuilder extends WorldRenderer { VertexFormat vertexFormat = getVertexFormat(); int posOffset = -1, colorOffset = -1, uvOffset = -1; List elements = vertexFormat.getElements(); + int index = 0; for (VertexFormatElement element : elements) { + //#if MC>11200 + int offset = vertexFormat.getOffset(index); + //#else + //$$ int offset = element.getOffset(); + //#endif switch (element.getUsage()) { - case POSITION: posOffset = element.getOffset(); break; - case COLOR: colorOffset = element.getOffset(); break; - case UV: if (element.getIndex() == 0) uvOffset = element.getOffset(); break; + case POSITION: posOffset = offset; break; + case COLOR: colorOffset = offset; break; + case UV: if (element.getIndex() == 0) uvOffset = offset; break; } + index++; } if (posOffset == -1) throw new IllegalStateException("No position element in " + vertexFormat); if (uvOffset == -1) throw new IllegalStateException("No uv element in " + vertexFormat); @@ -179,15 +256,27 @@ public class BlendMeshBuilder extends WorldRenderer { if (colorOffset != -1) { color = buffer.getInt(offset + colorOffset); } - setTextureUV( + //#if MC>11200 + tex( + //#else + //$$ setTextureUV( + //#endif buffer.getFloat(offset + uvOffset), buffer.getFloat(offset + uvOffset + 4) ); - addVertex( + //#if MC>11200 + pos( + //#else + //$$ addVertex( + //#endif buffer.getFloat(offset + posOffset ), buffer.getFloat(offset + posOffset + 4), buffer.getFloat(offset + posOffset + 8) ); + + //#if MC>11200 + endVertex(); + //#endif } } diff --git a/src/main/java/com/replaymod/render/blend/BlendState.java b/src/main/java/com/replaymod/render/blend/BlendState.java index 2c7ba4f0..e84ab3ff 100644 --- a/src/main/java/com/replaymod/render/blend/BlendState.java +++ b/src/main/java/com/replaymod/render/blend/BlendState.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; +import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.render.ReplayModRender.LOGGER; // Note: @@ -77,7 +78,7 @@ public class BlendState implements Exporter { } catch (IOException e) { CrashReport report = CrashReport.makeCrashReport(e, "Setup of blend exporter"); CrashReportCategory category = report.makeCategory("Exporter"); - category.addCrashSectionCallable("Exporter", exporter::toString); + addDetail(category, "Exporter", exporter::toString); throw new ReportedException(report); } } @@ -91,7 +92,7 @@ public class BlendState implements Exporter { } catch (IOException e) { CrashReport report = CrashReport.makeCrashReport(e, "Tear down of blend exporter"); CrashReportCategory category = report.makeCategory("Exporter"); - category.addCrashSectionCallable("Exporter", exporter::toString); + addDetail(category, "Exporter", exporter::toString); throw new ReportedException(report); } } @@ -128,7 +129,7 @@ public class BlendState implements Exporter { } catch (IOException e) { CrashReport report = CrashReport.makeCrashReport(e, "Pre frame of blend exporter"); CrashReportCategory category = report.makeCategory("Exporter"); - category.addCrashSectionCallable("Exporter", exporter::toString); + addDetail(category, "Exporter", exporter::toString); category.addCrashSection("Frame", frame); throw new ReportedException(report); } @@ -143,7 +144,7 @@ public class BlendState implements Exporter { } catch (IOException e) { CrashReport report = CrashReport.makeCrashReport(e, "Post frame of blend exporter"); CrashReportCategory category = report.makeCategory("Exporter"); - category.addCrashSectionCallable("Exporter", exporter::toString); + addDetail(category, "Exporter", exporter::toString); category.addCrashSection("Frame", frame); throw new ReportedException(report); } diff --git a/src/main/java/com/replaymod/render/blend/data/DMesh.java b/src/main/java/com/replaymod/render/blend/data/DMesh.java index 70aaf174..18d6366c 100644 --- a/src/main/java/com/replaymod/render/blend/data/DMesh.java +++ b/src/main/java/com/replaymod/render/blend/data/DMesh.java @@ -1,6 +1,5 @@ package com.replaymod.render.blend.data; -import net.minecraft.util.Vec3i; import org.blender.dna.CustomData; import org.blender.dna.CustomDataLayer; import org.blender.dna.Image; @@ -20,6 +19,12 @@ import org.cakelab.blender.nio.CPointer; import org.lwjgl.util.vector.Vector2f; import org.lwjgl.util.vector.Vector3f; +//#if MC>=10904 +import net.minecraft.util.math.Vec3i; +//#else +//$$ import net.minecraft.util.Vec3i; +//#endif + import java.io.IOException; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/replaymod/render/blend/exporters/ChunkExporter.java b/src/main/java/com/replaymod/render/blend/exporters/ChunkExporter.java index c6f28601..536149d4 100644 --- a/src/main/java/com/replaymod/render/blend/exporters/ChunkExporter.java +++ b/src/main/java/com/replaymod/render/blend/exporters/ChunkExporter.java @@ -13,15 +13,20 @@ import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderGlobal; import net.minecraft.client.renderer.chunk.CompiledChunk; import net.minecraft.client.renderer.chunk.RenderChunk; -import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.vertex.VertexBuffer; -import net.minecraft.util.BlockPos; -import net.minecraft.util.EnumWorldBlockLayer; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL15; import org.lwjgl.util.vector.Vector2f; import org.lwjgl.util.vector.Vector3f; +//#if MC>=10904 +import net.minecraft.util.BlockRenderLayer; +import net.minecraft.util.math.BlockPos; +//#else +//$$ import net.minecraft.util.BlockPos; +//$$ import net.minecraft.util.EnumWorldBlockLayer; +//#endif + import java.io.IOException; import java.nio.ByteBuffer; import java.util.ArrayList; @@ -30,16 +35,31 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import static com.replaymod.core.versions.MCVer.*; + public class ChunkExporter implements Exporter { private final Map chunkObjects = new HashMap<>(); - private final Map> chunkLayerObjects = new HashMap<>(); - private final List> chunks = new ArrayList<>(); + //#if MC>=10904 + private final Map> chunkLayerObjects = new HashMap<>(); + private final List> chunks = new ArrayList<>(); + //#else + //$$ private final Map> chunkLayerObjects = new HashMap<>(); + //$$ private final List> chunks = new ArrayList<>(); + //#endif private DObject chunksObject; private DMaterial material; private int frame; - public void addChunkUpdate(RenderChunk chunk, EnumWorldBlockLayer layer) { - chunks.add(Pair.of(chunk, layer)); + public void addChunkUpdate(RenderChunk chunk, CompiledChunk compiledChunk) { + //#if MC>=10904 + for (BlockRenderLayer layer : BlockRenderLayer.values()) { + //#else + //$$ for (EnumWorldBlockLayer layer : EnumWorldBlockLayer.values()) { + //#endif + if (compiledChunk == null || compiledChunk.isLayerStarted(layer)) { + chunks.add(Pair.of(chunk, layer)); + } + } } @Override @@ -53,9 +73,7 @@ public class ChunkExporter implements Exporter { RenderChunk renderChunk = ReflectionUtil.get(renderInfo, "renderChunk", RenderChunk.class); // SneakyThrows CompiledChunk compiledChunk = renderChunk.getCompiledChunk(); if (!compiledChunk.isEmpty()) { - for (EnumWorldBlockLayer layer : EnumWorldBlockLayer.values()) { - addChunkUpdate(renderChunk, layer); - } + addChunkUpdate(renderChunk, null); } } @@ -79,21 +97,31 @@ public class ChunkExporter implements Exporter { @Override public void postFrame(int frame) throws IOException { - Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.locationBlocksTexture); + Minecraft.getMinecraft().getTextureManager().bindTexture(LOCATION_BLOCKS_TEXTURE); material = BlendState.getState().getMaterials().getActiveMaterial(); - for (Pair pair : chunks) { + //#if MC>=10904 + for (Pair pair : chunks) { + BlockRenderLayer layer = pair.getRight(); + //#else + //$$ for (Pair pair : chunks) { + //$$ EnumWorldBlockLayer layer = pair.getRight(); + //#endif RenderChunk chunk = pair.getLeft(); - EnumWorldBlockLayer layer = pair.getRight(); DObject chunkObject = chunkObjects.get(chunk.getPosition()); if (chunkObject == null) { chunkObject = buildChunkObject(chunk); chunkObjects.put(chunk.getPosition(), chunkObject); - chunkLayerObjects.put(chunk.getPosition(), new EnumMap<>(EnumWorldBlockLayer.class)); + chunkLayerObjects.put(chunk.getPosition(), new EnumMap<>(layer.getDeclaringClass())); } DObject layerObject = buildChunkLayerObject(chunkObject, chunk, layer); if (layerObject == null) continue; - Map layerObjects = chunkLayerObjects.get(chunk.getPosition()); + //#if MC>=10904 + Map layerObjects + //#else + //$$ Map layerObjects + //#endif + = chunkLayerObjects.get(chunk.getPosition()); DObject oldLayerObject = layerObjects.get(layer); if (oldLayerObject != null) { oldLayerObject.keyframe("hide", 0, frame, 1f); @@ -118,7 +146,12 @@ public class ChunkExporter implements Exporter { return chunkObject; } - private DObject buildChunkLayerObject(DObject chunkObject, RenderChunk renderChunk, EnumWorldBlockLayer layer) { + private DObject buildChunkLayerObject(DObject chunkObject, RenderChunk renderChunk, + //#if MC>=10904 + BlockRenderLayer layer) { + //#else + //$$ EnumWorldBlockLayer layer) { + //#endif VertexBuffer vertexBuffer = renderChunk.getVertexBufferByLayer(layer.ordinal()); if (vertexBuffer == null) return null; diff --git a/src/main/java/com/replaymod/render/blend/exporters/ItemExporter.java b/src/main/java/com/replaymod/render/blend/exporters/ItemExporter.java index c420ef03..279d18ed 100644 --- a/src/main/java/com/replaymod/render/blend/exporters/ItemExporter.java +++ b/src/main/java/com/replaymod/render/blend/exporters/ItemExporter.java @@ -4,14 +4,20 @@ import com.replaymod.render.blend.BlendMeshBuilder; import com.replaymod.render.blend.Exporter; import com.replaymod.render.blend.data.DMesh; import com.replaymod.render.blend.data.DObject; -import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.renderer.RenderItem; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.client.resources.model.IBakedModel; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraftforge.client.model.pipeline.LightUtil; +//#if MC>=10904 +import net.minecraft.client.renderer.block.model.IBakedModel; +import org.lwjgl.opengl.GL11; +//#else +//$$ import net.minecraft.client.resources.model.IBakedModel; +//#endif + import java.util.List; public class ItemExporter implements Exporter { @@ -21,8 +27,8 @@ public class ItemExporter implements Exporter { this.renderState = renderState; } - public void onRender(IBakedModel model, ItemStack stack) { - DObject object = getObjectForItemStack(model, stack); + public void onRender(RenderItem renderItem, IBakedModel model, ItemStack stack) { + DObject object = getObjectForItemStack(renderItem, model, stack); renderState.pushObject(object); renderState.pushModelView(); @@ -34,20 +40,20 @@ public class ItemExporter implements Exporter { renderState.pop(); } - private DObject getObjectForItemStack(IBakedModel model, ItemStack stack) { + private DObject getObjectForItemStack(RenderItem renderItem, IBakedModel model, ItemStack stack) { int frame = renderState.getFrame(); DObject parent = renderState.peekObject(); DObject object = null; for (DObject child : parent.getChildren()) { if (child.lastFrame < frame && child instanceof ItemBasedDObject - && ((ItemBasedDObject) child).isBasedOn(model, stack)) { + && ((ItemBasedDObject) child).isBasedOn(renderItem, model, stack)) { object = child; break; } } if (object == null) { - object = new ItemBasedDObject(model, stack); + object = new ItemBasedDObject(renderItem, model, stack); object.id.name = stack.getDisplayName(); object.setParent(parent); } @@ -56,26 +62,41 @@ public class ItemExporter implements Exporter { } @SuppressWarnings("unchecked") - private static DMesh generateMeshForItemStack(IBakedModel model, ItemStack stack) { + private static DMesh generateMeshForItemStack(RenderItem renderItem, IBakedModel model, ItemStack stack) { DMesh mesh = new DMesh(); BlendMeshBuilder builder = new BlendMeshBuilder(mesh); builder.setWellBehaved(true); - builder.startDrawingQuads(); - builder.setVertexFormat(DefaultVertexFormats.ITEM); + //#if MC>=10809 + builder.begin(GL11.GL_QUADS, DefaultVertexFormats.ITEM); + //#else + //$$ builder.startDrawingQuads(); + //$$ builder.setVertexFormat(DefaultVertexFormats.ITEM); + //#endif + //#if MC>=10904 for (EnumFacing face : EnumFacing.values()) { - renderQuads(builder, model.getFaceQuads(face), stack); + renderQuads(renderItem, builder, model.getQuads(null, face, 0), stack); } - renderQuads(builder, model.getGeneralQuads(), stack); + renderQuads(renderItem, builder, model.getQuads(null, null, 0), stack); + //#else + //$$ for (EnumFacing face : EnumFacing.values()) { + //$$ renderQuads(renderItem, builder, model.getFaceQuads(face), stack); + //$$ } + //$$ renderQuads(renderItem, builder, model.getGeneralQuads(), stack); + //#endif builder.finishDrawing(); return mesh; } - private static void renderQuads(WorldRenderer buffer, List quads, ItemStack stack) { + private static void renderQuads(RenderItem renderItem, BlendMeshBuilder buffer, List quads, ItemStack stack) { for (BakedQuad quad : quads) { int color = stack != null && quad.hasTintIndex() - ? stack.getItem().getColorFromItemStack(stack, quad.getTintIndex()) | 0xff000000 + //#if MC>=11200 + ? renderItem.itemColors.getColorFromItemstack(stack, quad.getTintIndex()) | 0xff000000 + //#else + //$$ ? stack.getItem().getColorFromItemStack(stack, quad.getTintIndex()) | 0xff000000 + //#endif : 0xffffffff; LightUtil.renderQuadColor(buffer, quad, color); } @@ -83,18 +104,20 @@ public class ItemExporter implements Exporter { } private static class ItemBasedDObject extends DObject { + private final RenderItem renderItem; private final IBakedModel model; private final ItemStack stack; private boolean valid; - public ItemBasedDObject(IBakedModel model, ItemStack stack) { - super(generateMeshForItemStack(model, stack)); + public ItemBasedDObject(RenderItem renderItem, IBakedModel model, ItemStack stack) { + super(generateMeshForItemStack(renderItem, model, stack)); + this.renderItem = renderItem; this.model = model; this.stack = stack; } - public boolean isBasedOn(IBakedModel model, ItemStack scale) { - return this.model == model; // FIXME ignores color of stack + public boolean isBasedOn(RenderItem renderItem, IBakedModel model, ItemStack stack) { + return this.renderItem == renderItem && this.model == model && this.stack == stack; } @Override diff --git a/src/main/java/com/replaymod/render/blend/exporters/ParticlesExporter.java b/src/main/java/com/replaymod/render/blend/exporters/ParticlesExporter.java index 32aa6fe4..80acae4f 100644 --- a/src/main/java/com/replaymod/render/blend/exporters/ParticlesExporter.java +++ b/src/main/java/com/replaymod/render/blend/exporters/ParticlesExporter.java @@ -6,15 +6,25 @@ import com.replaymod.render.blend.Exporter; import com.replaymod.render.blend.data.DMesh; import com.replaymod.render.blend.data.DObject; import net.minecraft.client.Minecraft; -import net.minecraft.client.particle.EntityFX; import net.minecraft.entity.Entity; import org.lwjgl.util.vector.Matrix4f; import org.lwjgl.util.vector.Vector3f; +//#if MC>=10904 +import net.minecraft.client.particle.Particle; +//#else +//$$ import net.minecraft.client.particle.EntityFX; +//#endif + +//#if MC>=10809 +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +//#endif + import java.io.IOException; import java.util.IdentityHashMap; import java.util.Map; +import static com.replaymod.core.versions.MCVer.*; import static com.replaymod.render.blend.Util.getGlModelViewMatrix; public class ParticlesExporter implements Exporter { @@ -23,8 +33,13 @@ public class ParticlesExporter implements Exporter { private DObject pointAtObject; private DObject particlesObject; private DObject litParticlesObject; - private Map particleObjects; - private Map particleObjectsSeen; + //#if MC>=10904 + private Map particleObjects; + private Map particleObjectsSeen; + //#else + //$$ private Map particleObjects; + //$$ private Map particleObjectsSeen; + //#endif public ParticlesExporter(RenderState renderState) { this.renderState = renderState; @@ -32,7 +47,7 @@ public class ParticlesExporter implements Exporter { @Override public void setup() throws IOException { - if (true) return; // FIXME make configurable (also other methods below) + if (false) return; // FIXME make configurable (also other methods below) // FIXME replace with camera pointAtObject = new DObject(DObject.Type.OB_EMPTY); pointAtObject.id.name = "Particles Target"; @@ -54,7 +69,7 @@ public class ParticlesExporter implements Exporter { } public void preParticlesRender(boolean lit) { - if (true) return; + if (false) return; Matrix4f modelView = getGlModelViewMatrix(); // Particles are rendered relative to the viewer location. // We however want our Particles object to not move when the viewer does, @@ -68,12 +83,16 @@ public class ParticlesExporter implements Exporter { } public void postParticlesRender() { - if (true) return; + if (false) return; renderState.pop(); } - public void onRender(EntityFX particle, float renderPartialTicks) { - if (true) return; + //#if MC>=10904 + public void onRender(Particle particle, float renderPartialTicks) { + //#else + //$$ public void onRender(EntityFX particle, float renderPartialTicks) { + //#endif + if (false) return; DObject particleObject = particleObjects.get(particle); if (particleObject == null) { particleObject = new DObject(DObject.Type.OB_EMPTY); @@ -94,9 +113,9 @@ public class ParticlesExporter implements Exporter { // renderer translate there again. // Instead of actually translating, we just add the translation on the current model-view-matrix. Matrix4f modelView = getGlModelViewMatrix(); - double dx = particle.prevPosX + (particle.posX - particle.prevPosX) * renderPartialTicks - EntityFX.interpPosX; - double dy = particle.prevPosY + (particle.posY - particle.prevPosY) * renderPartialTicks - EntityFX.interpPosY; - double dz = particle.prevPosZ + (particle.posZ - particle.prevPosZ) * renderPartialTicks - EntityFX.interpPosZ; + double dx = particle.prevPosX + (particle.posX - particle.prevPosX) * renderPartialTicks - interpPosX(); + double dy = particle.prevPosY + (particle.posY - particle.prevPosY) * renderPartialTicks - interpPosY(); + double dz = particle.prevPosZ + (particle.posZ - particle.prevPosZ) * renderPartialTicks - interpPosZ(); Vector3f offset = new Vector3f((float) dx, (float) dy, (float) dz); Matrix4f.translate(offset, modelView, modelView); renderState.pushModelView(modelView); @@ -116,26 +135,35 @@ public class ParticlesExporter implements Exporter { renderState.pop(); } - private DMesh generateMeshForParticle(EntityFX particle, Vector3f offset) { + //#if MC>=10904 + private DMesh generateMeshForParticle(Particle particle, Vector3f offset) { + //#else + //$$ private DMesh generateMeshForParticle(EntityFX particle, Vector3f offset) { + //#endif DMesh mesh = new DMesh(); BlendMeshBuilder builder = new BlendMeshBuilder(mesh); builder.setOffset(offset); builder.setWellBehaved(true); - builder.startDrawingQuads(); - particle.func_180434_a(builder, Minecraft.getMinecraft().getRenderViewEntity(), 0, 1, 1, 0, 0, 0); + //#if MC>=10809 + builder.begin(7, DefaultVertexFormats.PARTICLE_POSITION_TEX_COLOR_LMAP); + //#else + //$$ builder.startDrawingQuads(); + //#endif + //#if MC>=10904 + particle.renderParticle(builder, Minecraft.getMinecraft().getRenderViewEntity(), 0, 1, 1, 0, 0, 0); + //#else + //$$ particle.func_180434_a(builder, Minecraft.getMinecraft().getRenderViewEntity(), 0, 1, 1, 0, 0, 0); + //#endif builder.finishDrawing(); return mesh; } @Override public void postFrame(int frame) throws IOException { - if (true) return; - for (Map.Entry entry : particleObjects.entrySet()) { - if (!particleObjectsSeen.containsKey(entry.getKey())) { - DObject object = entry.getValue(); - object.keyframe("hide", 0, renderState.getFrame(), 1f); - } - } + if (false) return; + particleObjects.entrySet().stream() + .filter(entry -> !particleObjectsSeen.containsKey(entry.getKey())) + .forEach(entry -> entry.getValue().keyframe("hide", 0, renderState.getFrame(), 1f)); particleObjects = particleObjectsSeen; particleObjectsSeen = new IdentityHashMap<>(); } diff --git a/src/main/java/com/replaymod/render/blend/exporters/TileEntityExporter.java b/src/main/java/com/replaymod/render/blend/exporters/TileEntityExporter.java index aceeefd9..180b3364 100644 --- a/src/main/java/com/replaymod/render/blend/exporters/TileEntityExporter.java +++ b/src/main/java/com/replaymod/render/blend/exporters/TileEntityExporter.java @@ -6,10 +6,15 @@ import com.replaymod.render.blend.data.DObject; import lombok.SneakyThrows; import net.minecraft.client.Minecraft; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.BlockPos; import org.lwjgl.util.vector.Matrix4f; import org.lwjgl.util.vector.Vector3f; +//#if MC>=10904 +import net.minecraft.util.math.BlockPos; +//#else +//$$ import net.minecraft.util.BlockPos; +//#endif + import java.io.IOException; import java.util.IdentityHashMap; import java.util.Map; @@ -57,7 +62,8 @@ public class TileEntityExporter implements Exporter { renderState.pop(); } - public void preRender(TileEntity tileEntity, double dx, double dy, double dz, float renderPartialTicks, int destroyStage) { + public void preRender(TileEntity tileEntity, double dx, double dy, double dz, float renderPartialTicks, int destroyStage, float alpha) { + // FIXME: handle alpha DObject tileEntityObject = tileEntityObjects.get(tileEntity); if (tileEntityObject == null) { tileEntityObject = new DObject(DObject.Type.OB_EMPTY); diff --git a/src/main/java/com/replaymod/render/blend/mixin/MixinChunkRenderWorker.java b/src/main/java/com/replaymod/render/blend/mixin/MixinChunkRenderWorker.java index 0c0d5d8a..85fc7c50 100644 --- a/src/main/java/com/replaymod/render/blend/mixin/MixinChunkRenderWorker.java +++ b/src/main/java/com/replaymod/render/blend/mixin/MixinChunkRenderWorker.java @@ -4,12 +4,17 @@ import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.exporters.ChunkExporter; import net.minecraft.client.renderer.chunk.ChunkCompileTaskGenerator; import net.minecraft.client.renderer.chunk.ChunkRenderWorker; -import net.minecraft.util.EnumWorldBlockLayer; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//#if MC>=10904 +import net.minecraft.util.BlockRenderLayer; +//#else +//$$ import net.minecraft.util.EnumWorldBlockLayer; +//#endif + @Mixin(ChunkRenderWorker.class) public abstract class MixinChunkRenderWorker { @@ -19,11 +24,7 @@ public abstract class MixinChunkRenderWorker { if (blendState != null) { if (task.getStatus() == ChunkCompileTaskGenerator.Status.DONE && task.getType() == ChunkCompileTaskGenerator.Type.REBUILD_CHUNK) { - for (EnumWorldBlockLayer layer : EnumWorldBlockLayer.values()) { - if (task.getCompiledChunk().isLayerStarted(layer)) { - blendState.get(ChunkExporter.class).addChunkUpdate(task.getRenderChunk(), layer); - } - } + blendState.get(ChunkExporter.class).addChunkUpdate(task.getRenderChunk(), task.getCompiledChunk()); } } } diff --git a/src/main/java/com/replaymod/render/blend/mixin/MixinEffectRenderer.java b/src/main/java/com/replaymod/render/blend/mixin/MixinEffectRenderer.java index f9557d97..1270525e 100644 --- a/src/main/java/com/replaymod/render/blend/mixin/MixinEffectRenderer.java +++ b/src/main/java/com/replaymod/render/blend/mixin/MixinEffectRenderer.java @@ -2,14 +2,23 @@ package com.replaymod.render.blend.mixin; import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.exporters.ParticlesExporter; -import net.minecraft.client.particle.EffectRenderer; import net.minecraft.entity.Entity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(EffectRenderer.class) +//#if MC>=10904 +import net.minecraft.client.particle.ParticleManager; +//#else +//$$ import net.minecraft.client.particle.EffectRenderer; +//#endif + +//#if MC>=10904 +@Mixin(ParticleManager.class) +//#else +//$$ @Mixin(EffectRenderer.class) +//#endif public abstract class MixinEffectRenderer { @Inject(method = "renderParticles", at = @At("HEAD")) diff --git a/src/main/java/com/replaymod/render/blend/mixin/MixinRenderGlobal.java b/src/main/java/com/replaymod/render/blend/mixin/MixinRenderGlobal.java index 4dd38130..af1a356e 100644 --- a/src/main/java/com/replaymod/render/blend/mixin/MixinRenderGlobal.java +++ b/src/main/java/com/replaymod/render/blend/mixin/MixinRenderGlobal.java @@ -18,7 +18,11 @@ public abstract class MixinRenderGlobal { @Inject(method = "renderEntities", at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/renderer/entity/RenderManager;renderEntitySimple(Lnet/minecraft/entity/Entity;F)V")) + //#if MC>=10904 + target = "Lnet/minecraft/client/renderer/entity/RenderManager;renderEntityStatic(Lnet/minecraft/entity/Entity;FZ)V")) + //#else + //$$ target = "Lnet/minecraft/client/renderer/entity/RenderManager;renderEntitySimple(Lnet/minecraft/entity/Entity;F)V")) + //#endif public void preEntityRender(Entity view, ICamera camera, float renderPartialTicks, CallbackInfo ci) { BlendState blendState = BlendState.getState(); if (blendState != null) { @@ -28,7 +32,11 @@ public abstract class MixinRenderGlobal { @Inject(method = "renderEntities", at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/renderer/entity/RenderManager;renderEntitySimple(Lnet/minecraft/entity/Entity;F)V", + //#if MC>=10904 + target = "Lnet/minecraft/client/renderer/entity/RenderManager;renderEntityStatic(Lnet/minecraft/entity/Entity;FZ)V", + //#else + //$$ target = "Lnet/minecraft/client/renderer/entity/RenderManager;renderEntitySimple(Lnet/minecraft/entity/Entity;F)V", + //#endif shift = At.Shift.AFTER)) public void postEntityRender(Entity view, ICamera camera, float renderPartialTicks, CallbackInfo ci) { BlendState blendState = BlendState.getState(); diff --git a/src/main/java/com/replaymod/render/blend/mixin/MixinRenderItem.java b/src/main/java/com/replaymod/render/blend/mixin/MixinRenderItem.java index 943915ac..07959a3e 100644 --- a/src/main/java/com/replaymod/render/blend/mixin/MixinRenderItem.java +++ b/src/main/java/com/replaymod/render/blend/mixin/MixinRenderItem.java @@ -2,22 +2,33 @@ package com.replaymod.render.blend.mixin; import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.exporters.ItemExporter; -import net.minecraft.client.renderer.entity.RenderItem; -import net.minecraft.client.resources.model.IBakedModel; import net.minecraft.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//#if MC>=10904 +import net.minecraft.client.renderer.RenderItem; +import net.minecraft.client.renderer.block.model.IBakedModel; +//#else +//$$ import net.minecraft.client.renderer.entity.RenderItem; +//$$ import net.minecraft.client.resources.model.IBakedModel; +//#endif + @Mixin(RenderItem.class) public abstract class MixinRenderItem { - @Inject(method = "renderModel(Lnet/minecraft/client/resources/model/IBakedModel;Lnet/minecraft/item/ItemStack;)V", + //#if MC>=10904 + @Inject(method = "renderModel(Lnet/minecraft/client/renderer/block/model/IBakedModel;Lnet/minecraft/item/ItemStack;)V", at = @At("HEAD")) + //#else + //$$ @Inject(method = "renderModel(Lnet/minecraft/client/resources/model/IBakedModel;Lnet/minecraft/item/ItemStack;)V", + //$$ at = @At("HEAD")) + //#endif private void onRenderModel(IBakedModel model, ItemStack stack, CallbackInfo ci) { BlendState blendState = BlendState.getState(); if (blendState != null) { - blendState.get(ItemExporter.class).onRender(model, stack); + blendState.get(ItemExporter.class).onRender((RenderItem)(Object)this, model, stack); } } } diff --git a/src/main/java/com/replaymod/render/blend/mixin/MixinRenderManager.java b/src/main/java/com/replaymod/render/blend/mixin/MixinRenderManager.java index 450f39e8..a52f74e8 100644 --- a/src/main/java/com/replaymod/render/blend/mixin/MixinRenderManager.java +++ b/src/main/java/com/replaymod/render/blend/mixin/MixinRenderManager.java @@ -7,7 +7,12 @@ import net.minecraft.entity.Entity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +//#if MC>=10904 +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//#else +//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +//#endif @Mixin(RenderManager.class) public abstract class MixinRenderManager { @@ -15,7 +20,12 @@ public abstract class MixinRenderManager { @Inject(method = "doRenderEntity", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/Render;doRender(Lnet/minecraft/entity/Entity;DDDFFZ)V")) - public void preRender(Entity entity, double x, double y, double z, float yaw, float renderPartialTicks, boolean box, CallbackInfoReturnable ci) { + public void preRender(Entity entity, double x, double y, double z, float yaw, float renderPartialTicks, boolean box, + //#if MC>=10904 + CallbackInfo ci) { + //#else + //$$ CallbackInfoReturnable ci) { + //#endif BlendState blendState = BlendState.getState(); if (blendState != null) { blendState.get(EntityExporter.class).preRender(entity, x, y, z, yaw, renderPartialTicks); @@ -26,7 +36,12 @@ public abstract class MixinRenderManager { at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/Render;doRender(Lnet/minecraft/entity/Entity;DDDFFZ)V", shift = At.Shift.AFTER)) - public void postRender(Entity entity, double x, double y, double z, float yaw, float renderPartialTicks, boolean box, CallbackInfoReturnable ci) { + public void postRender(Entity entity, double x, double y, double z, float yaw, float renderPartialTicks, boolean box, + //#if MC>=10904 + CallbackInfo ci) { + //#else + //$$ CallbackInfoReturnable ci) { + //#endif BlendState blendState = BlendState.getState(); if (blendState != null) { blendState.get(EntityExporter.class).postRender(entity, x, y, z, yaw, renderPartialTicks); diff --git a/src/main/java/com/replaymod/render/blend/mixin/MixinTileEntityRendererDispatcher.java b/src/main/java/com/replaymod/render/blend/mixin/MixinTileEntityRendererDispatcher.java index 74fe86d3..abe563b9 100644 --- a/src/main/java/com/replaymod/render/blend/mixin/MixinTileEntityRendererDispatcher.java +++ b/src/main/java/com/replaymod/render/blend/mixin/MixinTileEntityRendererDispatcher.java @@ -12,18 +12,31 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(TileEntityRendererDispatcher.class) public abstract class MixinTileEntityRendererDispatcher { - @Inject(method = "renderTileEntityAt(Lnet/minecraft/tileentity/TileEntity;DDDFI)V", + //#if MC>=11200 + @Inject(method = "renderTileEntityAt(Lnet/minecraft/tileentity/TileEntity;DDDFIF)V", at = @At("HEAD")) - public void preRender(TileEntity tileEntity, double x, double y, double z, float renderPartialTicks, int destroyStage, CallbackInfo ci) { + public void preRender(TileEntity tileEntity, double x, double y, double z, float renderPartialTicks, int destroyStage, float alpha, CallbackInfo ci) { + //#else + //$$ @Inject(method = "renderTileEntityAt(Lnet/minecraft/tileentity/TileEntity;DDDFI)V", + //$$ at = @At("HEAD")) + //$$ public void preRender(TileEntity tileEntity, double x, double y, double z, float renderPartialTicks, int destroyStage, CallbackInfo ci) { + //$$ float alpha = 1; + //#endif BlendState blendState = BlendState.getState(); if (blendState != null) { - blendState.get(TileEntityExporter.class).preRender(tileEntity, x, y, z, renderPartialTicks, destroyStage); + blendState.get(TileEntityExporter.class).preRender(tileEntity, x, y, z, renderPartialTicks, destroyStage, alpha); } } - @Inject(method = "renderTileEntityAt(Lnet/minecraft/tileentity/TileEntity;DDDFI)V", + //#if MC>=11200 + @Inject(method = "renderTileEntityAt(Lnet/minecraft/tileentity/TileEntity;DDDFIF)V", at = @At("RETURN")) - public void postRender(TileEntity tileEntity, double x, double y, double z, float renderPartialTicks, int destroyStage, CallbackInfo ci) { + public void postRender(TileEntity tileEntity, double x, double y, double z, float renderPartialTicks, int destroyStage, float alpha, CallbackInfo ci) { + //#else + //$$ @Inject(method = "renderTileEntityAt(Lnet/minecraft/tileentity/TileEntity;DDDFI)V", + //$$ at = @At("RETURN")) + //$$ public void postRender(TileEntity tileEntity, double x, double y, double z, float renderPartialTicks, int destroyStage, CallbackInfo ci) { + //#endif BlendState blendState = BlendState.getState(); if (blendState != null) { blendState.get(TileEntityExporter.class).postRender(); diff --git a/src/main/java/com/replaymod/render/mixin/MixinParticleManager.java b/src/main/java/com/replaymod/render/mixin/MixinParticleManager.java index 5cf6df2c..2092239b 100644 --- a/src/main/java/com/replaymod/render/mixin/MixinParticleManager.java +++ b/src/main/java/com/replaymod/render/mixin/MixinParticleManager.java @@ -1,6 +1,8 @@ package com.replaymod.render.mixin; //#if MC>=10904 +import com.replaymod.render.blend.BlendState; +import com.replaymod.render.blend.exporters.ParticlesExporter; import com.replaymod.render.hooks.EntityRendererHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.particle.Particle; @@ -62,6 +64,10 @@ public abstract class MixinParticleManager { rotYZ = (float) (-rotZ * Math.sin(pitch)); rotXY = (float) (rotX * Math.sin(pitch)); } + BlendState blendState = BlendState.getState(); + if (blendState != null) { + blendState.get(ParticlesExporter.class).onRender(particle, partialTicks); + } particle.renderParticle(vertexBuffer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY); } } diff --git a/src/main/resources/META-INF/replaymod_at.cfg b/src/main/resources/META-INF/replaymod_at.cfg index 54ec438e..8b0fbfb6 100644 --- a/src/main/resources/META-INF/replaymod_at.cfg +++ b/src/main/resources/META-INF/replaymod_at.cfg @@ -97,6 +97,11 @@ public net.minecraft.client.renderer.entity.RenderManager field_178636_l # skinM public net.minecraft.client.renderer.ItemRenderer * public net.minecraft.client.renderer.ItemRenderer *() +# RenderItem +##if MC>=10904 +public net.minecraft.client.renderer.RenderItem field_184395_f # itemColors +##endif + # EntityPlayer public net.minecraft.entity.player.EntityPlayer *