Update blend export to 1.12.2
This commit is contained in:
@@ -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<BlockPos, DObject> chunkObjects = new HashMap<>();
|
||||
private final Map<BlockPos, Map<EnumWorldBlockLayer, DObject>> chunkLayerObjects = new HashMap<>();
|
||||
private final List<Pair<RenderChunk, EnumWorldBlockLayer>> chunks = new ArrayList<>();
|
||||
//#if MC>=10904
|
||||
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 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<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();
|
||||
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<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);
|
||||
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;
|
||||
|
||||
|
||||
@@ -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<BakedQuad> quads, ItemStack stack) {
|
||||
private static void renderQuads(RenderItem renderItem, BlendMeshBuilder buffer, List<BakedQuad> 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
|
||||
|
||||
@@ -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<Entity, DObject> particleObjects;
|
||||
private Map<Entity, DObject> particleObjectsSeen;
|
||||
//#if MC>=10904
|
||||
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) {
|
||||
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<Entity, DObject> 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<>();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user