contraptions self light but it's slightly less slow
This commit is contained in:
parent
16b8e1175e
commit
f6b68acbd5
2 changed files with 68 additions and 15 deletions
|
@ -103,14 +103,6 @@ public class ContraptionRenderer {
|
||||||
.values())
|
.values())
|
||||||
renderWorld.setBlockState(info.pos, info.state);
|
renderWorld.setBlockState(info.pos, info.state);
|
||||||
|
|
||||||
WorldLightManager lighter = renderWorld.lighter;
|
|
||||||
|
|
||||||
renderWorld.chunkProvider.getLightSources().forEach((pos) -> {
|
|
||||||
lighter.func_215573_a(pos, renderWorld.getLightValue(pos));
|
|
||||||
});
|
|
||||||
|
|
||||||
lighter.tick(Integer.MAX_VALUE, true, false);
|
|
||||||
|
|
||||||
for (BlockInfo info : c.getBlocks()
|
for (BlockInfo info : c.getBlocks()
|
||||||
.values()) {
|
.values()) {
|
||||||
BlockState state = info.state;
|
BlockState state = info.state;
|
||||||
|
|
|
@ -1,27 +1,37 @@
|
||||||
package com.simibubi.create.foundation.render.contraption;
|
package com.simibubi.create.foundation.render.contraption;
|
||||||
|
|
||||||
|
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||||
import com.mojang.blaze3d.platform.GlStateManager;
|
import com.mojang.blaze3d.platform.GlStateManager;
|
||||||
import com.simibubi.create.AllMovementBehaviours;
|
import com.simibubi.create.AllMovementBehaviours;
|
||||||
import com.simibubi.create.content.contraptions.components.structureMovement.Contraption;
|
import com.simibubi.create.content.contraptions.components.structureMovement.Contraption;
|
||||||
import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionRenderer;
|
|
||||||
import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour;
|
import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour;
|
||||||
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
|
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
|
||||||
import com.simibubi.create.foundation.render.gl.shader.ShaderHelper;
|
import com.simibubi.create.foundation.render.gl.shader.ShaderHelper;
|
||||||
import com.simibubi.create.foundation.render.instancing.*;
|
import com.simibubi.create.foundation.render.instancing.*;
|
||||||
import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData;
|
import com.simibubi.create.foundation.render.instancing.actors.StaticRotatingActorData;
|
||||||
import com.simibubi.create.foundation.render.light.ContraptionLighter;
|
import com.simibubi.create.foundation.render.light.ContraptionLighter;
|
||||||
import net.minecraft.client.renderer.BufferBuilder;
|
import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld;
|
||||||
import net.minecraft.client.renderer.Matrix4f;
|
import net.minecraft.block.BlockRenderType;
|
||||||
import net.minecraft.client.renderer.RenderType;
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.client.Minecraft;
|
||||||
|
import net.minecraft.client.renderer.*;
|
||||||
|
import net.minecraft.client.renderer.model.IBakedModel;
|
||||||
|
import net.minecraft.client.renderer.texture.OverlayTexture;
|
||||||
|
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraft.world.gen.feature.template.Template;
|
import net.minecraft.world.gen.feature.template.Template;
|
||||||
|
import net.minecraft.world.lighting.WorldLightManager;
|
||||||
|
import net.minecraftforge.client.ForgeHooksClient;
|
||||||
|
import net.minecraftforge.client.model.data.EmptyModelData;
|
||||||
import org.apache.commons.lang3.tuple.MutablePair;
|
import org.apache.commons.lang3.tuple.MutablePair;
|
||||||
|
import org.lwjgl.opengl.GL11;
|
||||||
|
|
||||||
import java.nio.FloatBuffer;
|
import java.nio.FloatBuffer;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
public class RenderedContraption {
|
public class RenderedContraption {
|
||||||
private HashMap<RenderType, ContraptionModel> renderLayers = new HashMap<>();
|
private HashMap<RenderType, ContraptionModel> renderLayers = new HashMap<>();
|
||||||
|
@ -76,10 +86,11 @@ public class RenderedContraption {
|
||||||
|
|
||||||
renderLayers.clear();
|
renderLayers.clear();
|
||||||
|
|
||||||
|
PlacementSimulationWorld renderWorld = setupRenderWorld(c);
|
||||||
List<RenderType> blockLayers = RenderType.getBlockLayers();
|
List<RenderType> blockLayers = RenderType.getBlockLayers();
|
||||||
|
|
||||||
for (RenderType layer : blockLayers) {
|
for (RenderType layer : blockLayers) {
|
||||||
renderLayers.put(layer, buildStructureBuffer(c, layer));
|
renderLayers.put(layer, buildStructureModel(renderWorld, c, layer));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -156,8 +167,58 @@ public class RenderedContraption {
|
||||||
kinetics.invalidate();
|
kinetics.invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ContraptionModel buildStructureBuffer(Contraption c, RenderType layer) {
|
private static ContraptionModel buildStructureModel(PlacementSimulationWorld renderWorld, Contraption c, RenderType layer) {
|
||||||
BufferBuilder builder = ContraptionRenderer.buildStructure(c, layer);
|
BufferBuilder builder = buildStructure(renderWorld, c, layer);
|
||||||
return new ContraptionModel(builder);
|
return new ContraptionModel(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static PlacementSimulationWorld setupRenderWorld(Contraption c) {
|
||||||
|
PlacementSimulationWorld renderWorld = new PlacementSimulationWorld(Minecraft.getInstance().world);
|
||||||
|
|
||||||
|
renderWorld.setTileEntities(c.presentTileEntities.values());
|
||||||
|
|
||||||
|
for (Template.BlockInfo info : c.getBlocks()
|
||||||
|
.values())
|
||||||
|
renderWorld.setBlockState(info.pos, info.state);
|
||||||
|
|
||||||
|
WorldLightManager lighter = renderWorld.lighter;
|
||||||
|
|
||||||
|
renderWorld.chunkProvider.getLightSources().forEach((pos) -> lighter.func_215573_a(pos, renderWorld.getLightValue(pos)));
|
||||||
|
|
||||||
|
lighter.tick(Integer.MAX_VALUE, true, false);
|
||||||
|
|
||||||
|
return renderWorld;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static BufferBuilder buildStructure(PlacementSimulationWorld renderWorld, Contraption c, RenderType layer) {
|
||||||
|
|
||||||
|
ForgeHooksClient.setRenderLayer(layer);
|
||||||
|
MatrixStack ms = new MatrixStack();
|
||||||
|
BlockRendererDispatcher dispatcher = Minecraft.getInstance()
|
||||||
|
.getBlockRendererDispatcher();
|
||||||
|
BlockModelRenderer blockRenderer = dispatcher.getBlockModelRenderer();
|
||||||
|
Random random = new Random();
|
||||||
|
BufferBuilder builder = new BufferBuilder(DefaultVertexFormats.BLOCK.getIntegerSize());
|
||||||
|
builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK);
|
||||||
|
|
||||||
|
for (Template.BlockInfo info : c.getBlocks()
|
||||||
|
.values()) {
|
||||||
|
BlockState state = info.state;
|
||||||
|
|
||||||
|
if (state.getRenderType() == BlockRenderType.ENTITYBLOCK_ANIMATED)
|
||||||
|
continue;
|
||||||
|
if (!RenderTypeLookup.canRenderInLayer(state, layer))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
IBakedModel originalModel = dispatcher.getModelForState(state);
|
||||||
|
ms.push();
|
||||||
|
ms.translate(info.pos.getX(), info.pos.getY(), info.pos.getZ());
|
||||||
|
blockRenderer.renderModel(renderWorld, originalModel, state, info.pos, ms, builder, true, random, 42,
|
||||||
|
OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE);
|
||||||
|
ms.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.finishDrawing();
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue