mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-12-16 06:33:43 +01:00
Some housekeeping and documentation.
This commit is contained in:
parent
8c79174904
commit
a56514c308
37 changed files with 228 additions and 206 deletions
|
@ -15,7 +15,7 @@ public class HalfShaftInstance extends SingleRotatingInstance {
|
||||||
@Override
|
@Override
|
||||||
protected InstancedModel<RotatingData> getModel() {
|
protected InstancedModel<RotatingData> getModel() {
|
||||||
Direction dir = getShaftDirection();
|
Direction dir = getShaftDirection();
|
||||||
return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState, dir);
|
return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(renderer, blockState, dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Direction getShaftDirection() {
|
protected Direction getShaftDirection() {
|
||||||
|
|
|
@ -20,16 +20,6 @@ public class KineticData extends BasicData {
|
||||||
super(owner);
|
super(owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
public KineticData setTileEntity(KineticTileEntity te) {
|
|
||||||
setPosition(te.getPos());
|
|
||||||
if (te.hasSource()) {
|
|
||||||
setColor(te.network);
|
|
||||||
}else {
|
|
||||||
setColor(0xFF, 0xFF, 0x00);
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public KineticData setPosition(BlockPos pos) {
|
public KineticData setPosition(BlockPos pos) {
|
||||||
return setPosition(pos.getX(), pos.getY(), pos.getZ());
|
return setPosition(pos.getX(), pos.getY(), pos.getZ());
|
||||||
}
|
}
|
||||||
|
@ -39,11 +29,9 @@ public class KineticData extends BasicData {
|
||||||
}
|
}
|
||||||
|
|
||||||
public KineticData setPosition(int x, int y, int z) {
|
public KineticData setPosition(int x, int y, int z) {
|
||||||
BlockPos origin = owner.renderer.getOriginCoordinate();
|
return setPosition((float) (x),
|
||||||
|
(float) (y),
|
||||||
return setPosition((float) (x - origin.getX()),
|
(float) (z));
|
||||||
(float) (y - origin.getY()),
|
|
||||||
(float) (z - origin.getZ()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public KineticData setPosition(float x, float y, float z) {
|
public KineticData setPosition(float x, float y, float z) {
|
||||||
|
@ -60,6 +48,15 @@ public class KineticData extends BasicData {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public KineticData setColor(KineticTileEntity te) {
|
||||||
|
if (te.hasSource()) {
|
||||||
|
setColor(te.network);
|
||||||
|
}else {
|
||||||
|
setColor(0xFF, 0xFF, 0x00);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public KineticData setColor(Long l) {
|
public KineticData setColor(Long l) {
|
||||||
if (l != null)
|
if (l != null)
|
||||||
return setColor(l.longValue());
|
return setColor(l.longValue());
|
||||||
|
|
|
@ -8,41 +8,55 @@ import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
|
||||||
|
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.util.Direction;
|
import net.minecraft.util.Direction;
|
||||||
import net.minecraft.world.LightType;
|
|
||||||
|
|
||||||
public abstract class KineticTileInstance<T extends KineticTileEntity> extends TileEntityInstance<T> {
|
public abstract class KineticTileInstance<T extends KineticTileEntity> extends TileEntityInstance<T> {
|
||||||
|
|
||||||
|
protected final Direction.Axis axis;
|
||||||
|
|
||||||
public KineticTileInstance(InstancedTileRenderer<?> modelManager, T tile) {
|
public KineticTileInstance(InstancedTileRenderer<?> modelManager, T tile) {
|
||||||
super(modelManager, tile);
|
super(modelManager, tile);
|
||||||
|
|
||||||
|
axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final void updateRotation(InstanceKey<RotatingData> key, Direction.Axis axis) {
|
protected final void updateRotation(RotatingData instance) {
|
||||||
updateRotation(key, axis, tile.getSpeed());
|
updateRotation(instance, getRotationAxis(), getTileSpeed());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final void updateRotation(InstanceKey<RotatingData> key, Direction.Axis axis, float speed) {
|
protected final void updateRotation(RotatingData instance, Direction.Axis axis) {
|
||||||
updateRotation(key.getInstance(), axis, speed);
|
updateRotation(instance, axis, getTileSpeed());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final void updateRotation(RotatingData key, Direction.Axis axis, float speed) {
|
protected final void updateRotation(RotatingData instance, float speed) {
|
||||||
key.setRotationAxis(axis)
|
updateRotation(instance, getRotationAxis(), speed);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final void updateRotation(RotatingData instance, Direction.Axis axis, float speed) {
|
||||||
|
instance.setRotationAxis(axis)
|
||||||
.setRotationOffset(getRotationOffset(axis))
|
.setRotationOffset(getRotationOffset(axis))
|
||||||
.setRotationalSpeed(speed)
|
.setRotationalSpeed(speed)
|
||||||
.setColor(tile.network);
|
.setColor(tile);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final void updateRotation(RotatingData key, Direction.Axis axis) {
|
protected final InstanceKey<RotatingData> setup(InstanceKey<RotatingData> key) {
|
||||||
updateRotation(key, axis, tile.getSpeed());
|
return setup(key, getRotationAxis(), getTileSpeed());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final InstanceKey<RotatingData> setup(InstanceKey<RotatingData> key, float speed, Direction.Axis axis) {
|
protected final InstanceKey<RotatingData> setup(InstanceKey<RotatingData> key, Direction.Axis axis) {
|
||||||
|
return setup(key, axis, getTileSpeed());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final InstanceKey<RotatingData> setup(InstanceKey<RotatingData> key, float speed) {
|
||||||
|
return setup(key, getRotationAxis(), speed);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final InstanceKey<RotatingData> setup(InstanceKey<RotatingData> key, Direction.Axis axis, float speed) {
|
||||||
key.getInstance()
|
key.getInstance()
|
||||||
.setRotationAxis(axis)
|
.setRotationAxis(axis)
|
||||||
.setRotationalSpeed(speed)
|
.setRotationalSpeed(speed)
|
||||||
.setRotationOffset(getRotationOffset(axis))
|
.setRotationOffset(getRotationOffset(axis))
|
||||||
.setTileEntity(tile)
|
.setColor(tile)
|
||||||
.setSkyLight(world.getLightLevel(LightType.SKY, pos))
|
.setPosition(getInstancePosition());
|
||||||
.setBlockLight(world.getLightLevel(LightType.BLOCK, pos));
|
|
||||||
|
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
@ -57,16 +71,24 @@ public abstract class KineticTileInstance<T extends KineticTileEntity> extends T
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected Direction.Axis getRotationAxis() {
|
||||||
|
return axis;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected float getTileSpeed() {
|
||||||
|
return tile.getSpeed();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected BlockState shaft() {
|
||||||
|
return shaft(getRotationAxis());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final RenderMaterial<?, InstancedModel<RotatingData>> getRotatingMaterial() {
|
||||||
|
return renderer.getMaterial(KineticRenderMaterials.ROTATING);
|
||||||
|
}
|
||||||
|
|
||||||
public static BlockState shaft(Direction.Axis axis) {
|
public static BlockState shaft(Direction.Axis axis) {
|
||||||
return AllBlocks.SHAFT.getDefaultState()
|
return AllBlocks.SHAFT.getDefaultState()
|
||||||
.with(ShaftBlock.AXIS, axis);
|
.with(ShaftBlock.AXIS, axis);
|
||||||
}
|
|
||||||
|
|
||||||
public Direction.Axis getRotationAxis() {
|
|
||||||
return ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected final RenderMaterial<?, InstancedModel<RotatingData>> rotatingMaterial() {
|
|
||||||
return modelManager.getMaterial(KineticRenderMaterials.ROTATING);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,6 @@ public class ShaftlessCogInstance extends SingleRotatingInstance {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected InstancedModel<RotatingData> getModel() {
|
protected InstancedModel<RotatingData> getModel() {
|
||||||
return AllBlockPartials.SHAFTLESS_COGWHEEL.renderOnRotating(modelManager, tile.getBlockState());
|
return AllBlockPartials.SHAFTLESS_COGWHEEL.renderOnRotating(renderer, tile.getBlockState());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,39 +1,34 @@
|
||||||
package com.simibubi.create.content.contraptions.base;
|
package com.simibubi.create.content.contraptions.base;
|
||||||
|
|
||||||
import static com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer.KINETIC_TILE;
|
|
||||||
|
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
|
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
|
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
|
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
|
||||||
|
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.util.Direction;
|
|
||||||
|
|
||||||
public class SingleRotatingInstance extends KineticTileInstance<KineticTileEntity> {
|
public class SingleRotatingInstance extends KineticTileInstance<KineticTileEntity> {
|
||||||
|
|
||||||
protected final InstanceKey<RotatingData> rotatingModelKey;
|
protected final InstanceKey<RotatingData> rotatingModel;
|
||||||
|
|
||||||
public SingleRotatingInstance(InstancedTileRenderer<?> modelManager, KineticTileEntity tile) {
|
public SingleRotatingInstance(InstancedTileRenderer<?> modelManager, KineticTileEntity tile) {
|
||||||
super(modelManager, tile);
|
super(modelManager, tile);
|
||||||
|
|
||||||
Direction.Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
|
rotatingModel = setup(getModel().createInstance());
|
||||||
rotatingModelKey = setup(getModel().createInstance(), tile.getSpeed(), axis);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update() {
|
public void update() {
|
||||||
Direction.Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
|
updateRotation(rotatingModel.getInstance());
|
||||||
updateRotation(rotatingModelKey, axis);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateLight() {
|
public void updateLight() {
|
||||||
relight(pos, rotatingModelKey.getInstance());
|
relight(pos, rotatingModel.getInstance());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void remove() {
|
public void remove() {
|
||||||
rotatingModelKey.delete();
|
rotatingModel.delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected BlockState getRenderedBlockState() {
|
protected BlockState getRenderedBlockState() {
|
||||||
|
@ -41,6 +36,6 @@ public class SingleRotatingInstance extends KineticTileInstance<KineticTileEntit
|
||||||
}
|
}
|
||||||
|
|
||||||
protected InstancedModel<RotatingData> getModel() {
|
protected InstancedModel<RotatingData> getModel() {
|
||||||
return rotatingMaterial().getModel(KINETIC_TILE, getRenderedBlockState());
|
return getRotatingMaterial().getModel(getRenderedBlockState());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,6 @@ public class DrillInstance extends SingleRotatingInstance {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected InstancedModel<RotatingData> getModel() {
|
protected InstancedModel<RotatingData> getModel() {
|
||||||
return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouthRotating(modelManager, tile.getBlockState());
|
return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouthRotating(renderer, tile.getBlockState());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ public class HarvesterActorInstance extends ActorInstance {
|
||||||
public HarvesterActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) {
|
public HarvesterActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) {
|
||||||
super(modelManager, context);
|
super(modelManager, context);
|
||||||
|
|
||||||
RenderMaterial<?, InstancedModel<ModelData>> renderMaterial = modelManager.transformMaterial();
|
RenderMaterial<?, InstancedModel<ModelData>> renderMaterial = modelManager.getTransformMaterial();
|
||||||
|
|
||||||
BlockState state = context.state;
|
BlockState state = context.state;
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,6 @@ public class MechanicalCrafterInstance extends SingleRotatingInstance {
|
||||||
stacker.unCentre();
|
stacker.unCentre();
|
||||||
return stack;
|
return stack;
|
||||||
};
|
};
|
||||||
return rotatingMaterial().getModel(AllBlockPartials.SHAFTLESS_COGWHEEL, blockState, facing, ms);
|
return getRotatingMaterial().getModel(AllBlockPartials.SHAFTLESS_COGWHEEL, blockState, facing, ms);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,8 +30,6 @@ public class HandCrankInstance extends SingleRotatingInstance implements IDynami
|
||||||
facing = blockState.get(BlockStateProperties.FACING);
|
facing = blockState.get(BlockStateProperties.FACING);
|
||||||
InstancedModel<ModelData> model = renderedHandle.renderOnDirectionalSouthModel(modelManager, blockState, facing.getOpposite());
|
InstancedModel<ModelData> model = renderedHandle.renderOnDirectionalSouthModel(modelManager, blockState, facing.getOpposite());
|
||||||
crank = model.createInstance();
|
crank = model.createInstance();
|
||||||
|
|
||||||
updateLight();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -45,7 +43,7 @@ public class HandCrankInstance extends SingleRotatingInstance implements IDynami
|
||||||
|
|
||||||
MatrixStack ms = new MatrixStack();
|
MatrixStack ms = new MatrixStack();
|
||||||
MatrixStacker.of(ms)
|
MatrixStacker.of(ms)
|
||||||
.translate(getFloatingPos())
|
.translate(getInstancePosition())
|
||||||
.centre()
|
.centre()
|
||||||
.rotate(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis), angle)
|
.rotate(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis), angle)
|
||||||
.unCentre();
|
.unCentre();
|
||||||
|
|
|
@ -37,7 +37,7 @@ public class DeployerActorInstance extends ActorInstance {
|
||||||
public DeployerActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) {
|
public DeployerActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) {
|
||||||
super(modelManager, context);
|
super(modelManager, context);
|
||||||
|
|
||||||
RenderMaterial<ContraptionProgram, InstancedModel<ModelData>> mat = modelManager.transformMaterial();
|
RenderMaterial<ContraptionProgram, InstancedModel<ModelData>> mat = modelManager.getTransformMaterial();
|
||||||
|
|
||||||
BlockState state = context.state;
|
BlockState state = context.state;
|
||||||
DeployerTileEntity.Mode mode = NBTHelper.readEnum(context.tileData, "Mode", DeployerTileEntity.Mode.class);
|
DeployerTileEntity.Mode mode = NBTHelper.readEnum(context.tileData, "Mode", DeployerTileEntity.Mode.class);
|
||||||
|
@ -56,7 +56,7 @@ public class DeployerActorInstance extends ActorInstance {
|
||||||
|
|
||||||
Direction.Axis axis = ((IRotate) state.getBlock()).getRotationAxis(state);
|
Direction.Axis axis = ((IRotate) state.getBlock()).getRotationAxis(state);
|
||||||
shaft = modelManager.getMaterial(KineticRenderMaterials.ROTATING)
|
shaft = modelManager.getMaterial(KineticRenderMaterials.ROTATING)
|
||||||
.getModel(KineticTileEntityRenderer.KINETIC_TILE, KineticTileInstance.shaft(axis))
|
.getModel(KineticTileInstance.shaft(axis))
|
||||||
.createInstance();
|
.createInstance();
|
||||||
|
|
||||||
int blockLight = localBlockLight();
|
int blockLight = localBlockLight();
|
||||||
|
|
|
@ -3,7 +3,6 @@ package com.simibubi.create.content.contraptions.components.deployer;
|
||||||
import com.simibubi.create.AllBlockPartials;
|
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.relays.encased.ShaftInstance;
|
import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance;
|
||||||
import com.simibubi.create.foundation.render.backend.RenderMaterials;
|
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.*;
|
import com.simibubi.create.foundation.render.backend.instancing.*;
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.impl.OrientedData;
|
import com.simibubi.create.foundation.render.backend.instancing.impl.OrientedData;
|
||||||
import com.simibubi.create.foundation.utility.AngleHelper;
|
import com.simibubi.create.foundation.utility.AngleHelper;
|
||||||
|
@ -46,7 +45,7 @@ public class DeployerInstance extends ShaftInstance implements IDynamicInstance,
|
||||||
zRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 90 : 0;
|
zRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 90 : 0;
|
||||||
zRotPole = rotatePole ? 90 : 0;
|
zRotPole = rotatePole ? 90 : 0;
|
||||||
|
|
||||||
pole = RenderMaterials.ORIENTED.get(modelManager).getModel(AllBlockPartials.DEPLOYER_POLE, blockState).createInstance();
|
pole = getOrientedMaterial().getModel(AllBlockPartials.DEPLOYER_POLE, blockState).createInstance();
|
||||||
|
|
||||||
updateHandPose();
|
updateHandPose();
|
||||||
relight(pos, pole.getInstance());
|
relight(pos, pole.getInstance());
|
||||||
|
@ -73,7 +72,7 @@ public class DeployerInstance extends ShaftInstance implements IDynamicInstance,
|
||||||
: currentHand == AllBlockPartials.DEPLOYER_HAND_HOLDING ? 4 / 16f : 3 / 16f;
|
: currentHand == AllBlockPartials.DEPLOYER_HAND_HOLDING ? 4 / 16f : 3 / 16f;
|
||||||
float distance = Math.min(MathHelper.clamp(progress, 0, 1) * (tile.reach + handLength), 21 / 16f);
|
float distance = Math.min(MathHelper.clamp(progress, 0, 1) * (tile.reach + handLength), 21 / 16f);
|
||||||
Vec3i facingVec = facing.getDirectionVec();
|
Vec3i facingVec = facing.getDirectionVec();
|
||||||
BlockPos blockPos = getFloatingPos();
|
BlockPos blockPos = getInstancePosition();
|
||||||
|
|
||||||
float x = blockPos.getX() + ((float) facingVec.getX()) * distance;
|
float x = blockPos.getX() + ((float) facingVec.getX()) * distance;
|
||||||
float y = blockPos.getY() + ((float) facingVec.getY()) * distance;
|
float y = blockPos.getY() + ((float) facingVec.getY()) * distance;
|
||||||
|
@ -107,7 +106,7 @@ public class DeployerInstance extends ShaftInstance implements IDynamicInstance,
|
||||||
|
|
||||||
if (hand != null) hand.delete();
|
if (hand != null) hand.delete();
|
||||||
|
|
||||||
hand = RenderMaterials.ORIENTED.get(modelManager).getModel(currentHand, blockState).createInstance();
|
hand = getOrientedMaterial().getModel(currentHand, blockState).createInstance();
|
||||||
|
|
||||||
relight(pos, hand.getInstance());
|
relight(pos, hand.getInstance());
|
||||||
updateRotation(pole, hand, yRot, zRot, zRotPole);
|
updateRotation(pole, hand, yRot, zRot, zRotPole);
|
||||||
|
|
|
@ -17,27 +17,18 @@ public class FanInstance extends KineticTileInstance<EncasedFanTileEntity> {
|
||||||
|
|
||||||
protected final InstanceKey<RotatingData> shaft;
|
protected final InstanceKey<RotatingData> shaft;
|
||||||
protected final InstanceKey<RotatingData> fan;
|
protected final InstanceKey<RotatingData> fan;
|
||||||
final Direction.Axis axis;
|
|
||||||
final Direction direction;
|
final Direction direction;
|
||||||
|
|
||||||
public FanInstance(InstancedTileRenderer<?> modelManager, EncasedFanTileEntity tile) {
|
public FanInstance(InstancedTileRenderer<?> modelManager, EncasedFanTileEntity tile) {
|
||||||
super(modelManager, tile);
|
super(modelManager, tile);
|
||||||
|
|
||||||
direction = blockState.get(FACING);
|
direction = blockState.get(FACING);
|
||||||
axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
|
|
||||||
|
|
||||||
shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState, direction.getOpposite()).createInstance();
|
shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState, direction.getOpposite()).createInstance();
|
||||||
fan = AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(modelManager, blockState, direction.getOpposite()).createInstance();
|
fan = AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(modelManager, blockState, direction.getOpposite()).createInstance();
|
||||||
|
|
||||||
RotatingData shaftInstance = shaft.getInstance();
|
setup(shaft);
|
||||||
shaftInstance.setTileEntity(tile);
|
setup(fan, getFanSpeed());
|
||||||
updateRotation(shaftInstance, axis);
|
|
||||||
|
|
||||||
RotatingData fanInstance = fan.getInstance();
|
|
||||||
fanInstance.setTileEntity(tile);
|
|
||||||
updateRotation(fanInstance, axis, getFanSpeed());
|
|
||||||
|
|
||||||
updateLight();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private float getFanSpeed() {
|
private float getFanSpeed() {
|
||||||
|
@ -51,8 +42,8 @@ public class FanInstance extends KineticTileInstance<EncasedFanTileEntity> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void update() {
|
protected void update() {
|
||||||
updateRotation(shaft, axis);
|
updateRotation(shaft.getInstance());
|
||||||
updateRotation(fan, axis, getFanSpeed());
|
updateRotation(fan.getInstance(), getFanSpeed());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -6,10 +6,8 @@ import java.util.List;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||||
import com.simibubi.create.AllBlockPartials;
|
import com.simibubi.create.AllBlockPartials;
|
||||||
import com.simibubi.create.content.contraptions.base.IRotate;
|
|
||||||
import com.simibubi.create.content.contraptions.base.KineticTileInstance;
|
import com.simibubi.create.content.contraptions.base.KineticTileInstance;
|
||||||
import com.simibubi.create.content.contraptions.base.RotatingData;
|
import com.simibubi.create.content.contraptions.base.RotatingData;
|
||||||
import com.simibubi.create.foundation.render.backend.RenderMaterials;
|
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.*;
|
import com.simibubi.create.foundation.render.backend.instancing.*;
|
||||||
|
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
|
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
|
||||||
|
@ -49,8 +47,7 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
|
||||||
|
|
||||||
facing = blockState.get(BlockStateProperties.HORIZONTAL_FACING);
|
facing = blockState.get(BlockStateProperties.HORIZONTAL_FACING);
|
||||||
|
|
||||||
Direction.Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
|
shaft = setup(shaftModel().createInstance());
|
||||||
shaft = setup(shaftModel().createInstance(), tile.getSpeed(), axis);
|
|
||||||
|
|
||||||
wheel = AllBlockPartials.FLYWHEEL.renderOnHorizontalModel(modelManager, blockState.rotate(Rotation.CLOCKWISE_90)).createInstance();
|
wheel = AllBlockPartials.FLYWHEEL.renderOnHorizontalModel(modelManager, blockState.rotate(Rotation.CLOCKWISE_90)).createInstance();
|
||||||
|
|
||||||
|
@ -62,7 +59,7 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
|
||||||
|
|
||||||
connectorAngleMult = flipAngle ? -1 : 1;
|
connectorAngleMult = flipAngle ? -1 : 1;
|
||||||
|
|
||||||
RenderMaterial<?, InstancedModel<ModelData>> mat = modelManager.getMaterial(RenderMaterials.TRANSFORMED);
|
RenderMaterial<?, InstancedModel<ModelData>> mat = getTransformMaterial();
|
||||||
|
|
||||||
upperRotating = mat.getModel(AllBlockPartials.FLYWHEEL_UPPER_ROTATING, blockState).createInstance();
|
upperRotating = mat.getModel(AllBlockPartials.FLYWHEEL_UPPER_ROTATING, blockState).createInstance();
|
||||||
lowerRotating = mat.getModel(AllBlockPartials.FLYWHEEL_LOWER_ROTATING, blockState).createInstance();
|
lowerRotating = mat.getModel(AllBlockPartials.FLYWHEEL_LOWER_ROTATING, blockState).createInstance();
|
||||||
|
@ -73,8 +70,6 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
|
||||||
} else {
|
} else {
|
||||||
connectors = Collections.emptyList();
|
connectors = Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
updateLight();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -90,7 +85,7 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
|
||||||
MatrixStack ms = new MatrixStack();
|
MatrixStack ms = new MatrixStack();
|
||||||
MatrixStacker msr = MatrixStacker.of(ms);
|
MatrixStacker msr = MatrixStacker.of(ms);
|
||||||
|
|
||||||
msr.translate(getFloatingPos());
|
msr.translate(getInstancePosition());
|
||||||
|
|
||||||
if (connection != null) {
|
if (connection != null) {
|
||||||
float rotation = angle * connectorAngleMult;
|
float rotation = angle * connectorAngleMult;
|
||||||
|
@ -133,8 +128,7 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void update() {
|
protected void update() {
|
||||||
Direction.Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
|
updateRotation(shaft.getInstance());
|
||||||
updateRotation(shaft, axis);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -156,7 +150,7 @@ public class FlyWheelInstance extends KineticTileInstance<FlywheelTileEntity> im
|
||||||
}
|
}
|
||||||
|
|
||||||
protected InstancedModel<RotatingData> shaftModel() {
|
protected InstancedModel<RotatingData> shaftModel() {
|
||||||
return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState, facing.getOpposite());
|
return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(renderer, blockState, facing.getOpposite());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void transformConnector(MatrixStacker ms, boolean upper, boolean rotating, float angle, boolean flip) {
|
protected void transformConnector(MatrixStacker ms, boolean upper, boolean rotating, float angle, boolean flip) {
|
||||||
|
|
|
@ -2,7 +2,6 @@ package com.simibubi.create.content.contraptions.components.flywheel.engine;
|
||||||
|
|
||||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||||
import com.simibubi.create.AllBlockPartials;
|
import com.simibubi.create.AllBlockPartials;
|
||||||
import com.simibubi.create.foundation.render.backend.RenderMaterials;
|
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
|
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
|
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.TileEntityInstance;
|
import com.simibubi.create.foundation.render.backend.instancing.TileEntityInstance;
|
||||||
|
@ -30,14 +29,14 @@ public class EngineInstance extends TileEntityInstance<EngineTileEntity> {
|
||||||
|
|
||||||
Direction facing = blockState.get(BlockStateProperties.HORIZONTAL_FACING);
|
Direction facing = blockState.get(BlockStateProperties.HORIZONTAL_FACING);
|
||||||
|
|
||||||
this.frame = modelManager.getMaterial(RenderMaterials.TRANSFORMED).getModel(frame, blockState).createInstance();
|
this.frame = getTransformMaterial().getModel(frame, blockState).createInstance();
|
||||||
|
|
||||||
float angle = AngleHelper.rad(AngleHelper.horizontalAngle(facing));
|
float angle = AngleHelper.rad(AngleHelper.horizontalAngle(facing));
|
||||||
|
|
||||||
MatrixStack ms = new MatrixStack();
|
MatrixStack ms = new MatrixStack();
|
||||||
MatrixStacker msr = MatrixStacker.of(ms);
|
MatrixStacker msr = MatrixStacker.of(ms);
|
||||||
|
|
||||||
msr.translate(getFloatingPos())
|
msr.translate(getInstancePosition())
|
||||||
.nudge(tile.hashCode())
|
.nudge(tile.hashCode())
|
||||||
.centre()
|
.centre()
|
||||||
.rotate(Direction.UP, angle)
|
.rotate(Direction.UP, angle)
|
||||||
|
@ -46,8 +45,6 @@ public class EngineInstance extends TileEntityInstance<EngineTileEntity> {
|
||||||
|
|
||||||
this.frame.getInstance()
|
this.frame.getInstance()
|
||||||
.setTransform(ms);
|
.setTransform(ms);
|
||||||
|
|
||||||
updateLight();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -15,6 +15,6 @@ public class MillStoneCogInstance extends SingleRotatingInstance {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected InstancedModel<RotatingData> getModel() {
|
protected InstancedModel<RotatingData> getModel() {
|
||||||
return AllBlockPartials.MILLSTONE_COG.renderOnRotating(modelManager, tile.getBlockState());
|
return AllBlockPartials.MILLSTONE_COG.renderOnRotating(renderer, tile.getBlockState());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,6 @@ 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.RotatingData;
|
import com.simibubi.create.content.contraptions.base.RotatingData;
|
||||||
import com.simibubi.create.content.contraptions.base.ShaftlessCogInstance;
|
import com.simibubi.create.content.contraptions.base.ShaftlessCogInstance;
|
||||||
import com.simibubi.create.foundation.render.backend.RenderMaterials;
|
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.*;
|
import com.simibubi.create.foundation.render.backend.instancing.*;
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
|
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
|
||||||
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
||||||
|
@ -20,13 +19,13 @@ public class MixerInstance extends ShaftlessCogInstance implements IDynamicInsta
|
||||||
public MixerInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) {
|
public MixerInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) {
|
||||||
super(dispatcher, tile);
|
super(dispatcher, tile);
|
||||||
|
|
||||||
mixerHead = rotatingMaterial().getModel(AllBlockPartials.MECHANICAL_MIXER_HEAD, blockState)
|
mixerHead = getRotatingMaterial().getModel(AllBlockPartials.MECHANICAL_MIXER_HEAD, blockState)
|
||||||
.createInstance();
|
.createInstance();
|
||||||
|
|
||||||
mixerHead.getInstance()
|
mixerHead.getInstance()
|
||||||
.setRotationAxis(Direction.Axis.Y);
|
.setRotationAxis(Direction.Axis.Y);
|
||||||
|
|
||||||
mixerPole = modelManager.getMaterial(RenderMaterials.TRANSFORMED)
|
mixerPole = getTransformMaterial()
|
||||||
.getModel(AllBlockPartials.MECHANICAL_MIXER_POLE, blockState)
|
.getModel(AllBlockPartials.MECHANICAL_MIXER_POLE, blockState)
|
||||||
.createInstance();
|
.createInstance();
|
||||||
|
|
||||||
|
@ -36,7 +35,6 @@ public class MixerInstance extends ShaftlessCogInstance implements IDynamicInsta
|
||||||
|
|
||||||
transformPole(renderedHeadOffset);
|
transformPole(renderedHeadOffset);
|
||||||
transformHead(mixer, renderedHeadOffset);
|
transformHead(mixer, renderedHeadOffset);
|
||||||
updateLight();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -56,7 +54,7 @@ public class MixerInstance extends ShaftlessCogInstance implements IDynamicInsta
|
||||||
float speed = mixer.getRenderedHeadRotationSpeed(AnimationTickHolder.getPartialTicks());
|
float speed = mixer.getRenderedHeadRotationSpeed(AnimationTickHolder.getPartialTicks());
|
||||||
|
|
||||||
mixerHead.getInstance()
|
mixerHead.getInstance()
|
||||||
.setPosition(pos)
|
.setPosition(getInstancePosition())
|
||||||
.nudge(0, -renderedHeadOffset, 0)
|
.nudge(0, -renderedHeadOffset, 0)
|
||||||
.setRotationalSpeed(speed * 2);
|
.setRotationalSpeed(speed * 2);
|
||||||
}
|
}
|
||||||
|
@ -65,7 +63,7 @@ public class MixerInstance extends ShaftlessCogInstance implements IDynamicInsta
|
||||||
MatrixStack ms = new MatrixStack();
|
MatrixStack ms = new MatrixStack();
|
||||||
|
|
||||||
MatrixStacker msr = MatrixStacker.of(ms);
|
MatrixStacker msr = MatrixStacker.of(ms);
|
||||||
msr.translate(getFloatingPos());
|
msr.translate(getInstancePosition());
|
||||||
msr.translate(0, -renderedHeadOffset, 0);
|
msr.translate(0, -renderedHeadOffset, 0);
|
||||||
|
|
||||||
mixerPole.getInstance().setTransform(ms);
|
mixerPole.getInstance().setTransform(ms);
|
||||||
|
|
|
@ -20,7 +20,6 @@ public class PressInstance extends ShaftInstance implements IDynamicInstance {
|
||||||
|
|
||||||
pressHead = AllBlockPartials.MECHANICAL_PRESS_HEAD.renderOnHorizontalModel(dispatcher, blockState).createInstance();
|
pressHead = AllBlockPartials.MECHANICAL_PRESS_HEAD.renderOnHorizontalModel(dispatcher, blockState).createInstance();
|
||||||
|
|
||||||
updateLight();
|
|
||||||
transformModels((MechanicalPressTileEntity) tile);
|
transformModels((MechanicalPressTileEntity) tile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,7 +38,7 @@ public class PressInstance extends ShaftInstance implements IDynamicInstance {
|
||||||
MatrixStack ms = new MatrixStack();
|
MatrixStack ms = new MatrixStack();
|
||||||
|
|
||||||
MatrixStacker msr = MatrixStacker.of(ms);
|
MatrixStacker msr = MatrixStacker.of(ms);
|
||||||
msr.translate(getFloatingPos());
|
msr.translate(getInstancePosition());
|
||||||
msr.translate(0, -renderedHeadOffset, 0);
|
msr.translate(0, -renderedHeadOffset, 0);
|
||||||
|
|
||||||
pressHead.getInstance()
|
pressHead.getInstance()
|
||||||
|
|
|
@ -4,7 +4,6 @@ import static net.minecraft.state.properties.BlockStateProperties.FACING;
|
||||||
|
|
||||||
import com.simibubi.create.AllBlockPartials;
|
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.RotatingData;
|
import com.simibubi.create.content.contraptions.base.RotatingData;
|
||||||
import com.simibubi.create.content.contraptions.base.SingleRotatingInstance;
|
import com.simibubi.create.content.contraptions.base.SingleRotatingInstance;
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
|
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
|
||||||
|
@ -21,8 +20,8 @@ public class SawInstance extends SingleRotatingInstance {
|
||||||
@Override
|
@Override
|
||||||
protected InstancedModel<RotatingData> getModel() {
|
protected InstancedModel<RotatingData> getModel() {
|
||||||
if (blockState.get(FACING).getAxis().isHorizontal())
|
if (blockState.get(FACING).getAxis().isHorizontal())
|
||||||
return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState.rotate(tile.getWorld(), tile.getPos(), Rotation.CLOCKWISE_180));
|
return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(renderer, blockState.rotate(tile.getWorld(), tile.getPos(), Rotation.CLOCKWISE_180));
|
||||||
else
|
else
|
||||||
return rotatingMaterial().getModel(KineticTileEntityRenderer.KINETIC_TILE, shaft(getRotationAxis()));
|
return getRotatingMaterial().getModel(shaft());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,6 @@ package com.simibubi.create.content.contraptions.components.structureMovement.ch
|
||||||
|
|
||||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||||
import com.simibubi.create.AllBlockPartials;
|
import com.simibubi.create.AllBlockPartials;
|
||||||
import com.simibubi.create.foundation.render.backend.RenderMaterials;
|
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.*;
|
import com.simibubi.create.foundation.render.backend.instancing.*;
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
|
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
|
||||||
import com.simibubi.create.foundation.utility.AngleHelper;
|
import com.simibubi.create.foundation.utility.AngleHelper;
|
||||||
|
@ -24,13 +23,11 @@ public class StickerInstance extends TileEntityInstance<StickerTileEntity> imple
|
||||||
public StickerInstance(InstancedTileRenderer<?> modelManager, StickerTileEntity tile) {
|
public StickerInstance(InstancedTileRenderer<?> modelManager, StickerTileEntity tile) {
|
||||||
super(modelManager, tile);
|
super(modelManager, tile);
|
||||||
|
|
||||||
head = modelManager.getMaterial(RenderMaterials.TRANSFORMED).getModel(AllBlockPartials.STICKER_HEAD, blockState).createInstance();
|
head = getTransformMaterial().getModel(AllBlockPartials.STICKER_HEAD, blockState).createInstance();
|
||||||
|
|
||||||
fakeWorld = tile.getWorld() != Minecraft.getInstance().world;
|
fakeWorld = tile.getWorld() != Minecraft.getInstance().world;
|
||||||
facing = blockState.get(StickerBlock.FACING);
|
facing = blockState.get(StickerBlock.FACING);
|
||||||
offset = blockState.get(StickerBlock.EXTENDED) ? 1 : 0;
|
offset = blockState.get(StickerBlock.EXTENDED) ? 1 : 0;
|
||||||
|
|
||||||
updateLight();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -45,7 +42,7 @@ public class StickerInstance extends TileEntityInstance<StickerTileEntity> imple
|
||||||
|
|
||||||
MatrixStack stack = new MatrixStack();
|
MatrixStack stack = new MatrixStack();
|
||||||
MatrixStacker.of(stack)
|
MatrixStacker.of(stack)
|
||||||
.translate(getFloatingPos())
|
.translate(getInstancePosition())
|
||||||
.nudge(tile.hashCode())
|
.nudge(tile.hashCode())
|
||||||
.centre()
|
.centre()
|
||||||
.rotateY(AngleHelper.horizontalAngle(facing))
|
.rotateY(AngleHelper.horizontalAngle(facing))
|
||||||
|
|
|
@ -5,7 +5,6 @@ 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.content.contraptions.relays.encased.ShaftInstance;
|
import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance;
|
||||||
import com.simibubi.create.foundation.render.backend.RenderMaterials;
|
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance;
|
import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance;
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
|
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
|
import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer;
|
||||||
|
@ -29,7 +28,7 @@ public class GantryCarriageInstance extends ShaftInstance implements IDynamicIns
|
||||||
public GantryCarriageInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) {
|
public GantryCarriageInstance(InstancedTileRenderer<?> dispatcher, KineticTileEntity tile) {
|
||||||
super(dispatcher, tile);
|
super(dispatcher, tile);
|
||||||
|
|
||||||
gantryCogs = modelManager.getMaterial(RenderMaterials.TRANSFORMED)
|
gantryCogs = getTransformMaterial()
|
||||||
.getModel(AllBlockPartials.GANTRY_COGS, blockState)
|
.getModel(AllBlockPartials.GANTRY_COGS, blockState)
|
||||||
.createInstance();
|
.createInstance();
|
||||||
|
|
||||||
|
@ -40,8 +39,6 @@ public class GantryCarriageInstance extends ShaftInstance implements IDynamicIns
|
||||||
visualPos = facing.getAxisDirection() == Direction.AxisDirection.POSITIVE ? tile.getPos()
|
visualPos = facing.getAxisDirection() == Direction.AxisDirection.POSITIVE ? tile.getPos()
|
||||||
: tile.getPos()
|
: tile.getPos()
|
||||||
.offset(facing.getOpposite());
|
.offset(facing.getOpposite());
|
||||||
|
|
||||||
updateLight();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -62,7 +59,7 @@ public class GantryCarriageInstance extends ShaftInstance implements IDynamicIns
|
||||||
|
|
||||||
MatrixStack ms = new MatrixStack();
|
MatrixStack ms = new MatrixStack();
|
||||||
MatrixStacker.of(ms)
|
MatrixStacker.of(ms)
|
||||||
.translate(getFloatingPos())
|
.translate(getInstancePosition())
|
||||||
.centre()
|
.centre()
|
||||||
.rotateY(AngleHelper.horizontalAngle(facing))
|
.rotateY(AngleHelper.horizontalAngle(facing))
|
||||||
.rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90)
|
.rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90)
|
||||||
|
@ -77,7 +74,7 @@ public class GantryCarriageInstance extends ShaftInstance implements IDynamicIns
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateLight() {
|
public void updateLight() {
|
||||||
relight(pos, gantryCogs.getInstance());
|
relight(pos, gantryCogs.getInstance(), rotatingModel.getInstance());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -15,6 +15,6 @@ public class PumpCogInstance extends SingleRotatingInstance {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected InstancedModel<RotatingData> getModel() {
|
protected InstancedModel<RotatingData> getModel() {
|
||||||
return AllBlockPartials.MECHANICAL_PUMP_COG.renderOnDirectionalSouthRotating(modelManager, tile.getBlockState());
|
return AllBlockPartials.MECHANICAL_PUMP_COG.renderOnDirectionalSouthRotating(renderer, tile.getBlockState());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,9 +37,8 @@ public class FluidValveInstance extends ShaftInstance implements IDynamicInstanc
|
||||||
boolean twist = pipeAxis.isHorizontal() && shaftAxis == Direction.Axis.Z || pipeAxis.isVertical();
|
boolean twist = pipeAxis.isHorizontal() && shaftAxis == Direction.Axis.Z || pipeAxis.isVertical();
|
||||||
pointerRotationOffset = twist ? 90 : 0;
|
pointerRotationOffset = twist ? 90 : 0;
|
||||||
|
|
||||||
pointer = modelManager.transformMaterial().getModel(AllBlockPartials.FLUID_VALVE_POINTER, blockState).createInstance();
|
pointer = renderer.getTransformMaterial().getModel(AllBlockPartials.FLUID_VALVE_POINTER, blockState).createInstance();
|
||||||
|
|
||||||
updateLight();
|
|
||||||
transformPointer((FluidValveTileEntity) tile);
|
transformPointer((FluidValveTileEntity) tile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,7 +57,7 @@ public class FluidValveInstance extends ShaftInstance implements IDynamicInstanc
|
||||||
|
|
||||||
MatrixStack ms = new MatrixStack();
|
MatrixStack ms = new MatrixStack();
|
||||||
MatrixStacker.of(ms)
|
MatrixStacker.of(ms)
|
||||||
.translate(getFloatingPos())
|
.translate(getInstancePosition())
|
||||||
.centre()
|
.centre()
|
||||||
.rotateY(yRot)
|
.rotateY(yRot)
|
||||||
.rotateX(xRot)
|
.rotateX(xRot)
|
||||||
|
|
|
@ -69,7 +69,7 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
|
||||||
if (tile.hasPulley()) {
|
if (tile.hasPulley()) {
|
||||||
InstancedModel<RotatingData> pulleyModel = getPulleyModel();
|
InstancedModel<RotatingData> pulleyModel = getPulleyModel();
|
||||||
|
|
||||||
pulleyKey = setup(pulleyModel.createInstance(), tile.getSpeed(), getRotationAxis());
|
pulleyKey = setup(pulleyModel.createInstance());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,13 +83,13 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
|
||||||
SpriteShiftEntry spriteShiftEntry = BeltRenderer.getSpriteShiftEntry(color, diagonal, bottom);
|
SpriteShiftEntry spriteShiftEntry = BeltRenderer.getSpriteShiftEntry(color, diagonal, bottom);
|
||||||
key.getInstance()
|
key.getInstance()
|
||||||
.setScrollTexture(spriteShiftEntry)
|
.setScrollTexture(spriteShiftEntry)
|
||||||
.setColor(tile.network)
|
.setColor(tile)
|
||||||
.setRotationalSpeed(getScrollSpeed());
|
.setRotationalSpeed(getScrollSpeed());
|
||||||
bottom = false;
|
bottom = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pulleyKey != null) {
|
if (pulleyKey != null) {
|
||||||
updateRotation(pulleyKey, getRotationAxis());
|
updateRotation(pulleyKey.getInstance());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,7 +139,7 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
|
||||||
return modelTransform;
|
return modelTransform;
|
||||||
};
|
};
|
||||||
|
|
||||||
return rotatingMaterial().getModel(AllBlockPartials.BELT_PULLEY, blockState, dir, ms);
|
return getRotatingMaterial().getModel(AllBlockPartials.BELT_PULLEY, blockState, dir, ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Direction getOrientation() {
|
private Direction getOrientation() {
|
||||||
|
@ -159,13 +159,14 @@ public class BeltInstance extends KineticTileInstance<BeltTileEntity> {
|
||||||
|
|
||||||
Quaternion q = new Quaternion(rotX, rotY, rotZ, true);
|
Quaternion q = new Quaternion(rotX, rotY, rotZ, true);
|
||||||
|
|
||||||
key.getInstance()
|
key.getInstance()
|
||||||
.setScrollTexture(spriteShift)
|
.setScrollTexture(spriteShift)
|
||||||
.setScrollMult(diagonal ? 3f / 8f : 0.5f)
|
.setScrollMult(diagonal ? 3f / 8f : 0.5f)
|
||||||
.setRotation(q)
|
.setRotation(q)
|
||||||
.setRotationalSpeed(getScrollSpeed())
|
.setRotationalSpeed(getScrollSpeed())
|
||||||
.setRotationOffset(bottom ? 0.5f : 0f)
|
.setRotationOffset(bottom ? 0.5f : 0f)
|
||||||
.setTileEntity(tile)
|
.setColor(tile)
|
||||||
|
.setPosition(getInstancePosition())
|
||||||
.setBlockLight(world.getLightLevel(LightType.BLOCK, pos))
|
.setBlockLight(world.getLightLevel(LightType.BLOCK, pos))
|
||||||
.setSkyLight(world.getLightLevel(LightType.SKY, pos));
|
.setSkyLight(world.getLightLevel(LightType.SKY, pos));
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ public class ShaftInstance extends SingleRotatingInstance {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected BlockState getRenderedBlockState() {
|
protected BlockState getRenderedBlockState() {
|
||||||
return shaft(getRotationAxis());
|
return shaft();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,19 +24,18 @@ public class SplitShaftInstance extends KineticTileInstance<SplitShaftTileEntity
|
||||||
|
|
||||||
keys = new ArrayList<>(2);
|
keys = new ArrayList<>(2);
|
||||||
|
|
||||||
Block block = blockState.getBlock();
|
|
||||||
final Direction.Axis boxAxis = ((IRotate) block).getRotationAxis(blockState);
|
|
||||||
|
|
||||||
float speed = tile.getSpeed();
|
float speed = tile.getSpeed();
|
||||||
|
|
||||||
for (Direction dir : Iterate.directionsInAxis(boxAxis)) {
|
for (Direction dir : Iterate.directionsInAxis(getRotationAxis())) {
|
||||||
|
|
||||||
InstancedModel<RotatingData> half = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState, dir);
|
InstancedModel<RotatingData> half = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, blockState, dir);
|
||||||
|
|
||||||
float splitSpeed = speed * tile.getRotationSpeedModifier(dir);
|
float splitSpeed = speed * tile.getRotationSpeedModifier(dir);
|
||||||
|
|
||||||
keys.add(setup(half.createInstance(), splitSpeed, boxAxis));
|
keys.add(setup(half.createInstance(), splitSpeed));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateLight();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -47,13 +46,13 @@ public class SplitShaftInstance extends KineticTileInstance<SplitShaftTileEntity
|
||||||
Direction[] directions = Iterate.directionsInAxis(boxAxis);
|
Direction[] directions = Iterate.directionsInAxis(boxAxis);
|
||||||
|
|
||||||
for (int i : Iterate.zeroAndOne) {
|
for (int i : Iterate.zeroAndOne) {
|
||||||
updateRotation(keys.get(i), directions[i]);
|
updateRotation(keys.get(i).getInstance(), tile.getSpeed() * tile.getRotationSpeedModifier(directions[i]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateLight() {
|
public void updateLight() {
|
||||||
keys.forEach(key -> relight(pos, ((InstanceKey<? extends KineticData>) key).getInstance()));
|
relight(pos, keys.stream().map(InstanceKey::getInstance));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -62,13 +61,4 @@ public class SplitShaftInstance extends KineticTileInstance<SplitShaftTileEntity
|
||||||
keys.clear();
|
keys.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void updateRotation(InstanceKey<RotatingData> key, Direction dir) {
|
|
||||||
Direction.Axis axis = dir.getAxis();
|
|
||||||
|
|
||||||
key.getInstance()
|
|
||||||
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
|
|
||||||
.setRotationalSpeed(tile.getSpeed() * tile.getRotationSpeedModifier(dir))
|
|
||||||
.setRotationOffset(getRotationOffset(axis))
|
|
||||||
.setColor(tile.network);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,6 @@ import com.mojang.blaze3d.matrix.MatrixStack;
|
||||||
import com.simibubi.create.AllBlockPartials;
|
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.relays.encased.ShaftInstance;
|
import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance;
|
||||||
import com.simibubi.create.foundation.render.backend.RenderMaterials;
|
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance;
|
import com.simibubi.create.foundation.render.backend.instancing.IDynamicInstance;
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
|
import com.simibubi.create.foundation.render.backend.instancing.InstanceKey;
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
|
import com.simibubi.create.foundation.render.backend.instancing.InstancedModel;
|
||||||
|
@ -30,12 +29,12 @@ public abstract class GaugeInstance extends ShaftInstance implements IDynamicIns
|
||||||
GaugeTileEntity gaugeTile = (GaugeTileEntity) tile;
|
GaugeTileEntity gaugeTile = (GaugeTileEntity) tile;
|
||||||
GaugeBlock gaugeBlock = (GaugeBlock) blockState.getBlock();
|
GaugeBlock gaugeBlock = (GaugeBlock) blockState.getBlock();
|
||||||
|
|
||||||
InstancedModel<ModelData> dialModel = modelManager.getMaterial(RenderMaterials.TRANSFORMED).getModel(AllBlockPartials.GAUGE_DIAL, blockState);
|
InstancedModel<ModelData> dialModel = getTransformMaterial().getModel(AllBlockPartials.GAUGE_DIAL, blockState);
|
||||||
InstancedModel<ModelData> headModel = getHeadModel();
|
InstancedModel<ModelData> headModel = getHeadModel();
|
||||||
|
|
||||||
ms = new MatrixStack();
|
ms = new MatrixStack();
|
||||||
MatrixStacker msr = MatrixStacker.of(ms);
|
MatrixStacker msr = MatrixStacker.of(ms);
|
||||||
msr.translate(getFloatingPos());
|
msr.translate(getInstancePosition());
|
||||||
|
|
||||||
float progress = MathHelper.lerp(AnimationTickHolder.getPartialTicks(), gaugeTile.prevDialState, gaugeTile.dialState);
|
float progress = MathHelper.lerp(AnimationTickHolder.getPartialTicks(), gaugeTile.prevDialState, gaugeTile.dialState);
|
||||||
|
|
||||||
|
@ -49,8 +48,6 @@ public abstract class GaugeInstance extends ShaftInstance implements IDynamicIns
|
||||||
|
|
||||||
face.setupTransform(msr, progress);
|
face.setupTransform(msr, progress);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateLight();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private DialFace makeFace(Direction face, InstancedModel<ModelData> dialModel, InstancedModel<ModelData> headModel) {
|
private DialFace makeFace(Direction face, InstancedModel<ModelData> dialModel, InstancedModel<ModelData> headModel) {
|
||||||
|
@ -151,7 +148,7 @@ public abstract class GaugeInstance extends ShaftInstance implements IDynamicIns
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected InstancedModel<ModelData> getHeadModel() {
|
protected InstancedModel<ModelData> getHeadModel() {
|
||||||
return modelManager.getMaterial(RenderMaterials.TRANSFORMED).getModel(AllBlockPartials.GAUGE_HEAD_SPEED, blockState);
|
return getTransformMaterial().getModel(AllBlockPartials.GAUGE_HEAD_SPEED, blockState);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,7 +159,7 @@ public abstract class GaugeInstance extends ShaftInstance implements IDynamicIns
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected InstancedModel<ModelData> getHeadModel() {
|
protected InstancedModel<ModelData> getHeadModel() {
|
||||||
return modelManager.getMaterial(RenderMaterials.TRANSFORMED).getModel(AllBlockPartials.GAUGE_HEAD_STRESS, blockState);
|
return getTransformMaterial().getModel(AllBlockPartials.GAUGE_HEAD_STRESS, blockState);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,8 +44,8 @@ public class GearboxInstance extends KineticTileInstance<GearboxTileEntity> {
|
||||||
key.getInstance()
|
key.getInstance()
|
||||||
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
|
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
|
||||||
.setRotationalSpeed(getSpeed(direction))
|
.setRotationalSpeed(getSpeed(direction))
|
||||||
.setRotationOffset(getRotationOffset(axis))
|
.setRotationOffset(getRotationOffset(axis)).setColor(tile)
|
||||||
.setTileEntity(tile)
|
.setPosition(getInstancePosition())
|
||||||
.setBlockLight(blockLight)
|
.setBlockLight(blockLight)
|
||||||
.setSkyLight(skyLight);
|
.setSkyLight(skyLight);
|
||||||
|
|
||||||
|
@ -81,12 +81,7 @@ public class GearboxInstance extends KineticTileInstance<GearboxTileEntity> {
|
||||||
Direction direction = key.getKey();
|
Direction direction = key.getKey();
|
||||||
Direction.Axis axis = direction.getAxis();
|
Direction.Axis axis = direction.getAxis();
|
||||||
|
|
||||||
key.getValue()
|
updateRotation(key.getValue().getInstance(), axis, getSpeed(direction));
|
||||||
.getInstance()
|
|
||||||
.setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector())
|
|
||||||
.setRotationalSpeed(getSpeed(direction))
|
|
||||||
.setRotationOffset(getRotationOffset(axis))
|
|
||||||
.setColor(tile.network);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,18 +16,16 @@ public class AdjustableRepeaterInstance extends TileEntityInstance<AdjustableRep
|
||||||
public AdjustableRepeaterInstance(InstancedTileRenderer<?> modelManager, AdjustableRepeaterTileEntity tile) {
|
public AdjustableRepeaterInstance(InstancedTileRenderer<?> modelManager, AdjustableRepeaterTileEntity tile) {
|
||||||
super(modelManager, tile);
|
super(modelManager, tile);
|
||||||
|
|
||||||
indicator = modelManager.transformMaterial().getModel(AllBlockPartials.FLEXPEATER_INDICATOR, blockState).createInstance();
|
indicator = modelManager.getTransformMaterial().getModel(AllBlockPartials.FLEXPEATER_INDICATOR, blockState).createInstance();
|
||||||
|
|
||||||
MatrixStack ms = new MatrixStack();
|
MatrixStack ms = new MatrixStack();
|
||||||
MatrixStacker.of(ms).translate(getFloatingPos());
|
MatrixStacker.of(ms).translate(getInstancePosition());
|
||||||
|
|
||||||
indicator.getInstance()
|
indicator.getInstance()
|
||||||
.setTransform(ms)
|
.setTransform(ms)
|
||||||
.setColor(getColor());
|
.setColor(getColor());
|
||||||
|
|
||||||
previousState = tile.state;
|
previousState = tile.state;
|
||||||
|
|
||||||
updateLight();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -6,7 +6,6 @@ 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.RotatingData;
|
import com.simibubi.create.content.contraptions.base.RotatingData;
|
||||||
import com.simibubi.create.content.contraptions.base.SingleRotatingInstance;
|
import com.simibubi.create.content.contraptions.base.SingleRotatingInstance;
|
||||||
import com.simibubi.create.foundation.render.backend.RenderMaterials;
|
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.*;
|
import com.simibubi.create.foundation.render.backend.instancing.*;
|
||||||
|
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
|
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
|
||||||
|
@ -38,7 +37,7 @@ public class ArmInstance extends SingleRotatingInstance implements IDynamicInsta
|
||||||
public ArmInstance(InstancedTileRenderer<?> modelManager, KineticTileEntity tile) {
|
public ArmInstance(InstancedTileRenderer<?> modelManager, KineticTileEntity tile) {
|
||||||
super(modelManager, tile);
|
super(modelManager, tile);
|
||||||
|
|
||||||
RenderMaterial<?, InstancedModel<ModelData>> mat = modelManager.getMaterial(RenderMaterials.TRANSFORMED);
|
RenderMaterial<?, InstancedModel<ModelData>> mat = getTransformMaterial();
|
||||||
|
|
||||||
base = mat.getModel(AllBlockPartials.ARM_BASE, blockState).createInstance();
|
base = mat.getModel(AllBlockPartials.ARM_BASE, blockState).createInstance();
|
||||||
lowerBody = mat.getModel(AllBlockPartials.ARM_LOWER_BODY, blockState).createInstance();
|
lowerBody = mat.getModel(AllBlockPartials.ARM_LOWER_BODY, blockState).createInstance();
|
||||||
|
@ -52,8 +51,6 @@ public class ArmInstance extends SingleRotatingInstance implements IDynamicInsta
|
||||||
|
|
||||||
clawGrips = Lists.newArrayList(clawGrip1, clawGrip2);
|
clawGrips = Lists.newArrayList(clawGrip1, clawGrip2);
|
||||||
models = Lists.newArrayList(base, lowerBody, upperBody, head, claw, clawGrip1, clawGrip2);
|
models = Lists.newArrayList(base, lowerBody, upperBody, head, claw, clawGrip1, clawGrip2);
|
||||||
|
|
||||||
updateLight();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -91,7 +88,7 @@ public class ArmInstance extends SingleRotatingInstance implements IDynamicInsta
|
||||||
|
|
||||||
MatrixStack msLocal = new MatrixStack();
|
MatrixStack msLocal = new MatrixStack();
|
||||||
MatrixStacker msr = MatrixStacker.of(msLocal);
|
MatrixStacker msr = MatrixStacker.of(msLocal);
|
||||||
msr.translate(getFloatingPos());
|
msr.translate(getInstancePosition());
|
||||||
msr.centre();
|
msr.centre();
|
||||||
|
|
||||||
if (blockState.get(ArmBlock.CEILING))
|
if (blockState.get(ArmBlock.CEILING))
|
||||||
|
@ -147,7 +144,7 @@ public class ArmInstance extends SingleRotatingInstance implements IDynamicInsta
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected InstancedModel<RotatingData> getModel() {
|
protected InstancedModel<RotatingData> getModel() {
|
||||||
return AllBlockPartials.ARM_COG.renderOnRotating(modelManager, tile.getBlockState());
|
return AllBlockPartials.ARM_COG.renderOnRotating(renderer, tile.getBlockState());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -2,7 +2,6 @@ package com.simibubi.create.content.logistics.block.redstone;
|
||||||
|
|
||||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||||
import com.simibubi.create.AllBlockPartials;
|
import com.simibubi.create.AllBlockPartials;
|
||||||
import com.simibubi.create.foundation.render.backend.RenderMaterials;
|
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.*;
|
import com.simibubi.create.foundation.render.backend.instancing.*;
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
|
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
|
||||||
import com.simibubi.create.foundation.utility.AngleHelper;
|
import com.simibubi.create.foundation.utility.AngleHelper;
|
||||||
|
@ -23,7 +22,7 @@ public class AnalogLeverInstance extends TileEntityInstance<AnalogLeverTileEntit
|
||||||
public AnalogLeverInstance(InstancedTileRenderer<?> modelManager, AnalogLeverTileEntity tile) {
|
public AnalogLeverInstance(InstancedTileRenderer<?> modelManager, AnalogLeverTileEntity tile) {
|
||||||
super(modelManager, tile);
|
super(modelManager, tile);
|
||||||
|
|
||||||
RenderMaterial<?, InstancedModel<ModelData>> mat = modelManager.getMaterial(RenderMaterials.TRANSFORMED);
|
RenderMaterial<?, InstancedModel<ModelData>> mat = getTransformMaterial();
|
||||||
|
|
||||||
handle = mat.getModel(AllBlockPartials.ANALOG_LEVER_HANDLE, blockState).createInstance();
|
handle = mat.getModel(AllBlockPartials.ANALOG_LEVER_HANDLE, blockState).createInstance();
|
||||||
indicator = mat.getModel(AllBlockPartials.ANALOG_LEVER_INDICATOR, blockState).createInstance();
|
indicator = mat.getModel(AllBlockPartials.ANALOG_LEVER_INDICATOR, blockState).createInstance();
|
||||||
|
@ -33,7 +32,6 @@ public class AnalogLeverInstance extends TileEntityInstance<AnalogLeverTileEntit
|
||||||
rY = AngleHelper.horizontalAngle(blockState.get(AnalogLeverBlock.HORIZONTAL_FACING));
|
rY = AngleHelper.horizontalAngle(blockState.get(AnalogLeverBlock.HORIZONTAL_FACING));
|
||||||
|
|
||||||
setupModel();
|
setupModel();
|
||||||
updateLight();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -46,7 +44,7 @@ public class AnalogLeverInstance extends TileEntityInstance<AnalogLeverTileEntit
|
||||||
MatrixStack ms = new MatrixStack();
|
MatrixStack ms = new MatrixStack();
|
||||||
MatrixStacker msr = MatrixStacker.of(ms);
|
MatrixStacker msr = MatrixStacker.of(ms);
|
||||||
|
|
||||||
msr.translate(getFloatingPos());
|
msr.translate(getInstancePosition());
|
||||||
transform(msr);
|
transform(msr);
|
||||||
|
|
||||||
float state = tile.clientState.get(AnimationTickHolder.getPartialTicks());
|
float state = tile.clientState.get(AnimationTickHolder.getPartialTicks());
|
||||||
|
|
|
@ -2,7 +2,6 @@ package com.simibubi.create.content.schematics.block;
|
||||||
|
|
||||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||||
import com.simibubi.create.AllBlockPartials;
|
import com.simibubi.create.AllBlockPartials;
|
||||||
import com.simibubi.create.foundation.render.backend.RenderMaterials;
|
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.*;
|
import com.simibubi.create.foundation.render.backend.instancing.*;
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
|
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
|
||||||
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
import com.simibubi.create.foundation.utility.AnimationTickHolder;
|
||||||
|
@ -17,12 +16,10 @@ public class SchematicannonInstance extends TileEntityInstance<SchematicannonTil
|
||||||
public SchematicannonInstance(InstancedTileRenderer<?> modelManager, SchematicannonTileEntity tile) {
|
public SchematicannonInstance(InstancedTileRenderer<?> modelManager, SchematicannonTileEntity tile) {
|
||||||
super(modelManager, tile);
|
super(modelManager, tile);
|
||||||
|
|
||||||
RenderMaterial<?, InstancedModel<ModelData>> mat = modelManager.getMaterial(RenderMaterials.TRANSFORMED);
|
RenderMaterial<?, InstancedModel<ModelData>> mat = getTransformMaterial();
|
||||||
|
|
||||||
connector = mat.getModel(AllBlockPartials.SCHEMATICANNON_CONNECTOR, blockState).createInstance();
|
connector = mat.getModel(AllBlockPartials.SCHEMATICANNON_CONNECTOR, blockState).createInstance();
|
||||||
pipe = mat.getModel(AllBlockPartials.SCHEMATICANNON_PIPE, blockState).createInstance();
|
pipe = mat.getModel(AllBlockPartials.SCHEMATICANNON_PIPE, blockState).createInstance();
|
||||||
|
|
||||||
updateLight();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -39,7 +36,7 @@ public class SchematicannonInstance extends TileEntityInstance<SchematicannonTil
|
||||||
MatrixStack ms = new MatrixStack();
|
MatrixStack ms = new MatrixStack();
|
||||||
MatrixStacker msr = MatrixStacker.of(ms);
|
MatrixStacker msr = MatrixStacker.of(ms);
|
||||||
|
|
||||||
msr.translate(getFloatingPos());
|
msr.translate(getInstancePosition());
|
||||||
|
|
||||||
ms.push();
|
ms.push();
|
||||||
msr.centre();
|
msr.centre();
|
||||||
|
|
|
@ -1,9 +1,17 @@
|
||||||
package com.simibubi.create.foundation.render.backend.instancing;
|
package com.simibubi.create.foundation.render.backend.instancing;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An interface giving {@link TileEntityInstance}s a hook to have a function called at
|
||||||
|
* the start of a frame. By implementing {@link IDynamicInstance}, a {@link TileEntityInstance}
|
||||||
|
* can animate its models in ways that could not be easily achieved by shader attribute
|
||||||
|
* parameterization.
|
||||||
|
*
|
||||||
|
* <br><br> If your goal is offloading work to shaders, but you're unsure exactly how you need
|
||||||
|
* to parameterize the instances, you're encouraged to implement this for prototyping.
|
||||||
|
*/
|
||||||
public interface IDynamicInstance {
|
public interface IDynamicInstance {
|
||||||
/**
|
/**
|
||||||
* Called every frame. This can be used to smoothly change instance data
|
* Called every frame.
|
||||||
* to allow for fancy animations that could not be achieved on the GPU alone.
|
|
||||||
*/
|
*/
|
||||||
void beginFrame();
|
void beginFrame();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,25 @@
|
||||||
package com.simibubi.create.foundation.render.backend.instancing;
|
package com.simibubi.create.foundation.render.backend.instancing;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An interface giving {@link TileEntityInstance}s a hook to have a function called at
|
||||||
|
* the end of every tick. By implementing {@link ITickableInstance}, a {@link TileEntityInstance}
|
||||||
|
* can update frequently, but not every frame.
|
||||||
|
* <br> There are a few cases in which this should be considered over {@link IDynamicInstance}:
|
||||||
|
* <ul>
|
||||||
|
* <li>
|
||||||
|
* You'd like to change something about the instance every now and then.
|
||||||
|
* eg. adding or removing parts, snapping to a different rotation.
|
||||||
|
* </li>
|
||||||
|
* <li>
|
||||||
|
* Your TileEntity does animate, but the animation doesn't have
|
||||||
|
* to be smooth, in which case this could be an optimization.
|
||||||
|
* </li>
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
public interface ITickableInstance {
|
public interface ITickableInstance {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called every tick. This is useful for things that don't have to be smooth,
|
* Called every tick.
|
||||||
* or to recalculate something that would only change after a game tick.
|
*/
|
||||||
*/
|
void tick();
|
||||||
void tick();
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,11 +68,11 @@ public abstract class InstancedTileRenderer<P extends BasicProgram> {
|
||||||
return (RenderMaterial<P, M>) materials.get(materialType);
|
return (RenderMaterial<P, M>) materials.get(materialType);
|
||||||
}
|
}
|
||||||
|
|
||||||
public RenderMaterial<P, InstancedModel<ModelData>> transformMaterial() {
|
public RenderMaterial<P, InstancedModel<ModelData>> getTransformMaterial() {
|
||||||
return getMaterial(RenderMaterials.TRANSFORMED);
|
return getMaterial(RenderMaterials.TRANSFORMED);
|
||||||
}
|
}
|
||||||
|
|
||||||
public RenderMaterial<P, InstancedModel<OrientedData>> orientedMaterial() {
|
public RenderMaterial<P, InstancedModel<OrientedData>> getOrientedMaterial() {
|
||||||
return getMaterial(RenderMaterials.ORIENTED);
|
return getMaterial(RenderMaterials.ORIENTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,6 +167,7 @@ public abstract class InstancedTileRenderer<P extends BasicProgram> {
|
||||||
TileEntityInstance<? super T> renderer = InstancedTileRenderRegistry.instance.create(this, tile);
|
TileEntityInstance<? super T> renderer = InstancedTileRenderRegistry.instance.create(this, tile);
|
||||||
|
|
||||||
if (renderer != null) {
|
if (renderer != null) {
|
||||||
|
renderer.updateLight();
|
||||||
instances.put(tile, renderer);
|
instances.put(tile, renderer);
|
||||||
|
|
||||||
if (renderer instanceof IDynamicInstance)
|
if (renderer instanceof IDynamicInstance)
|
||||||
|
|
|
@ -1,10 +1,5 @@
|
||||||
package com.simibubi.create.foundation.render.backend.instancing;
|
package com.simibubi.create.foundation.render.backend.instancing;
|
||||||
|
|
||||||
import com.simibubi.create.foundation.render.backend.gl.BasicProgram;
|
|
||||||
|
|
||||||
public class MaterialType<M extends InstancedModel<?>> {
|
public class MaterialType<M extends InstancedModel<?>> {
|
||||||
|
|
||||||
public <P extends BasicProgram> RenderMaterial<?, M> get(InstancedTileRenderer<P> renderer) {
|
|
||||||
return renderer.getMaterial(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ public class RenderMaterial<P extends BasicProgram, MODEL extends InstancedModel
|
||||||
this.layerPredicate = layerPredicate;
|
this.layerPredicate = layerPredicate;
|
||||||
registerCompartment(Compartment.PARTIAL);
|
registerCompartment(Compartment.PARTIAL);
|
||||||
registerCompartment(Compartment.DIRECTIONAL_PARTIAL);
|
registerCompartment(Compartment.DIRECTIONAL_PARTIAL);
|
||||||
registerCompartment(KineticTileEntityRenderer.KINETIC_TILE);
|
registerCompartment(Compartment.GENERIC_TILE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canRenderInLayer(RenderType layer) {
|
public boolean canRenderInLayer(RenderType layer) {
|
||||||
|
@ -120,8 +120,8 @@ public class RenderMaterial<P extends BasicProgram, MODEL extends InstancedModel
|
||||||
() -> buildModel(partial.get(), referenceState, modelTransform.get()));
|
() -> buildModel(partial.get(), referenceState, modelTransform.get()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public MODEL getModel(Compartment<BlockState> compartment, BlockState toRender) {
|
public MODEL getModel(BlockState toRender) {
|
||||||
return get(compartment, toRender, () -> buildModel(toRender));
|
return get(Compartment.GENERIC_TILE, toRender, () -> buildModel(toRender));
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T> MODEL get(Compartment<T> compartment, T key, Supplier<MODEL> supplier) {
|
public <T> MODEL get(Compartment<T> compartment, T key, Supplier<MODEL> supplier) {
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
package com.simibubi.create.foundation.render.backend.instancing;
|
package com.simibubi.create.foundation.render.backend.instancing;
|
||||||
|
|
||||||
import com.simibubi.create.foundation.render.backend.instancing.impl.IFlatLight;
|
import com.simibubi.create.foundation.render.backend.instancing.impl.IFlatLight;
|
||||||
|
import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData;
|
||||||
|
import com.simibubi.create.foundation.render.backend.instancing.impl.OrientedData;
|
||||||
|
|
||||||
import net.minecraft.block.BlockState;
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
@ -10,16 +13,33 @@ import net.minecraft.world.World;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The layer between a {@link TileEntity} and the Flywheel backend.
|
||||||
|
*
|
||||||
|
* <br><br> {@link #updateLight()} is called after construction.
|
||||||
|
*
|
||||||
|
* <br><br> There are a few additional features that overriding classes can opt in to:
|
||||||
|
* <ul>
|
||||||
|
* <li>{@link IDynamicInstance}</li>
|
||||||
|
* <li>{@link ITickableInstance}</li>
|
||||||
|
* </ul>
|
||||||
|
* See the interfaces' documentation for more information about each one.
|
||||||
|
*
|
||||||
|
* <br> Implementing one or more of these will give a {@link TileEntityInstance} access
|
||||||
|
* to more interesting and regular points within a tick or a frame.
|
||||||
|
*
|
||||||
|
* @param <T> The type of {@link TileEntity} your class is an instance of.
|
||||||
|
*/
|
||||||
public abstract class TileEntityInstance<T extends TileEntity> {
|
public abstract class TileEntityInstance<T extends TileEntity> {
|
||||||
|
|
||||||
protected final InstancedTileRenderer<?> modelManager;
|
protected final InstancedTileRenderer<?> renderer;
|
||||||
protected final T tile;
|
protected final T tile;
|
||||||
protected final World world;
|
protected final World world;
|
||||||
protected final BlockPos pos;
|
protected final BlockPos pos;
|
||||||
protected final BlockState blockState;
|
protected final BlockState blockState;
|
||||||
|
|
||||||
public TileEntityInstance(InstancedTileRenderer<?> modelManager, T tile) {
|
public TileEntityInstance(InstancedTileRenderer<?> renderer, T tile) {
|
||||||
this.modelManager = modelManager;
|
this.renderer = renderer;
|
||||||
this.tile = tile;
|
this.tile = tile;
|
||||||
this.world = tile.getWorld();
|
this.world = tile.getWorld();
|
||||||
this.pos = tile.getPos();
|
this.pos = tile.getPos();
|
||||||
|
@ -30,26 +50,46 @@ public abstract class TileEntityInstance<T extends TileEntity> {
|
||||||
* Update instance data here. Good for when data doesn't change very often and when animations are GPU based.
|
* Update instance data here. Good for when data doesn't change very often and when animations are GPU based.
|
||||||
* Don't query lighting data here, that's handled separately in {@link #updateLight()}.
|
* Don't query lighting data here, that's handled separately in {@link #updateLight()}.
|
||||||
*
|
*
|
||||||
* If your animations are complex and more CPU driven, use {@link IDynamicInstance} or {@link ITickableInstance}.
|
* <br><br> If your animations are complex or more CPU driven, see {@link IDynamicInstance} or {@link ITickableInstance}.
|
||||||
*/
|
*/
|
||||||
protected void update() { }
|
protected void update() { }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when a light update occurs in the world. If your model needs it, update light here.
|
* Called after construction and when a light update occurs in the world.
|
||||||
|
*
|
||||||
|
* <br> If your model needs it, update light here.
|
||||||
*/
|
*/
|
||||||
public void updateLight() { }
|
public void updateLight() { }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Call {@link InstanceKey#delete()} on all acquired keys.
|
* Free any acquired resources.
|
||||||
|
*
|
||||||
|
* <br> eg. call {@link InstanceKey#delete()}.
|
||||||
*/
|
*/
|
||||||
public abstract void remove();
|
public abstract void remove();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Just before {@link #update()} would be called, <code>shouldReset()</code> is checked.
|
||||||
|
* If this function returns <code>true</code>, then this instance will be {@link #remove}d,
|
||||||
|
* and another instance will be constructed to replace it. This allows for more sane resource
|
||||||
|
* acquisition compared to trying to update everything within the lifetime of an instance.
|
||||||
|
*
|
||||||
|
* @return <code>true</code> if this instance should be discarded and refreshed.
|
||||||
|
*/
|
||||||
public boolean shouldReset() {
|
public boolean shouldReset() {
|
||||||
return tile.getBlockState() != blockState;
|
return tile.getBlockState() != blockState;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BlockPos getFloatingPos() {
|
/**
|
||||||
return pos.subtract(modelManager.getOriginCoordinate());
|
* In order to accommodate for floating point precision errors at high coordinates,
|
||||||
|
* {@link InstancedTileRenderer}s are allowed to arbitrarily adjust the origin, and
|
||||||
|
* shift the world matrix provided as a shader uniform accordingly.
|
||||||
|
*
|
||||||
|
* @return The {@link BlockPos} at which the {@link TileEntity} this instance
|
||||||
|
* represents should be rendered at to appear in the correct location.
|
||||||
|
*/
|
||||||
|
public BlockPos getInstancePosition() {
|
||||||
|
return pos.subtract(renderer.getOriginCoordinate());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void relight(BlockPos pos, IFlatLight<?>... models) {
|
protected void relight(BlockPos pos, IFlatLight<?>... models) {
|
||||||
|
@ -67,4 +107,12 @@ public abstract class TileEntityInstance<T extends TileEntity> {
|
||||||
protected void relight(int block, int sky, Stream<IFlatLight<?>> models) {
|
protected void relight(int block, int sky, Stream<IFlatLight<?>> models) {
|
||||||
models.forEach(model -> model.setBlockLight(block).setSkyLight(sky));
|
models.forEach(model -> model.setBlockLight(block).setSkyLight(sky));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected RenderMaterial<?, InstancedModel<ModelData>> getTransformMaterial() {
|
||||||
|
return renderer.getTransformMaterial();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected RenderMaterial<?, InstancedModel<OrientedData>> getOrientedMaterial() {
|
||||||
|
return renderer.getOrientedMaterial();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue