From 07667efe981ca456da60a9a2b2cd110c71d255fb Mon Sep 17 00:00:00 2001 From: Christian Knaapen Date: Thu, 2 Feb 2023 00:45:21 +0100 Subject: [PATCH] Icons for modifier settings and replace modes. Rendering mirror lines and areas in world. Removed shaders. --- .../requios/effortlessbuilding/AllIcons.java | 30 +- .../buildmode/ModeOptions.java | 10 +- .../buildmodifier/RadialMirror.java | 8 +- .../item/render/PartialItemModelRenderer.java | 14 +- .../create/foundation/render/RenderTypes.java | 82 ++--- .../gui/buildmodifier/MirrorEntry.java | 18 +- .../gui/buildmodifier/RadialMirrorEntry.java | 26 +- .../render/BuildRenderTypes.java | 79 ----- .../render/ModifierRenderer.java | 314 +++++++++--------- .../render/RenderHandler.java | 31 +- .../shaders/core/dissolve.fsh | 105 ------ .../shaders/core/dissolve.json | 37 --- .../shaders/core/dissolve.vsh | 31 -- .../shaders/core/glowing_shader.fsh | 24 -- .../shaders/core/glowing_shader.json | 31 -- .../shaders/core/glowing_shader.vsh | 36 -- .../effortlessbuilding/shaders/raw_color.frag | 15 - .../effortlessbuilding/textures/gui/icons.png | Bin 4207 -> 5479 bytes 18 files changed, 281 insertions(+), 610 deletions(-) delete mode 100644 src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.fsh delete mode 100644 src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.json delete mode 100644 src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.vsh delete mode 100644 src/main/resources/assets/effortlessbuilding/shaders/core/glowing_shader.fsh delete mode 100644 src/main/resources/assets/effortlessbuilding/shaders/core/glowing_shader.json delete mode 100644 src/main/resources/assets/effortlessbuilding/shaders/core/glowing_shader.vsh delete mode 100644 src/main/resources/assets/effortlessbuilding/shaders/raw_color.frag diff --git a/src/main/java/nl/requios/effortlessbuilding/AllIcons.java b/src/main/java/nl/requios/effortlessbuilding/AllIcons.java index 3805ed8..fffc87e 100644 --- a/src/main/java/nl/requios/effortlessbuilding/AllIcons.java +++ b/src/main/java/nl/requios/effortlessbuilding/AllIcons.java @@ -26,15 +26,21 @@ public class AllIcons implements ScreenElement { private int iconY; public static final AllIcons - I_SETTINGS = newRow(), - I_UNDO = next(), - I_REDO = next(), - I_REPLACE = next(); + I_SETTINGS = newRow(), + I_UNDO = next(), + I_REDO = next(), + I_REPLACE = next(), + I_REPLACE_AIR = next(), + I_REPLACE_BLOCKS_AND_AIR = next(), + I_REPLACE_BLOCKS = next(), + I_REPLACE_OFFHAND_FILTERED = next(), + I_PROTECT_TILE_ENTITIES = next(); + public static final AllIcons - I_DISABLE = newRow(), - I_SINGLE = next(), - I_LINE = next(), + I_DISABLE = newRow(), + I_SINGLE = next(), + I_LINE = next(), I_WALL = next(), I_FLOOR = next(), I_CUBE = next(), @@ -71,7 +77,15 @@ public class AllIcons implements ScreenElement { I_HIDE_LINES = next(), I_SHOW_LINES = next(), I_HIDE_AREAS = next(), - I_SHOW_AREAS = next(); + I_SHOW_AREAS = next(), + I_X_OFF = next(), + I_X_ON = next(), + I_Y_OFF = next(), + I_Y_ON = next(), + I_Z_OFF = next(), + I_Z_ON = next(), + I_ALTERNATE_OFF = next(), + I_ALTERNATE_ON = next(); public AllIcons(int x, int y) { diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeOptions.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeOptions.java index a7ccc6c..298c351 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeOptions.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeOptions.java @@ -115,11 +115,11 @@ public class ModeOptions { OPEN_MODIFIER_SETTINGS("open_modifier_settings", AllIcons.I_SETTINGS), OPEN_PLAYER_SETTINGS("open_player_settings", AllIcons.I_SETTINGS), - REPLACE_ONLY_AIR("replace_only_air", AllIcons.I_REPLACE), - REPLACE_BLOCKS_AND_AIR("replace_blocks_and_air", AllIcons.I_REPLACE), - REPLACE_ONLY_BLOCKS("replace_only_blocks", AllIcons.I_REPLACE), - REPLACE_FILTERED_BY_OFFHAND("replace_filtered_by_offhand", AllIcons.I_REPLACE), - TOGGLE_PROTECT_TILE_ENTITIES("toggle_protect_tile_entities", AllIcons.I_REPLACE), + REPLACE_ONLY_AIR("replace_only_air", AllIcons.I_REPLACE_AIR), + REPLACE_BLOCKS_AND_AIR("replace_blocks_and_air", AllIcons.I_REPLACE_BLOCKS_AND_AIR), + REPLACE_ONLY_BLOCKS("replace_only_blocks", AllIcons.I_REPLACE_BLOCKS), + REPLACE_FILTERED_BY_OFFHAND("replace_filtered_by_offhand", AllIcons.I_REPLACE_OFFHAND_FILTERED), + TOGGLE_PROTECT_TILE_ENTITIES("toggle_protect_tile_entities", AllIcons.I_PROTECT_TILE_ENTITIES), NORMAL_SPEED("normal_speed", AllIcons.I_NORMAL_SPEED), FAST_SPEED("fast_speed", AllIcons.I_FAST_SPEED), diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/RadialMirror.java b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/RadialMirror.java index 4870b83..491d556 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/RadialMirror.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/RadialMirror.java @@ -91,21 +91,21 @@ public class RadialMirror extends BaseModifier { if (angleToCenter < -0.751 * Math.PI || angleToCenter > 0.749 * Math.PI) { blockEntry.rotation = blockEntry.rotation.getRotated(Rotation.CLOCKWISE_180); if (alternate) { - blockEntry.mirrorZ = !blockEntry.mirrorZ; +// blockEntry.mirrorX = !blockEntry.mirrorX; } } else if (angleToCenter < -0.251 * Math.PI) { blockEntry.rotation = blockEntry.rotation.getRotated(Rotation.CLOCKWISE_90); if (alternate) { - blockEntry.mirrorX = !blockEntry.mirrorX; +// blockEntry.mirrorZ = !blockEntry.mirrorZ; } } else if (angleToCenter > 0.249 * Math.PI) { blockEntry.rotation = blockEntry.rotation.getRotated(Rotation.COUNTERCLOCKWISE_90); if (alternate) { - blockEntry.mirrorX = !blockEntry.mirrorX; +// blockEntry.mirrorZ = !blockEntry.mirrorZ; } } else { if (alternate) { - blockEntry.mirrorZ = !blockEntry.mirrorZ; +// blockEntry.mirrorX = !blockEntry.mirrorX; } } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/render/PartialItemModelRenderer.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/render/PartialItemModelRenderer.java index 5c1c491..e123fbf 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/render/PartialItemModelRenderer.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/render/PartialItemModelRenderer.java @@ -47,13 +47,13 @@ public class PartialItemModelRenderer { render(model, RenderTypes.getItemPartialSolid(), light); } - public void renderSolidGlowing(BakedModel model, int light) { - render(model, RenderTypes.getGlowingSolid(), light); - } - - public void renderGlowing(BakedModel model, int light) { - render(model, RenderTypes.getGlowingTranslucent(), light); - } +// public void renderSolidGlowing(BakedModel model, int light) { +// render(model, RenderTypes.getGlowingSolid(), light); +// } +// +// public void renderGlowing(BakedModel model, int light) { +// render(model, RenderTypes.getGlowingTranslucent(), light); +// } public void render(BakedModel model, RenderType type, int light) { if (stack.isEmpty()) diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/RenderTypes.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/RenderTypes.java index 2ac1860..825968b 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/RenderTypes.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/RenderTypes.java @@ -20,7 +20,7 @@ import java.io.IOException; // TODO 1.17: use custom shaders instead of vanilla ones public class RenderTypes extends RenderStateShard { - public static final ShaderStateShard GLOWING_SHADER = new ShaderStateShard(() -> Shaders.glowingShader); +// public static final ShaderStateShard GLOWING_SHADER = new ShaderStateShard(() -> Shaders.glowingShader); private static final RenderType OUTLINE_SOLID = RenderType.create(createLayerName("outline_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, false, @@ -49,33 +49,33 @@ public class RenderTypes extends RenderStateShard { .createCompositeState(false)); } - public static RenderType getGlowingSolid(ResourceLocation texture) { - return RenderType.create(createLayerName("glowing_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, - true, false, RenderType.CompositeState.builder() - .setShaderState(GLOWING_SHADER) - .setTextureState(new TextureStateShard(texture, false, false)) - .setCullState(CULL) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .createCompositeState(true)); - } +// public static RenderType getGlowingSolid(ResourceLocation texture) { +// return RenderType.create(createLayerName("glowing_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, +// true, false, RenderType.CompositeState.builder() +// .setShaderState(GLOWING_SHADER) +// .setTextureState(new TextureStateShard(texture, false, false)) +// .setCullState(CULL) +// .setLightmapState(LIGHTMAP) +// .setOverlayState(OVERLAY) +// .createCompositeState(true)); +// } +// +// private static final RenderType GLOWING_SOLID_DEFAULT = getGlowingSolid(InventoryMenu.BLOCK_ATLAS); +// +// public static RenderType getGlowingSolid() { +// return GLOWING_SOLID_DEFAULT; +// } - private static final RenderType GLOWING_SOLID_DEFAULT = getGlowingSolid(InventoryMenu.BLOCK_ATLAS); - - public static RenderType getGlowingSolid() { - return GLOWING_SOLID_DEFAULT; - } - - public static RenderType getGlowingTranslucent(ResourceLocation texture) { - return RenderType.create(createLayerName("glowing_translucent"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, - 256, true, true, RenderType.CompositeState.builder() - .setShaderState(GLOWING_SHADER) - .setTextureState(new TextureStateShard(texture, false, false)) - .setTransparencyState(TRANSLUCENT_TRANSPARENCY) - .setLightmapState(LIGHTMAP) - .setOverlayState(OVERLAY) - .createCompositeState(true)); - } +// public static RenderType getGlowingTranslucent(ResourceLocation texture) { +// return RenderType.create(createLayerName("glowing_translucent"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, +// 256, true, true, RenderType.CompositeState.builder() +// .setShaderState(GLOWING_SHADER) +// .setTextureState(new TextureStateShard(texture, false, false)) +// .setTransparencyState(TRANSLUCENT_TRANSPARENCY) +// .setLightmapState(LIGHTMAP) +// .setOverlayState(OVERLAY) +// .createCompositeState(true)); +// } private static final RenderType ADDITIVE = RenderType.create(createLayerName("additive"), DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, 256, true, true, RenderType.CompositeState.builder() @@ -91,11 +91,11 @@ public class RenderTypes extends RenderStateShard { return ADDITIVE; } - private static final RenderType GLOWING_TRANSLUCENT_DEFAULT = getGlowingTranslucent(InventoryMenu.BLOCK_ATLAS); +// private static final RenderType GLOWING_TRANSLUCENT_DEFAULT = getGlowingTranslucent(InventoryMenu.BLOCK_ATLAS); - public static RenderType getGlowingTranslucent() { - return GLOWING_TRANSLUCENT_DEFAULT; - } +// public static RenderType getGlowingTranslucent() { +// return GLOWING_TRANSLUCENT_DEFAULT; +// } private static final RenderType ITEM_PARTIAL_SOLID = RenderType.create(createLayerName("item_partial_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, @@ -146,15 +146,15 @@ public class RenderTypes extends RenderStateShard { super(null, null, null); } - @EventBusSubscriber(value = Dist.CLIENT, bus = EventBusSubscriber.Bus.MOD) - private static class Shaders { - private static ShaderInstance glowingShader; - - @SubscribeEvent - public static void onRegisterShaders(RegisterShadersEvent event) throws IOException { - ResourceManager resourceManager = event.getResourceManager(); - event.registerShader(new ShaderInstance(resourceManager, Create.asResource("glowing_shader"), DefaultVertexFormat.NEW_ENTITY), shader -> glowingShader = shader); - } - } +// @EventBusSubscriber(value = Dist.CLIENT, bus = EventBusSubscriber.Bus.MOD) +// private static class Shaders { +// private static ShaderInstance glowingShader; +// +// @SubscribeEvent +// public static void onRegisterShaders(RegisterShadersEvent event) throws IOException { +// ResourceManager resourceManager = event.getResourceManager(); +// event.registerShader(new ShaderInstance(resourceManager, Create.asResource("glowing_shader"), DefaultVertexFormat.NEW_ENTITY), shader -> glowingShader = shader); +// } +// } } diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/MirrorEntry.java b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/MirrorEntry.java index 88b7fa9..4cf6c69 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/MirrorEntry.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/MirrorEntry.java @@ -89,7 +89,7 @@ public class MirrorEntry extends BaseModifierEntry { //Axis buttons for (int i = 0; i < 3; i++) { final int index = i; - IconButton button = new IconButton(0, 0, AllIcons.I_SHOW_LINES) + IconButton button = new IconButton(0, 0, i == 0 ? AllIcons.I_X_ON : i == 1 ? AllIcons.I_Y_OFF : AllIcons.I_Z_OFF) .withCallback(() -> { modifier.toggleMirrorAxis(index); onValueChanged(); @@ -191,42 +191,42 @@ public class MirrorEntry extends BaseModifierEntry { //Toggle offset button if (modifier.position.x == Math.floor(modifier.position.x)) { toggleOffsetButton.setIcon(AllIcons.I_BLOCK_CENTER); - toggleOffsetButton.setToolTip(Components.literal("Set mirror position to center of block, for uneven numbered builds.")); + toggleOffsetButton.setToolTip(Components.literal("Set position to center of block, for uneven numbered builds.")); } else { toggleOffsetButton.setIcon(AllIcons.I_BLOCK_CORNER); - toggleOffsetButton.setToolTip(Components.literal("Set mirror position to corner of block, for even numbered builds.")); + toggleOffsetButton.setToolTip(Components.literal("Set position to corner of block, for even numbered builds.")); } //Axis buttons for (int i = 0; i < 3; i++) { IconButton button = axisButtons.get(i); if (modifier.getMirrorAxis(i)) { - button.setIcon(AllIcons.I_SHOW_LINES); + button.setIcon(i == 0 ? AllIcons.I_X_ON : i == 1 ? AllIcons.I_Y_ON : AllIcons.I_Z_ON); } else { - button.setIcon(AllIcons.I_HIDE_LINES); + button.setIcon(i == 0 ? AllIcons.I_X_OFF : i == 1 ? AllIcons.I_Y_OFF : AllIcons.I_Z_OFF); } } //Show lines button if (modifier.drawLines) { showLinesButton.setIcon(AllIcons.I_SHOW_LINES); - showLinesButton.setToolTip(Components.literal("Hide mirror lines")); + showLinesButton.setToolTip(Components.literal("Showing mirror lines")); } else { showLinesButton.setIcon(AllIcons.I_HIDE_LINES); - showLinesButton.setToolTip(Components.literal("Show mirror lines")); + showLinesButton.setToolTip(Components.literal("Not showing mirror lines")); } //Show areas button if (modifier.drawPlanes) { showAreasButton.setIcon(AllIcons.I_SHOW_AREAS); - showAreasButton.setToolTip(Components.literal("Hide mirror areas")); + showAreasButton.setToolTip(Components.literal("Showing mirror areas")); } else { showAreasButton.setIcon(AllIcons.I_HIDE_AREAS); - showAreasButton.setToolTip(Components.literal("Show mirror areas")); + showAreasButton.setToolTip(Components.literal("Not showing mirror areas")); } } } diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/RadialMirrorEntry.java b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/RadialMirrorEntry.java index 2b73479..80b9554 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/RadialMirrorEntry.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/RadialMirrorEntry.java @@ -98,7 +98,7 @@ public class RadialMirrorEntry extends BaseModifierEntry { listeners.add(slicesInput); //Alternate - alternateButton = new IconButton(0, 0, AllIcons.I_SHOW_AREAS) + alternateButton = new IconButton(0, 0, AllIcons.I_ALTERNATE_OFF) .withCallback(() -> { modifier.alternate = !modifier.alternate; onValueChanged(); @@ -108,7 +108,9 @@ public class RadialMirrorEntry extends BaseModifierEntry { //Radius radiusInput = new LabeledScrollInput(0, 0, 27, 18) .withRange(0, ReachHelper.getMaxMirrorRadius(Minecraft.getInstance().player)) - .titled(Component.literal("Radius. Use Reach Upgrade items to increase maximum.")) + .titled(Minecraft.getInstance().player.isCreative() ? + Component.literal("Radius") : + Component.literal("Radius. Use Reach Upgrade items to increase maximum.")) .calling(value -> { modifier.radius = value; onValueChanged(); @@ -199,41 +201,41 @@ public class RadialMirrorEntry extends BaseModifierEntry { //Toggle offset button if (modifier.position.x == Math.floor(modifier.position.x)) { toggleOffsetButton.setIcon(AllIcons.I_BLOCK_CENTER); - toggleOffsetButton.setToolTip(Components.literal("Set radialMirror position to center of block, for uneven numbered builds.")); + toggleOffsetButton.setToolTip(Components.literal("Set position to center of block, for uneven numbered builds.")); } else { toggleOffsetButton.setIcon(AllIcons.I_BLOCK_CORNER); - toggleOffsetButton.setToolTip(Components.literal("Set radialMirror position to corner of block, for even numbered builds.")); + toggleOffsetButton.setToolTip(Components.literal("Set position to corner of block, for even numbered builds.")); } //Toggle alternate button if (modifier.alternate) { - alternateButton.setIcon(AllIcons.I_SHOW_AREAS); - alternateButton.setToolTip(Components.literal("Alternate the direction of every other slice: Currently ON")); + alternateButton.setIcon(AllIcons.I_ALTERNATE_ON); + alternateButton.setToolTip(Components.literal("Alternating the direction of every other slice.")); } else { - alternateButton.setIcon(AllIcons.I_HIDE_AREAS); - alternateButton.setToolTip(Components.literal("Alternate the direction of every other slice. Currently OFF")); + alternateButton.setIcon(AllIcons.I_ALTERNATE_OFF); + alternateButton.setToolTip(Components.literal("Alternate the direction of every other slice. Currently off.")); } //Show lines button if (modifier.drawLines) { showLinesButton.setIcon(AllIcons.I_SHOW_LINES); - showLinesButton.setToolTip(Components.literal("Hide radial mirror lines")); + showLinesButton.setToolTip(Components.literal("Showing mirror lines")); } else { showLinesButton.setIcon(AllIcons.I_HIDE_LINES); - showLinesButton.setToolTip(Components.literal("Show radial mirror lines")); + showLinesButton.setToolTip(Components.literal("Not showing mirror lines")); } //Show areas button if (modifier.drawPlanes) { showAreasButton.setIcon(AllIcons.I_SHOW_AREAS); - showAreasButton.setToolTip(Components.literal("Hide radial mirror areas")); + showAreasButton.setToolTip(Components.literal("Showing mirror areas")); } else { showAreasButton.setIcon(AllIcons.I_HIDE_AREAS); - showAreasButton.setToolTip(Components.literal("Show radial mirror areas")); + showAreasButton.setToolTip(Components.literal("Not showing mirror areas")); } } } diff --git a/src/main/java/nl/requios/effortlessbuilding/render/BuildRenderTypes.java b/src/main/java/nl/requios/effortlessbuilding/render/BuildRenderTypes.java index f7f72e1..e331b1e 100644 --- a/src/main/java/nl/requios/effortlessbuilding/render/BuildRenderTypes.java +++ b/src/main/java/nl/requios/effortlessbuilding/render/BuildRenderTypes.java @@ -1,33 +1,16 @@ package nl.requios.effortlessbuilding.render; -import com.mojang.blaze3d.shaders.Uniform; -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.VertexFormat; import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.ShaderInstance; -import net.minecraft.core.BlockPos; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.phys.Vec3; -import nl.requios.effortlessbuilding.EffortlessBuilding; import java.util.OptionalDouble; - public class BuildRenderTypes extends RenderType { - public static ResourceLocation shaderMaskTextureLocation = new ResourceLocation(EffortlessBuilding.MODID, "textures/shader_mask.png"); - public static final RenderType LINES; public static final RenderType PLANES; - public static ShaderInstance dissolveShaderInstance; - private static final ShaderStateShard RENDERTYPE_DISSOLVE_SHADER = new ShaderStateShard(() -> dissolveShaderInstance); - - //Between 0 and 7, but dont override vanilla textures - //Also update dissolve.fsh SamplerX - private static final int maskTextureIndex = 2; - static { final LineStateShard LINE = new LineStateShard(OptionalDouble.of(2.0)); final int INITIAL_BUFFER_SIZE = 128; @@ -64,69 +47,7 @@ public class BuildRenderTypes extends RenderType { DefaultVertexFormat.POSITION_COLOR, VertexFormat.Mode.TRIANGLE_STRIP, INITIAL_BUFFER_SIZE, false, false, renderState); } - - // Dummy constructor needed to make java happy public BuildRenderTypes(String p_173178_, VertexFormat p_173179_, VertexFormat.Mode p_173180_, int p_173181_, boolean p_173182_, boolean p_173183_, Runnable p_173184_, Runnable p_173185_) { super(p_173178_, p_173179_, p_173180_, p_173181_, p_173182_, p_173183_, p_173184_, p_173185_); } - - public static RenderType getBlockPreviewRenderType(float dissolve, BlockPos blockPos, BlockPos firstPos, BlockPos secondPos, boolean red) { - - String stateName = "eb_texturing_" + dissolve + "_" + blockPos + "_" + firstPos + "_" + secondPos + "_" + red; - TexturingStateShard MY_TEXTURING = new TexturingStateShard(stateName, () -> { - setShaderParameters(dissolveShaderInstance, dissolve, Vec3.atLowerCornerOf(blockPos), Vec3.atLowerCornerOf(firstPos), Vec3.atLowerCornerOf(secondPos), blockPos == secondPos, red); - RenderSystem.setShaderColor(1f, 1f, 1f, 0.8f); - }, () -> {}); - - RenderType.CompositeState renderState = RenderType.CompositeState.builder() - .setShaderState(RENDERTYPE_DISSOLVE_SHADER) - .setTexturingState(MY_TEXTURING) - .setTextureState(RenderStateShard.BLOCK_SHEET_MIPPED) - .setTransparencyState(TRANSLUCENT_TRANSPARENCY) - .setLightmapState(RenderStateShard.NO_LIGHTMAP) - .setCullState(RenderStateShard.CULL) - .setOutputState(RenderStateShard.TRANSLUCENT_TARGET) - .createCompositeState(true); - //Unique name for every combination, otherwise it will reuse the previous one - String name = "eb_block_previews_" + dissolve + "_" + blockPos + "_" + firstPos + "_" + secondPos + "_" + red; - return RenderType.create(name, - DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, 2097152, true, true, renderState); - } - - private static void setShaderParameters(ShaderInstance shader, final float dissolve, final Vec3 blockpos, - final Vec3 firstpos, final Vec3 secondpos, - final boolean highlight, final boolean red) { - Uniform percentileUniform = shader.getUniform("dissolve"); - Uniform highlightUniform = shader.getUniform("highlight"); - Uniform redUniform = shader.getUniform("red"); - Uniform blockposUniform = shader.getUniform("blockpos"); - Uniform firstposUniform = shader.getUniform("firstpos"); - Uniform secondposUniform = shader.getUniform("secondpos"); - - RenderSystem.setShaderTexture(maskTextureIndex, shaderMaskTextureLocation); - - if (percentileUniform != null) percentileUniform.set(dissolve); else EffortlessBuilding.log("percentileUniform is null"); - if (highlightUniform != null) highlightUniform.set(highlight ? 1 : 0); else EffortlessBuilding.log("highlightUniform is null"); - if (redUniform != null) redUniform.set(red ? 1 : 0); else EffortlessBuilding.log("redUniform is null"); - - if (blockposUniform != null) blockposUniform.set((float) blockpos.x, (float) blockpos.y, (float) blockpos.z); else EffortlessBuilding.log("blockposUniform is null"); - if (firstposUniform != null) firstposUniform.set((float) firstpos.x, (float) firstpos.y, (float) firstpos.z); else EffortlessBuilding.log("firstposUniform is null"); - if (secondposUniform != null) secondposUniform.set((float) secondpos.x, (float) secondpos.y, (float) secondpos.z); else EffortlessBuilding.log("secondposUniform is null"); - } - - private class ShaderInfo { - float dissolve; - Vec3 blockPos; - Vec3 firstPos; - Vec3 secondPos; - boolean red; - - public ShaderInfo(float dissolve, Vec3 blockPos, Vec3 firstPos, Vec3 secondPos, boolean red) { - this.dissolve = dissolve; - this.blockPos = blockPos; - this.firstPos = firstPos; - this.secondPos = secondPos; - this.red = red; - } - } } diff --git a/src/main/java/nl/requios/effortlessbuilding/render/ModifierRenderer.java b/src/main/java/nl/requios/effortlessbuilding/render/ModifierRenderer.java index d8bd1bd..4e2643f 100644 --- a/src/main/java/nl/requios/effortlessbuilding/render/ModifierRenderer.java +++ b/src/main/java/nl/requios/effortlessbuilding/render/ModifierRenderer.java @@ -2,165 +2,181 @@ package nl.requios.effortlessbuilding.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource.BufferSource; import com.mojang.math.Matrix4f; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import nl.requios.effortlessbuilding.EffortlessBuildingClient; +import nl.requios.effortlessbuilding.buildmodifier.BaseModifier; import nl.requios.effortlessbuilding.buildmodifier.Mirror; import nl.requios.effortlessbuilding.buildmodifier.RadialMirror; import java.awt.*; +import java.util.List; @OnlyIn(Dist.CLIENT) public class ModifierRenderer { -// protected static final Color colorX = new Color(255, 72, 52); -// protected static final Color colorY = new Color(67, 204, 51); -// protected static final Color colorZ = new Color(52, 247, 255); -// protected static final Color colorRadial = new Color(52, 247, 255); -// protected static final int lineAlpha = 200; -// protected static final int planeAlpha = 50; -// protected static final Vec3 epsilon = new Vec3(0.001, 0.001, 0.001); //prevents z-fighting -// -// public static void render(PoseStack matrixStack, MultiBufferSource.BufferSource renderTypeBuffer, ModifierSettingsManager.ModifierSettings modifierSettings) { -// //Mirror lines and areas -// Mirror.MirrorSettings m = modifierSettings.getMirrorSettings(); -// if (m != null && m.enabled && (m.mirrorX || m.mirrorY || m.mirrorZ)) { -// Vec3 pos = m.position.add(epsilon); -// int radius = m.radius; -// -// if (m.mirrorX) { -// Vec3 posA = new Vec3(pos.x, pos.y - radius, pos.z - radius); -// Vec3 posB = new Vec3(pos.x, pos.y + radius, pos.z + radius); -// -// drawMirrorPlane(matrixStack, renderTypeBuffer, posA, posB, colorX, m.drawLines, m.drawPlanes, true); -// } -// if (m.mirrorY) { -// Vec3 posA = new Vec3(pos.x - radius, pos.y, pos.z - radius); -// Vec3 posB = new Vec3(pos.x + radius, pos.y, pos.z + radius); -// -// drawMirrorPlaneY(matrixStack, renderTypeBuffer, posA, posB, colorY, m.drawLines, m.drawPlanes); -// } -// if (m.mirrorZ) { -// Vec3 posA = new Vec3(pos.x - radius, pos.y - radius, pos.z); -// Vec3 posB = new Vec3(pos.x + radius, pos.y + radius, pos.z); -// -// drawMirrorPlane(matrixStack, renderTypeBuffer, posA, posB, colorZ, m.drawLines, m.drawPlanes, true); -// } -// -// //Draw axis coordinated colors if two or more axes are enabled -// //(If only one is enabled the lines are that planes color) -// if (m.drawLines && ((m.mirrorX && m.mirrorY) || (m.mirrorX && m.mirrorZ) || (m.mirrorY && m.mirrorZ))) { -// drawMirrorLines(matrixStack, renderTypeBuffer, m); -// } -// } -// -// //Radial mirror lines and areas -// RadialMirror.RadialMirrorSettings r = modifierSettings.getRadialMirrorSettings(); -// if (r != null && r.enabled) { -// Vec3 pos = r.position.add(epsilon); -// int radius = r.radius; -// -// float angle = 2f * ((float) Math.PI) / r.slices; -// Vec3 relStartVec = new Vec3(radius, 0, 0); -// if (r.slices % 4 == 2) relStartVec = relStartVec.yRot(angle / 2f); -// -// for (int i = 0; i < r.slices; i++) { -// Vec3 relNewVec = relStartVec.yRot(angle * i); -// Vec3 newVec = pos.add(relNewVec); -// -// Vec3 posA = new Vec3(pos.x, pos.y - radius, pos.z); -// Vec3 posB = new Vec3(newVec.x, pos.y + radius, newVec.z); -// drawMirrorPlane(matrixStack, renderTypeBuffer, posA, posB, colorRadial, r.drawLines, r.drawPlanes, false); -// } -// } -// } -// -// -// //----Mirror---- -// -// protected static void drawMirrorPlane(PoseStack matrixStack, MultiBufferSource.BufferSource renderTypeBuffer, Vec3 posA, Vec3 posB, Color c, boolean drawLines, boolean drawPlanes, boolean drawVerticalLines) { -// -//// GL11.glColor4d(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha); -// Matrix4f matrixPos = matrixStack.last().pose(); -// -// if (drawPlanes) { -// VertexConsumer buffer = RenderHandler.beginPlanes(renderTypeBuffer); -// -// buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); -// buffer.vertex(matrixPos, (float) posA.x, (float) posB.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); -// buffer.vertex(matrixPos, (float) posB.x, (float) posA.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); -// buffer.vertex(matrixPos, (float) posB.x, (float) posB.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); -// //backface (using triangle strip) -// buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); -// buffer.vertex(matrixPos, (float) posA.x, (float) posB.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); -// -// RenderHandler.endPlanes(renderTypeBuffer); -// } -// -// if (drawLines) { -// VertexConsumer buffer = RenderHandler.beginLines(renderTypeBuffer); -// -// Vec3 middle = posA.add(posB).scale(0.5); -// buffer.vertex(matrixPos, (float) posA.x, (float) middle.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); -// buffer.vertex(matrixPos, (float) posB.x, (float) middle.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); -// if (drawVerticalLines) { -// buffer.vertex(matrixPos, (float) middle.x, (float) posA.y, (float) middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); -// buffer.vertex(matrixPos, (float) middle.x, (float) posB.y, (float) middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); -// } -// -// RenderHandler.endLines(renderTypeBuffer); -// } -// } -// -// protected static void drawMirrorPlaneY(PoseStack matrixStack, MultiBufferSource.BufferSource renderTypeBuffer, Vec3 posA, Vec3 posB, Color c, boolean drawLines, boolean drawPlanes) { -// -//// GL11.glColor4d(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); -// Matrix4f matrixPos = matrixStack.last().pose(); -// -// if (drawPlanes) { -// VertexConsumer buffer = RenderHandler.beginPlanes(renderTypeBuffer); -// -// buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); -// buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); -// buffer.vertex(matrixPos, (float) posB.x, (float) posA.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); -// buffer.vertex(matrixPos, (float) posB.x, (float) posA.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); -// //backface (using triangle strip) -// buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); -// buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); -// -// RenderHandler.endPlanes(renderTypeBuffer); -// } -// -// if (drawLines) { -// VertexConsumer buffer = RenderHandler.beginLines(renderTypeBuffer); -// -// Vec3 middle = posA.add(posB).scale(0.5); -// buffer.vertex(matrixPos, (float) middle.x, (float) middle.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); -// buffer.vertex(matrixPos, (float) middle.x, (float) middle.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); -// buffer.vertex(matrixPos, (float) posA.x, (float) middle.y, (float) middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); -// buffer.vertex(matrixPos, (float) posB.x, (float) middle.y, (float) middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); -// -// RenderHandler.endLines(renderTypeBuffer); -// } -// } -// -// protected static void drawMirrorLines(PoseStack matrixStack, MultiBufferSource.BufferSource renderTypeBuffer, Mirror.MirrorSettings m) { -// -//// GL11.glColor4d(100, 100, 100, 255); -// VertexConsumer buffer = RenderHandler.beginLines(renderTypeBuffer); -// Matrix4f matrixPos = matrixStack.last().pose(); -// -// Vec3 pos = m.position.add(epsilon); -// -// buffer.vertex(matrixPos, (float) pos.x - m.radius, (float) pos.y, (float) pos.z).color(colorX.getRed(), colorX.getGreen(), colorX.getBlue(), lineAlpha).endVertex(); -// buffer.vertex(matrixPos, (float) pos.x + m.radius, (float) pos.y, (float) pos.z).color(colorX.getRed(), colorX.getGreen(), colorX.getBlue(), lineAlpha).endVertex(); -// buffer.vertex(matrixPos, (float) pos.x, (float) pos.y - m.radius, (float) pos.z).color(colorY.getRed(), colorY.getGreen(), colorY.getBlue(), lineAlpha).endVertex(); -// buffer.vertex(matrixPos, (float) pos.x, (float) pos.y + m.radius, (float) pos.z).color(colorY.getRed(), colorY.getGreen(), colorY.getBlue(), lineAlpha).endVertex(); -// buffer.vertex(matrixPos, (float) pos.x, (float) pos.y, (float) pos.z - m.radius).color(colorZ.getRed(), colorZ.getGreen(), colorZ.getBlue(), lineAlpha).endVertex(); -// buffer.vertex(matrixPos, (float) pos.x, (float) pos.y, (float) pos.z + m.radius).color(colorZ.getRed(), colorZ.getGreen(), colorZ.getBlue(), lineAlpha).endVertex(); -// -// RenderHandler.endLines(renderTypeBuffer); -// } + protected static final Color colorX = new Color(255, 72, 52); + protected static final Color colorY = new Color(67, 204, 51); + protected static final Color colorZ = new Color(52, 247, 255); + protected static final Color colorRadial = new Color(52, 247, 255); + protected static final int lineAlpha = 200; + protected static final int planeAlpha = 50; + protected static final Vec3 epsilon = new Vec3(0.001, 0.001, 0.001); //prevents z-fighting + + public static void render(PoseStack ms, BufferSource buffer) { + List modifierSettingsList = EffortlessBuildingClient.BUILD_MODIFIERS.getModifierSettingsList(); + + for (BaseModifier modifierSettings : modifierSettingsList) { + if (modifierSettings == null) continue; + if (modifierSettings instanceof Mirror) { + renderMirror(ms, buffer, (Mirror) modifierSettings); + } else if (modifierSettings instanceof RadialMirror) { + renderRadialMirror(ms, buffer, (RadialMirror) modifierSettings); + } + } + } + + //Mirror lines and areas + private static void renderMirror(PoseStack ms, BufferSource buffer, Mirror m) { + + if (m != null && m.enabled && (m.mirrorX || m.mirrorY || m.mirrorZ)) { + Vec3 pos = m.position.add(epsilon); + int radius = m.radius; + + if (m.mirrorX) { + Vec3 posA = new Vec3(pos.x, pos.y - radius, pos.z - radius); + Vec3 posB = new Vec3(pos.x, pos.y + radius, pos.z + radius); + + drawMirrorPlane(ms, buffer, posA, posB, colorX, m.drawLines, m.drawPlanes, true); + } + if (m.mirrorY) { + Vec3 posA = new Vec3(pos.x - radius, pos.y, pos.z - radius); + Vec3 posB = new Vec3(pos.x + radius, pos.y, pos.z + radius); + + drawMirrorPlaneY(ms, buffer, posA, posB, colorY, m.drawLines, m.drawPlanes); + } + if (m.mirrorZ) { + Vec3 posA = new Vec3(pos.x - radius, pos.y - radius, pos.z); + Vec3 posB = new Vec3(pos.x + radius, pos.y + radius, pos.z); + + drawMirrorPlane(ms, buffer, posA, posB, colorZ, m.drawLines, m.drawPlanes, true); + } + + //Draw axis coordinated colors if two or more axes are enabled + //(If only one is enabled the lines are that planes color) + if (m.drawLines && ((m.mirrorX && m.mirrorY) || (m.mirrorX && m.mirrorZ) || (m.mirrorY && m.mirrorZ))) { + drawMirrorLines(ms, buffer, m); + } + } + } + + //Radial mirror lines and areas + private static void renderRadialMirror(PoseStack ms, BufferSource buffer, RadialMirror r) { + + if (r != null && r.enabled) { + Vec3 pos = r.position.add(epsilon); + int radius = r.radius; + + float angle = 2f * ((float) Math.PI) / r.slices; + Vec3 relStartVec = new Vec3(radius, 0, 0); + if (r.slices % 4 == 2) relStartVec = relStartVec.yRot(angle / 2f); + + for (int i = 0; i < r.slices; i++) { + Vec3 relNewVec = relStartVec.yRot(angle * i); + Vec3 newVec = pos.add(relNewVec); + + Vec3 posA = new Vec3(pos.x, pos.y - radius, pos.z); + Vec3 posB = new Vec3(newVec.x, pos.y + radius, newVec.z); + drawMirrorPlane(ms, buffer, posA, posB, colorRadial, r.drawLines, r.drawPlanes, false); + } + } + } + + protected static void drawMirrorPlane(PoseStack ms, BufferSource renderTypeBuffer, Vec3 posA, Vec3 posB, Color c, boolean drawLines, boolean drawPlanes, boolean drawVerticalLines) { + +// GL11.glColor4d(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha); + Matrix4f matrixPos = ms.last().pose(); + + if (drawPlanes) { + VertexConsumer buffer = RenderHandler.beginPlanes(renderTypeBuffer); + + buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + buffer.vertex(matrixPos, (float) posA.x, (float) posB.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + buffer.vertex(matrixPos, (float) posB.x, (float) posA.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + buffer.vertex(matrixPos, (float) posB.x, (float) posB.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + //backface (using triangle strip) + buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + buffer.vertex(matrixPos, (float) posA.x, (float) posB.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + + RenderHandler.endPlanes(renderTypeBuffer); + } + + if (drawLines) { + VertexConsumer buffer = RenderHandler.beginLines(renderTypeBuffer); + + Vec3 middle = posA.add(posB).scale(0.5); + buffer.vertex(matrixPos, (float) posA.x, (float) middle.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + buffer.vertex(matrixPos, (float) posB.x, (float) middle.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + if (drawVerticalLines) { + buffer.vertex(matrixPos, (float) middle.x, (float) posA.y, (float) middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + buffer.vertex(matrixPos, (float) middle.x, (float) posB.y, (float) middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + } + + RenderHandler.endLines(renderTypeBuffer); + } + } + + protected static void drawMirrorPlaneY(PoseStack matrixStack, BufferSource renderTypeBuffer, Vec3 posA, Vec3 posB, Color c, boolean drawLines, boolean drawPlanes) { + +// GL11.glColor4d(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()); + Matrix4f matrixPos = matrixStack.last().pose(); + + if (drawPlanes) { + VertexConsumer buffer = RenderHandler.beginPlanes(renderTypeBuffer); + + buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + buffer.vertex(matrixPos, (float) posB.x, (float) posA.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + buffer.vertex(matrixPos, (float) posB.x, (float) posA.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + //backface (using triangle strip) + buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + + RenderHandler.endPlanes(renderTypeBuffer); + } + + if (drawLines) { + VertexConsumer buffer = RenderHandler.beginLines(renderTypeBuffer); + + Vec3 middle = posA.add(posB).scale(0.5); + buffer.vertex(matrixPos, (float) middle.x, (float) middle.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + buffer.vertex(matrixPos, (float) middle.x, (float) middle.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + buffer.vertex(matrixPos, (float) posA.x, (float) middle.y, (float) middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + buffer.vertex(matrixPos, (float) posB.x, (float) middle.y, (float) middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + + RenderHandler.endLines(renderTypeBuffer); + } + } + + protected static void drawMirrorLines(PoseStack matrixStack, BufferSource renderTypeBuffer, Mirror m) { + +// GL11.glColor4d(100, 100, 100, 255); + VertexConsumer buffer = RenderHandler.beginLines(renderTypeBuffer); + Matrix4f matrixPos = matrixStack.last().pose(); + + Vec3 pos = m.position.add(epsilon); + + buffer.vertex(matrixPos, (float) pos.x - m.radius, (float) pos.y, (float) pos.z).color(colorX.getRed(), colorX.getGreen(), colorX.getBlue(), lineAlpha).endVertex(); + buffer.vertex(matrixPos, (float) pos.x + m.radius, (float) pos.y, (float) pos.z).color(colorX.getRed(), colorX.getGreen(), colorX.getBlue(), lineAlpha).endVertex(); + buffer.vertex(matrixPos, (float) pos.x, (float) pos.y - m.radius, (float) pos.z).color(colorY.getRed(), colorY.getGreen(), colorY.getBlue(), lineAlpha).endVertex(); + buffer.vertex(matrixPos, (float) pos.x, (float) pos.y + m.radius, (float) pos.z).color(colorY.getRed(), colorY.getGreen(), colorY.getBlue(), lineAlpha).endVertex(); + buffer.vertex(matrixPos, (float) pos.x, (float) pos.y, (float) pos.z - m.radius).color(colorZ.getRed(), colorZ.getGreen(), colorZ.getBlue(), lineAlpha).endVertex(); + buffer.vertex(matrixPos, (float) pos.x, (float) pos.y, (float) pos.z + m.radius).color(colorZ.getRed(), colorZ.getGreen(), colorZ.getBlue(), lineAlpha).endVertex(); + + RenderHandler.endLines(renderTypeBuffer); + } } diff --git a/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java b/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java index cac1838..828648a 100644 --- a/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java @@ -29,24 +29,21 @@ public class RenderHandler { public static void onRender(RenderLevelStageEvent event) { if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_TRANSLUCENT_BLOCKS) return; -// Vec3 cameraPos = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); -// - PoseStack ms = event.getPoseStack(); -// BufferBuilder bufferBuilder = Tesselator.getInstance().getBuilder(); -// MultiBufferSource.BufferSource buffer = MultiBufferSource.immediate(bufferBuilder); -// -// Player player = Minecraft.getInstance().player; -// ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player); -// -// ms.pushPose(); -// ms.translate(-cameraPos.x, -cameraPos.y, -cameraPos.z); -// -// //Mirror and radial mirror lines and areas -// ModifierRenderer.render(ms, buffer, modifierSettings); -// -// ms.popPose(); + Vec3 cameraPos = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); - renderSubText(ms); + PoseStack ms = event.getPoseStack(); + BufferBuilder bufferBuilder = Tesselator.getInstance().getBuilder(); + MultiBufferSource.BufferSource buffer = MultiBufferSource.immediate(bufferBuilder); + + ms.pushPose(); + ms.translate(-cameraPos.x, -cameraPos.y, -cameraPos.z); + + //Mirror and radial mirror lines and areas + ModifierRenderer.render(ms, buffer); + + ms.popPose(); + +// renderSubText(ms); } @SubscribeEvent diff --git a/src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.fsh b/src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.fsh deleted file mode 100644 index c17257d..0000000 --- a/src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.fsh +++ /dev/null @@ -1,105 +0,0 @@ -#version 150 - -#moj_import - -uniform sampler2D Sampler0; -uniform sampler2D Sampler2; - -uniform float GameTime; -uniform vec4 ColorModulator; -uniform float FogStart; -uniform float FogEnd; -uniform vec4 FogColor; - -uniform float dissolve; // Passed in via Callback -uniform int highlight; -uniform int red; -uniform vec3 blockpos; -uniform vec3 firstpos; -uniform vec3 secondpos; - -in vec3 vertexPosition; -in float vertexDistance; -in vec4 vertexColor; -in vec2 texCoord0; -in vec4 normal; - -out vec4 fragColor; - -void main() { - //convert gametime to seconds (roughly) - float time = GameTime * 1200; - - vec3 pixelposition = floor(vertexPosition * 8.0) / 8.0; - vec3 worldpos = blockpos + pixelposition.xyz; - vec4 texcolor = texture(Sampler0, texCoord0) * vertexColor * ColorModulator; - vec4 color = texcolor; - vec3 firstposc = firstpos + 0.51; //center in block - vec3 secondposc = secondpos + 0.5; - - //find place in between first and second pos - float firstToSecond = length(secondposc - firstposc); - float place = 0.0; - if (firstToSecond > 0.5) { - float placeFromFirst = length(worldpos - firstposc) / firstToSecond; - float placeFromSecond = length(worldpos - secondposc) / firstToSecond; - place = (placeFromFirst + (1.0 - placeFromSecond)) / 2.0; - } //else only one block - - //find 2d texture coordinate for noise texture based on world position - vec2 maskcoord = vec2(worldpos.y, worldpos.z); - if (abs(normal.y) > 0.5) - maskcoord = vec2(worldpos.x, worldpos.z); - if (abs(normal.z) > 0.5) - maskcoord = vec2(worldpos.x, worldpos.y); - - maskcoord /= 20.0; - vec4 maskColor = texture(Sampler2, maskcoord); - float maskgs = maskColor.r; - - color.rgb *= vertexColor.rgb; - - //desaturate - color.rgb *= vec3(0.8); - - //add blueish hue - color.rgb += vec3(-0.1, 0.0, 0.2); - - //add pulsing blue - float pulse = (sin(time * 4.0) + 1.0) / 2.0; - color.rgb += 0.4 * vec3(-0.5, 0.2, 0.6) * pulse; - - //add diagonal highlights - float diagTime = mod(time / 2.0, 1.4) - 0.2; - float diag = smoothstep(diagTime - 0.2, diagTime, place) - smoothstep(diagTime, diagTime + 0.2, place); - color.rgb += 0.2 * diag * vec3(0.0, 0.2, 0.4); - - float diagTime2 = mod(time / 3.5, 1.4) - 0.2; - float diag2 = smoothstep(diagTime2 - 0.2, diagTime2, place) - smoothstep(diagTime2, diagTime2 + 0.2, place); - color.rgb += 0.2 * diag2 * vec3(0.0, 0.4, 0.8); - - //add flat shading -// if (abs(normal.x) > 0.5) -// color.rgb -= 0.0; - if (abs(normal.y) > 0.5) - color.rgb += 0.05; - if (abs(normal.z) > 0.5) - color.rgb -= 0.05; - - - if (highlight == 1 && dissolve == 0.0) { - color.rgb += vec3(0.0, 0.1, -0.2); - } - - if (red == 1) { - color.rgb += vec3(0.4, -0.3, -0.5); - } - - color.r = max(0, min(1, color.r)); - color.g = max(0, min(1, color.g)); - color.b = max(0, min(1, color.b)); - - if (maskgs * 0.3 + place * 0.7 <= dissolve) - fragColor = vec4(texcolor.rgb, 0.0); - else fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor); -} diff --git a/src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.json b/src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.json deleted file mode 100644 index 6af1cc9..0000000 --- a/src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "blend": { - "func": "add", - "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha" - }, - "vertex": "effortlessbuilding:dissolve", - "fragment": "effortlessbuilding:dissolve", - "attributes": [ - "Position", - "Color", - "UV0", - "UV2", - "Normal" - ], - "samplers": [ - { "name": "Sampler0" }, - { "name": "Sampler2" } - ], - "uniforms": [ - { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ChunkOffset", "type": "float", "count": 3, "values": [ 0.0, 0.0, 0.0 ] }, - { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, - { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, - { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] }, - { "name": "FogColor", "type": "float", "count": 4, "values": [ 0.0, 0.0, 0.0, 0.0 ] }, - { "name": "GameTime", "type": "float", "count": 1, "values": [ 0.0 ] }, - - { "name": "dissolve", "type": "float", "count": 1, "values": [0.0] }, - { "name": "highlight", "type": "int", "count": 1, "values": [0] }, - { "name": "red", "type": "int", "count": 1, "values": [0] }, - { "name": "blockpos", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] }, - { "name": "firstpos", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] }, - { "name": "secondpos", "type": "float", "count": 3, "values": [0.0, 0.0, 0.0] } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.vsh b/src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.vsh deleted file mode 100644 index b497445..0000000 --- a/src/main/resources/assets/effortlessbuilding/shaders/core/dissolve.vsh +++ /dev/null @@ -1,31 +0,0 @@ -#version 150 - -#moj_import - -in vec3 Position; -in vec4 Color; -in vec2 UV0; -in ivec2 UV2; -in vec3 Normal; - -uniform sampler2D Sampler2; - -uniform mat4 ModelViewMat; -uniform mat4 ProjMat; -uniform vec3 ChunkOffset; - -out vec3 vertexPosition; -out float vertexDistance; -out vec4 vertexColor; -out vec2 texCoord0; -out vec4 normal; - -void main() { - gl_Position = ProjMat * ModelViewMat * vec4(Position + ChunkOffset, 1.0); - - vertexPosition = gl_Position.xyz; - vertexDistance = length((ModelViewMat * vec4(Position + ChunkOffset, 1.0)).xyz); - vertexColor = Color; - texCoord0 = UV0; - normal = ProjMat * ModelViewMat * vec4(Normal, 0.0); -} \ No newline at end of file diff --git a/src/main/resources/assets/effortlessbuilding/shaders/core/glowing_shader.fsh b/src/main/resources/assets/effortlessbuilding/shaders/core/glowing_shader.fsh deleted file mode 100644 index ff27aab..0000000 --- a/src/main/resources/assets/effortlessbuilding/shaders/core/glowing_shader.fsh +++ /dev/null @@ -1,24 +0,0 @@ -#version 150 - -#moj_import - -uniform sampler2D Sampler0; - -uniform vec4 ColorModulator; -uniform float FogStart; -uniform float FogEnd; -uniform vec4 FogColor; - -in float vertexDistance; -in vec4 vertexColor; -in vec4 lightMapColor; -in vec2 texCoord0; -in vec4 normal; - -out vec4 fragColor; - -void main() { - vec4 color = texture(Sampler0, texCoord0) * vertexColor * ColorModulator; - color *= lightMapColor; - fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor); -} diff --git a/src/main/resources/assets/effortlessbuilding/shaders/core/glowing_shader.json b/src/main/resources/assets/effortlessbuilding/shaders/core/glowing_shader.json deleted file mode 100644 index 52cfb6d..0000000 --- a/src/main/resources/assets/effortlessbuilding/shaders/core/glowing_shader.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "blend": { - "func": "add", - "srcrgb": "srcalpha", - "dstrgb": "1-srcalpha" - }, - "vertex": "effortlessbuilding:glowing_shader", - "fragment": "effortlessbuilding:glowing_shader", - "attributes": [ - "Position", - "Color", - "UV0", - "UV1", - "UV2", - "Normal" - ], - "samplers": [ - { "name": "Sampler0" }, - { "name": "Sampler2" } - ], - "uniforms": [ - { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "IViewRotMat", "type": "matrix3x3", "count": 9, "values": [ 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0 ] }, - { "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }, - { "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] }, - { "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] }, - { "name": "FogColor", "type": "float", "count": 4, "values": [ 0.0, 0.0, 0.0, 0.0 ] }, - { "name": "FogShape", "type": "int", "count": 1, "values": [ 0 ] } - ] -} diff --git a/src/main/resources/assets/effortlessbuilding/shaders/core/glowing_shader.vsh b/src/main/resources/assets/effortlessbuilding/shaders/core/glowing_shader.vsh deleted file mode 100644 index b47f08e..0000000 --- a/src/main/resources/assets/effortlessbuilding/shaders/core/glowing_shader.vsh +++ /dev/null @@ -1,36 +0,0 @@ -#version 150 - -#moj_import - -in vec3 Position; -in vec4 Color; -in vec2 UV0; -in vec2 UV1; -in ivec2 UV2; -in vec3 Normal; - -uniform sampler2D Sampler1; -uniform sampler2D Sampler2; - -uniform mat4 ModelViewMat; -uniform mat4 ProjMat; -uniform mat3 IViewRotMat; -uniform int FogShape; - -out float vertexDistance; -out vec4 vertexColor; -out vec4 lightMapColor; -out vec2 texCoord0; -out vec2 texCoord1; -out vec4 normal; - -void main() { - gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); - - vertexDistance = fog_distance(ModelViewMat, IViewRotMat * Position, FogShape); - vertexColor = Color; - lightMapColor = texelFetch(Sampler2, UV2 / 16, 0); - texCoord0 = UV0; - texCoord1 = UV1; - normal = ProjMat * ModelViewMat * vec4(Normal, 0.0); -} diff --git a/src/main/resources/assets/effortlessbuilding/shaders/raw_color.frag b/src/main/resources/assets/effortlessbuilding/shaders/raw_color.frag deleted file mode 100644 index 41fcbdc..0000000 --- a/src/main/resources/assets/effortlessbuilding/shaders/raw_color.frag +++ /dev/null @@ -1,15 +0,0 @@ -#version 120 - -uniform sampler2D bgl_RenderedTexture; - -void main() { - vec2 texcoord = vec2(gl_TexCoord[0]); - vec4 color = texture2D(bgl_RenderedTexture, texcoord); - - float r = color.b * gl_Color.r; - float g = color.g * gl_Color.g; - float b = color.r * gl_Color.b; - float a = color.a * gl_Color.a; - - gl_FragColor = vec4(r, g, b, a); -} \ No newline at end of file diff --git a/src/main/resources/assets/effortlessbuilding/textures/gui/icons.png b/src/main/resources/assets/effortlessbuilding/textures/gui/icons.png index bc4974670bcf4193cba16d3387f7fae90f3b4c43..f5a72faea1e67c9d84d5a8521d14a8ba6b574f37 100644 GIT binary patch literal 5479 zcmeHL`#;lf*#B%!D@28SlT#8ogbqkKREToy;A~S<$f?L2=6p!Vsge*QHn%Hdf1_k$3=xKM{{DP4Fd0FX%a=k=~gWv(}Oi_@i&589{;}@Sw zFXsikkY!!pns0+#)~$S~o9nEaTPAhYYTvWyWo;XY^LTcFPl?ZB?TtJKnpxiVpi^4ar7e1Cf(0cRmt+&{^Z_jw$r5e;Td9 zt;D=(H7c~46a*6(v5uu}a(AwMWuo5}Ab^uo$N#yC6ngY$l&rA07IFg>>6mtA+D2MS zeugwuTU@(G#l@d%$H+BA-6bcZjbLmKllNFL2!F8vOR5%)kZYU50$idQ?S+SM%Nnt$km@90ze+5Jv)@c8LVPXJ?~u$5SVun)g%~=Sq;>6L_1Z-^an#N{oE&>_mp}}w=f|!D3^QQC zt?YTu=)AMmm2DMwhN4BS%MiVcyS6w57)51)vhiRbNg#HyrqiiTy6&{VPHflO&C
R}+s`W4Q`U7Wi`FW(XwyGq*~hyHIh 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