mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-11-10 03:53:12 +01:00
Rendering refactors
- Fix fluid rendering in JEI scenes - Add more separate options to SuperByteBuffer - Fix copper backtank diffuse when worn - Fix enchantment glint on custom rendered items; Closes #1846
This commit is contained in:
parent
ccbb57f518
commit
b5c0684dd6
7 changed files with 204 additions and 142 deletions
|
@ -15,6 +15,7 @@ import net.minecraft.block.BlockState;
|
|||
import net.minecraft.client.MainWindow;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.entity.player.ClientPlayerEntity;
|
||||
import net.minecraft.client.renderer.Atlases;
|
||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
|
||||
import net.minecraft.client.renderer.IRenderTypeBuffer.Impl;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
|
@ -60,7 +61,7 @@ public class CopperBacktankArmorLayer<T extends LivingEntity, M extends EntityMo
|
|||
BipedModel<?> model = (BipedModel<?>) entityModel;
|
||||
BlockState renderedState = AllBlocks.COPPER_BACKTANK.getDefaultState()
|
||||
.with(CopperBacktankBlock.HORIZONTAL_FACING, Direction.SOUTH);
|
||||
RenderType renderType = RenderType.getCutout();
|
||||
RenderType renderType = Atlases.getEntityCutout();
|
||||
|
||||
SuperByteBuffer backtank = CreateClient.BUFFER_CACHE.renderBlock(renderedState);
|
||||
SuperByteBuffer cogs =
|
||||
|
@ -69,8 +70,9 @@ public class CopperBacktankArmorLayer<T extends LivingEntity, M extends EntityMo
|
|||
model.bipedBody.rotate(ms);
|
||||
ms.translate(-1 / 2f, 10 / 16f, 1f);
|
||||
ms.scale(1, -1, -1);
|
||||
backtank.light(light)
|
||||
.renderInto(ms, buffer.getBuffer(renderType));
|
||||
backtank.forEntityRender()
|
||||
.light(light)
|
||||
.renderInto(ms, buffer.getBuffer(renderType));
|
||||
|
||||
cogs.matrixStacker()
|
||||
.centre()
|
||||
|
@ -80,13 +82,11 @@ public class CopperBacktankArmorLayer<T extends LivingEntity, M extends EntityMo
|
|||
.rotate(Direction.EAST, AngleHelper.rad(2 * AnimationTickHolder.getRenderTime(entity.world) % 360))
|
||||
.translate(0, -6.5f / 16, -11f / 16);
|
||||
|
||||
cogs.light(light)
|
||||
cogs.forEntityRender()
|
||||
.light(light)
|
||||
.renderInto(ms, buffer.getBuffer(renderType));
|
||||
|
||||
if (buffer instanceof Impl)
|
||||
((Impl) buffer).draw(renderType);
|
||||
ms.pop();
|
||||
|
||||
}
|
||||
|
||||
public static void register() {
|
||||
|
|
|
@ -11,14 +11,12 @@ import com.simibubi.create.foundation.utility.MatrixStacker;
|
|||
|
||||
import net.minecraft.block.Blocks;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.Atlases;
|
||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.WorldRenderer;
|
||||
import net.minecraft.client.renderer.entity.EntityRenderer;
|
||||
import net.minecraft.client.renderer.entity.EntityRendererManager;
|
||||
import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType;
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture;
|
||||
import net.minecraft.inventory.container.PlayerContainer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.ResourceLocation;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
|
@ -26,17 +24,16 @@ import net.minecraft.util.math.vector.Matrix3f;
|
|||
|
||||
public class BlueprintRenderer extends EntityRenderer<BlueprintEntity> {
|
||||
|
||||
public BlueprintRenderer(EntityRendererManager p_i46179_1_) {
|
||||
super(p_i46179_1_);
|
||||
public BlueprintRenderer(EntityRendererManager manager) {
|
||||
super(manager);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(BlueprintEntity entity, float yaw, float pt, MatrixStack ms, IRenderTypeBuffer buffer,
|
||||
int overlay) {
|
||||
int light) {
|
||||
PartialModel partialModel = entity.size == 3 ? AllBlockPartials.CRAFTING_BLUEPRINT_3x3
|
||||
: entity.size == 2 ? AllBlockPartials.CRAFTING_BLUEPRINT_2x2 : AllBlockPartials.CRAFTING_BLUEPRINT_1x1;
|
||||
SuperByteBuffer sbb = PartialBufferer.get(partialModel, Blocks.AIR.getDefaultState());
|
||||
int light = WorldRenderer.getLightmapCoordinates(entity.world, entity.getBlockPos());
|
||||
sbb.matrixStacker()
|
||||
.rotateY(-yaw)
|
||||
.rotateX(90.0F + entity.rotationPitch)
|
||||
|
@ -44,10 +41,9 @@ public class BlueprintRenderer extends EntityRenderer<BlueprintEntity> {
|
|||
if (entity.size == 2)
|
||||
sbb.translate(.5, 0, -.5);
|
||||
|
||||
RenderType entitySolid = RenderType.getEntitySolid(PlayerContainer.BLOCK_ATLAS_TEXTURE);
|
||||
sbb.asEntityModel()
|
||||
sbb.forEntityRender()
|
||||
.light(light)
|
||||
.renderInto(ms, buffer.getBuffer(entitySolid));
|
||||
.renderInto(ms, buffer.getBuffer(Atlases.getEntitySolid()));
|
||||
super.render(entity, yaw, pt, ms, buffer, light);
|
||||
|
||||
ms.push();
|
||||
|
|
|
@ -2,20 +2,18 @@ package com.simibubi.create.foundation.fluid;
|
|||
|
||||
import java.util.function.Function;
|
||||
|
||||
import com.jozufozu.flywheel.event.RenderLayerEvent;
|
||||
import com.mojang.blaze3d.matrix.MatrixStack;
|
||||
import com.mojang.blaze3d.matrix.MatrixStack.Entry;
|
||||
import com.mojang.blaze3d.vertex.IVertexBuilder;
|
||||
import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer;
|
||||
import com.simibubi.create.foundation.renderState.RenderTypes;
|
||||
import com.simibubi.create.foundation.utility.AngleHelper;
|
||||
import com.simibubi.create.foundation.utility.ColorHelper;
|
||||
import com.simibubi.create.foundation.utility.Iterate;
|
||||
import com.simibubi.create.foundation.utility.MatrixStacker;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.BufferBuilder;
|
||||
import net.minecraft.client.renderer.IRenderTypeBuffer;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.texture.OverlayTexture;
|
||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||
import net.minecraft.fluid.Fluid;
|
||||
import net.minecraft.inventory.container.PlayerContainer;
|
||||
|
@ -28,42 +26,23 @@ import net.minecraft.util.math.vector.Vector3d;
|
|||
import net.minecraft.util.math.vector.Vector3i;
|
||||
import net.minecraftforge.api.distmarker.Dist;
|
||||
import net.minecraftforge.api.distmarker.OnlyIn;
|
||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||
import net.minecraftforge.fluids.FluidAttributes;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
|
||||
@OnlyIn(Dist.CLIENT)
|
||||
@Mod.EventBusSubscriber(Dist.CLIENT)
|
||||
public class FluidRenderer {
|
||||
|
||||
// If we draw to BufferBuilder that minecraft provides for RenderType.getTranslucent(), minecraft draws the contents
|
||||
// to the wrong framebuffer. If we tried to inject a custom RenderType into RenderTypeBuffers, we'd have the same
|
||||
// issue. This is because minecraft calls IRenderTypeBuffer.Impl::draw just before clearing the transparency
|
||||
// framebuffer, so anything we put into the normal RenderTypeBuffers will never be seen. By using our own
|
||||
// BufferBuilder, we can avoid getting our contents wiped. Then, using Flywheel's renderLayer hook, we can draw our
|
||||
// buffer at the same time the transparent world layer is drawn.
|
||||
private static final BufferBuilder _builder = new BufferBuilder(RenderType.getTranslucent().getExpectedBufferSize());
|
||||
|
||||
private static BufferBuilder getBuilder() {
|
||||
if (!_builder.isBuilding()) {
|
||||
RenderType type = RenderType.getTranslucent();
|
||||
|
||||
_builder.begin(type.getDrawMode(), type.getVertexFormat());
|
||||
}
|
||||
|
||||
return _builder;
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void renderLayer(RenderLayerEvent event) {
|
||||
if (event.type == RenderType.getTranslucent()) {
|
||||
event.type.draw(_builder, 0, 0, 0);
|
||||
}
|
||||
public static IVertexBuilder getFluidBuilder(IRenderTypeBuffer buffer) {
|
||||
return buffer.getBuffer(RenderTypes.getFluid());
|
||||
}
|
||||
|
||||
public static void renderFluidStream(FluidStack fluidStack, Direction direction, float radius, float progress,
|
||||
boolean inbound, IRenderTypeBuffer buffer, MatrixStack ms, int light) {
|
||||
renderFluidStream(fluidStack, direction, radius, progress, inbound, getFluidBuilder(buffer), ms, light);
|
||||
}
|
||||
|
||||
public static void renderFluidStream(FluidStack fluidStack, Direction direction, float radius, float progress,
|
||||
boolean inbound, IVertexBuilder builder, MatrixStack ms, int light) {
|
||||
Fluid fluid = fluidStack.getFluid();
|
||||
FluidAttributes fluidAttributes = fluid.getAttributes();
|
||||
Function<ResourceLocation, TextureAtlasSprite> spriteAtlas = Minecraft.getInstance()
|
||||
|
@ -72,18 +51,14 @@ public class FluidRenderer {
|
|||
TextureAtlasSprite stillTexture = spriteAtlas.apply(fluidAttributes.getStillTexture(fluidStack));
|
||||
|
||||
int color = fluidAttributes.getColor(fluidStack);
|
||||
IVertexBuilder builder = getBuilder();
|
||||
if (buffer instanceof SuperRenderTypeBuffer)
|
||||
builder = ((SuperRenderTypeBuffer) buffer).getLateBuffer(RenderType.getTranslucent());
|
||||
|
||||
MatrixStacker msr = MatrixStacker.of(ms);
|
||||
int blockLightIn = (light >> 4) & 0xf;
|
||||
int blockLightIn = (light >> 4) & 0xF;
|
||||
int luminosity = Math.max(blockLightIn, fluidAttributes.getLuminosity(fluidStack));
|
||||
light = (light & 0xf00000) | luminosity << 4;
|
||||
light = (light & 0xF00000) | luminosity << 4;
|
||||
|
||||
if (inbound)
|
||||
direction = direction.getOpposite();
|
||||
|
||||
MatrixStacker msr = MatrixStacker.of(ms);
|
||||
ms.push();
|
||||
msr.centre()
|
||||
.rotateY(AngleHelper.horizontalAngle(direction))
|
||||
|
@ -111,11 +86,15 @@ public class FluidRenderer {
|
|||
stillTexture);
|
||||
|
||||
ms.pop();
|
||||
|
||||
}
|
||||
|
||||
public static void renderTiledFluidBB(FluidStack fluidStack, float xMin, float yMin, float zMin, float xMax,
|
||||
float yMax, float zMax, IRenderTypeBuffer buffer, MatrixStack ms, int light, boolean renderBottom) {
|
||||
renderTiledFluidBB(fluidStack, xMin, yMin, zMin, xMax, yMax, zMax, getFluidBuilder(buffer), ms, light, renderBottom);
|
||||
}
|
||||
|
||||
public static void renderTiledFluidBB(FluidStack fluidStack, float xMin, float yMin, float zMin, float xMax,
|
||||
float yMax, float zMax, IVertexBuilder builder, MatrixStack ms, int light, boolean renderBottom) {
|
||||
Fluid fluid = fluidStack.getFluid();
|
||||
FluidAttributes fluidAttributes = fluid.getAttributes();
|
||||
TextureAtlasSprite fluidTexture = Minecraft.getInstance()
|
||||
|
@ -123,16 +102,12 @@ public class FluidRenderer {
|
|||
.apply(fluidAttributes.getStillTexture(fluidStack));
|
||||
|
||||
int color = fluidAttributes.getColor(fluidStack);
|
||||
IVertexBuilder builder = getBuilder();
|
||||
if (buffer instanceof SuperRenderTypeBuffer)
|
||||
builder = ((SuperRenderTypeBuffer) buffer).getLateBuffer(RenderType.getTranslucent());
|
||||
MatrixStacker msr = MatrixStacker.of(ms);
|
||||
Vector3d center = new Vector3d(xMin + (xMax - xMin) / 2, yMin + (yMax - yMin) / 2, zMin + (zMax - zMin) / 2);
|
||||
|
||||
int blockLightIn = (light >> 4) & 0xf;
|
||||
int blockLightIn = (light >> 4) & 0xF;
|
||||
int luminosity = Math.max(blockLightIn, fluidAttributes.getLuminosity(fluidStack));
|
||||
light = (light & 0xf00000) | luminosity << 4;
|
||||
light = (light & 0xF00000) | luminosity << 4;
|
||||
|
||||
Vector3d center = new Vector3d(xMin + (xMax - xMin) / 2, yMin + (yMax - yMin) / 2, zMin + (zMax - zMin) / 2);
|
||||
MatrixStacker msr = MatrixStacker.of(ms);
|
||||
ms.push();
|
||||
if (fluidStack.getFluid()
|
||||
.getAttributes()
|
||||
|
@ -245,6 +220,7 @@ public class FluidRenderer {
|
|||
builder.vertex(peek.getModel(), x, y, z)
|
||||
.color(r, g, b, a)
|
||||
.texture(u, v)
|
||||
.overlay(OverlayTexture.DEFAULT_UV)
|
||||
.light(light)
|
||||
.normal(n.getX(), n.getY(), n.getZ())
|
||||
.endVertex();
|
||||
|
|
|
@ -158,12 +158,12 @@ public class GuiGameElement {
|
|||
|
||||
private static class GuiBlockModelRenderBuilder extends GuiRenderBuilder {
|
||||
|
||||
protected IBakedModel blockmodel;
|
||||
protected IBakedModel blockModel;
|
||||
protected BlockState blockState;
|
||||
|
||||
public GuiBlockModelRenderBuilder(IBakedModel blockmodel, @Nullable BlockState blockState) {
|
||||
this.blockState = blockState == null ? Blocks.AIR.getDefaultState() : blockState;
|
||||
this.blockmodel = blockmodel;
|
||||
this.blockModel = blockmodel;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -194,7 +194,7 @@ public class GuiGameElement {
|
|||
.getColor(blockState, null, null, 0);
|
||||
Vector3d rgb = ColorHelper.getRGB(color == -1 ? this.color : color);
|
||||
blockRenderer.getBlockModelRenderer()
|
||||
.renderModel(ms.peek(), vb, blockState, blockmodel, (float) rgb.x, (float) rgb.y, (float) rgb.z,
|
||||
.renderModel(ms.peek(), vb, blockState, blockModel, (float) rgb.x, (float) rgb.y, (float) rgb.z,
|
||||
0xF000F0, OverlayTexture.DEFAULT_UV, VirtualEmptyModelData.INSTANCE);
|
||||
buffer.draw();
|
||||
}
|
||||
|
@ -227,13 +227,9 @@ public class GuiGameElement {
|
|||
.isEmpty())
|
||||
return;
|
||||
|
||||
ms.push();
|
||||
RenderHelper.disableStandardItemLighting();
|
||||
FluidRenderer.renderTiledFluidBB(new FluidStack(blockState.getFluidState()
|
||||
.getFluid(), 1000), 0, 0, 0, 1.0001f, 1.0001f, 1.0001f, buffer, ms, 0xF000F0, true);
|
||||
buffer.draw(RenderType.getTranslucent());
|
||||
RenderHelper.enable();
|
||||
ms.pop();
|
||||
.getFluid(), 1000), 0, 0, 0, 1.0001f, 1.0001f, 1.0001f, buffer, ms, 0xF000F0, false);
|
||||
buffer.draw();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -70,7 +70,7 @@ public class PartialItemModelRenderer {
|
|||
|
||||
if (!model.isBuiltInRenderer())
|
||||
renderBakedItemModel(model, light, ms,
|
||||
ItemRenderer.getArmorVertexConsumer(buffer, type, true, stack.hasEffect()));
|
||||
ItemRenderer.getDirectGlintVertexConsumer(buffer, type, true, stack.hasEffect()));
|
||||
else
|
||||
stack.getItem()
|
||||
.getItemStackTileEntityRenderer()
|
||||
|
|
|
@ -16,6 +16,7 @@ import net.minecraft.client.renderer.texture.OverlayTexture;
|
|||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||
import net.minecraft.util.Direction;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.util.math.vector.Matrix3f;
|
||||
import net.minecraft.util.math.vector.Matrix4f;
|
||||
import net.minecraft.util.math.vector.Quaternion;
|
||||
|
@ -32,13 +33,18 @@ public class SuperByteBuffer {
|
|||
// Vertex Position
|
||||
private MatrixStack transforms;
|
||||
|
||||
// Vertex Texture Coords
|
||||
private SpriteShiftFunc spriteShiftFunc;
|
||||
private boolean isEntityModel;
|
||||
|
||||
// Vertex Coloring
|
||||
private boolean shouldColor;
|
||||
private int r, g, b, a;
|
||||
private boolean disableDiffuseDiv;
|
||||
private boolean disableDiffuseMult;
|
||||
|
||||
// Vertex Texture Coords
|
||||
private SpriteShiftFunc spriteShiftFunc;
|
||||
|
||||
// Vertex Overlay Color
|
||||
private boolean hasOverlay;
|
||||
private int overlay = OverlayTexture.DEFAULT_UV;;
|
||||
|
||||
// Vertex Lighting
|
||||
private boolean useWorldLight;
|
||||
|
@ -46,6 +52,15 @@ public class SuperByteBuffer {
|
|||
private int packedLightCoords;
|
||||
private Matrix4f lightTransform;
|
||||
|
||||
// Vertex Normals
|
||||
private boolean fullNormalTransform;
|
||||
|
||||
// Temporary
|
||||
private static final Long2IntMap WORLD_LIGHT_CACHE = new Long2IntOpenHashMap();
|
||||
private final Vector4f pos = new Vector4f();
|
||||
private final Vector3f normal = new Vector3f();
|
||||
private final Vector4f lightPos = new Vector4f();
|
||||
|
||||
public SuperByteBuffer(BufferBuilder buf) {
|
||||
template = new BufferBuilderReader(buf);
|
||||
transforms = new MatrixStack();
|
||||
|
@ -61,27 +76,26 @@ public class SuperByteBuffer {
|
|||
return (v - sprite.getMinV()) / f * 16.0F;
|
||||
}
|
||||
|
||||
private static final Long2IntMap WORLD_LIGHT_CACHE = new Long2IntOpenHashMap();
|
||||
Vector4f pos = new Vector4f();
|
||||
Vector3f normal = new Vector3f();
|
||||
Vector4f lightPos = new Vector4f();
|
||||
|
||||
public void renderInto(MatrixStack input, IVertexBuilder builder) {
|
||||
if (isEmpty())
|
||||
return;
|
||||
|
||||
Matrix3f normalMat = transforms.peek()
|
||||
.getNormal()
|
||||
.copy();
|
||||
|
||||
Matrix4f modelMat = input.peek()
|
||||
.getModel()
|
||||
.copy();
|
||||
|
||||
Matrix4f localTransforms = transforms.peek()
|
||||
.getModel();
|
||||
modelMat.multiply(localTransforms);
|
||||
|
||||
Matrix3f normalMat;
|
||||
if (fullNormalTransform) {
|
||||
normalMat = input.peek().getNormal().copy();
|
||||
Matrix3f localNormalTransforms = transforms.peek().getNormal();
|
||||
normalMat.multiply(localNormalTransforms);
|
||||
} else {
|
||||
normalMat = transforms.peek().getNormal().copy();
|
||||
}
|
||||
|
||||
if (useWorldLight) {
|
||||
WORLD_LIGHT_CACHE.clear();
|
||||
}
|
||||
|
@ -101,43 +115,58 @@ public class SuperByteBuffer {
|
|||
float normalY = template.getNY(i) / 127f;
|
||||
float normalZ = template.getNZ(i) / 127f;
|
||||
|
||||
float staticDiffuse = LightUtil.diffuseLight(normalX, normalY, normalZ);
|
||||
normal.set(normalX, normalY, normalZ);
|
||||
normal.transform(normalMat);
|
||||
float nx = normal.getX();
|
||||
float ny = normal.getY();
|
||||
float nz = normal.getZ();
|
||||
|
||||
float staticDiffuse = LightUtil.diffuseLight(normalX, normalY, normalZ);
|
||||
float instanceDiffuse = LightUtil.diffuseLight(nx, ny, nz);
|
||||
|
||||
pos.set(x, y, z, 1F);
|
||||
pos.transform(modelMat);
|
||||
builder.vertex(pos.getX(), pos.getY(), pos.getZ());
|
||||
|
||||
if (isEntityModel) {
|
||||
builder.color(255, 255, 255, 255);
|
||||
} else if (shouldColor) {
|
||||
int colorR = Math.min(255, (int) (((float) this.r) * instanceDiffuse));
|
||||
int colorG = Math.min(255, (int) (((float) this.g) * instanceDiffuse));
|
||||
int colorB = Math.min(255, (int) (((float) this.b) * instanceDiffuse));
|
||||
builder.color(colorR, colorG, colorB, this.a);
|
||||
if (shouldColor) {
|
||||
if (disableDiffuseMult) {
|
||||
builder.color(this.r, this.g, this.b, this.a);
|
||||
} else {
|
||||
int colorR = transformColor(this.r, instanceDiffuse);
|
||||
int colorG = transformColor(this.g, instanceDiffuse);
|
||||
int colorB = transformColor(this.b, instanceDiffuse);
|
||||
builder.color(colorR, colorG, colorB, this.a);
|
||||
}
|
||||
} else {
|
||||
float diffuseMult = instanceDiffuse / staticDiffuse;
|
||||
int colorR = Math.min(255, (int) (((float) Byte.toUnsignedInt(r)) * diffuseMult));
|
||||
int colorG = Math.min(255, (int) (((float) Byte.toUnsignedInt(g)) * diffuseMult));
|
||||
int colorB = Math.min(255, (int) (((float) Byte.toUnsignedInt(b)) * diffuseMult));
|
||||
builder.color(colorR, colorG, colorB, a);
|
||||
if (disableDiffuseDiv && disableDiffuseMult) {
|
||||
builder.color(r, g, b, a);
|
||||
} else {
|
||||
float diffuseMult;
|
||||
if (disableDiffuseDiv) {
|
||||
diffuseMult = instanceDiffuse;
|
||||
} else if (disableDiffuseMult) {
|
||||
diffuseMult = 1 / staticDiffuse;
|
||||
} else {
|
||||
diffuseMult = instanceDiffuse / staticDiffuse;
|
||||
}
|
||||
int colorR = transformColor(r, diffuseMult);
|
||||
int colorG = transformColor(g, diffuseMult);
|
||||
int colorB = transformColor(b, diffuseMult);
|
||||
builder.color(colorR, colorG, colorB, a);
|
||||
}
|
||||
}
|
||||
|
||||
float u = template.getU(i);
|
||||
float v = template.getV(i);
|
||||
|
||||
if (spriteShiftFunc != null) {
|
||||
spriteShiftFunc.shift(builder, u, v);
|
||||
} else
|
||||
} else {
|
||||
builder.texture(u, v);
|
||||
}
|
||||
|
||||
if (isEntityModel)
|
||||
builder.overlay(OverlayTexture.DEFAULT_UV);
|
||||
if (hasOverlay) {
|
||||
builder.overlay(overlay);
|
||||
}
|
||||
|
||||
int light;
|
||||
if (useWorldLight) {
|
||||
|
@ -163,10 +192,8 @@ public class SuperByteBuffer {
|
|||
builder.light(light);
|
||||
}
|
||||
|
||||
if (isEntityModel)
|
||||
builder.normal(input.peek().getNormal(), nx, ny, nz);
|
||||
else
|
||||
builder.normal(nx, ny, nz);
|
||||
builder.normal(nx, ny, nz);
|
||||
|
||||
builder.endVertex();
|
||||
}
|
||||
|
||||
|
@ -175,17 +202,21 @@ public class SuperByteBuffer {
|
|||
|
||||
public SuperByteBuffer reset() {
|
||||
transforms = new MatrixStack();
|
||||
spriteShiftFunc = null;
|
||||
shouldColor = false;
|
||||
isEntityModel = false;
|
||||
r = 0;
|
||||
g = 0;
|
||||
b = 0;
|
||||
a = 0;
|
||||
disableDiffuseDiv = false;
|
||||
disableDiffuseMult = false;
|
||||
spriteShiftFunc = null;
|
||||
hasOverlay = false;
|
||||
overlay = OverlayTexture.DEFAULT_UV;
|
||||
useWorldLight = false;
|
||||
hybridLight = false;
|
||||
packedLightCoords = 0;
|
||||
lightTransform = null;
|
||||
fullNormalTransform = false;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
@ -241,6 +272,15 @@ public class SuperByteBuffer {
|
|||
.translate(-.5f, -.5f, -.5f);
|
||||
}
|
||||
|
||||
public SuperByteBuffer color(int r, int g, int b, int a) {
|
||||
shouldColor = true;
|
||||
this.r = r;
|
||||
this.g = g;
|
||||
this.b = b;
|
||||
this.a = a;
|
||||
return this;
|
||||
}
|
||||
|
||||
public SuperByteBuffer color(int color) {
|
||||
shouldColor = true;
|
||||
r = ((color >> 16) & 0xFF);
|
||||
|
@ -250,6 +290,25 @@ public class SuperByteBuffer {
|
|||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevents vertex colors from being divided by the diffuse value calculated from the raw untransformed normal vector.
|
||||
* Useful when passed vertex colors do not have diffuse baked in.
|
||||
* Disabled when custom color is used.
|
||||
*/
|
||||
public SuperByteBuffer disableDiffuseDiv() {
|
||||
disableDiffuseDiv = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevents vertex colors from being multiplied by the diffuse value calculated from the final transformed normal vector.
|
||||
* Useful for entity rendering, when diffuse is applied automatically later.
|
||||
*/
|
||||
public SuperByteBuffer disableDiffuseMult() {
|
||||
disableDiffuseMult = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public SuperByteBuffer shiftUV(SpriteShiftEntry entry) {
|
||||
this.spriteShiftFunc = (builder, u, v) -> {
|
||||
float targetU = entry.getTarget()
|
||||
|
@ -286,6 +345,17 @@ public class SuperByteBuffer {
|
|||
return this;
|
||||
}
|
||||
|
||||
public SuperByteBuffer overlay() {
|
||||
hasOverlay = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public SuperByteBuffer overlay(int overlay) {
|
||||
hasOverlay = true;
|
||||
this.overlay = overlay;
|
||||
return this;
|
||||
}
|
||||
|
||||
public SuperByteBuffer light() {
|
||||
useWorldLight = true;
|
||||
return this;
|
||||
|
@ -309,16 +379,38 @@ public class SuperByteBuffer {
|
|||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Uses max light from calculated light (world light or custom light) and vertex light for the final light value.
|
||||
* Ineffective if any other light method was not called.
|
||||
*/
|
||||
public SuperByteBuffer hybridLight() {
|
||||
hybridLight = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public SuperByteBuffer asEntityModel() {
|
||||
isEntityModel = true;
|
||||
/**
|
||||
* Transforms normals not only by the local matrix stack, but also by the passed matrix stack.
|
||||
*/
|
||||
public SuperByteBuffer fullNormalTransform() {
|
||||
fullNormalTransform = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
public SuperByteBuffer forEntityRender() {
|
||||
disableDiffuseMult();
|
||||
overlay();
|
||||
fullNormalTransform();
|
||||
return this;
|
||||
}
|
||||
|
||||
public static int transformColor(byte component, float scale) {
|
||||
return MathHelper.clamp((int) (Byte.toUnsignedInt(component) * scale), 0, 255);
|
||||
}
|
||||
|
||||
public static int transformColor(int component, float scale) {
|
||||
return MathHelper.clamp((int) (component * scale), 0, 255);
|
||||
}
|
||||
|
||||
public static int maxLight(int packedLight1, int packedLight2) {
|
||||
int blockLight1 = LightTexture.getBlockLightCoordinates(packedLight1);
|
||||
int skyLight1 = LightTexture.getSkyLightCoordinates(packedLight1);
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
package com.simibubi.create.foundation.renderState;
|
||||
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
import com.simibubi.create.AllSpecialTextures;
|
||||
import com.simibubi.create.Create;
|
||||
|
||||
import net.minecraft.client.renderer.RenderState;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
|
@ -11,8 +13,6 @@ import net.minecraft.util.ResourceLocation;
|
|||
|
||||
public class RenderTypes extends RenderState {
|
||||
|
||||
protected static final RenderState.CullState DISABLE_CULLING = new NoCullState();
|
||||
|
||||
public static RenderType getOutlineTranslucent(ResourceLocation texture, boolean cull) {
|
||||
RenderType.State rendertype$state = RenderType.State.builder()
|
||||
.texture(new RenderState.TextureState(texture, false, false))
|
||||
|
@ -23,15 +23,14 @@ public class RenderTypes extends RenderState {
|
|||
.lightmap(ENABLE_LIGHTMAP)
|
||||
.overlay(ENABLE_OVERLAY_COLOR)
|
||||
.build(true);
|
||||
return RenderType.of("outline_translucent" + (cull ? "_cull" : ""),
|
||||
DefaultVertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, 7, 256, true, true, rendertype$state);
|
||||
return RenderType.of(createLayerName("outline_translucent" + (cull ? "_cull" : "")),
|
||||
DefaultVertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, GL11.GL_QUADS, 256, true, true, rendertype$state);
|
||||
}
|
||||
|
||||
private static final RenderType OUTLINE_SOLID =
|
||||
RenderType.of("outline_solid", DefaultVertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, 7, 256, true,
|
||||
RenderType.of(createLayerName("outline_solid"), DefaultVertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, GL11.GL_QUADS, 256, true,
|
||||
false, RenderType.State.builder()
|
||||
.texture(new RenderState.TextureState(AllSpecialTextures.BLANK.getLocation(), false, false))
|
||||
.transparency(NO_TRANSPARENCY)
|
||||
.diffuseLighting(ENABLE_DIFFUSE_LIGHTING)
|
||||
.lightmap(ENABLE_LIGHTMAP)
|
||||
.overlay(ENABLE_OVERLAY_COLOR)
|
||||
|
@ -40,12 +39,10 @@ public class RenderTypes extends RenderState {
|
|||
public static RenderType getGlowingSolid(ResourceLocation texture) {
|
||||
RenderType.State rendertype$state = RenderType.State.builder()
|
||||
.texture(new RenderState.TextureState(texture, false, false))
|
||||
.transparency(NO_TRANSPARENCY)
|
||||
.diffuseLighting(DISABLE_DIFFUSE_LIGHTING)
|
||||
.lightmap(ENABLE_LIGHTMAP)
|
||||
.overlay(ENABLE_OVERLAY_COLOR)
|
||||
.build(true);
|
||||
return RenderType.of("glowing_solid", DefaultVertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, 7, 256,
|
||||
return RenderType.of(createLayerName("glowing_solid"), DefaultVertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, GL11.GL_QUADS, 256,
|
||||
true, false, rendertype$state);
|
||||
}
|
||||
|
||||
|
@ -53,41 +50,52 @@ public class RenderTypes extends RenderState {
|
|||
RenderType.State rendertype$state = RenderType.State.builder()
|
||||
.texture(new RenderState.TextureState(texture, false, false))
|
||||
.transparency(TRANSLUCENT_TRANSPARENCY)
|
||||
.diffuseLighting(DISABLE_DIFFUSE_LIGHTING)
|
||||
.alpha(ONE_TENTH_ALPHA)
|
||||
.cull(DISABLE_CULLING)
|
||||
.lightmap(ENABLE_LIGHTMAP)
|
||||
.overlay(ENABLE_OVERLAY_COLOR)
|
||||
.build(true);
|
||||
return RenderType.of("glowing_translucent", DefaultVertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, 7,
|
||||
return RenderType.of(createLayerName("glowing_translucent"), DefaultVertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, GL11.GL_QUADS,
|
||||
256, true, true, rendertype$state);
|
||||
}
|
||||
|
||||
private static final RenderType GLOWING_SOLID = RenderTypes.getGlowingSolid(PlayerContainer.BLOCK_ATLAS_TEXTURE);
|
||||
private static final RenderType GLOWING_TRANSLUCENT =
|
||||
RenderTypes.getGlowingTranslucent(PlayerContainer.BLOCK_ATLAS_TEXTURE);
|
||||
private static final RenderType GLOWING_SOLID = getGlowingSolid(PlayerContainer.BLOCK_ATLAS_TEXTURE);
|
||||
private static final RenderType GLOWING_TRANSLUCENT = getGlowingTranslucent(PlayerContainer.BLOCK_ATLAS_TEXTURE);
|
||||
|
||||
private static final RenderType ITEM_PARTIAL_SOLID =
|
||||
RenderType.of("item_solid", DefaultVertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, 7, 256, true,
|
||||
RenderType.of(createLayerName("item_solid"), DefaultVertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, GL11.GL_QUADS, 256, true,
|
||||
false, RenderType.State.builder()
|
||||
.texture(new RenderState.TextureState(PlayerContainer.BLOCK_ATLAS_TEXTURE, false, false))
|
||||
.texture(BLOCK_ATLAS_TEXTURE)
|
||||
.transparency(NO_TRANSPARENCY)
|
||||
.diffuseLighting(ENABLE_DIFFUSE_LIGHTING)
|
||||
.lightmap(ENABLE_LIGHTMAP)
|
||||
.overlay(ENABLE_OVERLAY_COLOR)
|
||||
.build(true));
|
||||
|
||||
private static final RenderType ITEM_PARTIAL_TRANSLUCENT = RenderType.of("entity_translucent",
|
||||
DefaultVertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, 7, 256, true, true, RenderType.State.builder()
|
||||
.texture(new RenderState.TextureState(PlayerContainer.BLOCK_ATLAS_TEXTURE, false, false))
|
||||
private static final RenderType ITEM_PARTIAL_TRANSLUCENT = RenderType.of(createLayerName("item_translucent"),
|
||||
DefaultVertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, GL11.GL_QUADS, 256, true, true, RenderType.State.builder()
|
||||
.texture(BLOCK_ATLAS_TEXTURE)
|
||||
.transparency(TRANSLUCENT_TRANSPARENCY)
|
||||
.diffuseLighting(ENABLE_DIFFUSE_LIGHTING)
|
||||
.alpha(ONE_TENTH_ALPHA)
|
||||
.cull(ENABLE_CULLING)
|
||||
.lightmap(ENABLE_LIGHTMAP)
|
||||
.overlay(ENABLE_OVERLAY_COLOR)
|
||||
.build(true));
|
||||
|
||||
private static final RenderType FLUID = RenderType.of(createLayerName("fluid"),
|
||||
DefaultVertexFormats.POSITION_COLOR_TEXTURE_OVERLAY_LIGHT_NORMAL, GL11.GL_QUADS, 256, true, true, RenderType.State.builder()
|
||||
.texture(MIPMAP_BLOCK_ATLAS_TEXTURE)
|
||||
.transparency(TRANSLUCENT_TRANSPARENCY)
|
||||
.shadeModel(SMOOTH_SHADE_MODEL)
|
||||
.alpha(ONE_TENTH_ALPHA)
|
||||
.lightmap(ENABLE_LIGHTMAP)
|
||||
.overlay(ENABLE_OVERLAY_COLOR)
|
||||
.build(true));
|
||||
|
||||
private static String createLayerName(String name) {
|
||||
return Create.ID + ":" + name;
|
||||
}
|
||||
|
||||
public static RenderType getItemPartialSolid() {
|
||||
return ITEM_PARTIAL_SOLID;
|
||||
}
|
||||
|
@ -108,19 +116,13 @@ public class RenderTypes extends RenderState {
|
|||
return GLOWING_TRANSLUCENT;
|
||||
}
|
||||
|
||||
protected static class NoCullState extends RenderState.CullState {
|
||||
public NoCullState() {
|
||||
super(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startDrawing() {
|
||||
RenderSystem.disableCull();
|
||||
}
|
||||
public static RenderType getFluid() {
|
||||
return FLUID;
|
||||
}
|
||||
|
||||
// Mmm gimme those protected fields
|
||||
public RenderTypes() {
|
||||
super(null, null, null);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue