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 javax.annotation.Nullable;
import com.simibubi.create.Create; import com.simibubi.create.Create;
import com.simibubi.create.CreateClient;
import com.simibubi.create.content.contraptions.KineticNetwork; import com.simibubi.create.content.contraptions.KineticNetwork;
import com.simibubi.create.content.contraptions.RotationPropagator; import com.simibubi.create.content.contraptions.RotationPropagator;
import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; 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.tileEntity.TileEntityBehaviour;
import com.simibubi.create.foundation.utility.Lang; 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.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
@ -38,7 +38,7 @@ import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World; import net.minecraft.world.World;
public abstract class KineticTileEntity extends SmartTileEntity public abstract class KineticTileEntity extends SmartTileEntity
implements ITickableTileEntity, IHaveGoggleInformation, IHaveHoveringInformation { implements ITickableTileEntity, IHaveGoggleInformation, IHaveHoveringInformation, IInstanceRendered {
public @Nullable Long network; public @Nullable Long network;
public @Nullable BlockPos source; 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.tileEntity.renderer.SafeTileEntityRenderer;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.ColorHelper; 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.instancing.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.render.SuperByteBufferCache.Compartment; 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.Axis;
import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.Direction.AxisDirection;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.LightType;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@EventBusSubscriber(value = Dist.CLIENT) @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 final Compartment<BlockState> KINETIC_TILE = new Compartment<>();
public static boolean rainbowMode = false; public static boolean rainbowMode = false;
@ -43,23 +45,31 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer<KineticTil
@Override @Override
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay) { int light, int overlay) {
for (RenderType type : RenderType.getBlockLayers()) // for (RenderType type : RenderType.getBlockLayers())
if (RenderTypeLookup.canRenderInLayer(te.getBlockState(), type)) // if (RenderTypeLookup.canRenderInLayer(te.getBlockState(), type))
renderRotatingBuffer(te, getRotatedModel(te), light); // 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); 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 -> { instancer.setupInstance(data -> {
final BlockPos pos = te.getPos(); final BlockPos pos = te.getPos();
Axis axis = ((IRotate) te.getBlockState() Axis axis = ((IRotate) te.getBlockState()
.getBlock()).getRotationAxis(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()) .setRotationalSpeed(te.getSpeed())
.setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) .setRotationOffset(getRotationOffsetForPosition(te, pos, axis))
.setRotationAxis(Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis).getUnitVector()) .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.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.render.instancing.RotatingData;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType; 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.base.KineticTileEntityRenderer;
import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity.Animation; import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity.Animation;
import com.simibubi.create.foundation.utility.AngleHelper; 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.instancing.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.SuperByteBuffer; 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.block.BlockState;
import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType; 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.render.SuperByteBuffer;
import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.render.instancing.IInstancedTileEntityRenderer;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.IRenderTypeBuffer; 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.util.math.Vec3d;
import net.minecraft.world.World; import net.minecraft.world.World;
public class DeployerRenderer extends SafeTileEntityRenderer<DeployerTileEntity> { public class DeployerRenderer extends SafeTileEntityRenderer<DeployerTileEntity> implements IInstancedTileEntityRenderer<DeployerTileEntity> {
public DeployerRenderer(TileEntityRendererDispatcher dispatcher) { public DeployerRenderer(TileEntityRendererDispatcher dispatcher) {
super(dispatcher); super(dispatcher);
@ -49,6 +50,13 @@ public class DeployerRenderer extends SafeTileEntityRenderer<DeployerTileEntity>
renderItem(te, partialTicks, ms, buffer, light, overlay); renderItem(te, partialTicks, ms, buffer, light, overlay);
FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay); FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay);
renderComponents(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, 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, protected void renderComponents(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay) { int light, int overlay) {
IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid());
KineticTileEntityRenderer.renderRotatingKineticBlock(te, getRenderedBlockState(te), light); KineticTileEntityRenderer.renderRotatingKineticBlock(te, getRenderedBlockState(te));
BlockState blockState = te.getBlockState(); BlockState blockState = te.getBlockState();
BlockPos pos = te.getPos(); 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.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.world.LightType;
public class EncasedFanRenderer extends KineticTileEntityRenderer { public class EncasedFanRenderer extends KineticTileEntityRenderer {
@ -25,18 +26,24 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer {
@Override @Override
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay) { int light, int overlay) {
addInstanceData(te);
}
@Override
public void addInstanceData(KineticTileEntity te) {
Direction direction = te.getBlockState() Direction direction = te.getBlockState()
.get(FACING); .get(FACING);
int lightBehind = WorldRenderer.getLightmapCoordinates(te.getWorld(), te.getPos().offset(direction.getOpposite())); BlockPos inFront = te.getPos().offset(direction);
int lightInFront = WorldRenderer.getLightmapCoordinates(te.getWorld(), te.getPos().offset(direction)); int blockLight = te.getWorld().getLightLevel(LightType.BLOCK, inFront);
int skyLight = te.getWorld().getLightLevel(LightType.SKY, inFront);
RotatingBuffer shaftHalf = RotatingBuffer shaftHalf =
AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(te.getBlockState(), direction.getOpposite()); AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(te.getBlockState(), direction.getOpposite());
RotatingBuffer fanInner = RotatingBuffer fanInner =
AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(te.getBlockState(), direction.getOpposite()); AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(te.getBlockState(), direction.getOpposite());
renderRotatingBuffer(te, shaftHalf, lightBehind); renderRotatingBuffer(te, shaftHalf);
fanInner.setupInstance(data -> { fanInner.setupInstance(data -> {
final BlockPos pos = te.getPos(); final BlockPos pos = te.getPos();
Direction.Axis axis = ((IRotate) te.getBlockState() Direction.Axis axis = ((IRotate) te.getBlockState()
@ -48,12 +55,12 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer {
if (speed < 0) if (speed < 0)
speed = MathHelper.clamp(speed, -64 * 20, -80); speed = MathHelper.clamp(speed, -64 * 20, -80);
data.setPackedLight(lightInFront) data.setBlockLight(blockLight)
.setSkyLight(skyLight)
.setRotationalSpeed(speed) .setRotationalSpeed(speed)
.setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) .setRotationOffset(getRotationOffsetForPosition(te, pos, axis))
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
.setPosition(pos); .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.base.KineticTileEntityRenderer;
import com.simibubi.create.content.contraptions.components.flywheel.FlywheelBlock.ConnectionState; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelBlock.ConnectionState;
import com.simibubi.create.foundation.utility.AngleHelper; 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.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.block.BlockState;
import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType; 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.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; 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.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingData;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
public class MillstoneRenderer extends KineticTileEntityRenderer { 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.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; 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.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.instancing.RotatingData;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
public class CreativeMotorRenderer extends KineticTileEntityRenderer { 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.tileEntity.renderer.SafeTileEntityRenderer;
import com.simibubi.create.foundation.utility.*; 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.instancing.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.render.SuperByteBuffer;
import net.minecraft.block.BlockState; 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.MathHelper;
import net.minecraft.util.math.Vec3d; 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) { public SawRenderer(TileEntityRendererDispatcher dispatcher) {
super(dispatcher); super(dispatcher);
@ -41,7 +42,13 @@ public class SawRenderer extends SafeTileEntityRenderer<SawTileEntity> {
renderBlade(te, ms, buffer, light); renderBlade(te, ms, buffer, light);
renderItems(te, partialTicks, ms, buffer, light, overlay); renderItems(te, partialTicks, ms, buffer, light, overlay);
FilteringRenderer.renderOnTileEntity(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){ 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) { 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, 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); transform(entity, partialTicks, matrixStacks);
Contraption contraption = entity.getContraption(); Contraption contraption = entity.getContraption();
if (contraption != null) { if (contraption != null) {
ContraptionRenderer.render(entity.world, contraption, ms, msLocal, buffers); ContraptionRenderer.renderDynamic(entity.world, contraption, ms, msLocal, buffers);
// not ready yet FastContraptionRenderer.markForRendering(entity.world, contraption, getPosition(entity, partialTicks), getRotation(entity, partialTicks)); FastContraptionRenderer.markForRendering(entity.world, contraption, getPosition(entity, partialTicks), getRotation(entity, partialTicks));
} }
ms.pop(); ms.pop();

View file

@ -18,6 +18,12 @@ import java.util.stream.Collectors;
import javax.annotation.Nullable; 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.MutablePair;
import org.apache.commons.lang3.tuple.Pair; 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.KineticTileEntity;
import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.foundation.utility.AngleHelper; 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.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.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; 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.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AngleHelper;
import com.simibubi.create.foundation.utility.MatrixStacker; 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.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.block.BlockState;
import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType; 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.content.contraptions.base.KineticTileEntityRenderer;
import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; 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 com.simibubi.create.foundation.utility.render.instancing.RotatingBuffer;
import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; 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) { public SpeedControllerRenderer(TileEntityRendererDispatcher dispatcher) {
super(dispatcher); super(dispatcher);
@ -20,7 +21,12 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer<SpeedContro
IRenderTypeBuffer buffer, int light, int overlay) { IRenderTypeBuffer buffer, int light, int overlay) {
super.renderSafe(tileEntityIn, partialTicks, ms, buffer, light, 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) { 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.Iterate;
import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.MatrixStacker;
import com.simibubi.create.foundation.utility.render.instancing.BeltBuffer; 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.instancing.RotatingBuffer;
import com.simibubi.create.foundation.utility.render.ShadowRenderHelper; 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.MathHelper;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.Vec3i; 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) { public BeltRenderer(TileEntityRendererDispatcher dispatcher) {
super(dispatcher); super(dispatcher);
@ -45,6 +47,17 @@ public class BeltRenderer extends SafeTileEntityRenderer<BeltTileEntity> {
protected void renderSafe(BeltTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, protected void renderSafe(BeltTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay) { 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(); BlockState blockState = te.getBlockState();
if (!AllBlocks.BELT.has(blockState)) if (!AllBlocks.BELT.has(blockState))
return; return;
@ -97,8 +110,9 @@ public class BeltRenderer extends SafeTileEntityRenderer<BeltTileEntity> {
float rotZ = sideways ? 90 : (vertical ? 180 : 0); float rotZ = sideways ? 90 : (vertical ? 180 : 0);
data.setPosition(te.getPos()) data.setPosition(te.getPos())
.setBlockLight(te.getWorld().getLightLevel(LightType.BLOCK, te.getPos()))
.setSkyLight(te.getWorld().getLightLevel(LightType.SKY, te.getPos()))
.setRotation(rotX, rotY, rotZ) .setRotation(rotX, rotY, rotZ)
.setPackedLight(light)
.setRotationalSpeed(speed) .setRotationalSpeed(speed)
.setScrollTexture(spriteShift) .setScrollTexture(spriteShift)
.setScrollMult(diagonal ? 3f / 8f : 0.5f); .setScrollMult(diagonal ? 3f / 8f : 0.5f);
@ -127,10 +141,9 @@ public class BeltRenderer extends SafeTileEntityRenderer<BeltTileEntity> {
RotatingBuffer rotatingBuffer = CreateClient.kineticRenderer RotatingBuffer rotatingBuffer = CreateClient.kineticRenderer
.renderDirectionalPartialInstanced(AllBlockPartials.BELT_PULLEY, blockState, dir, modelTransform); .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, 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;
import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.LightType;
public class SplitShaftRenderer extends KineticTileEntityRenderer { public class SplitShaftRenderer extends KineticTileEntityRenderer {
@ -24,10 +25,19 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer {
@Override @Override
protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer,
int light, int overlay) { int light, int overlay) {
addInstanceData(te);
}
@Override
public void addInstanceData(KineticTileEntity te) {
Block block = te.getBlockState().getBlock(); Block block = te.getBlockState().getBlock();
final Axis boxAxis = ((IRotate) block).getRotationAxis(te.getBlockState()); final Axis boxAxis = ((IRotate) block).getRotationAxis(te.getBlockState());
final BlockPos pos = te.getPos(); 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) { for (Direction direction : Iterate.directions) {
Axis axis = direction.getAxis(); Axis axis = direction.getAxis();
if (boxAxis != axis) if (boxAxis != axis)
@ -46,7 +56,8 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer {
speed *= modifier; speed *= modifier;
data.setPackedLight(light) data.setBlockLight(blockLight)
.setSkyLight(skyLight)
.setRotationalSpeed(speed) .setRotationalSpeed(speed)
.setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) .setRotationOffset(getRotationOffsetForPosition(te, pos, axis))
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) .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;
import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.LightType;
public class GearboxRenderer extends KineticTileEntityRenderer { public class GearboxRenderer extends KineticTileEntityRenderer {
@ -26,6 +27,9 @@ public class GearboxRenderer extends KineticTileEntityRenderer {
final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS); final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS);
final BlockPos pos = te.getPos(); 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) { for (Direction direction : Iterate.directions) {
final Axis axis = direction.getAxis(); final Axis axis = direction.getAxis();
if (boxAxis == axis) if (boxAxis == axis)
@ -45,7 +49,8 @@ public class GearboxRenderer extends KineticTileEntityRenderer {
speed *= -1; speed *= -1;
} }
data.setPackedLight(light) data.setBlockLight(blockLight)
.setSkyLight(skyLight)
.setRotationalSpeed(speed) .setRotationalSpeed(speed)
.setRotationOffset(getRotationOffsetForPosition(te, pos, axis)) .setRotationOffset(getRotationOffsetForPosition(te, pos, axis))
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) .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.content.logistics.block.mechanicalArm.ArmTileEntity.Phase;
import com.simibubi.create.foundation.utility.*; 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.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.block.BlockState;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer;

View file

@ -11,7 +11,8 @@ public class AnimationTickHolder {
} }
public static float getRenderTick() { 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 { 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<>(); private ArrayList<ContraptionBuffer> renderLayers = new ArrayList<>();
@ -105,7 +105,7 @@ public class FastContraptionRenderer extends ContraptionRenderer {
private static FastContraptionRenderer getRenderer(World world, Contraption c) { private static FastContraptionRenderer getRenderer(World world, Contraption c) {
try { try {
return renderers.get(c, () -> new FastContraptionRenderer(world, c)); return renderers.get(c.entity.getEntityId(), () -> new FastContraptionRenderer(world, c));
} catch (ExecutionException e) { } catch (ExecutionException e) {
e.printStackTrace(); e.printStackTrace();
return null; return null;
@ -120,13 +120,20 @@ public class FastContraptionRenderer extends ContraptionRenderer {
ShaderHelper.useShader(Shader.CONTRAPTION_STRUCTURE, ShaderHelper.getViewProjectionCallback(event)); ShaderHelper.useShader(Shader.CONTRAPTION_STRUCTURE, ShaderHelper.getViewProjectionCallback(event));
int shader = ShaderHelper.getShaderHandle(Shader.CONTRAPTION_STRUCTURE); int shader = ShaderHelper.getShaderHandle(Shader.CONTRAPTION_STRUCTURE);
ArrayList<Integer> toRemove = new ArrayList<>();
for (FastContraptionRenderer renderer : renderers.asMap().values()) { for (FastContraptionRenderer renderer : renderers.asMap().values()) {
if (renderer.c.entity.isAlive())
renderer.render(shader); renderer.render(shader);
else
toRemove.add(renderer.c.entity.getEntityId());
} }
ShaderHelper.releaseShader(); ShaderHelper.releaseShader();
CreateClient.kineticRenderer.teardown(); CreateClient.kineticRenderer.teardown();
renderers.invalidateAll(toRemove);
} }
public static void invalidateAll() { 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.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.Create; import com.simibubi.create.foundation.utility.render.instancing.*;
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.shader.Shader; 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.ShaderCallback;
import com.simibubi.create.foundation.utility.render.shader.ShaderHelper; 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.*;
import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IBakedModel;
import net.minecraft.client.renderer.texture.Texture; 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.inventory.container.PlayerContainer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction; 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.client.event.RenderWorldLastEvent;
import net.minecraftforge.fml.common.Mod;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL13; import org.lwjgl.opengl.GL13;
@ -36,13 +35,14 @@ import java.util.function.Supplier;
import static com.simibubi.create.foundation.utility.render.SuperByteBufferCache.PARTIAL; import static com.simibubi.create.foundation.utility.render.SuperByteBufferCache.PARTIAL;
@Mod.EventBusSubscriber(modid = Create.ID, value = Dist.CLIENT)
public class FastKineticRenderer { public class FastKineticRenderer {
Map<SuperByteBufferCache.Compartment<?>, Cache<Object, RotatingBuffer>> rotating; Map<SuperByteBufferCache.Compartment<?>, Cache<Object, RotatingBuffer>> rotating;
Map<SuperByteBufferCache.Compartment<?>, Cache<Object, BeltBuffer>> belts; Map<SuperByteBufferCache.Compartment<?>, Cache<Object, BeltBuffer>> belts;
Queue<Runnable> runs; Queue<Runnable> runs;
boolean rebuild;
public FastKineticRenderer() { public FastKineticRenderer() {
rotating = new HashMap<>(); rotating = new HashMap<>();
belts = new HashMap<>(); belts = new HashMap<>();
@ -52,7 +52,29 @@ public class FastKineticRenderer {
registerCompartment(SuperByteBufferCache.DIRECTIONAL_PARTIAL); 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() { public void tick() {
// TODO: (later) detect changes in lighting with a mixin to ClientChunkProvider.markLightChanged()
for (Cache<Object, RotatingBuffer> cache : rotating.values()) { for (Cache<Object, RotatingBuffer> cache : rotating.values()) {
for (RotatingBuffer renderer : cache.asMap().values()) { for (RotatingBuffer renderer : cache.asMap().values()) {
renderer.clearInstanceData(); renderer.clearInstanceData();
@ -64,6 +86,8 @@ public class FastKineticRenderer {
renderer.clearInstanceData(); renderer.clearInstanceData();
} }
} }
// rebuild = true;
} }
public void enqueue(Runnable run) { public void enqueue(Runnable run) {
@ -72,6 +96,11 @@ public class FastKineticRenderer {
public void renderInstances(RenderWorldLastEvent event) { public void renderInstances(RenderWorldLastEvent event) {
GameRenderer gameRenderer = Minecraft.getInstance().gameRenderer; GameRenderer gameRenderer = Minecraft.getInstance().gameRenderer;
//
// if (rebuild) {
// buildTileEntityBuffers(Minecraft.getInstance().world);
// rebuild = false;
// }
setup(gameRenderer); 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; 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.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<BeltData> {
public class BeltBuffer extends InstanceBuffer<BeltBuffer.BeltData> {
public BeltBuffer(BufferBuilder buf) { public BeltBuffer(BufferBuilder buf) {
super(buf); super(buf);
} }
@ -24,84 +17,4 @@ public class BeltBuffer extends InstanceBuffer<BeltBuffer.BeltData> {
return BeltData.FORMAT; 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; 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.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; public class RotatingBuffer extends InstanceBuffer<RotatingData> {
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 RotatingBuffer(BufferBuilder buf) { public RotatingBuffer(BufferBuilder buf) {
super(buf); super(buf);
} }
@ -33,74 +17,4 @@ public class RotatingBuffer extends InstanceBuffer<RotatingBuffer.RotatingData>
return RotatingData.FORMAT; 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 = 2) in vec2 aTexCoords;
layout (location = 3) in vec3 instancePos; layout (location = 3) in vec3 instancePos;
layout (location = 4) in vec3 rotationDegrees; layout (location = 4) in vec2 light;
layout (location = 5) in vec2 light; layout (location = 5) in vec3 rotationDegrees;
layout (location = 6) in float speed; layout (location = 6) in float speed;
layout (location = 7) in vec2 sourceUV; layout (location = 7) in vec2 sourceUV;
layout (location = 8) in vec4 scrollTexture; layout (location = 8) in vec4 scrollTexture;

View file

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