Update blend export to 1.12.2

This commit is contained in:
Jonas Herzig
2018-03-03 18:40:52 +01:00
parent 6794b58524
commit 1bdf7da525
16 changed files with 407 additions and 102 deletions

View File

@@ -15,6 +15,7 @@ import net.minecraft.client.multiplayer.WorldClient;
import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.client.network.NetHandlerPlayClient;
import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.client.resources.ResourcePackRepository; import net.minecraft.client.resources.ResourcePackRepository;
import net.minecraft.crash.CrashReportCategory; import net.minecraft.crash.CrashReportCategory;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
@@ -22,6 +23,7 @@ import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.Packet; import net.minecraft.network.Packet;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.WorldType; import net.minecraft.world.WorldType;
import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.Chunk;
@@ -37,8 +39,10 @@ import net.minecraft.client.renderer.BufferBuilder;
//#else //#else
//$$ import net.minecraft.client.renderer.VertexBuffer; //$$ import net.minecraft.client.renderer.VertexBuffer;
//#endif //#endif
import net.minecraft.client.particle.Particle;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
//#else //#else
//$$ import net.minecraft.client.particle.EntityFX;
//$$ import net.minecraft.client.renderer.WorldRenderer; //$$ import net.minecraft.client.renderer.WorldRenderer;
//$$ import net.minecraft.util.MathHelper; //$$ import net.minecraft.util.MathHelper;
//#endif //#endif
@@ -188,6 +192,13 @@ public class MCVer {
//$$ = WorldType.DEBUG_WORLD; //$$ = WorldType.DEBUG_WORLD;
//#endif //#endif
public static ResourceLocation LOCATION_BLOCKS_TEXTURE
//#if MC>=10904
= TextureMap.LOCATION_BLOCKS_TEXTURE;
//#else
//$$ = TextureMap.locationBlocksTexture;
//#endif
public static EntityPlayerSP player(Minecraft mc) { public static EntityPlayerSP player(Minecraft mc) {
//#if MC>=11102 //#if MC>=11102
return mc.player; return mc.player;
@@ -396,6 +407,23 @@ public class MCVer {
//$$ worldRenderer.addVertexWithUV(x, y, z, u, v); //$$ worldRenderer.addVertexWithUV(x, y, z, u, v);
//#endif //#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) { public static int floor(double val) {
//#if MC>=11102 //#if MC>=11102
return MathHelper.floor(val); return MathHelper.floor(val);
@@ -411,4 +439,28 @@ public class MCVer {
public static float sin(float val) { public static float sin(float val) {
return MathHelper.sin(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
}
} }

View File

@@ -3,20 +3,33 @@ package com.replaymod.render.blend;
import com.replaymod.render.blend.data.DMaterial; import com.replaymod.render.blend.data.DMaterial;
import com.replaymod.render.blend.data.DMesh; import com.replaymod.render.blend.data.DMesh;
import net.minecraft.client.renderer.Tessellator; 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.VertexFormat;
import net.minecraft.client.renderer.vertex.VertexFormatElement; import net.minecraft.client.renderer.vertex.VertexFormatElement;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import org.lwjgl.util.vector.Vector2f; import org.lwjgl.util.vector.Vector2f;
import org.lwjgl.util.vector.Vector3f; 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.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import java.nio.IntBuffer; import java.nio.IntBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; 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 DMesh mesh;
private final List<DMesh.Vertex> vertices = new ArrayList<>(); private final List<DMesh.Vertex> vertices = new ArrayList<>();
private final List<Vector2f> uvs = new ArrayList<>(); private final List<Vector2f> uvs = new ArrayList<>();
@@ -25,6 +38,9 @@ public class BlendMeshBuilder extends WorldRenderer {
private boolean isDrawing; private boolean isDrawing;
private boolean wellBehaved; private boolean wellBehaved;
private int mode; private int mode;
//#if MC>=11200
private double x, y, z;
//#endif
private float u, v; private float u, v;
private int color = 0xffffffff; // Default not in parent class but probably set implicitly somewhere due to re-use 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 @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 (isDrawing) {
if (!wellBehaved) { if (!wellBehaved) {
// Someone probably finished drawing with the global instance instead of this one, // Someone probably finished drawing with the global instance instead of this one,
@@ -58,7 +78,7 @@ public class BlendMeshBuilder extends WorldRenderer {
if (!wellBehaved) { if (!wellBehaved) {
// In case the calling code finishes with Tessellator.getInstance().draw() // 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 @Override
public int finishDrawing() { //#if MC>=11200
public void finishDrawing() {
//#else
//$$ public int finishDrawing() {
//#endif
if (!isDrawing) { if (!isDrawing) {
throw new IllegalStateException("Not building!"); throw new IllegalStateException("Not building!");
} else { } else {
if (!wellBehaved) { if (!wellBehaved) {
Tessellator.getInstance().getWorldRenderer().finishDrawing(); getBuffer(Tessellator.getInstance()).finishDrawing();
} }
doFinish(); 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 @Override
public void setTextureUV(double u, double v) { public BlendMeshBuilder tex(double u, double v) {
this.u = (float) u; this.u = (float) u;
this.v = (float) (1 - v); this.v = (float) (1 - v);
return this;
} }
@Override @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); this.color = r | (g << 8) | (b << 16) | (a << 24);
return this;
} }
@Override @Override
public void addVertex(double x, double y, double z) { public BufferBuilder normal(float x, float y, float z) {
x -= offset.x; // TODO do we care about normals?
y -= offset.y; return this;
z -= offset.z; }
@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)); vertices.add(new DMesh.Vertex((float) x, (float) -z, (float) y));
uvs.add(new Vector2f(u, v)); uvs.add(new Vector2f(u, v));
colors.add(color); 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 @Override
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@@ -164,12 +234,19 @@ public class BlendMeshBuilder extends WorldRenderer {
VertexFormat vertexFormat = getVertexFormat(); VertexFormat vertexFormat = getVertexFormat();
int posOffset = -1, colorOffset = -1, uvOffset = -1; int posOffset = -1, colorOffset = -1, uvOffset = -1;
List<VertexFormatElement> elements = vertexFormat.getElements(); List<VertexFormatElement> elements = vertexFormat.getElements();
int index = 0;
for (VertexFormatElement element : elements) { for (VertexFormatElement element : elements) {
//#if MC>11200
int offset = vertexFormat.getOffset(index);
//#else
//$$ int offset = element.getOffset();
//#endif
switch (element.getUsage()) { switch (element.getUsage()) {
case POSITION: posOffset = element.getOffset(); break; case POSITION: posOffset = offset; break;
case COLOR: colorOffset = element.getOffset(); break; case COLOR: colorOffset = offset; break;
case UV: if (element.getIndex() == 0) uvOffset = element.getOffset(); break; case UV: if (element.getIndex() == 0) uvOffset = offset; break;
} }
index++;
} }
if (posOffset == -1) throw new IllegalStateException("No position element in " + vertexFormat); if (posOffset == -1) throw new IllegalStateException("No position element in " + vertexFormat);
if (uvOffset == -1) throw new IllegalStateException("No uv 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) { if (colorOffset != -1) {
color = buffer.getInt(offset + colorOffset); color = buffer.getInt(offset + colorOffset);
} }
setTextureUV( //#if MC>11200
tex(
//#else
//$$ setTextureUV(
//#endif
buffer.getFloat(offset + uvOffset), buffer.getFloat(offset + uvOffset),
buffer.getFloat(offset + uvOffset + 4) buffer.getFloat(offset + uvOffset + 4)
); );
addVertex( //#if MC>11200
pos(
//#else
//$$ addVertex(
//#endif
buffer.getFloat(offset + posOffset ), buffer.getFloat(offset + posOffset ),
buffer.getFloat(offset + posOffset + 4), buffer.getFloat(offset + posOffset + 4),
buffer.getFloat(offset + posOffset + 8) buffer.getFloat(offset + posOffset + 8)
); );
//#if MC>11200
endVertex();
//#endif
} }
} }

View File

@@ -22,6 +22,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
import static com.replaymod.core.versions.MCVer.*;
import static com.replaymod.render.ReplayModRender.LOGGER; import static com.replaymod.render.ReplayModRender.LOGGER;
// Note: // Note:
@@ -77,7 +78,7 @@ public class BlendState implements Exporter {
} catch (IOException e) { } catch (IOException e) {
CrashReport report = CrashReport.makeCrashReport(e, "Setup of blend exporter"); CrashReport report = CrashReport.makeCrashReport(e, "Setup of blend exporter");
CrashReportCategory category = report.makeCategory("Exporter"); CrashReportCategory category = report.makeCategory("Exporter");
category.addCrashSectionCallable("Exporter", exporter::toString); addDetail(category, "Exporter", exporter::toString);
throw new ReportedException(report); throw new ReportedException(report);
} }
} }
@@ -91,7 +92,7 @@ public class BlendState implements Exporter {
} catch (IOException e) { } catch (IOException e) {
CrashReport report = CrashReport.makeCrashReport(e, "Tear down of blend exporter"); CrashReport report = CrashReport.makeCrashReport(e, "Tear down of blend exporter");
CrashReportCategory category = report.makeCategory("Exporter"); CrashReportCategory category = report.makeCategory("Exporter");
category.addCrashSectionCallable("Exporter", exporter::toString); addDetail(category, "Exporter", exporter::toString);
throw new ReportedException(report); throw new ReportedException(report);
} }
} }
@@ -128,7 +129,7 @@ public class BlendState implements Exporter {
} catch (IOException e) { } catch (IOException e) {
CrashReport report = CrashReport.makeCrashReport(e, "Pre frame of blend exporter"); CrashReport report = CrashReport.makeCrashReport(e, "Pre frame of blend exporter");
CrashReportCategory category = report.makeCategory("Exporter"); CrashReportCategory category = report.makeCategory("Exporter");
category.addCrashSectionCallable("Exporter", exporter::toString); addDetail(category, "Exporter", exporter::toString);
category.addCrashSection("Frame", frame); category.addCrashSection("Frame", frame);
throw new ReportedException(report); throw new ReportedException(report);
} }
@@ -143,7 +144,7 @@ public class BlendState implements Exporter {
} catch (IOException e) { } catch (IOException e) {
CrashReport report = CrashReport.makeCrashReport(e, "Post frame of blend exporter"); CrashReport report = CrashReport.makeCrashReport(e, "Post frame of blend exporter");
CrashReportCategory category = report.makeCategory("Exporter"); CrashReportCategory category = report.makeCategory("Exporter");
category.addCrashSectionCallable("Exporter", exporter::toString); addDetail(category, "Exporter", exporter::toString);
category.addCrashSection("Frame", frame); category.addCrashSection("Frame", frame);
throw new ReportedException(report); throw new ReportedException(report);
} }

View File

@@ -1,6 +1,5 @@
package com.replaymod.render.blend.data; package com.replaymod.render.blend.data;
import net.minecraft.util.Vec3i;
import org.blender.dna.CustomData; import org.blender.dna.CustomData;
import org.blender.dna.CustomDataLayer; import org.blender.dna.CustomDataLayer;
import org.blender.dna.Image; 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.Vector2f;
import org.lwjgl.util.vector.Vector3f; 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.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;

View File

@@ -13,15 +13,20 @@ import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.RenderGlobal; import net.minecraft.client.renderer.RenderGlobal;
import net.minecraft.client.renderer.chunk.CompiledChunk; import net.minecraft.client.renderer.chunk.CompiledChunk;
import net.minecraft.client.renderer.chunk.RenderChunk; import net.minecraft.client.renderer.chunk.RenderChunk;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.client.renderer.vertex.VertexBuffer; 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.apache.commons.lang3.tuple.Pair;
import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL15;
import org.lwjgl.util.vector.Vector2f; import org.lwjgl.util.vector.Vector2f;
import org.lwjgl.util.vector.Vector3f; 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.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.ArrayList; import java.util.ArrayList;
@@ -30,16 +35,31 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import static com.replaymod.core.versions.MCVer.*;
public class ChunkExporter implements Exporter { public class ChunkExporter implements Exporter {
private final Map<BlockPos, DObject> chunkObjects = new HashMap<>(); private final Map<BlockPos, DObject> chunkObjects = new HashMap<>();
private final Map<BlockPos, Map<EnumWorldBlockLayer, DObject>> chunkLayerObjects = new HashMap<>(); //#if MC>=10904
private final List<Pair<RenderChunk, EnumWorldBlockLayer>> chunks = new ArrayList<>(); private final Map<BlockPos, Map<BlockRenderLayer, DObject>> chunkLayerObjects = new HashMap<>();
private final List<Pair<RenderChunk, BlockRenderLayer>> chunks = new ArrayList<>();
//#else
//$$ private final Map<BlockPos, Map<EnumWorldBlockLayer, DObject>> chunkLayerObjects = new HashMap<>();
//$$ private final List<Pair<RenderChunk, EnumWorldBlockLayer>> chunks = new ArrayList<>();
//#endif
private DObject chunksObject; private DObject chunksObject;
private DMaterial material; private DMaterial material;
private int frame; private int frame;
public void addChunkUpdate(RenderChunk chunk, EnumWorldBlockLayer layer) { public void addChunkUpdate(RenderChunk chunk, CompiledChunk compiledChunk) {
chunks.add(Pair.of(chunk, layer)); //#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 @Override
@@ -53,9 +73,7 @@ public class ChunkExporter implements Exporter {
RenderChunk renderChunk = ReflectionUtil.get(renderInfo, "renderChunk", RenderChunk.class); // SneakyThrows RenderChunk renderChunk = ReflectionUtil.get(renderInfo, "renderChunk", RenderChunk.class); // SneakyThrows
CompiledChunk compiledChunk = renderChunk.getCompiledChunk(); CompiledChunk compiledChunk = renderChunk.getCompiledChunk();
if (!compiledChunk.isEmpty()) { if (!compiledChunk.isEmpty()) {
for (EnumWorldBlockLayer layer : EnumWorldBlockLayer.values()) { addChunkUpdate(renderChunk, null);
addChunkUpdate(renderChunk, layer);
}
} }
} }
@@ -79,21 +97,31 @@ public class ChunkExporter implements Exporter {
@Override @Override
public void postFrame(int frame) throws IOException { 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(); material = BlendState.getState().getMaterials().getActiveMaterial();
for (Pair<RenderChunk, EnumWorldBlockLayer> pair : chunks) { //#if MC>=10904
for (Pair<RenderChunk, BlockRenderLayer> pair : chunks) {
BlockRenderLayer layer = pair.getRight();
//#else
//$$ for (Pair<RenderChunk, EnumWorldBlockLayer> pair : chunks) {
//$$ EnumWorldBlockLayer layer = pair.getRight();
//#endif
RenderChunk chunk = pair.getLeft(); RenderChunk chunk = pair.getLeft();
EnumWorldBlockLayer layer = pair.getRight();
DObject chunkObject = chunkObjects.get(chunk.getPosition()); DObject chunkObject = chunkObjects.get(chunk.getPosition());
if (chunkObject == null) { if (chunkObject == null) {
chunkObject = buildChunkObject(chunk); chunkObject = buildChunkObject(chunk);
chunkObjects.put(chunk.getPosition(), chunkObject); 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); DObject layerObject = buildChunkLayerObject(chunkObject, chunk, layer);
if (layerObject == null) continue; if (layerObject == null) continue;
Map<EnumWorldBlockLayer, DObject> layerObjects = chunkLayerObjects.get(chunk.getPosition()); //#if MC>=10904
Map<BlockRenderLayer, DObject> layerObjects
//#else
//$$ Map<EnumWorldBlockLayer, DObject> layerObjects
//#endif
= chunkLayerObjects.get(chunk.getPosition());
DObject oldLayerObject = layerObjects.get(layer); DObject oldLayerObject = layerObjects.get(layer);
if (oldLayerObject != null) { if (oldLayerObject != null) {
oldLayerObject.keyframe("hide", 0, frame, 1f); oldLayerObject.keyframe("hide", 0, frame, 1f);
@@ -118,7 +146,12 @@ public class ChunkExporter implements Exporter {
return chunkObject; 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()); VertexBuffer vertexBuffer = renderChunk.getVertexBufferByLayer(layer.ordinal());
if (vertexBuffer == null) return null; if (vertexBuffer == null) return null;

View File

@@ -4,14 +4,20 @@ import com.replaymod.render.blend.BlendMeshBuilder;
import com.replaymod.render.blend.Exporter; import com.replaymod.render.blend.Exporter;
import com.replaymod.render.blend.data.DMesh; import com.replaymod.render.blend.data.DMesh;
import com.replaymod.render.blend.data.DObject; 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.block.model.BakedQuad;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.resources.model.IBakedModel;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumFacing;
import net.minecraftforge.client.model.pipeline.LightUtil; 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; import java.util.List;
public class ItemExporter implements Exporter { public class ItemExporter implements Exporter {
@@ -21,8 +27,8 @@ public class ItemExporter implements Exporter {
this.renderState = renderState; this.renderState = renderState;
} }
public void onRender(IBakedModel model, ItemStack stack) { public void onRender(RenderItem renderItem, IBakedModel model, ItemStack stack) {
DObject object = getObjectForItemStack(model, stack); DObject object = getObjectForItemStack(renderItem, model, stack);
renderState.pushObject(object); renderState.pushObject(object);
renderState.pushModelView(); renderState.pushModelView();
@@ -34,20 +40,20 @@ public class ItemExporter implements Exporter {
renderState.pop(); renderState.pop();
} }
private DObject getObjectForItemStack(IBakedModel model, ItemStack stack) { private DObject getObjectForItemStack(RenderItem renderItem, IBakedModel model, ItemStack stack) {
int frame = renderState.getFrame(); int frame = renderState.getFrame();
DObject parent = renderState.peekObject(); DObject parent = renderState.peekObject();
DObject object = null; DObject object = null;
for (DObject child : parent.getChildren()) { for (DObject child : parent.getChildren()) {
if (child.lastFrame < frame if (child.lastFrame < frame
&& child instanceof ItemBasedDObject && child instanceof ItemBasedDObject
&& ((ItemBasedDObject) child).isBasedOn(model, stack)) { && ((ItemBasedDObject) child).isBasedOn(renderItem, model, stack)) {
object = child; object = child;
break; break;
} }
} }
if (object == null) { if (object == null) {
object = new ItemBasedDObject(model, stack); object = new ItemBasedDObject(renderItem, model, stack);
object.id.name = stack.getDisplayName(); object.id.name = stack.getDisplayName();
object.setParent(parent); object.setParent(parent);
} }
@@ -56,26 +62,41 @@ public class ItemExporter implements Exporter {
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private static DMesh generateMeshForItemStack(IBakedModel model, ItemStack stack) { private static DMesh generateMeshForItemStack(RenderItem renderItem, IBakedModel model, ItemStack stack) {
DMesh mesh = new DMesh(); DMesh mesh = new DMesh();
BlendMeshBuilder builder = new BlendMeshBuilder(mesh); BlendMeshBuilder builder = new BlendMeshBuilder(mesh);
builder.setWellBehaved(true); builder.setWellBehaved(true);
builder.startDrawingQuads(); //#if MC>=10809
builder.setVertexFormat(DefaultVertexFormats.ITEM); builder.begin(GL11.GL_QUADS, DefaultVertexFormats.ITEM);
//#else
//$$ builder.startDrawingQuads();
//$$ builder.setVertexFormat(DefaultVertexFormats.ITEM);
//#endif
//#if MC>=10904
for (EnumFacing face : EnumFacing.values()) { 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(); builder.finishDrawing();
return mesh; return mesh;
} }
private static void renderQuads(WorldRenderer buffer, List<BakedQuad> quads, ItemStack stack) { private static void renderQuads(RenderItem renderItem, BlendMeshBuilder buffer, List<BakedQuad> quads, ItemStack stack) {
for (BakedQuad quad : quads) { for (BakedQuad quad : quads) {
int color = stack != null && quad.hasTintIndex() 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; : 0xffffffff;
LightUtil.renderQuadColor(buffer, quad, color); LightUtil.renderQuadColor(buffer, quad, color);
} }
@@ -83,18 +104,20 @@ public class ItemExporter implements Exporter {
} }
private static class ItemBasedDObject extends DObject { private static class ItemBasedDObject extends DObject {
private final RenderItem renderItem;
private final IBakedModel model; private final IBakedModel model;
private final ItemStack stack; private final ItemStack stack;
private boolean valid; private boolean valid;
public ItemBasedDObject(IBakedModel model, ItemStack stack) { public ItemBasedDObject(RenderItem renderItem, IBakedModel model, ItemStack stack) {
super(generateMeshForItemStack(model, stack)); super(generateMeshForItemStack(renderItem, model, stack));
this.renderItem = renderItem;
this.model = model; this.model = model;
this.stack = stack; this.stack = stack;
} }
public boolean isBasedOn(IBakedModel model, ItemStack scale) { public boolean isBasedOn(RenderItem renderItem, IBakedModel model, ItemStack stack) {
return this.model == model; // FIXME ignores color of stack return this.renderItem == renderItem && this.model == model && this.stack == stack;
} }
@Override @Override

View File

@@ -6,15 +6,25 @@ import com.replaymod.render.blend.Exporter;
import com.replaymod.render.blend.data.DMesh; import com.replaymod.render.blend.data.DMesh;
import com.replaymod.render.blend.data.DObject; import com.replaymod.render.blend.data.DObject;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.particle.EntityFX;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import org.lwjgl.util.vector.Matrix4f; import org.lwjgl.util.vector.Matrix4f;
import org.lwjgl.util.vector.Vector3f; 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.io.IOException;
import java.util.IdentityHashMap; import java.util.IdentityHashMap;
import java.util.Map; import java.util.Map;
import static com.replaymod.core.versions.MCVer.*;
import static com.replaymod.render.blend.Util.getGlModelViewMatrix; import static com.replaymod.render.blend.Util.getGlModelViewMatrix;
public class ParticlesExporter implements Exporter { public class ParticlesExporter implements Exporter {
@@ -23,8 +33,13 @@ public class ParticlesExporter implements Exporter {
private DObject pointAtObject; private DObject pointAtObject;
private DObject particlesObject; private DObject particlesObject;
private DObject litParticlesObject; private DObject litParticlesObject;
private Map<Entity, DObject> particleObjects; //#if MC>=10904
private Map<Entity, DObject> particleObjectsSeen; private Map<Particle, DObject> particleObjects;
private Map<Particle, DObject> particleObjectsSeen;
//#else
//$$ private Map<Entity, DObject> particleObjects;
//$$ private Map<Entity, DObject> particleObjectsSeen;
//#endif
public ParticlesExporter(RenderState renderState) { public ParticlesExporter(RenderState renderState) {
this.renderState = renderState; this.renderState = renderState;
@@ -32,7 +47,7 @@ public class ParticlesExporter implements Exporter {
@Override @Override
public void setup() throws IOException { 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 // FIXME replace with camera
pointAtObject = new DObject(DObject.Type.OB_EMPTY); pointAtObject = new DObject(DObject.Type.OB_EMPTY);
pointAtObject.id.name = "Particles Target"; pointAtObject.id.name = "Particles Target";
@@ -54,7 +69,7 @@ public class ParticlesExporter implements Exporter {
} }
public void preParticlesRender(boolean lit) { public void preParticlesRender(boolean lit) {
if (true) return; if (false) return;
Matrix4f modelView = getGlModelViewMatrix(); Matrix4f modelView = getGlModelViewMatrix();
// Particles are rendered relative to the viewer location. // Particles are rendered relative to the viewer location.
// We however want our Particles object to not move when the viewer does, // 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() { public void postParticlesRender() {
if (true) return; if (false) return;
renderState.pop(); renderState.pop();
} }
public void onRender(EntityFX particle, float renderPartialTicks) { //#if MC>=10904
if (true) return; public void onRender(Particle particle, float renderPartialTicks) {
//#else
//$$ public void onRender(EntityFX particle, float renderPartialTicks) {
//#endif
if (false) return;
DObject particleObject = particleObjects.get(particle); DObject particleObject = particleObjects.get(particle);
if (particleObject == null) { if (particleObject == null) {
particleObject = new DObject(DObject.Type.OB_EMPTY); particleObject = new DObject(DObject.Type.OB_EMPTY);
@@ -94,9 +113,9 @@ public class ParticlesExporter implements Exporter {
// renderer translate there again. // renderer translate there again.
// Instead of actually translating, we just add the translation on the current model-view-matrix. // Instead of actually translating, we just add the translation on the current model-view-matrix.
Matrix4f modelView = getGlModelViewMatrix(); Matrix4f modelView = getGlModelViewMatrix();
double dx = particle.prevPosX + (particle.posX - particle.prevPosX) * renderPartialTicks - EntityFX.interpPosX; double dx = particle.prevPosX + (particle.posX - particle.prevPosX) * renderPartialTicks - interpPosX();
double dy = particle.prevPosY + (particle.posY - particle.prevPosY) * renderPartialTicks - EntityFX.interpPosY; double dy = particle.prevPosY + (particle.posY - particle.prevPosY) * renderPartialTicks - interpPosY();
double dz = particle.prevPosZ + (particle.posZ - particle.prevPosZ) * renderPartialTicks - EntityFX.interpPosZ; double dz = particle.prevPosZ + (particle.posZ - particle.prevPosZ) * renderPartialTicks - interpPosZ();
Vector3f offset = new Vector3f((float) dx, (float) dy, (float) dz); Vector3f offset = new Vector3f((float) dx, (float) dy, (float) dz);
Matrix4f.translate(offset, modelView, modelView); Matrix4f.translate(offset, modelView, modelView);
renderState.pushModelView(modelView); renderState.pushModelView(modelView);
@@ -116,26 +135,35 @@ public class ParticlesExporter implements Exporter {
renderState.pop(); 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(); DMesh mesh = new DMesh();
BlendMeshBuilder builder = new BlendMeshBuilder(mesh); BlendMeshBuilder builder = new BlendMeshBuilder(mesh);
builder.setOffset(offset); builder.setOffset(offset);
builder.setWellBehaved(true); builder.setWellBehaved(true);
builder.startDrawingQuads(); //#if MC>=10809
particle.func_180434_a(builder, Minecraft.getMinecraft().getRenderViewEntity(), 0, 1, 1, 0, 0, 0); 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(); builder.finishDrawing();
return mesh; return mesh;
} }
@Override @Override
public void postFrame(int frame) throws IOException { public void postFrame(int frame) throws IOException {
if (true) return; if (false) return;
for (Map.Entry<Entity, DObject> entry : particleObjects.entrySet()) { particleObjects.entrySet().stream()
if (!particleObjectsSeen.containsKey(entry.getKey())) { .filter(entry -> !particleObjectsSeen.containsKey(entry.getKey()))
DObject object = entry.getValue(); .forEach(entry -> entry.getValue().keyframe("hide", 0, renderState.getFrame(), 1f));
object.keyframe("hide", 0, renderState.getFrame(), 1f);
}
}
particleObjects = particleObjectsSeen; particleObjects = particleObjectsSeen;
particleObjectsSeen = new IdentityHashMap<>(); particleObjectsSeen = new IdentityHashMap<>();
} }

View File

@@ -6,10 +6,15 @@ import com.replaymod.render.blend.data.DObject;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockPos;
import org.lwjgl.util.vector.Matrix4f; import org.lwjgl.util.vector.Matrix4f;
import org.lwjgl.util.vector.Vector3f; 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.io.IOException;
import java.util.IdentityHashMap; import java.util.IdentityHashMap;
import java.util.Map; import java.util.Map;
@@ -57,7 +62,8 @@ public class TileEntityExporter implements Exporter {
renderState.pop(); 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); DObject tileEntityObject = tileEntityObjects.get(tileEntity);
if (tileEntityObject == null) { if (tileEntityObject == null) {
tileEntityObject = new DObject(DObject.Type.OB_EMPTY); tileEntityObject = new DObject(DObject.Type.OB_EMPTY);

View File

@@ -4,12 +4,17 @@ import com.replaymod.render.blend.BlendState;
import com.replaymod.render.blend.exporters.ChunkExporter; import com.replaymod.render.blend.exporters.ChunkExporter;
import net.minecraft.client.renderer.chunk.ChunkCompileTaskGenerator; import net.minecraft.client.renderer.chunk.ChunkCompileTaskGenerator;
import net.minecraft.client.renderer.chunk.ChunkRenderWorker; import net.minecraft.client.renderer.chunk.ChunkRenderWorker;
import net.minecraft.util.EnumWorldBlockLayer;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 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) @Mixin(ChunkRenderWorker.class)
public abstract class MixinChunkRenderWorker { public abstract class MixinChunkRenderWorker {
@@ -19,11 +24,7 @@ public abstract class MixinChunkRenderWorker {
if (blendState != null) { if (blendState != null) {
if (task.getStatus() == ChunkCompileTaskGenerator.Status.DONE if (task.getStatus() == ChunkCompileTaskGenerator.Status.DONE
&& task.getType() == ChunkCompileTaskGenerator.Type.REBUILD_CHUNK) { && task.getType() == ChunkCompileTaskGenerator.Type.REBUILD_CHUNK) {
for (EnumWorldBlockLayer layer : EnumWorldBlockLayer.values()) { blendState.get(ChunkExporter.class).addChunkUpdate(task.getRenderChunk(), task.getCompiledChunk());
if (task.getCompiledChunk().isLayerStarted(layer)) {
blendState.get(ChunkExporter.class).addChunkUpdate(task.getRenderChunk(), layer);
}
}
} }
} }
} }

View File

@@ -2,14 +2,23 @@ package com.replaymod.render.blend.mixin;
import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.BlendState;
import com.replaymod.render.blend.exporters.ParticlesExporter; import com.replaymod.render.blend.exporters.ParticlesExporter;
import net.minecraft.client.particle.EffectRenderer;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 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 { public abstract class MixinEffectRenderer {
@Inject(method = "renderParticles", at = @At("HEAD")) @Inject(method = "renderParticles", at = @At("HEAD"))

View File

@@ -18,7 +18,11 @@ public abstract class MixinRenderGlobal {
@Inject(method = "renderEntities", @Inject(method = "renderEntities",
at = @At(value = "INVOKE", 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) { public void preEntityRender(Entity view, ICamera camera, float renderPartialTicks, CallbackInfo ci) {
BlendState blendState = BlendState.getState(); BlendState blendState = BlendState.getState();
if (blendState != null) { if (blendState != null) {
@@ -28,7 +32,11 @@ public abstract class MixinRenderGlobal {
@Inject(method = "renderEntities", @Inject(method = "renderEntities",
at = @At(value = "INVOKE", 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)) shift = At.Shift.AFTER))
public void postEntityRender(Entity view, ICamera camera, float renderPartialTicks, CallbackInfo ci) { public void postEntityRender(Entity view, ICamera camera, float renderPartialTicks, CallbackInfo ci) {
BlendState blendState = BlendState.getState(); BlendState blendState = BlendState.getState();

View File

@@ -2,22 +2,33 @@ package com.replaymod.render.blend.mixin;
import com.replaymod.render.blend.BlendState; import com.replaymod.render.blend.BlendState;
import com.replaymod.render.blend.exporters.ItemExporter; 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 net.minecraft.item.ItemStack;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 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) @Mixin(RenderItem.class)
public abstract class MixinRenderItem { 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")) 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) { private void onRenderModel(IBakedModel model, ItemStack stack, CallbackInfo ci) {
BlendState blendState = BlendState.getState(); BlendState blendState = BlendState.getState();
if (blendState != null) { if (blendState != null) {
blendState.get(ItemExporter.class).onRender(model, stack); blendState.get(ItemExporter.class).onRender((RenderItem)(Object)this, model, stack);
} }
} }
} }

View File

@@ -7,7 +7,12 @@ import net.minecraft.entity.Entity;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; 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) @Mixin(RenderManager.class)
public abstract class MixinRenderManager { public abstract class MixinRenderManager {
@@ -15,7 +20,12 @@ public abstract class MixinRenderManager {
@Inject(method = "doRenderEntity", @Inject(method = "doRenderEntity",
at = @At(value = "INVOKE", at = @At(value = "INVOKE",
target = "Lnet/minecraft/client/renderer/entity/Render;doRender(Lnet/minecraft/entity/Entity;DDDFFZ)V")) 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<Boolean> 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<Boolean> ci) {
//#endif
BlendState blendState = BlendState.getState(); BlendState blendState = BlendState.getState();
if (blendState != null) { if (blendState != null) {
blendState.get(EntityExporter.class).preRender(entity, x, y, z, yaw, renderPartialTicks); blendState.get(EntityExporter.class).preRender(entity, x, y, z, yaw, renderPartialTicks);
@@ -26,7 +36,12 @@ public abstract class MixinRenderManager {
at = @At(value = "INVOKE", at = @At(value = "INVOKE",
target = "Lnet/minecraft/client/renderer/entity/Render;doRender(Lnet/minecraft/entity/Entity;DDDFFZ)V", target = "Lnet/minecraft/client/renderer/entity/Render;doRender(Lnet/minecraft/entity/Entity;DDDFFZ)V",
shift = At.Shift.AFTER)) shift = At.Shift.AFTER))
public void postRender(Entity entity, double x, double y, double z, float yaw, float renderPartialTicks, boolean box, CallbackInfoReturnable<Boolean> 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<Boolean> ci) {
//#endif
BlendState blendState = BlendState.getState(); BlendState blendState = BlendState.getState();
if (blendState != null) { if (blendState != null) {
blendState.get(EntityExporter.class).postRender(entity, x, y, z, yaw, renderPartialTicks); blendState.get(EntityExporter.class).postRender(entity, x, y, z, yaw, renderPartialTicks);

View File

@@ -12,18 +12,31 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(TileEntityRendererDispatcher.class) @Mixin(TileEntityRendererDispatcher.class)
public abstract class MixinTileEntityRendererDispatcher { 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")) 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(); BlendState blendState = BlendState.getState();
if (blendState != null) { 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")) 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(); BlendState blendState = BlendState.getState();
if (blendState != null) { if (blendState != null) {
blendState.get(TileEntityExporter.class).postRender(); blendState.get(TileEntityExporter.class).postRender();

View File

@@ -1,6 +1,8 @@
package com.replaymod.render.mixin; package com.replaymod.render.mixin;
//#if MC>=10904 //#if MC>=10904
import com.replaymod.render.blend.BlendState;
import com.replaymod.render.blend.exporters.ParticlesExporter;
import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.render.hooks.EntityRendererHandler;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.Particle;
@@ -62,6 +64,10 @@ public abstract class MixinParticleManager {
rotYZ = (float) (-rotZ * Math.sin(pitch)); rotYZ = (float) (-rotZ * Math.sin(pitch));
rotXY = (float) (rotX * 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); particle.renderParticle(vertexBuffer, view, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
} }
} }

View File

@@ -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 *
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 # EntityPlayer
public net.minecraft.entity.player.EntityPlayer * public net.minecraft.entity.player.EntityPlayer *