Rewrote texturing layer

Changes to be committed:
	modified:   src/main/java/org/dimdev/dimdoors/client/DimensionalPortalRenderer.java
	modified:   src/main/java/org/dimdev/dimdoors/client/EntranceRiftBlockEntityRenderer.java
	modified:   src/main/java/org/dimdev/dimdoors/client/MyRenderLayer.java
	new file:   src/main/java/org/dimdev/dimdoors/mixin/client/GlStateManagerAccessor.java
	modified:   src/main/resources/dimdoors.mixins.json
This commit is contained in:
SD 2020-08-29 14:31:37 +05:30
parent c063714f24
commit 46d5459b37
No known key found for this signature in database
GPG key ID: E36B57EE08544BC5
5 changed files with 106 additions and 410 deletions

View file

@ -2,27 +2,14 @@ package org.dimdev.dimdoors.client;
import java.nio.FloatBuffer; import java.nio.FloatBuffer;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Random;
import com.flowpowered.math.vector.Vector3d;
import com.flowpowered.math.vector.Vector3f;
import com.flowpowered.math.vector.Vector3i;
import com.flowpowered.math.vector.VectorNi; import com.flowpowered.math.vector.VectorNi;
import com.google.common.collect.Maps;
import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import org.dimdev.dimdoors.block.ModBlocks;
import org.dimdev.dimdoors.block.entity.RiftBlockEntity;
import org.dimdev.dimdoors.mixin.DirectionAccessor; import org.dimdev.dimdoors.mixin.DirectionAccessor;
import org.dimdev.dimdoors.util.RGBA; import org.dimdev.dimdoors.util.RGBA;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.DoorBlock;
import net.minecraft.block.enums.DoorHinge; import net.minecraft.block.enums.DoorHinge;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.BufferBuilder; import net.minecraft.client.render.BufferBuilder;
@ -30,14 +17,10 @@ import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.VertexFormats; import net.minecraft.client.render.VertexFormats;
import net.minecraft.client.render.block.BlockModels; import net.minecraft.client.render.block.BlockModels;
import net.minecraft.client.render.model.BakedModel;
import net.minecraft.client.render.model.BakedModelManager; import net.minecraft.client.render.model.BakedModelManager;
import net.minecraft.client.render.model.BakedQuad;
import net.minecraft.client.texture.TextureManager; import net.minecraft.client.texture.TextureManager;
import net.minecraft.client.util.GlAllocationUtils; import net.minecraft.client.util.GlAllocationUtils;
import net.minecraft.client.util.ModelIdentifier;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.screen.PlayerScreenHandler;
import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.BooleanProperty;
import net.minecraft.state.property.DirectionProperty; import net.minecraft.state.property.DirectionProperty;
import net.minecraft.state.property.EnumProperty; import net.minecraft.state.property.EnumProperty;
@ -45,7 +28,6 @@ import net.minecraft.util.Identifier;
import net.minecraft.util.Util; import net.minecraft.util.Util;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
import net.minecraft.util.math.Quaternion; import net.minecraft.util.math.Quaternion;
import net.minecraft.util.registry.Registry;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
@ -91,7 +73,7 @@ public final class DimensionalPortalRenderer {
RenderSystem.disableCull(); RenderSystem.disableCull();
for (int pass = 0; pass < 4; pass++) { for (int pass = 0; pass < 4; pass++) {
matrices.push(); RenderSystem.pushMatrix();
float translationScale = 16 - pass; float translationScale = 16 - pass;
float scale = 0.2625F; float scale = 0.2625F;
@ -114,7 +96,7 @@ public final class DimensionalPortalRenderer {
} }
double offset = Util.getMeasuringTimeNano() % 200000L / 200000.0F; double offset = Util.getMeasuringTimeNano() % 200000L / 200000.0F;
matrices.translate(offset, offset, offset); RenderSystem.translated(offset, offset, offset);
GlStateManager.texGenMode(GlStateManager.TexCoord.S, GL_OBJECT_LINEAR); GlStateManager.texGenMode(GlStateManager.TexCoord.S, GL_OBJECT_LINEAR);
GlStateManager.texGenMode(GlStateManager.TexCoord.T, GL_OBJECT_LINEAR); GlStateManager.texGenMode(GlStateManager.TexCoord.T, GL_OBJECT_LINEAR);
@ -171,16 +153,16 @@ public final class DimensionalPortalRenderer {
GlStateManager.enableTexGen(GlStateManager.TexCoord.R); GlStateManager.enableTexGen(GlStateManager.TexCoord.R);
GlStateManager.enableTexGen(GlStateManager.TexCoord.Q); GlStateManager.enableTexGen(GlStateManager.TexCoord.Q);
matrices.pop(); RenderSystem.popMatrix();
RenderSystem.matrixMode(GL_TEXTURE); RenderSystem.matrixMode(GL_TEXTURE);
matrices.push(); RenderSystem.pushMatrix();
RenderSystem.loadIdentity(); RenderSystem.loadIdentity();
matrices.translate(0.0F, offset * translationScale, 0.0F); RenderSystem.translated(0.0F, offset * translationScale, 0.0F);
matrices.scale(scale, scale, scale); RenderSystem.scalef(scale, scale, scale);
matrices.translate(0.5F, 0.5F, 0.5F); RenderSystem.translatef(0.5F, 0.5F, 0.5F);
matrices.multiply(new Quaternion((pass * pass * 4321 + pass) * 9 * 2.0F, 0.0F, 0.0F, 1.0F)); RenderSystem.rotatef((pass * pass * 4321 + pass) * 9 * 2.0F, 0.0F, 0.0F, 1.0F);
matrices.translate(0.5F, 0.5F, 0.5F); RenderSystem.translated(0.5F, 0.5F, 0.5F);
Tessellator tessellator = Tessellator.getInstance(); Tessellator tessellator = Tessellator.getInstance();
BufferBuilder worldRenderer = tessellator.getBuffer(); BufferBuilder worldRenderer = tessellator.getBuffer();
@ -230,7 +212,7 @@ public final class DimensionalPortalRenderer {
tessellator.draw(); tessellator.draw();
matrices.pop(); RenderSystem.popMatrix();
RenderSystem.matrixMode(GL_MODELVIEW); RenderSystem.matrixMode(GL_MODELVIEW);
} }
@ -243,356 +225,7 @@ public final class DimensionalPortalRenderer {
RenderSystem.enableLighting(); RenderSystem.enableLighting();
} }
//TODO Check to make sure block type is valid (and not air) static FloatBuffer getBuffer(float f1, float f2, float f3, float f4) {
@SuppressWarnings("Duplicates")
public static void renderFoxWallAxis(RiftBlockEntity blockEntity, Vector3d pos, Vector3d offset, Direction orientation, double width, double height, MatrixStack matrices, VertexConsumer consumer) {
//System.out.println(orientation);
if (orientation == null) return;
switch (orientation) {
case UP:
case DOWN:
return;
}
final float pathLength = 10;
final float doorDistanceMul = 1.5f;
final int endOpacity = 0;
// incoming depth function is GL_LEQUAL
// this means that you can redraw geometry multiple times as long as you don't translate.
/*int glDepthFunc = glGetInteger(GL_DEPTH_FUNC);
switch (glDepthFunc) {
case GL_LESS:
System.out.println("less");
break;
case GL_LEQUAL:
System.out.println("lequal");
break;
case GL_GREATER:
System.out.println("greater");
break;
case GL_GEQUAL:
System.out.println("gequal");
break;
}*/
//System.out.println("RENDER");
//System.out.println(height);
RenderSystem.disableLighting();
RenderSystem.activeTexture(33985);
RenderSystem.disableTexture();
RenderSystem.activeTexture(33984);
RenderSystem.disableTexture();
GlStateManager.genFramebuffers();
RenderSystem.disableCull();
RenderSystem.disableDepthTest();
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, 1, 0xff);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glStencilMask(0xFF);
glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);
//System.out.println(glGetInteger(GL_STENCIL_BITS));
final Vector3d merged = pos.add(offset);
final Vector3d left, right, back, depth, up;
switch (orientation) {
case NORTH:
left = merged.add(width, 0, 0);//new Vector3d(x + width, y, z);
right = merged;
back = new Vector3d(0, 0, 1);
break;
case SOUTH:
left = merged;
right = merged.add(width, 0, 0);
back = new Vector3d(0, 0, -1);
break;
case WEST:
left = merged;
right = merged.add(0, 0, width);
back = new Vector3d(1, 0, 0);
break;
case EAST:
left = merged.add(0, 0, width);
right = merged;
back = new Vector3d(-1, 0, 0);
break;
default:
return;
}
depth = back.mul(pathLength);
up = new Vector3d(0, height, 0);
Vector3d leftTop = left.add(up),
rightTop = right.add(up),
leftBack = left.add(depth),
rightBack = right.add(depth),
leftTopBack = leftTop.add(depth),
rightTopBack = rightTop.add(depth);
Vector3f voidColor;
Vector3i pathColor;
// boolean personal = blockType instanceof BlockDimensionalDoorQuartz;
final float brightness = 0.99f;
voidColor = new Vector3f(brightness, brightness, brightness);
pathColor = new Vector3i(255, 210, 0);
// if (personal) {
// } else {
// voidColor = new Vector3f(0, 0, 0);
// pathColor = new Vector3i(50, 255, 255);
// }
Tessellator tessellator = Tessellator.getInstance();
BufferBuilder builder = tessellator.getBuffer();
consumer.color(voidColor.getX(), voidColor.getY(), voidColor.getZ(), 1f);
builder.begin(GL_QUADS, VertexFormats.POSITION);
builder.vertex(left.getX(), left.getY(), left.getZ());
builder.vertex(right.getX(), right.getY(), right.getZ());
builder.vertex(rightTop.getX(), rightTop.getY(), rightTop.getZ());
builder.vertex(leftTop.getX(), leftTop.getY(), leftTop.getZ());
tessellator.draw();
glStencilMask(0);
glStencilFunc(GL_EQUAL, 1, 0xff);
RenderSystem.disableDepthTest();
RenderSystem.enableBlend();
//TODO put blendfunc back to original state
RenderSystem.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
int oldShadeModel = GlStateManager.getInteger(GL_SHADE_MODEL);
RenderSystem.shadeModel(GL_SMOOTH);
RenderSystem.disableAlphaTest();
/*builder.begin(GL_QUADS, DefaultVertexFormats.POSITION_COLOR);
builder.pos(left.getX(), left.getY(), left.getZ())
.color(pathColor.getX(), pathColor.getY(), pathColor.getZ(), 127)
.endVertex();
builder.pos(right.getX(), right.getY(), right.getZ())
.color(pathColor.getX(), pathColor.getY(), pathColor.getZ(), 127)
.endVertex();
builder.pos(rightBack.getX(), rightBack.getY(), rightBack.getZ())
.color(pathColor.getX(), pathColor.getY(), pathColor.getZ(), endOpacity)
.endVertex();
builder.pos(leftBack.getX(), leftBack.getY(), leftBack.getZ())
.color(pathColor.getX(), pathColor.getY(), pathColor.getZ(), endOpacity)
.endVertex();
tessellator.draw();*/
// Modelled path ===============================================================================================
RenderSystem.defaultBlendFunc();
RenderSystem.enableTexture();
RenderSystem.disableDepthTest();
TEXTURE_MANAGER.bindTexture(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE);
Block stonebrick = Blocks.STONE_BRICKS;
BlockState stonebrickState = stonebrick.getDefaultState();
Map<BlockState, ModelIdentifier> stonebrickMap = Maps.newHashMap();
stonebrickMap.put(Blocks.STONE_BRICKS.getDefaultState(), new ModelIdentifier(Registry.BLOCK.getId(Blocks.STONE_BRICKS).toString()));
stonebrickMap.put(Blocks.CRACKED_STONE_BRICKS.getDefaultState(), new ModelIdentifier(Registry.BLOCK.getId(Blocks.CRACKED_STONE_BRICKS).toString()));
stonebrickMap.put(Blocks.CHISELED_STONE_BRICKS.getDefaultState(), new ModelIdentifier(Registry.BLOCK.getId(Blocks.CHISELED_STONE_BRICKS).toString()));
RenderSystem.matrixMode(GL_MODELVIEW);
matrices.push();
matrices.translate(pos.getX(), pos.getY() - 1, pos.getZ());
VectorNi pathColorVec = createColorVec(pathColor.getX(), pathColor.getY(), pathColor.getZ(), 255);
int numPathTiles = 10;
float deltaOp = 255f / numPathTiles;
for (int i = 0; i < numPathTiles; i++) {
int nearOp = 255 - (int) (i * deltaOp);
int farOp = (int) (nearOp - deltaOp);
VectorNi colorVec = new VectorNi(pathColorVec);
setOpacity(colorVec, nearOp, nearOp, farOp, farOp);
pathColorVec = rotateTopFaceColor(colorVec, orientation);
drawState(tessellator, builder, stonebrickMap, stonebrickState, Direction.UP, pathColorVec);
matrices.translate(back.getX(), 0, back.getZ());
}
matrices.pop();
RenderSystem.disableTexture();
builder.begin(GL_LINES, VertexFormats.POSITION_COLOR);
builder.vertex(leftTop.getX(), leftTop.getY(), leftTop.getZ())
.color(pathColor.getX(), pathColor.getY(), pathColor.getZ(), 255);
builder.vertex(leftTopBack.getX(), leftTopBack.getY(), leftTopBack.getZ())
.color(pathColor.getX(), pathColor.getY(), pathColor.getZ(), endOpacity);
builder.vertex(rightTop.getX(), rightTop.getY(), rightTop.getZ())
.color(pathColor.getX(), pathColor.getY(), pathColor.getZ(), 255);
builder.vertex(rightTopBack.getX(), rightTopBack.getY(), rightTopBack.getZ())
.color(pathColor.getX(), pathColor.getY(), pathColor.getZ(), endOpacity);
builder.vertex(left.getX(), left.getY(), left.getZ())
.color(pathColor.getX(), pathColor.getY(), pathColor.getZ(), 255);
builder.vertex(leftBack.getX(), leftBack.getY(), leftBack.getZ())
.color(pathColor.getX(), pathColor.getY(), pathColor.getZ(), endOpacity);
builder.vertex(right.getX(), right.getY(), right.getZ())
.color(pathColor.getX(), pathColor.getY(), pathColor.getZ(), 255);
builder.vertex(rightBack.getX(), rightBack.getY(), rightBack.getZ())
.color(pathColor.getX(), pathColor.getY(), pathColor.getZ(), endOpacity);
tessellator.draw();
RenderSystem.enableAlphaTest();
RenderSystem.disableBlend();
RenderSystem.blendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
{
RenderSystem.disableDepthTest();
//glDisable(GL_STENCIL_TEST);
RenderSystem.matrixMode(GL_MODELVIEW);
matrices.push();
matrices.translate(pos.getX(), pos.getY(), pos.getZ());
TEXTURE_MANAGER.bindTexture(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE);
Map<BlockState, ModelIdentifier> doorMap = Maps.newHashMap();
doorMap.put(ModBlocks.GOLD_DIMENSIONAL_DOOR.getDefaultState(), new ModelIdentifier(Registry.BLOCK.getId(ModBlocks.GOLD_DIMENSIONAL_DOOR).toString()));
doorMap.put(ModBlocks.QUARTZ_DIMENSIONAL_DOOR.getDefaultState(), new ModelIdentifier(Registry.BLOCK.getId(ModBlocks.QUARTZ_DIMENSIONAL_DOOR).toString()));
doorMap.put(ModBlocks.OAK_DIMENSIONAL_DOOR.getDefaultState(), new ModelIdentifier(Registry.BLOCK.getId(ModBlocks.OAK_DIMENSIONAL_DOOR).toString()));
doorMap.put(ModBlocks.GOLD_DIMENSIONAL_DOOR.getDefaultState(), new ModelIdentifier(Registry.BLOCK.getId(ModBlocks.GOLD_DIMENSIONAL_DOOR).toString()));
BlockState doorBottomState = blockEntity.getWorld().getBlockState(blockEntity.getPos());
BlockState doorTopState = blockEntity.getWorld().getBlockState(blockEntity.getPos().up());
if (doorBottomState.getBlock() instanceof DoorBlock && doorTopState.getBlock() instanceof DoorBlock) {
doorBottomState = doorBottomState.with(HINGE_PROPERTY, doorTopState.get(HINGE_PROPERTY));
// System.out.println();
// System.out.println("---------------------------------------------");
// System.out.println(doorBottomState.getProperties());
// System.out.println("---------------------------------------------");
doorTopState = doorTopState.with(OPEN_PROPERTY, doorBottomState.get(OPEN_PROPERTY))
.with(FACING_PROPERTY, doorBottomState.get(FACING_PROPERTY));
//System.out.println(doorTopState);
//System.out.println(doorBottomState);
//System.out.println(doorBottomState.getProperties());
//System.out.println();
//System.out.println(doorBottomState.getValue(PropertyEnum.create("hinge", BlockDoor.EnumHingePosition.class)));
RenderSystem.activeTexture(33984);
RenderSystem.enableTexture();
if (doorBottomState.get(OPEN_PROPERTY)) {
RenderSystem.activeTexture(33985);
drawState(tessellator, builder, doorMap, doorBottomState, null);
matrices.translate(0, 1, 0);
drawState(tessellator, builder, doorMap, doorTopState, null);
matrices.translate(0, -1, 0);
RenderSystem.disableTexture();
RenderSystem.activeTexture(33984);
RenderSystem.disableLighting();
}
Vector3d doorDepth = depth.mul(doorDistanceMul);
matrices.translate(doorDepth.getX(), doorDepth.getY(), doorDepth.getZ());
drawState(tessellator, builder, doorMap, doorBottomState.with(OPEN_PROPERTY, false), orientation);
matrices.translate(0, 1, 0);
drawState(tessellator, builder, doorMap, doorTopState.with(OPEN_PROPERTY, false), orientation);
}
matrices.pop();
}
//RenderSystem.rotate(Quaternion);
glStencilMask(0xff);
glDisable(GL_STENCIL_TEST);
RenderSystem.shadeModel(oldShadeModel);
RenderSystem.disableBlend();
//RenderSystem.activeTexture(OpenGlHelper.defaultTexUnit);
RenderSystem.enableTexture();
//RenderSystem.activeTexture(OpenGlHelper.lightmapTexUnit);
RenderSystem.enableTexture();
RenderSystem.enableCull();
RenderSystem.enableLighting();
RenderSystem.enableDepthTest();
}
private static void drawState(Tessellator tessellator, BufferBuilder worldRenderer, Map<BlockState, ModelIdentifier> map,
BlockState blockState, Direction side) {
drawState(tessellator, worldRenderer, map, blockState, side, COLORLESS);
}
private static void drawState(Tessellator tessellator, BufferBuilder bufferBuilder, Map<BlockState, ModelIdentifier> map,
BlockState blockState, Direction side, VectorNi colors) {
if (colors.size() < 16) colors = COLORLESS;
ModelIdentifier location = map.get(blockState);
BakedModel model = MODEL_MANAGER.getModel(location);
List<BakedQuad> quads = model.getQuads(null, side, new Random(1));
if (!quads.isEmpty()) {
bufferBuilder.begin(GL_QUADS, VertexFormats.POSITION);
//System.out.println(quads.size());
for (BakedQuad ignored : quads) {
//worldRenderer.(quad.getVertexData());
/*for (int i = 1; i <5 ; i++) {
worldRenderer.putColorMultiplier(1, 0, 0, i);
}*/
/*worldRenderer.putColorRGB_F(1, 0, 0, 4);
worldRenderer.putColorRGB_F(1, 1, 0, 3);
worldRenderer.putColorRGB_F(0, 1, 0, 2);
worldRenderer.putColorRGB_F(0, 0.3f, 1, 1);*/
for (int i = 0, j = 4; i < 16; i += 4, j--) {
bufferBuilder.color(colors.get(i), colors.get(i + 1), colors.get(i + 2), colors.get(i + 3));
}
}
tessellator.draw();
}
}
private static VectorNi rotateTopFaceColor(VectorNi vec, Direction facing) {
VectorNi ret = new VectorNi(vec);
if (facing == null) return ret;
int shiftAmount;
switch (facing) {
case NORTH:
shiftAmount = 4;
break;
case EAST:
shiftAmount = 8;
break;
case SOUTH:
shiftAmount = 12;
break;
case WEST:
shiftAmount = 0;
break;
default:
return ret;
}
for (int i = 0; i < 16; i++) {
ret.set(i, vec.get((i + shiftAmount) & 15));
}
return ret;
}
private static void setOpacity(VectorNi vec, int op1, int op2, int op3, int op4) {
if (vec.size() < 16) return;
vec.set(3, op1);
vec.set(7, op2);
vec.set(11, op3);
vec.set(15, op4);
}
private static VectorNi createColorVec(int red, int green, int blue, int alpha) {
return new VectorNi(red, green, blue, alpha, red, green, blue, alpha, red, green, blue, alpha, red, green, blue, alpha);
}
private static FloatBuffer getBuffer(float f1, float f2, float f3, float f4) {
BUFFER.clear(); BUFFER.clear();
BUFFER.put(f1).put(f2).put(f3).put(f4); BUFFER.put(f1).put(f2).put(f3).put(f4);
BUFFER.flip(); BUFFER.flip();

View file

@ -5,7 +5,6 @@ import java.util.Random;
import java.util.stream.IntStream; import java.util.stream.IntStream;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.mojang.blaze3d.systems.RenderSystem;
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity; import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
@ -14,11 +13,8 @@ import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher; import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher;
import net.minecraft.client.render.block.entity.BlockEntityRenderer; import net.minecraft.client.render.block.entity.BlockEntityRenderer;
import net.minecraft.client.render.model.json.ModelTransformation;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.client.util.math.Vector3f; import net.minecraft.client.util.math.Vector3f;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.math.Direction; import net.minecraft.util.math.Direction;
import net.minecraft.util.math.Matrix4f; import net.minecraft.util.math.Matrix4f;
@ -31,53 +27,54 @@ public class EntranceRiftBlockEntityRenderer extends BlockEntityRenderer<Entranc
private static final Identifier KEY_PATH = new Identifier("dimdoors:textures/other/keyhole.png"); private static final Identifier KEY_PATH = new Identifier("dimdoors:textures/other/keyhole.png");
private static final Identifier KEYHOLE_LIGHT = new Identifier("dimdoors:textures/other/keyhole_light.png"); private static final Identifier KEYHOLE_LIGHT = new Identifier("dimdoors:textures/other/keyhole_light.png");
private static final Random RANDOM = new Random(31100L); private static final Random RANDOM = new Random(31100L);
private static final List<RenderLayer> LAYERS = IntStream.range(0, 16).mapToObj((i) -> { // private static final List<RenderLayer> LAYERS = IntStream.range(0, 16).mapToObj((i) -> {
return MyRenderLayer.getDimensionalPortal(i + 1); // return MyRenderLayer.getDimensionalPortal(i + 1);
}).collect(ImmutableList.toImmutableList()); // }).collect(ImmutableList.toImmutableList());
public EntranceRiftBlockEntityRenderer(BlockEntityRenderDispatcher blockEntityRenderDispatcher) { public EntranceRiftBlockEntityRenderer(BlockEntityRenderDispatcher blockEntityRenderDispatcher) {
super(blockEntityRenderDispatcher); super(blockEntityRenderDispatcher);
} }
@Override @Override
public void render(EntranceRiftBlockEntity entrance, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) { public void render(EntranceRiftBlockEntity blockEntity, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) {
List<RenderLayer> layers = IntStream.range(0, 16).mapToObj((i) -> {
return MyRenderLayer.getDimensionalPortal(i + 1, blockEntity);
}).collect(ImmutableList.toImmutableList());
matrices.push(); matrices.push();
MinecraftClient.getInstance().getItemRenderer().renderItem(new ItemStack(Items.DIRT), ModelTransformation.Mode.THIRD_PERSON_RIGHT_HAND, light, overlay, matrices, vertexConsumers); if (MinecraftClient.getInstance().world == null) {
if (MinecraftClient.getInstance().world == null
|| !MinecraftClient.getInstance().world.isChunkLoaded(entrance.getPos().getX() >> 4, entrance.getPos().getZ() >> 4)) {
return; return;
} }
Direction orientation = entrance.getOrientation(); Direction orientation = blockEntity.getOrientation();
Vector3f vec = orientation.getOpposite().getUnitVector(); Vector3f vec = orientation.getOpposite().getUnitVector();
this.renderVertices(entrance, matrices, vertexConsumers, orientation, vec); this.renderVertices(blockEntity, matrices, vertexConsumers, orientation, vec, layers);
// Vec3d offset = new Vec3d(vec); // Vec3d offset = new Vec3d(vec);
// DimensionalPortalRenderer.renderDimensionalPortal( // DimensionalPortalRenderer.renderDimensionalPortal(
// entrance.getPos().getX() + offset.x, // blockEntity.getPos().getX() + offset.x,
// entrance.getPos().getY() + offset.y, // blockEntity.getPos().getY() + offset.y,
// entrance.getPos().getZ() + offset.z, // blockEntity.getPos().getZ() + offset.z,
// //entrance.orientation.getHorizontalAngle(), // //blockEntity.orientation.getHorizontalAngle(),
// //entrance.orientation.getDirectionVec().getY() * 90, // //blockEntity.orientation.getDirectionVec().getY() * 90,
// orientation, // orientation,
// 16, // 16,
// 16, // 16,
// entrance.getColors(16), // blockEntity.getColors(16),
// matrices, // matrices,
// vertexConsumers.getBuffer(LAYERS.get(0))); // vertexConsumers.getBuffer(LAYERS.get(0)));
matrices.pop(); matrices.pop();
} }
private void renderVertices(EntranceRiftBlockEntity entrance, MatrixStack matrices, VertexConsumerProvider vertexConsumers, Direction orientation, Vector3f vec) { private void renderVertices(EntranceRiftBlockEntity entrance, MatrixStack matrices, VertexConsumerProvider vertexConsumers, Direction orientation, Vector3f vec, List<RenderLayer> layers) {
vec.scale((float) (orientation == Direction.NORTH || orientation == Direction.WEST || orientation == Direction.UP ? 0.01 : 0.01 - 1)); vec.scale((float) (orientation == Direction.NORTH || orientation == Direction.WEST || orientation == Direction.UP ? 0.01 : 0.01 - 1));
double d = entrance.getPos().getSquaredDistance(this.dispatcher.camera.getPos(), true); double d = entrance.getPos().getSquaredDistance(this.dispatcher.camera.getPos(), true);
int k = this.getOffset(d); int k = this.getOffset(d);
float g = 0.75F; float g = 0.75F;
Matrix4f matrix4f = matrices.peek().getModel(); Matrix4f matrix4f = matrices.peek().getModel();
this.drawAllVertices(entrance, g, 0.15F, matrix4f, vertexConsumers.getBuffer(LAYERS.get(0)), orientation); this.drawAllVertices(entrance, g, 0.15F, matrix4f, vertexConsumers.getBuffer(layers.get(0)), orientation);
matrices.scale(0.99F, 0.99F, 0.99F); matrices.scale(0.99F, 0.99F, 0.99F);
for(int l = 1; l < k; ++l) { for(int l = 1; l < k; ++l) {
this.drawAllVertices(entrance, g, 2.0F / (float)(18 - l), matrix4f, vertexConsumers.getBuffer(LAYERS.get(l)), orientation); this.drawAllVertices(entrance, g, 2.0F / (float)(18 - l), matrix4f, vertexConsumers.getBuffer(layers.get(l)), orientation);
} }
} }
@ -114,16 +111,16 @@ public class EntranceRiftBlockEntityRenderer extends BlockEntityRenderer<Entranc
} }
private void drawVertices(EntranceRiftBlockEntity endPortalBlockEntity, Matrix4f matrix4f, VertexConsumer vertexConsumer, float x1, float x2, float y1, float y2, float z1, float z2, float z3, float z4, float red, float green, float blue, Direction direction) { private void drawVertices(EntranceRiftBlockEntity endPortalBlockEntity, Matrix4f matrix4f, VertexConsumer vertexConsumer, float x1, float x2, float y1, float y2, float z1, float z2, float z3, float z4, float red, float green, float blue, Direction direction) {
RenderSystem.clearTexGen();
// vertexConsumer.vertex(matrix4f, x1, y1, z1).color(red, green, blue, 1.0F).next(); // vertexConsumer.vertex(matrix4f, x1, y1, z1).color(red, green, blue, 1.0F).next();
// vertexConsumer.vertex(matrix4f, x2, y1, z2).color(red, green, blue, 1.0F).next(); // vertexConsumer.vertex(matrix4f, x2, y1, z2).color(red, green, blue, 1.0F).next();
// vertexConsumer.vertex(matrix4f, x2, y2, z3).color(red, green, blue, 1.0F).next(); // vertexConsumer.vertex(matrix4f, x2, y2, z3).color(red, green, blue, 1.0F).next();
// vertexConsumer.vertex(matrix4f, x1, y2, z4).color(red, green, blue, 1.0F).next(); // vertexConsumer.vertex(matrix4f, x1, y2, z4).color(red, green, blue, 1.0F).next();
if (direction == endPortalBlockEntity.getOrientation() || direction.getOpposite() == endPortalBlockEntity.getOrientation()) { if (direction == endPortalBlockEntity.getOrientation() || direction.getOpposite() == endPortalBlockEntity.getOrientation()) {
vertexConsumer.vertex(matrix4f, x1, y1, z1 + 0.5F).color(red, green, blue, 1.0F).next(); float offset = direction == endPortalBlockEntity.getOrientation() ? 0.5F : -0.5F;
vertexConsumer.vertex(matrix4f, x2, y1, z2 + 0.5F).color(red, green, blue, 1.0F).next(); vertexConsumer.vertex(matrix4f, x1, y1, z1 + offset).color(red, green, blue, 1.0F).next();
vertexConsumer.vertex(matrix4f, x2, y2, z3 + 0.5F).color(red, green, blue, 1.0F).next(); vertexConsumer.vertex(matrix4f, x2, y1, z2 + offset).color(red, green, blue, 1.0F).next();
vertexConsumer.vertex(matrix4f, x1, y2, z4 + 0.5F).color(red, green, blue, 1.0F).next(); vertexConsumer.vertex(matrix4f, x2, y2, z3 + offset).color(red, green, blue, 1.0F).next();
vertexConsumer.vertex(matrix4f, x1, y2, z4 + offset).color(red, green, blue, 1.0F).next();
} }
} }
} }

