Shader works partially
This commit is contained in:
@@ -71,9 +71,6 @@ public class BlockPreviewRenderer {
|
|||||||
|
|
||||||
private static List<PlacedData> placedDataList = new ArrayList<>();
|
private static List<PlacedData> placedDataList = new ArrayList<>();
|
||||||
|
|
||||||
private static final int primaryTextureUnit = 0;
|
|
||||||
private static final int secondaryTextureUnit = 2;
|
|
||||||
|
|
||||||
public static void render(MatrixStack matrixStack, IRenderTypeBuffer.Impl renderTypeBuffer, PlayerEntity player, ModifierSettings modifierSettings, ModeSettings modeSettings) {
|
public static void render(MatrixStack matrixStack, IRenderTypeBuffer.Impl renderTypeBuffer, PlayerEntity player, ModifierSettings modifierSettings, ModeSettings modeSettings) {
|
||||||
|
|
||||||
//Render placed blocks with dissolve effect
|
//Render placed blocks with dissolve effect
|
||||||
@@ -316,10 +313,7 @@ public class BlockPreviewRenderer {
|
|||||||
if ((!checkCanPlace /*&& player.world.getNewBlockState(blockPos) == blockState*/) || //TODO enable (breaks the breaking shader)
|
if ((!checkCanPlace /*&& player.world.getNewBlockState(blockPos) == blockState*/) || //TODO enable (breaks the breaking shader)
|
||||||
SurvivalHelper.canPlace(player.world, player, blockPos, blockState, itemstack, modifierSettings.doQuickReplace(), Direction.UP)) {
|
SurvivalHelper.canPlace(player.world, player, blockPos, blockState, itemstack, modifierSettings.doQuickReplace(), Direction.UP)) {
|
||||||
|
|
||||||
// ShaderHandler.useShader(ShaderHandler.dissolve, generateShaderCallback(dissolve,
|
RenderHandler.renderBlockPreview(matrixStack, renderTypeBuffer, dispatcher, blockPos, blockState, dissolve, firstPos, secondPos, red);
|
||||||
// new Vec3d(blockPos), new Vec3d(firstPos), new Vec3d(secondPos),
|
|
||||||
// blockPos == secondPos, red));
|
|
||||||
RenderHandler.renderBlockPreview(matrixStack, renderTypeBuffer, dispatcher, blockPos, blockState);
|
|
||||||
blocksValid++;
|
blocksValid++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -376,57 +370,6 @@ public class BlockPreviewRenderer {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Consumer<Integer> generateShaderCallback(final float dissolve, final Vec3d blockpos,
|
|
||||||
final Vec3d firstpos, final Vec3d secondpos,
|
|
||||||
final boolean highlight, final boolean red) {
|
|
||||||
Minecraft mc = Minecraft.getInstance();
|
|
||||||
return (Integer shader) -> {
|
|
||||||
int percentileUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "dissolve");
|
|
||||||
int highlightUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "highlight");
|
|
||||||
int redUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "red");
|
|
||||||
int blockposUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "blockpos");
|
|
||||||
int firstposUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "firstpos");
|
|
||||||
int secondposUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "secondpos");
|
|
||||||
int imageUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "image");
|
|
||||||
int maskUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "mask");
|
|
||||||
|
|
||||||
RenderSystem.enableTexture();
|
|
||||||
GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
|
|
||||||
|
|
||||||
//mask
|
|
||||||
ARBShaderObjects.glUniform1iARB(maskUniform, secondaryTextureUnit);
|
|
||||||
glActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + secondaryTextureUnit);
|
|
||||||
mc.getTextureManager().getTexture(ShaderHandler.shaderMaskTextureLocation).bindTexture();
|
|
||||||
//GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.getTextureManager().getTexture(ShaderHandler.shaderMaskTextureLocation).getGlTextureId());
|
|
||||||
|
|
||||||
//image
|
|
||||||
ARBShaderObjects.glUniform1iARB(imageUniform, primaryTextureUnit);
|
|
||||||
glActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + primaryTextureUnit);
|
|
||||||
mc.getTextureManager().getTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE).bindTexture();
|
|
||||||
//GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.getTextureManager().getTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE).getGlTextureId());
|
|
||||||
|
|
||||||
//blockpos
|
|
||||||
ARBShaderObjects.glUniform3fARB(blockposUniform, (float) blockpos.x, (float) blockpos.y, (float) blockpos.z);
|
|
||||||
ARBShaderObjects.glUniform3fARB(firstposUniform, (float) firstpos.x, (float) firstpos.y, (float) firstpos.z);
|
|
||||||
ARBShaderObjects.glUniform3fARB(secondposUniform, (float) secondpos.x, (float) secondpos.y, (float) secondpos.z);
|
|
||||||
|
|
||||||
//dissolve
|
|
||||||
ARBShaderObjects.glUniform1fARB(percentileUniform, dissolve);
|
|
||||||
//highlight
|
|
||||||
ARBShaderObjects.glUniform1iARB(highlightUniform, highlight ? 1 : 0);
|
|
||||||
//red
|
|
||||||
ARBShaderObjects.glUniform1iARB(redUniform, red ? 1 : 0);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void glActiveTexture(int texture) {
|
|
||||||
if (GL.getCapabilities().GL_ARB_multitexture && !GL.getCapabilities().OpenGL13) {
|
|
||||||
ARBMultitexture.glActiveTextureARB(texture);
|
|
||||||
} else {
|
|
||||||
GL13.glActiveTexture(texture);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void sortOnDistanceToPlayer(List<BlockPos> coordinates, PlayerEntity player) {
|
private static void sortOnDistanceToPlayer(List<BlockPos> coordinates, PlayerEntity player) {
|
||||||
|
|
||||||
|
|||||||
@@ -2,14 +2,18 @@ package nl.requios.effortlessbuilding.render;
|
|||||||
|
|
||||||
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 net.minecraft.client.Minecraft;
|
||||||
import net.minecraft.client.renderer.RenderState;
|
import net.minecraft.client.renderer.RenderState;
|
||||||
import net.minecraft.client.renderer.RenderType;
|
import net.minecraft.client.renderer.RenderType;
|
||||||
import net.minecraft.client.renderer.texture.AtlasTexture;
|
import net.minecraft.client.renderer.texture.AtlasTexture;
|
||||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Vec3d;
|
||||||
import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
|
import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
|
||||||
import org.lwjgl.opengl.GL11;
|
import org.lwjgl.opengl.*;
|
||||||
|
|
||||||
import java.util.OptionalDouble;
|
import java.util.OptionalDouble;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
public class BuildRenderTypes {
|
public class BuildRenderTypes {
|
||||||
public static final RenderState.TransparencyState TRANSLUCENT_TRANSPARENCY;
|
public static final RenderState.TransparencyState TRANSLUCENT_TRANSPARENCY;
|
||||||
@@ -27,22 +31,15 @@ public class BuildRenderTypes {
|
|||||||
public static final RenderState.WriteMaskState WRITE_TO_DEPTH_AND_COLOR;
|
public static final RenderState.WriteMaskState WRITE_TO_DEPTH_AND_COLOR;
|
||||||
public static final RenderState.WriteMaskState COLOR_WRITE;
|
public static final RenderState.WriteMaskState COLOR_WRITE;
|
||||||
|
|
||||||
public static final RenderState.TransparencyState MY_TRANSPARENCY;
|
|
||||||
|
|
||||||
public static final RenderType LINES;
|
public static final RenderType LINES;
|
||||||
public static final RenderType PLANES;
|
public static final RenderType PLANES;
|
||||||
public static final RenderType BLOCK_PREVIEWS;
|
|
||||||
|
private static final int primaryTextureUnit = 0;
|
||||||
|
private static final int secondaryTextureUnit = 2;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
TRANSLUCENT_TRANSPARENCY = ObfuscationReflectionHelper.getPrivateValue(RenderState.class, null, "field_228515_g_");
|
TRANSLUCENT_TRANSPARENCY = ObfuscationReflectionHelper.getPrivateValue(RenderState.class, null, "field_228515_g_");
|
||||||
NO_TRANSPARENCY = ObfuscationReflectionHelper.getPrivateValue(RenderState.class, null, "field_228510_b_");
|
NO_TRANSPARENCY = ObfuscationReflectionHelper.getPrivateValue(RenderState.class, null, "field_228510_b_");
|
||||||
MY_TRANSPARENCY = new RenderState.TransparencyState("eb_transparency", () -> {
|
|
||||||
RenderSystem.enableBlend();
|
|
||||||
RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);
|
|
||||||
}, () -> {
|
|
||||||
RenderSystem.disableBlend();
|
|
||||||
RenderSystem.defaultBlendFunc();
|
|
||||||
});
|
|
||||||
|
|
||||||
DIFFUSE_LIGHTING_ENABLED = new RenderState.DiffuseLightingState(true);
|
DIFFUSE_LIGHTING_ENABLED = new RenderState.DiffuseLightingState(true);
|
||||||
DIFFUSE_LIGHTING_DISABLED = new RenderState.DiffuseLightingState(false);
|
DIFFUSE_LIGHTING_DISABLED = new RenderState.DiffuseLightingState(false);
|
||||||
@@ -92,7 +89,10 @@ public class BuildRenderTypes {
|
|||||||
PLANES = RenderType.makeType("eb_planes",
|
PLANES = RenderType.makeType("eb_planes",
|
||||||
DefaultVertexFormats.POSITION_COLOR, GL11.GL_TRIANGLE_STRIP, INITIAL_BUFFER_SIZE, renderState);
|
DefaultVertexFormats.POSITION_COLOR, GL11.GL_TRIANGLE_STRIP, INITIAL_BUFFER_SIZE, renderState);
|
||||||
|
|
||||||
//BLOCK PREVIEWS
|
}
|
||||||
|
|
||||||
|
public static RenderType getBlockPreviewRenderType(float dissolve, BlockPos blockPos, BlockPos firstPos,
|
||||||
|
BlockPos secondPos, boolean red) {
|
||||||
// RenderSystem.pushLightingAttributes();
|
// RenderSystem.pushLightingAttributes();
|
||||||
// RenderSystem.pushTextureAttributes();
|
// RenderSystem.pushTextureAttributes();
|
||||||
// RenderSystem.enableCull();
|
// RenderSystem.enableCull();
|
||||||
@@ -105,8 +105,20 @@ public class BuildRenderTypes {
|
|||||||
//end
|
//end
|
||||||
// ShaderHandler.releaseShader();
|
// ShaderHandler.releaseShader();
|
||||||
|
|
||||||
renderState = RenderType.State.getBuilder()
|
//highjacking texturing state (which does nothing by default) to do my own things
|
||||||
.texture(new RenderState.TextureState(AtlasTexture.LOCATION_BLOCKS_TEXTURE, false, false))
|
RenderState.TexturingState MY_TEXTURING = new RenderState.TexturingState("eb_texturing", () -> {
|
||||||
|
// RenderSystem.pushLightingAttributes();
|
||||||
|
// RenderSystem.pushTextureAttributes();
|
||||||
|
ShaderHandler.useShader(ShaderHandler.dissolve, generateShaderCallback(dissolve, new Vec3d(blockPos), new Vec3d(firstPos), new Vec3d(secondPos), blockPos == secondPos, red));
|
||||||
|
|
||||||
|
RenderSystem.blendColor(1f, 1f, 1f, 0.8f);
|
||||||
|
}, () -> {
|
||||||
|
ShaderHandler.releaseShader();
|
||||||
|
});
|
||||||
|
|
||||||
|
RenderType.State renderState = RenderType.State.getBuilder()
|
||||||
|
.texture(new RenderState.TextureState(ShaderHandler.shaderMaskTextureLocation, false, false))
|
||||||
|
.texturing(MY_TEXTURING)
|
||||||
.transparency(TRANSLUCENT_TRANSPARENCY)
|
.transparency(TRANSLUCENT_TRANSPARENCY)
|
||||||
.diffuseLighting(DIFFUSE_LIGHTING_DISABLED)
|
.diffuseLighting(DIFFUSE_LIGHTING_DISABLED)
|
||||||
.alpha(DEFAULT_ALPHA)
|
.alpha(DEFAULT_ALPHA)
|
||||||
@@ -114,8 +126,60 @@ public class BuildRenderTypes {
|
|||||||
.lightmap(new RenderState.LightmapState(false))
|
.lightmap(new RenderState.LightmapState(false))
|
||||||
.overlay(new RenderState.OverlayState(false))
|
.overlay(new RenderState.OverlayState(false))
|
||||||
.build(true);
|
.build(true);
|
||||||
BLOCK_PREVIEWS = RenderType.makeType("eb_block_previews",
|
return RenderType.makeType("eb_block_previews",
|
||||||
DefaultVertexFormats.BLOCK, GL11.GL_QUADS, INITIAL_BUFFER_SIZE, true, true, renderState);
|
DefaultVertexFormats.BLOCK, GL11.GL_QUADS, 256, true, true, renderState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static Consumer<Integer> generateShaderCallback(final float dissolve, final Vec3d blockpos,
|
||||||
|
final Vec3d firstpos, final Vec3d secondpos,
|
||||||
|
final boolean highlight, final boolean red) {
|
||||||
|
Minecraft mc = Minecraft.getInstance();
|
||||||
|
return (Integer shader) -> {
|
||||||
|
int percentileUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "dissolve");
|
||||||
|
int highlightUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "highlight");
|
||||||
|
int redUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "red");
|
||||||
|
int blockposUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "blockpos");
|
||||||
|
int firstposUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "firstpos");
|
||||||
|
int secondposUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "secondpos");
|
||||||
|
int imageUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "image");
|
||||||
|
int maskUniform = ARBShaderObjects.glGetUniformLocationARB(shader, "mask");
|
||||||
|
|
||||||
|
RenderSystem.enableTexture();
|
||||||
|
GL11.glGetInteger(GL11.GL_TEXTURE_BINDING_2D);
|
||||||
|
|
||||||
|
//mask
|
||||||
|
ARBShaderObjects.glUniform1iARB(maskUniform, secondaryTextureUnit);
|
||||||
|
glActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + secondaryTextureUnit);
|
||||||
|
mc.getTextureManager().getTexture(ShaderHandler.shaderMaskTextureLocation).bindTexture();
|
||||||
|
//GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.getTextureManager().getTexture(ShaderHandler.shaderMaskTextureLocation).getGlTextureId());
|
||||||
|
|
||||||
|
//image
|
||||||
|
ARBShaderObjects.glUniform1iARB(imageUniform, primaryTextureUnit);
|
||||||
|
glActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + primaryTextureUnit);
|
||||||
|
mc.getTextureManager().getTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE).bindTexture();
|
||||||
|
//GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.getTextureManager().getTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE).getGlTextureId());
|
||||||
|
|
||||||
|
//blockpos
|
||||||
|
ARBShaderObjects.glUniform3fARB(blockposUniform, (float) blockpos.x, (float) blockpos.y, (float) blockpos.z);
|
||||||
|
ARBShaderObjects.glUniform3fARB(firstposUniform, (float) firstpos.x, (float) firstpos.y, (float) firstpos.z);
|
||||||
|
ARBShaderObjects.glUniform3fARB(secondposUniform, (float) secondpos.x, (float) secondpos.y, (float) secondpos.z);
|
||||||
|
|
||||||
|
//dissolve
|
||||||
|
ARBShaderObjects.glUniform1fARB(percentileUniform, dissolve);
|
||||||
|
//highlight
|
||||||
|
ARBShaderObjects.glUniform1iARB(highlightUniform, highlight ? 1 : 0);
|
||||||
|
//red
|
||||||
|
ARBShaderObjects.glUniform1iARB(redUniform, red ? 1 : 0);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void glActiveTexture(int texture) {
|
||||||
|
if (GL.getCapabilities().GL_ARB_multitexture && !GL.getCapabilities().OpenGL13) {
|
||||||
|
ARBMultitexture.glActiveTextureARB(texture);
|
||||||
|
} else {
|
||||||
|
GL13.glActiveTexture(texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -174,16 +174,8 @@ public class RenderHandler {
|
|||||||
renderTypeBuffer.finish();
|
renderTypeBuffer.finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static IVertexBuilder beginBlockPreviews(IRenderTypeBuffer.Impl renderTypeBuffer) {
|
protected static void renderBlockPreview(MatrixStack matrixStack, IRenderTypeBuffer.Impl renderTypeBuffer, BlockRendererDispatcher dispatcher,
|
||||||
// return renderTypeBuffer.getBuffer(Atlases.getTranslucentBlockType());
|
BlockPos blockPos, BlockState blockState, float dissolve, BlockPos firstPos, BlockPos secondPos, boolean red) {
|
||||||
return renderTypeBuffer.getBuffer(BuildRenderTypes.BLOCK_PREVIEWS);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static void endBlockPreviews(IRenderTypeBuffer.Impl renderTypeBuffer) {
|
|
||||||
renderTypeBuffer.finish();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static void renderBlockPreview(MatrixStack matrixStack, IRenderTypeBuffer.Impl renderTypeBuffer, BlockRendererDispatcher dispatcher, BlockPos blockPos, BlockState blockState) {
|
|
||||||
if (blockState == null) return;
|
if (blockState == null) return;
|
||||||
|
|
||||||
matrixStack.push();
|
matrixStack.push();
|
||||||
@@ -192,8 +184,10 @@ public class RenderHandler {
|
|||||||
matrixStack.translate(-0.01f, -0.01f, -0.01f);
|
matrixStack.translate(-0.01f, -0.01f, -0.01f);
|
||||||
matrixStack.scale(1.02f, 1.02f, 1.02f);
|
matrixStack.scale(1.02f, 1.02f, 1.02f);
|
||||||
|
|
||||||
IVertexBuilder buffer = RenderHandler.beginBlockPreviews(renderTypeBuffer);
|
//Begin block preview rendering
|
||||||
// RenderType renderType = RenderTypeLookup.getRenderType(blockState);
|
RenderType blockPreviewRenderType = BuildRenderTypes.getBlockPreviewRenderType(dissolve, blockPos, firstPos, secondPos, red);
|
||||||
|
IVertexBuilder buffer = renderTypeBuffer.getBuffer(blockPreviewRenderType);
|
||||||
|
|
||||||
// MinecraftServer server = Minecraft.getInstance().getIntegratedServer();
|
// MinecraftServer server = Minecraft.getInstance().getIntegratedServer();
|
||||||
// World world = DimensionManager.getWorld(server, DimensionType.OVERWORLD, false, true);
|
// World world = DimensionManager.getWorld(server, DimensionType.OVERWORLD, false, true);
|
||||||
|
|
||||||
@@ -208,16 +202,15 @@ public class RenderHandler {
|
|||||||
|
|
||||||
//Render outline as backup, escape out of the current renderstack
|
//Render outline as backup, escape out of the current renderstack
|
||||||
matrixStack.pop();
|
matrixStack.pop();
|
||||||
endBlockPreviews(renderTypeBuffer);
|
renderTypeBuffer.finish();
|
||||||
IVertexBuilder lineBuffer = beginLines(renderTypeBuffer);
|
IVertexBuilder lineBuffer = beginLines(renderTypeBuffer);
|
||||||
renderBlockOutline(matrixStack, lineBuffer, blockPos, new Vec3d(1f, 1f, 1f));
|
renderBlockOutline(matrixStack, lineBuffer, blockPos, new Vec3d(1f, 1f, 1f));
|
||||||
endLines(renderTypeBuffer);
|
endLines(renderTypeBuffer);
|
||||||
buffer = beginBlockPreviews(renderTypeBuffer);
|
buffer = renderTypeBuffer.getBuffer(Atlases.getTranslucentBlockType()); //any type will do, as long as we have something on the stack
|
||||||
matrixStack.push();
|
matrixStack.push();
|
||||||
}
|
}
|
||||||
|
|
||||||
endBlockPreviews(renderTypeBuffer);
|
renderTypeBuffer.finish();
|
||||||
|
|
||||||
matrixStack.pop();
|
matrixStack.pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user