almost super fast kinetic rendering but we need to detect changes in light first (forge pr?)

fast contraption rendering
This commit is contained in:
JozsefA 2021-01-08 01:29:18 -08:00
parent fa1e3ea543
commit 05ab482f70
33 changed files with 381 additions and 269 deletions

View file

@ -8,7 +8,6 @@ import java.util.List;
import javax.annotation.Nullable;
import com.simibubi.create.Create;
import com.simibubi.create.CreateClient;
import com.simibubi.create.content.contraptions.KineticNetwork;
import com.simibubi.create.content.contraptions.RotationPropagator;
import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel;
@ -22,6 +21,7 @@ import com.simibubi.create.foundation.tileEntity.SmartTileEntity;
import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.render.instancing.IInstanceRendered;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.client.resources.I18n;
@ -38,7 +38,7 @@ import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
public abstract class KineticTileEntity extends SmartTileEntity
implements ITickableTileEntity, IHaveGoggleInformation, IHaveHoveringInformation {
implements ITickableTileEntity, IHaveGoggleInformation, IHaveHoveringInformation, IInstanceRendered {
public @Nullable Long network;
public @Nullable BlockPos source;

View file

@ -8,6 +8,7 @@ import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock;
import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer;
import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.ColorHelper;
import com.simibubi.create.foundation.utility.render.instancing.IInstancedTileEntityRenderer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.render.SuperByteBufferCache.Compartment;
@ -22,11 +23,12 @@ import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.Direction.AxisDirection;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.LightType;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@EventBusSubscriber(value = Dist.CLIENT)
public class KineticTileEntityRenderer extends SafeTileEntityRenderer<KineticTileEntity> {
public class KineticTileEntityRenderer extends SafeTileEntityRenderer<KineticTileEntity> implements IInstancedTileEntityRenderer<KineticTileEntity> {
public static final Compartment<BlockState> KINETIC_TILE = new Compartment<>();
public static boolean rainbowMode = false;
@ -43,23 +45,31 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer<KineticTil
@Override
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay) {
for (RenderType type : RenderType.getBlockLayers())
if (RenderTypeLookup.canRenderInLayer(te.getBlockState(), type))
renderRotatingBuffer(te, getRotatedModel(te), light);
// for (RenderType type : RenderType.getBlockLayers())
// if (RenderTypeLookup.canRenderInLayer(te.getBlockState(), type))
// renderRotatingBuffer(te, getRotatedModel(te));
addInstanceData(te);
}
public static void renderRotatingKineticBlock(KineticTileEntity te, BlockState renderedState, int light) {
@Override
public void addInstanceData(KineticTileEntity te) {
renderRotatingBuffer(te, getRotatedModel(te));
}
public static void renderRotatingKineticBlock(KineticTileEntity te, BlockState renderedState) {
RotatingBuffer instancedRenderer = CreateClient.kineticRenderer.renderBlockInstanced(KINETIC_TILE, renderedState);
renderRotatingBuffer(te, instancedRenderer, light);
renderRotatingBuffer(te, instancedRenderer);
}
public static void renderRotatingBuffer(KineticTileEntity te, RotatingBuffer instancer, int light) {
public static void renderRotatingBuffer(KineticTileEntity te, RotatingBuffer instancer) {
instancer.setupInstance(data -> {
final BlockPos pos = te.getPos();
Axis axis = ((IRotate) te.getBlockState()
.getBlock()).getRotationAxis(te.getBlockState());
data.setPackedLight(light)
data
.setBlockLight(te.getWorld().getLightLevel(LightType.BLOCK, te.getPos()))
.setSkyLight(te.getWorld().getLightLevel(LightType.SKY, te.getPos()))
.setRotationalSpeed(te.getSpeed())
.setRotationOffset(getRotationOffsetForPosition(te, pos, axis))
.setRotationAxis(Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis).getUnitVector())

View file

@ -14,6 +14,7 @@ import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.render.instancing.RotatingData;
import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;

View file

@ -7,9 +7,11 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity.Animation;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingData;
import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;

View file

@ -19,6 +19,7 @@ import com.simibubi.create.foundation.utility.NBTHelper;
import com.simibubi.create.foundation.utility.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.render.instancing.IInstancedTileEntityRenderer;
import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.IRenderTypeBuffer;
@ -37,7 +38,7 @@ import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
public class DeployerRenderer extends SafeTileEntityRenderer<DeployerTileEntity> {
public class DeployerRenderer extends SafeTileEntityRenderer<DeployerTileEntity> implements IInstancedTileEntityRenderer<DeployerTileEntity> {
public DeployerRenderer(TileEntityRendererDispatcher dispatcher) {
super(dispatcher);
@ -49,6 +50,13 @@ public class DeployerRenderer extends SafeTileEntityRenderer<DeployerTileEntity>
renderItem(te, partialTicks, ms, buffer, light, overlay);
FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay);
renderComponents(te, partialTicks, ms, buffer, light, overlay);
addInstanceData(te);
}
@Override
public void addInstanceData(DeployerTileEntity te) {
KineticTileEntityRenderer.renderRotatingKineticBlock(te, getRenderedBlockState(te));
}
protected void renderItem(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
@ -102,7 +110,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer<DeployerTileEntity>
protected void renderComponents(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay) {
IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid());
KineticTileEntityRenderer.renderRotatingKineticBlock(te, getRenderedBlockState(te), light);
KineticTileEntityRenderer.renderRotatingKineticBlock(te, getRenderedBlockState(te));
BlockState blockState = te.getBlockState();
BlockPos pos = te.getPos();

View file

@ -15,6 +15,7 @@ import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.LightType;
public class EncasedFanRenderer extends KineticTileEntityRenderer {
@ -25,18 +26,24 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer {
@Override
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay) {
addInstanceData(te);
}
@Override
public void addInstanceData(KineticTileEntity te) {
Direction direction = te.getBlockState()
.get(FACING);
int lightBehind = WorldRenderer.getLightmapCoordinates(te.getWorld(), te.getPos().offset(direction.getOpposite()));
int lightInFront = WorldRenderer.getLightmapCoordinates(te.getWorld(), te.getPos().offset(direction));
BlockPos inFront = te.getPos().offset(direction);
int blockLight = te.getWorld().getLightLevel(LightType.BLOCK, inFront);
int skyLight = te.getWorld().getLightLevel(LightType.SKY, inFront);
RotatingBuffer shaftHalf =
AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(te.getBlockState(), direction.getOpposite());
RotatingBuffer fanInner =
AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(te.getBlockState(), direction.getOpposite());
renderRotatingBuffer(te, shaftHalf, lightBehind);
renderRotatingBuffer(te, shaftHalf);
fanInner.setupInstance(data -> {
final BlockPos pos = te.getPos();
Direction.Axis axis = ((IRotate) te.getBlockState()
@ -48,12 +55,12 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer {
if (speed < 0)
speed = MathHelper.clamp(speed, -64 * 20, -80);
data.setPackedLight(lightInFront)
data.setBlockLight(blockLight)
.setSkyLight(skyLight)
.setRotationalSpeed(speed)
.setRotationOffset(getRotationOffsetForPosition(te, pos, axis))
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
.setPosition(pos);
});
}
}

View file

@ -9,9 +9,11 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.content.contraptions.components.flywheel.FlywheelBlock.ConnectionState;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer;
import com.simibubi.create.foundation.utility.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingData;
import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;

View file

@ -5,7 +5,9 @@ import com.simibubi.create.CreateClient;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingData;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
public class MillstoneRenderer extends KineticTileEntityRenderer {

View file

@ -4,7 +4,9 @@ import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingData;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
public class CreativeMotorRenderer extends KineticTileEntityRenderer {

View file

@ -12,6 +12,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRe
import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer;
import com.simibubi.create.foundation.utility.*;
import com.simibubi.create.foundation.utility.render.instancing.IInstancedTileEntityRenderer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.SuperByteBuffer;
import net.minecraft.block.BlockState;
@ -29,7 +30,7 @@ import net.minecraft.util.Rotation;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
public class SawRenderer extends SafeTileEntityRenderer<SawTileEntity> {
public class SawRenderer extends SafeTileEntityRenderer<SawTileEntity> implements IInstancedTileEntityRenderer<SawTileEntity> {
public SawRenderer(TileEntityRendererDispatcher dispatcher) {
super(dispatcher);
@ -41,7 +42,13 @@ public class SawRenderer extends SafeTileEntityRenderer<SawTileEntity> {
renderBlade(te, ms, buffer, light);
renderItems(te, partialTicks, ms, buffer, light, overlay);
FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay);
renderShaft(te, ms, buffer, light, overlay);
addInstanceData(te);
}
@Override
public void addInstanceData(SawTileEntity te) {
KineticTileEntityRenderer.renderRotatingBuffer(te, getRotatedModel(te));
}
protected void renderBlade(SawTileEntity te, MatrixStack ms, IRenderTypeBuffer buffer, int light){
@ -79,7 +86,7 @@ public class SawRenderer extends SafeTileEntityRenderer<SawTileEntity> {
}
protected void renderShaft(SawTileEntity te, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) {
KineticTileEntityRenderer.renderRotatingBuffer(te, getRotatedModel(te), light);
KineticTileEntityRenderer.renderRotatingBuffer(te, getRotatedModel(te));
}
protected void renderItems(SawTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light,

View file

@ -53,8 +53,8 @@ public abstract class AbstractContraptionEntityRenderer<C extends AbstractContra
transform(entity, partialTicks, matrixStacks);
Contraption contraption = entity.getContraption();
if (contraption != null) {
ContraptionRenderer.render(entity.world, contraption, ms, msLocal, buffers);
// not ready yet FastContraptionRenderer.markForRendering(entity.world, contraption, getPosition(entity, partialTicks), getRotation(entity, partialTicks));
ContraptionRenderer.renderDynamic(entity.world, contraption, ms, msLocal, buffers);
FastContraptionRenderer.markForRendering(entity.world, contraption, getPosition(entity, partialTicks), getRotation(entity, partialTicks));
}
ms.pop();

View file

@ -18,6 +18,12 @@ import java.util.stream.Collectors;
import javax.annotation.Nullable;
import com.simibubi.create.CreateClient;
import com.simibubi.create.foundation.utility.render.FastContraptionRenderer;
import com.simibubi.create.foundation.utility.render.FastKineticRenderer;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.DistExecutor;
import org.apache.commons.lang3.tuple.MutablePair;
import org.apache.commons.lang3.tuple.Pair;

View file

@ -5,9 +5,11 @@ import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer;
import com.simibubi.create.foundation.utility.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingData;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;

View file

@ -6,9 +6,11 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.MatrixStacker;
import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer;
import com.simibubi.create.foundation.utility.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingData;
import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;

View file

@ -5,11 +5,12 @@ import com.simibubi.create.CreateClient;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer;
import com.simibubi.create.foundation.utility.render.instancing.IInstancedTileEntityRenderer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
public class SpeedControllerRenderer extends SmartTileEntityRenderer<SpeedControllerTileEntity> {
public class SpeedControllerRenderer extends SmartTileEntityRenderer<SpeedControllerTileEntity> implements IInstancedTileEntityRenderer<SpeedControllerTileEntity> {
public SpeedControllerRenderer(TileEntityRendererDispatcher dispatcher) {
super(dispatcher);
@ -20,7 +21,12 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer<SpeedContro
IRenderTypeBuffer buffer, int light, int overlay) {
super.renderSafe(tileEntityIn, partialTicks, ms, buffer, light, overlay);
KineticTileEntityRenderer.renderRotatingBuffer(tileEntityIn, getRotatedModel(tileEntityIn), light);
addInstanceData(tileEntityIn);
}
@Override
public void addInstanceData(SpeedControllerTileEntity te) {
KineticTileEntityRenderer.renderRotatingBuffer(te, getRotatedModel(te));
}
private RotatingBuffer getRotatedModel(SpeedControllerTileEntity te) {

View file

@ -14,6 +14,7 @@ import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer
import com.simibubi.create.foundation.utility.Iterate;
import com.simibubi.create.foundation.utility.MatrixStacker;
import com.simibubi.create.foundation.utility.render.instancing.BeltBuffer;
import com.simibubi.create.foundation.utility.render.instancing.IInstancedTileEntityRenderer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.ShadowRenderHelper;
@ -29,8 +30,9 @@ import net.minecraft.util.Direction.AxisDirection;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.Vec3i;
import net.minecraft.world.LightType;
public class BeltRenderer extends SafeTileEntityRenderer<BeltTileEntity> {
public class BeltRenderer extends SafeTileEntityRenderer<BeltTileEntity> implements IInstancedTileEntityRenderer<BeltTileEntity> {
public BeltRenderer(TileEntityRendererDispatcher dispatcher) {
super(dispatcher);
@ -45,6 +47,17 @@ public class BeltRenderer extends SafeTileEntityRenderer<BeltTileEntity> {
protected void renderSafe(BeltTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay) {
BlockState blockState = te.getBlockState();
if (!AllBlocks.BELT.has(blockState))
return;
addInstanceData(te);
renderItems(te, partialTicks, ms, buffer, light, overlay);
}
@Override
public void addInstanceData(BeltTileEntity te) {
BlockState blockState = te.getBlockState();
if (!AllBlocks.BELT.has(blockState))
return;
@ -97,8 +110,9 @@ public class BeltRenderer extends SafeTileEntityRenderer<BeltTileEntity> {
float rotZ = sideways ? 90 : (vertical ? 180 : 0);
data.setPosition(te.getPos())
.setBlockLight(te.getWorld().getLightLevel(LightType.BLOCK, te.getPos()))
.setSkyLight(te.getWorld().getLightLevel(LightType.SKY, te.getPos()))
.setRotation(rotX, rotY, rotZ)
.setPackedLight(light)
.setRotationalSpeed(speed)
.setScrollTexture(spriteShift)
.setScrollMult(diagonal ? 3f / 8f : 0.5f);
@ -127,10 +141,9 @@ public class BeltRenderer extends SafeTileEntityRenderer<BeltTileEntity> {
RotatingBuffer rotatingBuffer = CreateClient.kineticRenderer
.renderDirectionalPartialInstanced(AllBlockPartials.BELT_PULLEY, blockState, dir, modelTransform);
KineticTileEntityRenderer.renderRotatingBuffer(te, rotatingBuffer, light);
KineticTileEntityRenderer.renderRotatingBuffer(te, rotatingBuffer);
}
renderItems(te, partialTicks, ms, buffer, light, overlay);
}
protected void renderItems(BeltTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,

View file

@ -14,6 +14,7 @@ import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.LightType;
public class SplitShaftRenderer extends KineticTileEntityRenderer {
@ -24,10 +25,19 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer {
@Override
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay) {
addInstanceData(te);
}
@Override
public void addInstanceData(KineticTileEntity te) {
Block block = te.getBlockState().getBlock();
final Axis boxAxis = ((IRotate) block).getRotationAxis(te.getBlockState());
final BlockPos pos = te.getPos();
int blockLight = te.getWorld().getLightLevel(LightType.BLOCK, te.getPos());
int skyLight = te.getWorld().getLightLevel(LightType.SKY, te.getPos());
for (Direction direction : Iterate.directions) {
Axis axis = direction.getAxis();
if (boxAxis != axis)
@ -46,7 +56,8 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer {
speed *= modifier;
data.setPackedLight(light)
data.setBlockLight(blockLight)
.setSkyLight(skyLight)
.setRotationalSpeed(speed)
.setRotationOffset(getRotationOffsetForPosition(te, pos, axis))
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
@ -54,5 +65,4 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer {
});
}
}
}

View file

@ -13,6 +13,7 @@ import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.LightType;
public class GearboxRenderer extends KineticTileEntityRenderer {
@ -26,6 +27,9 @@ public class GearboxRenderer extends KineticTileEntityRenderer {
final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS);
final BlockPos pos = te.getPos();
int blockLight = te.getWorld().getLightLevel(LightType.BLOCK, te.getPos());
int skyLight = te.getWorld().getLightLevel(LightType.SKY, te.getPos());
for (Direction direction : Iterate.directions) {
final Axis axis = direction.getAxis();
if (boxAxis == axis)
@ -45,7 +49,8 @@ public class GearboxRenderer extends KineticTileEntityRenderer {
speed *= -1;
}
data.setPackedLight(light)
data.setBlockLight(blockLight)
.setSkyLight(skyLight)
.setRotationalSpeed(speed)
.setRotationOffset(getRotationOffsetForPosition(te, pos, axis))
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())

View file

@ -8,8 +8,10 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity.Phase;
import com.simibubi.create.foundation.utility.*;
import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer;
import com.simibubi.create.foundation.utility.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingData;
import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.IRenderTypeBuffer;

View file

@ -11,7 +11,8 @@ public class AnimationTickHolder {
}
public static float getRenderTick() {
return ticks + Minecraft.getInstance().getRenderPartialTicks();
Minecraft mc = Minecraft.getInstance();
return ticks + (mc.isGamePaused() ? mc.renderPartialTicksPaused : mc.getRenderPartialTicks());
}
}

View file

@ -24,7 +24,7 @@ import java.util.concurrent.ExecutionException;
public class FastContraptionRenderer extends ContraptionRenderer {
private static final Cache<Contraption, FastContraptionRenderer> renderers = CacheBuilder.newBuilder().build();
private static final Cache<Integer, FastContraptionRenderer> renderers = CacheBuilder.newBuilder().build();
private ArrayList<ContraptionBuffer> renderLayers = new ArrayList<>();
@ -105,7 +105,7 @@ public class FastContraptionRenderer extends ContraptionRenderer {
private static FastContraptionRenderer getRenderer(World world, Contraption c) {
try {
return renderers.get(c, () -> new FastContraptionRenderer(world, c));
return renderers.get(c.entity.getEntityId(), () -> new FastContraptionRenderer(world, c));
} catch (ExecutionException e) {
e.printStackTrace();
return null;
@ -120,13 +120,20 @@ public class FastContraptionRenderer extends ContraptionRenderer {
ShaderHelper.useShader(Shader.CONTRAPTION_STRUCTURE, ShaderHelper.getViewProjectionCallback(event));
int shader = ShaderHelper.getShaderHandle(Shader.CONTRAPTION_STRUCTURE);
ArrayList<Integer> toRemove = new ArrayList<>();
for (FastContraptionRenderer renderer : renderers.asMap().values()) {
if (renderer.c.entity.isAlive())
renderer.render(shader);
else
toRemove.add(renderer.c.entity.getEntityId());
}
ShaderHelper.releaseShader();
CreateClient.kineticRenderer.teardown();
renderers.invalidateAll(toRemove);
}
public static void invalidateAll() {

View file

@ -6,10 +6,7 @@ import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.Create;
import com.simibubi.create.foundation.utility.render.instancing.BeltBuffer;
import com.simibubi.create.foundation.utility.render.instancing.InstanceBuffer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.instancing.*;
import com.simibubi.create.foundation.utility.render.shader.Shader;
import com.simibubi.create.foundation.utility.render.shader.ShaderCallback;
import com.simibubi.create.foundation.utility.render.shader.ShaderHelper;
@ -18,11 +15,13 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.*;
import net.minecraft.client.renderer.model.IBakedModel;
import net.minecraft.client.renderer.texture.Texture;
import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.inventory.container.PlayerContainer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraft.world.World;
import net.minecraftforge.client.event.RenderWorldLastEvent;
import net.minecraftforge.fml.common.Mod;
import org.apache.commons.lang3.tuple.Pair;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL13;
@ -36,13 +35,14 @@ import java.util.function.Supplier;
import static com.simibubi.create.foundation.utility.render.SuperByteBufferCache.PARTIAL;
@Mod.EventBusSubscriber(modid = Create.ID, value = Dist.CLIENT)
public class FastKineticRenderer {
Map<SuperByteBufferCache.Compartment<?>, Cache<Object, RotatingBuffer>> rotating;
Map<SuperByteBufferCache.Compartment<?>, Cache<Object, BeltBuffer>> belts;
Queue<Runnable> runs;
boolean rebuild;
public FastKineticRenderer() {
rotating = new HashMap<>();
belts = new HashMap<>();
@ -52,7 +52,29 @@ public class FastKineticRenderer {
registerCompartment(SuperByteBufferCache.DIRECTIONAL_PARTIAL);
}
public void buildTileEntityBuffers(World world) {
List<TileEntity> tileEntities = world.loadedTileEntityList;
if (!tileEntities.isEmpty()) {
for (TileEntity te : tileEntities) {
if (te instanceof IInstanceRendered) {
TileEntityRenderer<TileEntity> renderer = TileEntityRendererDispatcher.instance.getRenderer(te);
if (renderer instanceof IInstancedTileEntityRenderer) {
addInstancedData(te, (IInstancedTileEntityRenderer<? super TileEntity>) renderer);
}
}
}
}
}
private <T extends TileEntity> void addInstancedData(T te, IInstancedTileEntityRenderer<T> renderer) {
renderer.addInstanceData(te);
}
public void tick() {
// TODO: (later) detect changes in lighting with a mixin to ClientChunkProvider.markLightChanged()
for (Cache<Object, RotatingBuffer> cache : rotating.values()) {
for (RotatingBuffer renderer : cache.asMap().values()) {
renderer.clearInstanceData();
@ -64,6 +86,8 @@ public class FastKineticRenderer {
renderer.clearInstanceData();
}
}
// rebuild = true;
}
public void enqueue(Runnable run) {
@ -72,6 +96,11 @@ public class FastKineticRenderer {
public void renderInstances(RenderWorldLastEvent event) {
GameRenderer gameRenderer = Minecraft.getInstance().gameRenderer;
//
// if (rebuild) {
// buildTileEntityBuffers(Minecraft.getInstance().world);
// rebuild = false;
// }
setup(gameRenderer);

View file

@ -1,13 +0,0 @@
package com.simibubi.create.foundation.utility.render;
import net.minecraft.client.renderer.LightTexture;
public class LightUtil {
public static float getProperBlockLight(int packedLight) {
return LightTexture.getBlockLightCoordinates(packedLight) / (float) 0xF;
}
public static float getProperSkyLight(int packedLight) {
return LightTexture.getSkyLightCoordinates(packedLight) / (float) 0xF;
}
}

View file

@ -0,0 +1,46 @@
package com.simibubi.create.foundation.utility.render.instancing;
import net.minecraft.client.renderer.Vector3f;
import net.minecraft.util.math.BlockPos;
import java.nio.ByteBuffer;
public class BasicData<D extends BasicData<D>> extends InstanceData {
private float x;
private float y;
private float z;
private float blockLight;
private float skyLight;
public D setBlockLight(int blockLight) {
this.blockLight = blockLight / 15f;
return (D) this;
}
public D setSkyLight(int skyLight) {
this.skyLight = skyLight / 15f;
return (D) this;
}
public D setPosition(Vector3f pos) {
this.x = pos.getX();
this.y = pos.getY();
this.z = pos.getZ();
return (D) this;
}
public D setPosition(BlockPos pos) {
this.x = pos.getX();
this.y = pos.getY();
this.z = pos.getZ();
return (D) this;
}
@Override
public void write(ByteBuffer buf) {
putVec3(buf, x, y, z);
putVec2(buf, blockLight, skyLight);
}
}

View file

@ -1,15 +1,8 @@
package com.simibubi.create.foundation.utility.render.instancing;
import com.simibubi.create.foundation.block.render.SpriteShiftEntry;
import com.simibubi.create.foundation.utility.render.LightUtil;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.util.math.BlockPos;
import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*;
import java.nio.ByteBuffer;
public class BeltBuffer extends InstanceBuffer<BeltBuffer.BeltData> {
public class BeltBuffer extends InstanceBuffer<BeltData> {
public BeltBuffer(BufferBuilder buf) {
super(buf);
}
@ -24,84 +17,4 @@ public class BeltBuffer extends InstanceBuffer<BeltBuffer.BeltData> {
return BeltData.FORMAT;
}
public static class BeltData extends InstanceData {
public static VertexFormat FORMAT = new VertexFormat(VEC3, VEC3, VEC2, FLOAT, VEC2, VEC4, FLOAT);
private float x;
private float y;
private float z;
private float rotX;
private float rotY;
private float rotZ;
private int packedLight;
private float rotationalSpeed;
private float sourceU;
private float sourceV;
private float minU;
private float minV;
private float maxU;
private float maxV;
private float scrollMult;
public BeltData setPosition(BlockPos pos) {
this.x = pos.getX();
this.y = pos.getY();
this.z = pos.getZ();
return this;
}
public BeltData setRotation(float rotX, float rotY, float rotZ) {
this.rotX = rotX;
this.rotY = rotY;
this.rotZ = rotZ;
return this;
}
public BeltData setPackedLight(int packedLight) {
this.packedLight = packedLight;
return this;
}
public BeltData setRotationalSpeed(float rotationalSpeed) {
this.rotationalSpeed = rotationalSpeed;
return this;
}
public BeltData setScrollTexture(SpriteShiftEntry spriteShift) {
TextureAtlasSprite source = spriteShift.getOriginal();
TextureAtlasSprite target = spriteShift.getTarget();
this.sourceU = source.getMinU();
this.sourceV = source.getMinV();
this.minU = target.getMinU();
this.minV = target.getMinV();
this.maxU = target.getMaxU();
this.maxV = target.getMaxV();
return this;
}
public BeltData setScrollMult(float scrollMult) {
this.scrollMult = scrollMult;
return this;
}
@Override
public void write(ByteBuffer buf) {
float blockLightCoordinates = LightUtil.getProperBlockLight(packedLight);
float skyLightCoordinates = LightUtil.getProperSkyLight(packedLight);
putVec3(buf, x, y, z);
putVec3(buf, rotX, rotY, rotZ);
putVec2(buf, blockLightCoordinates, skyLightCoordinates);
putFloat(buf, rotationalSpeed);
putVec2(buf, sourceU, sourceV);
putVec4(buf, minU, minV, maxU, maxV);
putFloat(buf, scrollMult);
}
}
}

View file

@ -0,0 +1,70 @@
package com.simibubi.create.foundation.utility.render.instancing;
import com.simibubi.create.foundation.block.render.SpriteShiftEntry;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.util.math.BlockPos;
import java.nio.ByteBuffer;
import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*;
public class BeltData extends BasicData<BeltData> {
public static VertexFormat FORMAT = new VertexFormat(VEC3, VEC2, VEC3, FLOAT, VEC2, VEC4, FLOAT);
private float rotX;
private float rotY;
private float rotZ;
private float rotationalSpeed;
private float sourceU;
private float sourceV;
private float minU;
private float minV;
private float maxU;
private float maxV;
private float scrollMult;
public BeltData setRotation(float rotX, float rotY, float rotZ) {
this.rotX = rotX;
this.rotY = rotY;
this.rotZ = rotZ;
return this;
}
public BeltData setRotationalSpeed(float rotationalSpeed) {
this.rotationalSpeed = rotationalSpeed;
return this;
}
public BeltData setScrollTexture(SpriteShiftEntry spriteShift) {
TextureAtlasSprite source = spriteShift.getOriginal();
TextureAtlasSprite target = spriteShift.getTarget();
this.sourceU = source.getMinU();
this.sourceV = source.getMinV();
this.minU = target.getMinU();
this.minV = target.getMinV();
this.maxU = target.getMaxU();
this.maxV = target.getMaxV();
return this;
}
public BeltData setScrollMult(float scrollMult) {
this.scrollMult = scrollMult;
return this;
}
@Override
public void write(ByteBuffer buf) {
super.write(buf);
putVec3(buf, rotX, rotY, rotZ);
putFloat(buf, rotationalSpeed);
putVec2(buf, sourceU, sourceV);
putVec4(buf, minU, minV, maxU, maxV);
putFloat(buf, scrollMult);
}
}

View file

@ -0,0 +1,4 @@
package com.simibubi.create.foundation.utility.render.instancing;
public interface IInstanceRendered {
}

View file

@ -0,0 +1,13 @@
package com.simibubi.create.foundation.utility.render.instancing;
import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer;
import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.tileentity.TileEntity;
import java.util.function.Supplier;
public interface IInstancedTileEntityRenderer<T extends TileEntity> {
void addInstanceData(T te);
}

View file

@ -1,12 +0,0 @@
package com.simibubi.create.foundation.utility.render.instancing;
import net.minecraft.tileentity.TileEntity;
import java.util.function.Supplier;
public abstract class InstancedTileEntityRenderer<T extends TileEntity, D extends InstanceData> {
public abstract D getInstanceData(T te);
public abstract InstanceBuffer<D> getModel(T te);
}

View file

@ -1,24 +1,8 @@
package com.simibubi.create.foundation.utility.render.instancing;
import com.mojang.blaze3d.platform.GlStateManager;
import com.simibubi.create.foundation.utility.render.LightUtil;
import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.GLAllocation;
import net.minecraft.client.renderer.Vector3f;
import net.minecraft.client.renderer.vertex.VertexFormatElement;
import net.minecraft.util.math.BlockPos;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL15;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL40;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*;
import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.FLOAT;
public class RotatingBuffer extends InstanceBuffer<RotatingBuffer.RotatingData> {
public class RotatingBuffer extends InstanceBuffer<RotatingData> {
public RotatingBuffer(BufferBuilder buf) {
super(buf);
}
@ -33,74 +17,4 @@ public class RotatingBuffer extends InstanceBuffer<RotatingBuffer.RotatingData>
return RotatingData.FORMAT;
}
public static class RotatingData extends InstanceData {
public static VertexFormat FORMAT = new VertexFormat(VEC3, VEC2, FLOAT, FLOAT, VEC3);
private float x;
private float y;
private float z;
private int packedLight;
private float rotationalSpeed;
private float rotationOffset;
private float rotationAxisX;
private float rotationAxisY;
private float rotationAxisZ;
public RotatingData setPackedLight(int packedLight) {
this.packedLight = packedLight;
return this;
}
public RotatingData setRotationalSpeed(float rotationalSpeed) {
this.rotationalSpeed = rotationalSpeed;
return this;
}
public RotatingData setRotationOffset(float rotationOffset) {
this.rotationOffset = rotationOffset;
return this;
}
public RotatingData setPosition(Vector3f pos) {
this.x = pos.getX();
this.y = pos.getY();
this.z = pos.getZ();
return this;
}
public RotatingData setPosition(BlockPos pos) {
this.x = pos.getX();
this.y = pos.getY();
this.z = pos.getZ();
return this;
}
public RotatingData setRotationAxis(Vector3f axis) {
this.rotationAxisX = axis.getX();
this.rotationAxisY = axis.getY();
this.rotationAxisZ = axis.getZ();
return this;
}
public RotatingData setRotationAxis(float rotationAxisX, float rotationAxisY, float rotationAxisZ) {
this.rotationAxisX = rotationAxisX;
this.rotationAxisY = rotationAxisY;
this.rotationAxisZ = rotationAxisZ;
return this;
}
@Override
public void write(ByteBuffer buf) {
float blockLightCoordinates = LightUtil.getProperBlockLight(packedLight);
float skyLightCoordinates = LightUtil.getProperSkyLight(packedLight);
putVec3(buf, x, y, z);
putVec2(buf, blockLightCoordinates, skyLightCoordinates);
putFloat(buf, rotationalSpeed);
putFloat(buf, rotationOffset);
putVec3(buf, rotationAxisX, rotationAxisY, rotationAxisZ);
}
}
}

View file

@ -0,0 +1,51 @@
package com.simibubi.create.foundation.utility.render.instancing;
import net.minecraft.client.renderer.Vector3f;
import net.minecraft.util.math.BlockPos;
import java.nio.ByteBuffer;
import static com.simibubi.create.foundation.utility.render.instancing.VertexAttribute.*;
public class RotatingData extends BasicData<RotatingData> {
public static VertexFormat FORMAT = new VertexFormat(VEC3, VEC2, FLOAT, FLOAT, VEC3);
private float rotationalSpeed;
private float rotationOffset;
private float rotationAxisX;
private float rotationAxisY;
private float rotationAxisZ;
public RotatingData setRotationalSpeed(float rotationalSpeed) {
this.rotationalSpeed = rotationalSpeed;
return this;
}
public RotatingData setRotationOffset(float rotationOffset) {
this.rotationOffset = rotationOffset;
return this;
}
public RotatingData setRotationAxis(Vector3f axis) {
this.rotationAxisX = axis.getX();
this.rotationAxisY = axis.getY();
this.rotationAxisZ = axis.getZ();
return this;
}
public RotatingData setRotationAxis(float rotationAxisX, float rotationAxisY, float rotationAxisZ) {
this.rotationAxisX = rotationAxisX;
this.rotationAxisY = rotationAxisY;
this.rotationAxisZ = rotationAxisZ;
return this;
}
@Override
public void write(ByteBuffer buf) {
super.write(buf);
putFloat(buf, rotationalSpeed);
putFloat(buf, rotationOffset);
putVec3(buf, rotationAxisX, rotationAxisY, rotationAxisZ);
}
}

View file

@ -6,8 +6,8 @@ layout (location = 1) in vec3 aNormal;
layout (location = 2) in vec2 aTexCoords;
layout (location = 3) in vec3 instancePos;
layout (location = 4) in vec3 rotationDegrees;
layout (location = 5) in vec2 light;
layout (location = 4) in vec2 light;
layout (location = 5) in vec3 rotationDegrees;
layout (location = 6) in float speed;
layout (location = 7) in vec2 sourceUV;
layout (location = 8) in vec4 scrollTexture;

View file

@ -38,14 +38,16 @@ mat4 contraptionRotation() {
}
void main() {
vec4 rotatedPos = contraptionRotation() * vec4(aPos - vec3(0.5), 1);
mat4 rotation = contraptionRotation();
vec4 rotatedPos = rotation * vec4(aPos - vec3(0.5), 1);
vec4 worldPos = rotatedPos + vec4(cPos + vec3(0.5), 0);
vec3 boxCoord = (worldPos.xyz - cPos - cSize * 0.5) / cSize;
//Light = texture(lightVolume, boxCoord).rg;
Normal = aNormal;
Light = vec2(1.);
Normal = normalize((rotation * vec4(aNormal, 0.)).xyz);
TexCoords = aTexCoords;
gl_Position = projection * view * worldPos;
}