From 46d5459b3754d3660980034d3efbc713cead86e9 Mon Sep 17 00:00:00 2001 From: SD Date: Sat, 29 Aug 2020 14:31:37 +0530 Subject: [PATCH] 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 --- .../client/DimensionalPortalRenderer.java | 389 +----------------- .../EntranceRiftBlockEntityRenderer.java | 51 ++- .../dimdev/dimdoors/client/MyRenderLayer.java | 56 ++- .../mixin/client/GlStateManagerAccessor.java | 19 + src/main/resources/dimdoors.mixins.json | 1 + 5 files changed, 106 insertions(+), 410 deletions(-) create mode 100644 src/main/java/org/dimdev/dimdoors/mixin/client/GlStateManagerAccessor.java diff --git a/src/main/java/org/dimdev/dimdoors/client/DimensionalPortalRenderer.java b/src/main/java/org/dimdev/dimdoors/client/DimensionalPortalRenderer.java index 58d08f16..54d2cd2d 100644 --- a/src/main/java/org/dimdev/dimdoors/client/DimensionalPortalRenderer.java +++ b/src/main/java/org/dimdev/dimdoors/client/DimensionalPortalRenderer.java @@ -2,27 +2,14 @@ package org.dimdev.dimdoors.client; import java.nio.FloatBuffer; 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.google.common.collect.Maps; import com.mojang.blaze3d.platform.GlStateManager; 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.util.RGBA; 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.client.MinecraftClient; 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.VertexFormats; 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.BakedQuad; import net.minecraft.client.texture.TextureManager; import net.minecraft.client.util.GlAllocationUtils; -import net.minecraft.client.util.ModelIdentifier; import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.screen.PlayerScreenHandler; import net.minecraft.state.property.BooleanProperty; import net.minecraft.state.property.DirectionProperty; import net.minecraft.state.property.EnumProperty; @@ -45,7 +28,6 @@ import net.minecraft.util.Identifier; import net.minecraft.util.Util; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Quaternion; -import net.minecraft.util.registry.Registry; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -91,7 +73,7 @@ public final class DimensionalPortalRenderer { RenderSystem.disableCull(); for (int pass = 0; pass < 4; pass++) { - matrices.push(); + RenderSystem.pushMatrix(); float translationScale = 16 - pass; float scale = 0.2625F; @@ -114,7 +96,7 @@ public final class DimensionalPortalRenderer { } 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.T, GL_OBJECT_LINEAR); @@ -171,16 +153,16 @@ public final class DimensionalPortalRenderer { GlStateManager.enableTexGen(GlStateManager.TexCoord.R); GlStateManager.enableTexGen(GlStateManager.TexCoord.Q); - matrices.pop(); + RenderSystem.popMatrix(); RenderSystem.matrixMode(GL_TEXTURE); - matrices.push(); + RenderSystem.pushMatrix(); RenderSystem.loadIdentity(); - matrices.translate(0.0F, offset * translationScale, 0.0F); - matrices.scale(scale, scale, scale); - matrices.translate(0.5F, 0.5F, 0.5F); - matrices.multiply(new Quaternion((pass * pass * 4321 + pass) * 9 * 2.0F, 0.0F, 0.0F, 1.0F)); - matrices.translate(0.5F, 0.5F, 0.5F); + RenderSystem.translated(0.0F, offset * translationScale, 0.0F); + RenderSystem.scalef(scale, scale, scale); + RenderSystem.translatef(0.5F, 0.5F, 0.5F); + RenderSystem.rotatef((pass * pass * 4321 + pass) * 9 * 2.0F, 0.0F, 0.0F, 1.0F); + RenderSystem.translated(0.5F, 0.5F, 0.5F); Tessellator tessellator = Tessellator.getInstance(); BufferBuilder worldRenderer = tessellator.getBuffer(); @@ -230,7 +212,7 @@ public final class DimensionalPortalRenderer { tessellator.draw(); - matrices.pop(); + RenderSystem.popMatrix(); RenderSystem.matrixMode(GL_MODELVIEW); } @@ -243,356 +225,7 @@ public final class DimensionalPortalRenderer { RenderSystem.enableLighting(); } - //TODO Check to make sure block type is valid (and not air) - @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 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 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 map, - BlockState blockState, Direction side) { - drawState(tessellator, worldRenderer, map, blockState, side, COLORLESS); - } - - private static void drawState(Tessellator tessellator, BufferBuilder bufferBuilder, Map 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 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) { + static FloatBuffer getBuffer(float f1, float f2, float f3, float f4) { BUFFER.clear(); BUFFER.put(f1).put(f2).put(f3).put(f4); BUFFER.flip(); diff --git a/src/main/java/org/dimdev/dimdoors/client/EntranceRiftBlockEntityRenderer.java b/src/main/java/org/dimdev/dimdoors/client/EntranceRiftBlockEntityRenderer.java index 55cf5e4a..51af54fc 100644 --- a/src/main/java/org/dimdev/dimdoors/client/EntranceRiftBlockEntityRenderer.java +++ b/src/main/java/org/dimdev/dimdoors/client/EntranceRiftBlockEntityRenderer.java @@ -5,7 +5,6 @@ import java.util.Random; import java.util.stream.IntStream; import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.systems.RenderSystem; import org.dimdev.dimdoors.block.entity.EntranceRiftBlockEntity; 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.block.entity.BlockEntityRenderDispatcher; 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.Vector3f; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; import net.minecraft.util.Identifier; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Matrix4f; @@ -31,53 +27,54 @@ public class EntranceRiftBlockEntityRenderer extends BlockEntityRenderer LAYERS = IntStream.range(0, 16).mapToObj((i) -> { - return MyRenderLayer.getDimensionalPortal(i + 1); - }).collect(ImmutableList.toImmutableList()); +// private static final List LAYERS = IntStream.range(0, 16).mapToObj((i) -> { +// return MyRenderLayer.getDimensionalPortal(i + 1); +// }).collect(ImmutableList.toImmutableList()); public EntranceRiftBlockEntityRenderer(BlockEntityRenderDispatcher blockEntityRenderDispatcher) { super(blockEntityRenderDispatcher); } @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 layers = IntStream.range(0, 16).mapToObj((i) -> { + return MyRenderLayer.getDimensionalPortal(i + 1, blockEntity); + }).collect(ImmutableList.toImmutableList()); 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 - || !MinecraftClient.getInstance().world.isChunkLoaded(entrance.getPos().getX() >> 4, entrance.getPos().getZ() >> 4)) { + if (MinecraftClient.getInstance().world == null) { return; } - Direction orientation = entrance.getOrientation(); + Direction orientation = blockEntity.getOrientation(); 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); // DimensionalPortalRenderer.renderDimensionalPortal( -// entrance.getPos().getX() + offset.x, -// entrance.getPos().getY() + offset.y, -// entrance.getPos().getZ() + offset.z, -// //entrance.orientation.getHorizontalAngle(), -// //entrance.orientation.getDirectionVec().getY() * 90, +// blockEntity.getPos().getX() + offset.x, +// blockEntity.getPos().getY() + offset.y, +// blockEntity.getPos().getZ() + offset.z, +// //blockEntity.orientation.getHorizontalAngle(), +// //blockEntity.orientation.getDirectionVec().getY() * 90, // orientation, // 16, // 16, -// entrance.getColors(16), +// blockEntity.getColors(16), // matrices, // vertexConsumers.getBuffer(LAYERS.get(0))); 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 layers) { 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); int k = this.getOffset(d); float g = 0.75F; 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); 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 { + 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; + } } } diff --git a/src/main/java/org/dimdev/dimdoors/mixin/client/GlStateManagerAccessor.java b/src/main/java/org/dimdev/dimdoors/mixin/client/GlStateManagerAccessor.java new file mode 100644 index 00000000..5560ef3b --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/mixin/client/GlStateManagerAccessor.java @@ -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)); + } +} diff --git a/src/main/resources/dimdoors.mixins.json b/src/main/resources/dimdoors.mixins.json index 4495a040..00daa36a 100644 --- a/src/main/resources/dimdoors.mixins.json +++ b/src/main/resources/dimdoors.mixins.json @@ -10,6 +10,7 @@ "PlayerEntityMixin" ], "client": [ + "client.GlStateManagerAccessor", "client.InGameHudMixin" ], "injectors": {