More work on rendering, mostly test code and a custom rendertype.

This commit is contained in:
Christian Knaapen
2020-08-23 19:27:36 +02:00
parent e22ad0c311
commit 31f3cf3233
4 changed files with 176 additions and 67 deletions

View File

@@ -1,6 +1,7 @@
package nl.requios.effortlessbuilding; package nl.requios.effortlessbuilding;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.texture.AtlasTexture;
import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
@@ -20,6 +21,7 @@ public class ModClientEventHandler {
@SubscribeEvent @SubscribeEvent
public static void onTextureStitch(final TextureStitchEvent.Pre event) { public static void onTextureStitch(final TextureStitchEvent.Pre event) {
EffortlessBuilding.log("Stitching textures");
//register icon textures //register icon textures
for (final BuildModes.BuildModeEnum mode : BuildModes.BuildModeEnum.values()) for (final BuildModes.BuildModeEnum mode : BuildModes.BuildModeEnum.values())
{ {
@@ -37,14 +39,10 @@ public class ModClientEventHandler {
} }
public static TextureAtlasSprite getBuildModeIcon(BuildModes.BuildModeEnum mode) { public static TextureAtlasSprite getBuildModeIcon(BuildModes.BuildModeEnum mode) {
//TODO 1.15 return Minecraft.getInstance().getModelManager().getAtlasTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE).getSprite(buildModeIcons.get(mode));
return null;
// return Minecraft.getInstance().getTextureMap().getSprite(buildModeIcons.get(mode));
} }
public static TextureAtlasSprite getModeOptionIcon(ModeOptions.ActionEnum action) { public static TextureAtlasSprite getModeOptionIcon(ModeOptions.ActionEnum action) {
//TODO 1.15 return Minecraft.getInstance().getModelManager().getAtlasTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE).getSprite(modeOptionIcons.get(action));
return null;
// return Minecraft.getInstance().getTextureMap().getSprite(modeOptionIcons.get(action));
} }
} }

View File

@@ -1,5 +1,6 @@
package nl.requios.effortlessbuilding.render; package nl.requios.effortlessbuilding.render;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.SoundType; import net.minecraft.block.SoundType;
@@ -71,7 +72,7 @@ public class BlockPreviewRenderer {
private static final int primaryTextureUnit = 0; private static final int primaryTextureUnit = 0;
private static final int secondaryTextureUnit = 2; private static final int secondaryTextureUnit = 2;
public static void render(PlayerEntity player, ModifierSettings modifierSettings, ModeSettings modeSettings) { public static void render(PlayerEntity player, ModifierSettings modifierSettings, ModeSettings modeSettings, MatrixStack matrixStack) {
//Render placed blocks with dissolve effect //Render placed blocks with dissolve effect
//Use fancy shader if config allows, otherwise no dissolve //Use fancy shader if config allows, otherwise no dissolve
@@ -83,7 +84,7 @@ public class BlockPreviewRenderer {
double totalTime = MathHelper.clampedLerp(30, 60, placed.firstPos.distanceSq(placed.secondPos) / 100.0) * BuildConfig.visuals.dissolveTimeMultiplier.get(); double totalTime = MathHelper.clampedLerp(30, 60, placed.firstPos.distanceSq(placed.secondPos) / 100.0) * BuildConfig.visuals.dissolveTimeMultiplier.get();
float dissolve = (ClientProxy.ticksInGame - placed.time) / (float) totalTime; float dissolve = (ClientProxy.ticksInGame - placed.time) / (float) totalTime;
renderBlockPreviews(placed.coordinates, placed.blockStates, placed.itemStacks, dissolve, placed.firstPos, placed.secondPos, false, placed.breaking); renderBlockPreviews(placed.coordinates, placed.blockStates, placed.itemStacks, dissolve, placed.firstPos, placed.secondPos, false, placed.breaking, matrixStack);
} }
} }
RenderHandler.endBlockPreviews(); RenderHandler.endBlockPreviews();
@@ -214,7 +215,7 @@ public class BlockPreviewRenderer {
RenderHandler.beginBlockPreviews(); RenderHandler.beginBlockPreviews();
blockCount = renderBlockPreviews(newCoordinates, blockStates, itemStacks, 0f, firstPos, secondPos, !breaking, breaking); blockCount = renderBlockPreviews(newCoordinates, blockStates, itemStacks, 0f, firstPos, secondPos, !breaking, breaking, matrixStack);
RenderHandler.endBlockPreviews(); RenderHandler.endBlockPreviews();
} else { } else {
@@ -226,7 +227,7 @@ public class BlockPreviewRenderer {
for (int i = newCoordinates.size() - 1; i >= 0; i--) { for (int i = newCoordinates.size() - 1; i >= 0; i--) {
VoxelShape collisionShape = blockStates.get(i).getCollisionShape(player.world, newCoordinates.get(i)); VoxelShape collisionShape = blockStates.get(i).getCollisionShape(player.world, newCoordinates.get(i));
RenderHandler.renderBlockOutline(newCoordinates.get(i), collisionShape, color); RenderHandler.renderBlockOutline(newCoordinates.get(i), collisionShape, color, matrixStack);
} }
RenderHandler.endLines(); RenderHandler.endLines();
@@ -283,7 +284,7 @@ public class BlockPreviewRenderer {
if (!blockState.getBlock().isAir(blockState, player.world, coordinate)) { if (!blockState.getBlock().isAir(blockState, player.world, coordinate)) {
if (SurvivalHelper.canBreak(player.world, player, coordinate) || i == 0) { if (SurvivalHelper.canBreak(player.world, player, coordinate) || i == 0) {
VoxelShape collisionShape = blockState.getCollisionShape(player.world, coordinate); VoxelShape collisionShape = blockState.getCollisionShape(player.world, coordinate);
RenderHandler.renderBlockOutline(coordinate, collisionShape, new Vec3d(0f, 0f, 0f)); RenderHandler.renderBlockOutline(coordinate, collisionShape, new Vec3d(0f, 0f, 0f), matrixStack);
} }
} }
} }
@@ -300,8 +301,8 @@ public class BlockPreviewRenderer {
} }
protected static int renderBlockPreviews(List<BlockPos> coordinates, List<BlockState> blockStates, protected static int renderBlockPreviews(List<BlockPos> coordinates, List<BlockState> blockStates,
List<ItemStack> itemStacks, float dissolve, BlockPos firstPos, List<ItemStack> itemStacks, float dissolve, BlockPos firstPos,
BlockPos secondPos, boolean checkCanPlace, boolean red) { BlockPos secondPos, boolean checkCanPlace, boolean red, MatrixStack matrixStack) {
PlayerEntity player = Minecraft.getInstance().player; PlayerEntity player = Minecraft.getInstance().player;
ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player); ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player);
BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher(); BlockRendererDispatcher dispatcher = Minecraft.getInstance().getBlockRendererDispatcher();
@@ -324,7 +325,7 @@ public class BlockPreviewRenderer {
ShaderHandler.useShader(ShaderHandler.dissolve, generateShaderCallback(dissolve, ShaderHandler.useShader(ShaderHandler.dissolve, generateShaderCallback(dissolve,
new Vec3d(blockPos), new Vec3d(firstPos), new Vec3d(secondPos), new Vec3d(blockPos), new Vec3d(firstPos), new Vec3d(secondPos),
blockPos == secondPos, red)); blockPos == secondPos, red));
RenderHandler.renderBlockPreview(dispatcher, blockPos, blockState); RenderHandler.renderBlockPreview(dispatcher, blockPos, blockState, matrixStack);
blocksValid++; blocksValid++;
} }
} }
@@ -401,12 +402,14 @@ public class BlockPreviewRenderer {
//mask //mask
ARBShaderObjects.glUniform1iARB(maskUniform, secondaryTextureUnit); ARBShaderObjects.glUniform1iARB(maskUniform, secondaryTextureUnit);
glActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + secondaryTextureUnit); glActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + secondaryTextureUnit);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.getTextureManager().getTexture(ShaderHandler.shaderMaskTextureLocation).getGlTextureId()); mc.getTextureManager().getTexture(ShaderHandler.shaderMaskTextureLocation).bindTexture();
//GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.getTextureManager().getTexture(ShaderHandler.shaderMaskTextureLocation).getGlTextureId());
//image //image
ARBShaderObjects.glUniform1iARB(imageUniform, primaryTextureUnit); ARBShaderObjects.glUniform1iARB(imageUniform, primaryTextureUnit);
glActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + primaryTextureUnit); glActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + primaryTextureUnit);
GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.getTextureManager().getTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE).getGlTextureId()); mc.getTextureManager().getTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE).bindTexture();
//GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.getTextureManager().getTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE).getGlTextureId());
//blockpos //blockpos
ARBShaderObjects.glUniform3fARB(blockposUniform, (float) blockpos.x, (float) blockpos.y, (float) blockpos.z); ARBShaderObjects.glUniform3fARB(blockposUniform, (float) blockpos.x, (float) blockpos.y, (float) blockpos.z);

View File

@@ -1,5 +1,6 @@
package nl.requios.effortlessbuilding.render; package nl.requios.effortlessbuilding.render;
import com.mojang.blaze3d.matrix.MatrixStack;
import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
@@ -24,7 +25,7 @@ public class ModifierRenderer {
protected static final int planeAlpha = 75; protected static final int planeAlpha = 75;
protected static final Vec3d epsilon = new Vec3d(0.001, 0.001, 0.001); //prevents z-fighting protected static final Vec3d epsilon = new Vec3d(0.001, 0.001, 0.001); //prevents z-fighting
public static void render(ModifierSettingsManager.ModifierSettings modifierSettings) { public static void render(ModifierSettingsManager.ModifierSettings modifierSettings, MatrixStack matrixStack) {
RenderHandler.beginLines(); RenderHandler.beginLines();
//Mirror lines and areas //Mirror lines and areas

View File

@@ -1,25 +1,35 @@
package nl.requios.effortlessbuilding.render; package nl.requios.effortlessbuilding.render;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.IVertexBuilder;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.SimpleSound; import net.minecraft.client.audio.SimpleSound;
import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.entity.player.ClientPlayerEntity;
import net.minecraft.client.renderer.BlockRendererDispatcher; import net.minecraft.client.renderer.*;
import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.model.IBakedModel;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraft.client.settings.KeyBinding; import net.minecraft.client.settings.KeyBinding;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvents; import net.minecraft.util.SoundEvents;
import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.World;
import net.minecraft.world.dimension.DimensionType;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.client.event.RenderWorldLastEvent;
import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuilding;
@@ -35,27 +45,113 @@ import nl.requios.effortlessbuilding.proxy.ClientProxy;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL14; import org.lwjgl.opengl.GL14;
import java.awt.*;
import java.util.OptionalDouble;
import java.util.Random;
/*** /***
* Main render class for Effortless Building * Main render class for Effortless Building
*/ */
@Mod.EventBusSubscriber(value = Dist.CLIENT) @Mod.EventBusSubscriber(value = Dist.CLIENT)
public class RenderHandler { public class RenderHandler {
protected static final RenderState.LayerState PROJECTION_LAYERING = new RenderState.LayerState("projection_layering", () -> {
RenderSystem.matrixMode(5889);
RenderSystem.pushMatrix();
RenderSystem.scalef(1.0F, 1.0F, 0.999F);
RenderSystem.matrixMode(5888);
}, () -> {
RenderSystem.matrixMode(5889);
RenderSystem.popMatrix();
RenderSystem.matrixMode(5888);
});
protected static final RenderState.TransparencyState TRANSLUCENT_TRANSPARENCY = new RenderState.TransparencyState("translucent_transparency", () -> {
RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc();
}, () -> {
RenderSystem.disableBlend();
});
protected static final RenderState.WriteMaskState COLOR_WRITE = new RenderState.WriteMaskState(true, false);
public static final RenderType PLANES = RenderType.makeType("planes", DefaultVertexFormats.POSITION_COLOR, GL11.GL_TRIANGLE_STRIP, 256, RenderType.State.getBuilder().line(new RenderState.LineState(OptionalDouble.empty())).layer(PROJECTION_LAYERING).transparency(TRANSLUCENT_TRANSPARENCY).writeMask(COLOR_WRITE).build(false));
@SubscribeEvent @SubscribeEvent
public static void onRender(RenderWorldLastEvent event) { public static void onRender(RenderWorldLastEvent event) {
PlayerEntity player = Minecraft.getInstance().player; if(event.getPhase() != EventPriority.NORMAL)
ModeSettingsManager.ModeSettings modeSettings = ModeSettingsManager.getModeSettings(player); return;
ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player);
begin(event.getPartialTicks()); // Get instances of the classes required for a block render.
MinecraftServer server = Minecraft.getInstance().getIntegratedServer();
World world = DimensionManager.getWorld(server, DimensionType.OVERWORLD, false, true);
MatrixStack matrixStack = event.getMatrixStack();
//Mirror and radial mirror lines and areas // Get the projected view coordinates.
ModifierRenderer.render(modifierSettings); Vec3d projectedView = Minecraft.getInstance().gameRenderer.getActiveRenderInfo().getProjectedView();
//Render block previews // Choose obsidian as the arbitrary block.
BlockPreviewRenderer.render(player, modifierSettings, modeSettings); BlockState blockState = Blocks.BIRCH_LOG.getDefaultState();
end(); // Begin rendering the block.
BufferBuilder bufferBuilder = Tessellator.getInstance().getBuffer();
IRenderTypeBuffer.Impl renderTypeBuffer = IRenderTypeBuffer.getImpl(bufferBuilder);
renderBlock(matrixStack, renderTypeBuffer, world, blockState, new BlockPos(0, 128, 0), projectedView, new Vec3d(0.0, 128.0, 0.0));
renderTypeBuffer.finish();
//TEST lines
matrixStack.push();
Vec3d pos = new Vec3d(0, 0, 0);
matrixStack.translate(-projectedView.x + pos.x, -projectedView.y + pos.y, -projectedView.z + pos.z);
IVertexBuilder buffer = renderTypeBuffer.getBuffer(PLANES);
// bufferBuilder.begin(GL11.GL_TRIANGLE_STRIP, DefaultVertexFormats.POSITION_COLOR);
Vec3d posA = new Vec3d(-10, 128, -10);
Vec3d posB = new Vec3d(10, 120, 10);
Color c = new Color(255, 72, 52);
int planeAlpha = 75;
buffer.pos(posA.x, posA.y, posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex();
buffer.pos(posA.x, posB.y, posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex();
buffer.pos(posB.x, posA.y, posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex();
buffer.pos(posB.x, posB.y, posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex();
matrixStack.pop();
renderTypeBuffer.finish();
// PlayerEntity player = Minecraft.getInstance().player;
// ModeSettingsManager.ModeSettings modeSettings = ModeSettingsManager.getModeSettings(player);
// ModifierSettingsManager.ModifierSettings modifierSettings = ModifierSettingsManager.getModifierSettings(player);
//
// begin(event.getPartialTicks(), event.getMatrixStack());
//
// //Mirror and radial mirror lines and areas
// ModifierRenderer.render(modifierSettings, event.getMatrixStack());
//
// //Render block previews
// BlockPreviewRenderer.render(player, modifierSettings, modeSettings, event.getMatrixStack());
//
// end(event.getMatrixStack());
}
public static void renderBlock(MatrixStack matrixStack, IRenderTypeBuffer.Impl renderTypeBuffer, World world, BlockState blockState, BlockPos logicPos, Vec3d projectedView, Vec3d renderCoordinates)
{
BlockRendererDispatcher blockRendererDispatcher = Minecraft.getInstance().getBlockRendererDispatcher();
int i = OverlayTexture.NO_OVERLAY;
matrixStack.push();
matrixStack.translate(-projectedView.x + renderCoordinates.x, -projectedView.y + renderCoordinates.y, -projectedView.z + renderCoordinates.z);
RenderType renderType = RenderTypeLookup.getRenderType(blockState);
renderType = Atlases.getTranslucentBlockType();
IBakedModel model = blockRendererDispatcher.getModelForState(blockState);
blockRendererDispatcher.getBlockModelRenderer().renderModelBrightnessColor(matrixStack.getLast(), renderTypeBuffer.getBuffer(renderType),
blockState, model, 1f, 1f, 1f, 1000, OverlayTexture.NO_OVERLAY);
// blockRendererDispatcher.getBlockModelRenderer().renderModel(world, blockRendererDispatcher.getModelForState(blockState),
// blockState, logicPos, matrixStack, renderTypeBuffer.getBuffer(renderType), true, new Random(), blockState.getPositionRandom(logicPos), i);
matrixStack.pop();
} }
@SubscribeEvent @SubscribeEvent
@@ -140,62 +236,66 @@ public class RenderHandler {
} }
} }
private static void begin(float partialTicks) { private static void begin(float partialTicks, MatrixStack matrixStack) {
// PlayerEntity player = Minecraft.getInstance().player; // PlayerEntity player = Minecraft.getInstance().player;
// double playerX = player.prevPosX + (player.posX - player.prevPosX) * partialTicks; // double playerX = player.prevPosX + (player.posX - player.prevPosX) * partialTicks;
// double playerY = player.prevPosY + (player.posY - player.prevPosY) * partialTicks; // double playerY = player.prevPosY + (player.posY - player.prevPosY) * partialTicks;
// double playerZ = player.prevPosZ + (player.posZ - player.prevPosZ) * partialTicks; // double playerZ = player.prevPosZ + (player.posZ - player.prevPosZ) * partialTicks;
// Vec3d playerPos = new Vec3d(playerX, playerY, playerZ); // Vec3d playerPos = new Vec3d(playerX, playerY, playerZ);
GL11.glPushMatrix(); matrixStack.push();
// RenderSystem.pushMatrix();
// GL11.glTranslated(-playerPos.x, -playerPos.y, -playerPos.z); // GL11.glTranslated(-playerPos.x, -playerPos.y, -playerPos.z);
//TODO 1.15 //TODO 1.15
//RenderSystem.translated(-TileEntityRendererDispatcher.staticPlayerX, -TileEntityRendererDispatcher.staticPlayerY, -TileEntityRendererDispatcher.staticPlayerZ); // Vec3d projectedView = Minecraft.getInstance().getRenderManager().info.getProjectedView();
// RenderSystem.translated(-projectedView.x, -projectedView.y, -projectedView.z);
GL11.glDepthMask(false); RenderSystem.depthMask(false);
} }
protected static void beginLines() { protected static void beginLines() {
GL11.glPushAttrib(GL11.GL_ENABLE_BIT); RenderSystem.pushLightingAttributes(); //GL11.glPushAttrib(GL11.GL_ENABLE_BIT);
GL11.glDisable(GL11.GL_CULL_FACE); RenderSystem.pushTextureAttributes();
GL11.glDisable(GL11.GL_LIGHTING); RenderSystem.disableCull();
GL11.glDisable(GL11.GL_TEXTURE_2D); RenderSystem.disableLighting();
RenderSystem.disableTexture();
GL11.glEnable(GL11.GL_BLEND); RenderSystem.enableBlend();
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); RenderSystem.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glLineWidth(2); RenderSystem.lineWidth(2);
} }
protected static void endLines() { protected static void endLines() {
GL11.glPopAttrib(); RenderSystem.popAttributes();
} }
protected static void beginBlockPreviews() { protected static void beginBlockPreviews() {
GL11.glPushAttrib(GL11.GL_ENABLE_BIT); RenderSystem.pushLightingAttributes(); //GL11.glPushAttrib(GL11.GL_ENABLE_BIT);
GL11.glEnable(GL11.GL_CULL_FACE); RenderSystem.pushTextureAttributes();
GL11.glEnable(GL11.GL_TEXTURE_2D); RenderSystem.enableCull();
RenderSystem.enableTexture();
// Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); // Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
Minecraft.getInstance().textureManager.bindTexture(ShaderHandler.shaderMaskTextureLocation); Minecraft.getInstance().textureManager.bindTexture(ShaderHandler.shaderMaskTextureLocation);
RenderSystem.enableBlend(); RenderSystem.enableBlend();
RenderSystem.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); RenderSystem.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL14.glBlendColor(1F, 1F, 1F, 0.8f); RenderSystem.blendColor(1f, 1f, 1f, 0.8f);
} }
protected static void endBlockPreviews() { protected static void endBlockPreviews() {
ShaderHandler.releaseShader(); ShaderHandler.releaseShader();
RenderSystem.disableBlend(); RenderSystem.disableBlend();
GL11.glPopAttrib(); RenderSystem.popAttributes();
} }
private static void end() { private static void end(MatrixStack matrixStack) {
GL11.glDepthMask(true); RenderSystem.depthMask(true);
GL11.glPopMatrix(); matrixStack.pop();
} }
protected static void renderBlockPreview(BlockRendererDispatcher dispatcher, BlockPos blockPos, BlockState blockState) { protected static void renderBlockPreview(BlockRendererDispatcher dispatcher, BlockPos blockPos, BlockState blockState, MatrixStack matrixStack) {
if (blockState == null) return; if (blockState == null) return;
RenderSystem.pushMatrix(); RenderSystem.pushMatrix();
@@ -205,46 +305,53 @@ public class RenderHandler {
RenderSystem.scalef(1.02f, 1.02f, 1.02f); RenderSystem.scalef(1.02f, 1.02f, 1.02f);
//TODO 1.15 //TODO 1.15
// try { try {
IRenderTypeBuffer.Impl bufferSource = Minecraft.getInstance().getRenderTypeBuffers().getBufferSource();
dispatcher.renderBlock(blockState, matrixStack, bufferSource, 1, 1);
bufferSource.finish();
// dispatcher.renderBlockBrightness(blockState, 0.85f); // dispatcher.renderBlockBrightness(blockState, 0.85f);
// } catch (NullPointerException e) { } catch (NullPointerException e) {
// EffortlessBuilding.logger.warn("RenderHandler::renderBlockPreview cannot render " + blockState.getBlock().toString()); EffortlessBuilding.logger.warn("RenderHandler::renderBlockPreview cannot render " + blockState.getBlock().toString());
//
// //Render outline as backup //Render outline as backup
// RenderSystem.popMatrix(); RenderSystem.popMatrix();
//// ShaderHandler.releaseShader(); // ShaderHandler.releaseShader();
// GL11.glDisable(GL11.GL_LIGHTING); GL11.glDisable(GL11.GL_LIGHTING);
// renderBlockOutline(blockPos, new Vec3d(1f, 1f, 1f)); renderBlockOutline(blockPos, new Vec3d(1f, 1f, 1f), matrixStack);
// GL11.glEnable(GL11.GL_LIGHTING); GL11.glEnable(GL11.GL_LIGHTING);
// RenderSystem.pushMatrix(); RenderSystem.pushMatrix();
// } }
RenderSystem.popMatrix(); RenderSystem.popMatrix();
} }
protected static void renderBlockOutline(BlockPos pos, Vec3d color) { protected static void renderBlockOutline(BlockPos pos, Vec3d color, MatrixStack matrixStack) {
renderBlockOutline(pos, pos, color); renderBlockOutline(pos, pos, color, matrixStack);
} }
//Renders outline. Pos1 has to be minimal x,y,z and pos2 maximal x,y,z //Renders outline. Pos1 has to be minimal x,y,z and pos2 maximal x,y,z
protected static void renderBlockOutline(BlockPos pos1, BlockPos pos2, Vec3d color) { protected static void renderBlockOutline(BlockPos pos1, BlockPos pos2, Vec3d color, MatrixStack matrixStack) {
GL11.glLineWidth(2); RenderSystem.lineWidth(2);
AxisAlignedBB aabb = new AxisAlignedBB(pos1, pos2.add(1, 1, 1)).grow(0.0020000000949949026); AxisAlignedBB aabb = new AxisAlignedBB(pos1, pos2.add(1, 1, 1)).grow(0.0020000000949949026);
//TODO 1.15 //TODO 1.15
IVertexBuilder buffer = Minecraft.getInstance().getRenderTypeBuffers().getBufferSource().getBuffer(RenderType.LINES);
WorldRenderer.drawBoundingBox(matrixStack, buffer, aabb, (float) color.x, (float) color.y, (float) color.z, 0.4f);
// WorldRenderer.drawSelectionBoundingBox(aabb, (float) color.x, (float) color.y, (float) color.z, 0.4f); // WorldRenderer.drawSelectionBoundingBox(aabb, (float) color.x, (float) color.y, (float) color.z, 0.4f);
} }
//Renders outline with given bounding box //Renders outline with given bounding box
protected static void renderBlockOutline(BlockPos pos, VoxelShape collisionShape, Vec3d color) { protected static void renderBlockOutline(BlockPos pos, VoxelShape collisionShape, Vec3d color, MatrixStack matrixStack) {
GL11.glLineWidth(2); RenderSystem.lineWidth(2);
// AxisAlignedBB aabb = boundingBox.offset(pos).grow(0.0020000000949949026); // AxisAlignedBB aabb = boundingBox.offset(pos).grow(0.0020000000949949026);
// VoxelShape voxelShape = collisionShape.withOffset(pos.getX(), pos.getY(), pos.getZ()); // VoxelShape voxelShape = collisionShape.withOffset(pos.getX(), pos.getY(), pos.getZ());
// WorldRenderer.drawSelectionBoundingBox(aabb, (float) color.x, (float) color.y, (float) color.z, 0.4f); // WorldRenderer.drawSelectionBoundingBox(aabb, (float) color.x, (float) color.y, (float) color.z, 0.4f);
//TODO 1.15 //TODO 1.15
IVertexBuilder buffer = Minecraft.getInstance().getRenderTypeBuffers().getBufferSource().getBuffer(RenderType.LINES);
WorldRenderer.drawVoxelShapeParts(matrixStack, buffer, collisionShape, pos.getX(), pos.getY(), pos.getZ(), (float) color.x, (float) color.y, (float) color.z, 0.4f);
// WorldRenderer.drawShape(collisionShape, pos.getX(), pos.getY(), pos.getZ(), (float) color.x, (float) color.y, (float) color.z, 0.4f); // WorldRenderer.drawShape(collisionShape, pos.getX(), pos.getY(), pos.getZ(), (float) color.x, (float) color.y, (float) color.z, 0.4f);
} }