View file

@ -1,16 +1,22 @@
package org.dimdev.dimdoors.client; package org.dimdev.dimdoors.client;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity;
import org.dimdev.dimdoors.mixin.client.GlStateManagerAccessor;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.RenderLayer; import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.RenderPhase; import net.minecraft.client.render.RenderPhase;
import net.minecraft.client.render.VertexFormat; import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.VertexFormats; import net.minecraft.client.render.VertexFormats;
import net.minecraft.util.Identifier; import net.minecraft.util.Util;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.Vec3i;
import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_DST_COLOR; import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL11.GL_ZERO;
public class MyRenderLayer extends RenderLayer { public class MyRenderLayer extends RenderLayer {
public MyRenderLayer(String string, VertexFormat vertexFormat, int i, int j, boolean bl, boolean bl2, Runnable runnable, Runnable runnable2) { public MyRenderLayer(String string, VertexFormat vertexFormat, int i, int j, boolean bl, boolean bl2, Runnable runnable, Runnable runnable2) {
@ -36,8 +42,48 @@ public class MyRenderLayer extends RenderLayer {
.texture(new Texture(DetachedRiftBlockEntityRenderer.TESSERACT_PATH, false, false)) .texture(new Texture(DetachedRiftBlockEntityRenderer.TESSERACT_PATH, false, false))
.build(false)); .build(false));
public static RenderLayer getDimensionalPortal(int phase) { public static RenderLayer getDimensionalPortal(int phase, EntranceRiftBlockEntity blockEntity) {
Texture tex = new Texture(DimensionalPortalRenderer.getWarpPath(), false, false); Texture tex = new Texture(DimensionalPortalRenderer.getWarpPath(), false, false);
return of("dimensional_portal", VertexFormats.POSITION_COLOR, 7, 256, false, true, RenderLayer.MultiPhaseParameters.builder().transparency(TRANSLUCENT_TRANSPARENCY).texture(tex).texturing(new RenderPhase.PortalTexturing(phase)).fog(FOG).build(false)); return of("dimensional_portal", VertexFormats.POSITION_COLOR, 7, 256, false, true, RenderLayer.MultiPhaseParameters.builder().transparency(TRANSLUCENT_TRANSPARENCY).texture(tex).texturing(new DimensionalPortalTexturing(phase, blockEntity)).fog(FOG).build(false));
}
public static class DimensionalPortalTexturing extends RenderPhase.Texturing {
public final int layer;
public DimensionalPortalTexturing(int layer, EntranceRiftBlockEntity blockEntity) {
super("dimensional_portal_texturing", () -> {
Direction orientation = blockEntity.getOrientation();
RenderSystem.matrixMode(5890);
RenderSystem.pushMatrix();
RenderSystem.loadIdentity();
BlockPos off = blockEntity.getPos();
Vec3i pos = MinecraftClient.getInstance().player != null ? off.subtract(MinecraftClient.getInstance().player.getBlockPos()) : new Vec3i(0, 0, 0);
RenderSystem.translatef(0.5F, 0.5F, 0.0F);
RenderSystem.scalef(0.5F + (pos.getX()/100.0F) * 1.2F, 0.5F + (pos.getZ()/100.0F) * 1.2F, 1.0F - (pos.getY()/100.0F) * 1.2F);
RenderSystem.translatef(17.0F / (float) layer, (2.0F + (float) layer / 1.5F) * ((float) (Util.getMeasuringTimeMs() % 800000L) / 800000.0F), 0.0F);
RenderSystem.rotatef(((float) (layer * layer) * 4321.0F + (float) layer * 9.0F) * 2.0F, 0.0F, 0.0F, 1.0F);
RenderSystem.scalef(4.5F - (float) layer / 4.0F, 4.5F - (float) layer / 4.0F, 1.0F);
RenderSystem.mulTextureByProjModelView();
RenderSystem.matrixMode(5888);
GlStateManager.texGenMode(GlStateManager.TexCoord.S, GL_OBJECT_LINEAR);
GlStateManager.texGenMode(GlStateManager.TexCoord.T, GL_OBJECT_LINEAR);
GlStateManager.texGenMode(GlStateManager.TexCoord.R, GL_OBJECT_LINEAR);
GlStateManager.texGenParam(GlStateManager.TexCoord.S, GL_OBJECT_PLANE, GlStateManagerAccessor.invokeGetBuffer(0.0F, 1.0F, 0.0F, 0.0F));
GlStateManager.texGenParam(GlStateManager.TexCoord.T, GL_OBJECT_PLANE, GlStateManagerAccessor.invokeGetBuffer(1.0F, 0.0F, 0.0F, 0.0F));
GlStateManager.texGenParam(GlStateManager.TexCoord.R, GL_OBJECT_PLANE, GlStateManagerAccessor.invokeGetBuffer(0.0F, 0.0F, 0.0F, 1.0F));
GlStateManager.enableTexGen(GlStateManager.TexCoord.S);
GlStateManager.enableTexGen(GlStateManager.TexCoord.T);
GlStateManager.enableTexGen(GlStateManager.TexCoord.R);
}, () -> {
RenderSystem.matrixMode(5890);
RenderSystem.popMatrix();
RenderSystem.matrixMode(5888);
RenderSystem.clearTexGen();
});
this.layer = layer;
}
} }
} }

View file

@ -0,0 +1,19 @@
package org.dimdev.dimdoors.mixin.client;
import java.nio.FloatBuffer;
import com.mojang.blaze3d.platform.GlStateManager;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
@Environment(EnvType.CLIENT)
@Mixin(GlStateManager.class)
public interface GlStateManagerAccessor {
@Invoker
static FloatBuffer invokeGetBuffer(float a, float b, float c, float d) {
throw new AssertionError(String.valueOf(a + b + c + d));
}
}

View file

@ -10,6 +10,7 @@
"PlayerEntityMixin" "PlayerEntityMixin"
], ],
"client": [ "client": [
"client.GlStateManagerAccessor",
"client.InGameHudMixin" "client.InGameHudMixin"
], ],
"injectors": { "injectors": {