contraptions self light but it's slightly less slow

This commit is contained in:
JozsefA 2021-01-30 15:37:50 -08:00
parent 16b8e1175e
commit f6b68acbd5
2 changed files with 68 additions and 15 deletions

View file

@ -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;

View file

@ -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;
}
} }