Shader works partially
This commit is contained in:
@@ -71,9 +71,6 @@ public class BlockPreviewRenderer {
|
||||
|
||||
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) {
|
||||
|
||||
//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)
|
||||
SurvivalHelper.canPlace(player.world, player, blockPos, blockState, itemstack, modifierSettings.doQuickReplace(), Direction.UP)) {
|
||||
|
||||
// ShaderHandler.useShader(ShaderHandler.dissolve, generateShaderCallback(dissolve,
|
||||
// new Vec3d(blockPos), new Vec3d(firstPos), new Vec3d(secondPos),
|
||||
// blockPos == secondPos, red));
|
||||
RenderHandler.renderBlockPreview(matrixStack, renderTypeBuffer, dispatcher, blockPos, blockState);
|
||||
RenderHandler.renderBlockPreview(matrixStack, renderTypeBuffer, dispatcher, blockPos, blockState, dissolve, firstPos, secondPos, red);
|
||||
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) {
|
||||
|
||||
|
||||
@@ -2,14 +2,18 @@ package nl.requios.effortlessbuilding.render;
|
||||
|
||||
import com.mojang.blaze3d.platform.GlStateManager;
|
||||
import com.mojang.blaze3d.systems.RenderSystem;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.RenderState;
|
||||
import net.minecraft.client.renderer.RenderType;
|
||||
import net.minecraft.client.renderer.texture.AtlasTexture;
|
||||
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 org.lwjgl.opengl.GL11;
|
||||
import org.lwjgl.opengl.*;
|
||||
|
||||
import java.util.OptionalDouble;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
public class BuildRenderTypes {
|
||||
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 COLOR_WRITE;
|
||||
|
||||
public static final RenderState.TransparencyState MY_TRANSPARENCY;
|
||||
|
||||
public static final RenderType LINES;
|
||||
public static final RenderType PLANES;
|
||||
public static final RenderType BLOCK_PREVIEWS;
|
||||
|
||||
private static final int primaryTextureUnit = 0;
|
||||
private static final int secondaryTextureUnit = 2;
|
||||
|
||||
static {
|
||||
TRANSLUCENT_TRANSPARENCY = ObfuscationReflectionHelper.getPrivateValue(RenderState.class, null, "field_228515_g_");
|
||||
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_DISABLED = new RenderState.DiffuseLightingState(false);
|
||||
@@ -92,7 +89,10 @@ public class BuildRenderTypes {
|
||||
PLANES = RenderType.makeType("eb_planes",
|
||||
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.pushTextureAttributes();
|
||||
// RenderSystem.enableCull();
|
||||
@@ -105,8 +105,20 @@ public class BuildRenderTypes {
|
||||
//end
|
||||
// ShaderHandler.releaseShader();
|
||||
|
||||
renderState = RenderType.State.getBuilder()
|
||||
.texture(new RenderState.TextureState(AtlasTexture.LOCATION_BLOCKS_TEXTURE, false, false))
|
||||
//highjacking texturing state (which does nothing by default) to do my own things
|
||||
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)
|
||||
.diffuseLighting(DIFFUSE_LIGHTING_DISABLED)
|
||||
.alpha(DEFAULT_ALPHA)
|
||||
@@ -114,8 +126,60 @@ public class BuildRenderTypes {
|
||||
.lightmap(new RenderState.LightmapState(false))
|
||||
.overlay(new RenderState.OverlayState(false))
|
||||
.build(true);
|
||||
BLOCK_PREVIEWS = RenderType.makeType("eb_block_previews",
|
||||
DefaultVertexFormats.BLOCK, GL11.GL_QUADS, INITIAL_BUFFER_SIZE, true, true, renderState);
|
||||
return RenderType.makeType("eb_block_previews",
|
||||
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();
|
||||
}
|
||||
|
||||
protected static IVertexBuilder beginBlockPreviews(IRenderTypeBuffer.Impl renderTypeBuffer) {
|
||||
// return renderTypeBuffer.getBuffer(Atlases.getTranslucentBlockType());
|
||||
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) {
|
||||
protected static void renderBlockPreview(MatrixStack matrixStack, IRenderTypeBuffer.Impl renderTypeBuffer, BlockRendererDispatcher dispatcher,
|
||||
BlockPos blockPos, BlockState blockState, float dissolve, BlockPos firstPos, BlockPos secondPos, boolean red) {
|
||||
if (blockState == null) return;
|
||||
|
||||
matrixStack.push();
|
||||
@@ -192,8 +184,10 @@ public class RenderHandler {
|
||||
matrixStack.translate(-0.01f, -0.01f, -0.01f);
|
||||
matrixStack.scale(1.02f, 1.02f, 1.02f);
|
||||
|
||||
IVertexBuilder buffer = RenderHandler.beginBlockPreviews(renderTypeBuffer);
|
||||
// RenderType renderType = RenderTypeLookup.getRenderType(blockState);
|
||||
//Begin block preview rendering
|
||||
RenderType blockPreviewRenderType = BuildRenderTypes.getBlockPreviewRenderType(dissolve, blockPos, firstPos, secondPos, red);
|
||||
IVertexBuilder buffer = renderTypeBuffer.getBuffer(blockPreviewRenderType);
|
||||
|
||||
// MinecraftServer server = Minecraft.getInstance().getIntegratedServer();
|
||||
// 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
|
||||
matrixStack.pop();
|
||||
endBlockPreviews(renderTypeBuffer);
|
||||
renderTypeBuffer.finish();
|
||||
IVertexBuilder lineBuffer = beginLines(renderTypeBuffer);
|
||||
renderBlockOutline(matrixStack, lineBuffer, blockPos, new Vec3d(1f, 1f, 1f));
|
||||
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();
|
||||
}
|
||||
|
||||
endBlockPreviews(renderTypeBuffer);
|
||||
|
||||
renderTypeBuffer.finish();
|
||||
matrixStack.pop();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user