From da711c046159fd757cf5a517859d651a3bbdd3f2 Mon Sep 17 00:00:00 2001 From: Arcaratus Date: Thu, 18 Feb 2016 21:59:10 -0500 Subject: [PATCH] Ritual holograms! --- .../api/ritual/RitualComponent.java | 5 + .../bloodmagic/client/helper/MiscIcons.java | 51 ++++++++ .../client/helper/RenderFakeBlocks.java | 68 +++++++++++ .../client/helper/ShaderHelper.java | 1 - .../client/render/RenderRitualDiviner.java | 109 ++++++++++++++++++ .../bloodmagic/proxy/ClientProxy.java | 9 +- 6 files changed, 238 insertions(+), 5 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/client/helper/MiscIcons.java create mode 100644 src/main/java/WayofTime/bloodmagic/client/helper/RenderFakeBlocks.java create mode 100644 src/main/java/WayofTime/bloodmagic/client/render/RenderRitualDiviner.java diff --git a/src/main/java/WayofTime/bloodmagic/api/ritual/RitualComponent.java b/src/main/java/WayofTime/bloodmagic/api/ritual/RitualComponent.java index c53c87dd..f8fc0b2b 100644 --- a/src/main/java/WayofTime/bloodmagic/api/ritual/RitualComponent.java +++ b/src/main/java/WayofTime/bloodmagic/api/ritual/RitualComponent.java @@ -31,6 +31,11 @@ public class RitualComponent } } + public int getY() + { + return this.getOffset().getY(); + } + public int getZ(EnumFacing direction) { switch (direction) diff --git a/src/main/java/WayofTime/bloodmagic/client/helper/MiscIcons.java b/src/main/java/WayofTime/bloodmagic/client/helper/MiscIcons.java new file mode 100644 index 00000000..45eda267 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/helper/MiscIcons.java @@ -0,0 +1,51 @@ +package WayofTime.bloodmagic.client.helper; + +import WayofTime.bloodmagic.api.Constants; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.event.TextureStitchEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; + +/** + * Courtesy of williewillus + */ +public class MiscIcons +{ + public static final MiscIcons INSTANCE = new MiscIcons(); + + public TextureAtlasSprite + ritualStoneBlankIcon, + ritualStoneWaterIcon, + ritualStoneFireIcon, + ritualStoneEarthIcon, + ritualStoneAirIcon, + ritualStoneDawnIcon, + ritualStoneDuskIcon; + + private MiscIcons() {} + + @SubscribeEvent + public void onTextureStitch(TextureStitchEvent.Pre event) + { + final String BLOCKS = "blocks"; + + ritualStoneBlankIcon = forName(event.map, "RitualStone", BLOCKS); + ritualStoneWaterIcon = forName(event.map, "WaterRitualStone", BLOCKS); + ritualStoneFireIcon = forName(event.map, "FireRitualStone", BLOCKS); + ritualStoneEarthIcon = forName(event.map, "EarthRitualStone", BLOCKS); + ritualStoneAirIcon = forName(event.map, "AirRitualStone", BLOCKS); + ritualStoneDawnIcon = forName(event.map, "LightRitualStone", BLOCKS); + ritualStoneDuskIcon = forName(event.map, "DuskRitualStone", BLOCKS); + } + + public static TextureAtlasSprite forName(TextureMap textureMap, String name) + { + return textureMap.registerSprite(new ResourceLocation(Constants.Mod.DOMAIN + name)); + } + + public static TextureAtlasSprite forName(TextureMap textureMap, String name, String dir) + { + return textureMap.registerSprite(new ResourceLocation(Constants.Mod.DOMAIN + dir + "/" + name)); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/client/helper/RenderFakeBlocks.java b/src/main/java/WayofTime/bloodmagic/client/helper/RenderFakeBlocks.java new file mode 100644 index 00000000..a3b97a90 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/helper/RenderFakeBlocks.java @@ -0,0 +1,68 @@ +package WayofTime.bloodmagic.client.helper; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.world.World; +import org.lwjgl.opengl.GL11; + +public class RenderFakeBlocks +{ + public static void drawFakeBlock(TextureAtlasSprite texture, double minX, double minY, double minZ, World world) + { + if (texture == null) + { + return; + } + + double maxX = minX + 1; + double maxY = minY + 1; + double maxZ = minZ + 1; + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer wr = tessellator.getWorldRenderer(); + Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationBlocksTexture); + + wr.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX); +// wr.setColorRGBA(255, 255, 255, 200); + + float texMinU = texture.getMinU(); + float texMinV = texture.getMinV(); + float texMaxU = texture.getMaxU(); + float texMaxV = texture.getMaxV(); + + wr.pos(minX, minY, minZ).tex(texMinU, texMinV).endVertex(); + wr.pos(maxX, minY, minZ).tex(texMaxU, texMinV).endVertex(); + wr.pos(maxX, minY, maxZ).tex(texMaxU, texMaxV).endVertex(); + wr.pos(minX, minY, maxZ).tex(texMinU, texMaxV).endVertex(); + + wr.pos(minX, maxY, maxZ).tex(texMinU, texMaxV).endVertex(); + wr.pos(maxX, maxY, maxZ).tex(texMaxU, texMaxV).endVertex(); + wr.pos(maxX, maxY, minZ).tex(texMaxU, texMinV).endVertex(); + wr.pos(minX, maxY, minZ).tex(texMinU, texMinV).endVertex(); + + wr.pos(maxX, minY, minZ).tex(texMinU, texMaxV).endVertex(); + wr.pos(minX, minY, minZ).tex(texMaxU, texMaxV).endVertex(); + wr.pos(minX, maxY, minZ).tex(texMaxU, texMinV).endVertex(); + wr.pos(maxX, maxY, minZ).tex(texMinU, texMinV).endVertex(); + + wr.pos(minX, minY, maxZ).tex(texMinU, texMaxV).endVertex(); + wr.pos(maxX, minY, maxZ).tex(texMaxU, texMaxV).endVertex(); + wr.pos(maxX, maxY, maxZ).tex(texMaxU, texMinV).endVertex(); + wr.pos(minX, maxY, maxZ).tex(texMinU, texMinV).endVertex(); + + wr.pos(minX, minY, minZ).tex(texMinU, texMaxV).endVertex(); + wr.pos(minX, minY, maxZ).tex(texMaxU, texMaxV).endVertex(); + wr.pos(minX, maxY, maxZ).tex(texMaxU, texMinV).endVertex(); + wr.pos(minX, maxY, minZ).tex(texMinU, texMinV).endVertex(); + + wr.pos(maxX, minY, maxZ).tex(texMinU, texMaxV).endVertex(); + wr.pos(maxX, minY, minZ).tex(texMaxU, texMaxV).endVertex(); + wr.pos(maxX, maxY, minZ).tex(texMaxU, texMinV).endVertex(); + wr.pos(maxX, maxY, maxZ).tex(texMinU, texMinV).endVertex(); + + tessellator.draw(); + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/bloodmagic/client/helper/ShaderHelper.java b/src/main/java/WayofTime/bloodmagic/client/helper/ShaderHelper.java index c3cc4cf7..825ba554 100644 --- a/src/main/java/WayofTime/bloodmagic/client/helper/ShaderHelper.java +++ b/src/main/java/WayofTime/bloodmagic/client/helper/ShaderHelper.java @@ -26,7 +26,6 @@ import org.lwjgl.opengl.GL11; public final class ShaderHelper { - private static final int VERT_ST = ARBVertexShader.GL_VERTEX_SHADER_ARB; private static final int FRAG_ST = ARBFragmentShader.GL_FRAGMENT_SHADER_ARB; diff --git a/src/main/java/WayofTime/bloodmagic/client/render/RenderRitualDiviner.java b/src/main/java/WayofTime/bloodmagic/client/render/RenderRitualDiviner.java new file mode 100644 index 00000000..378f6e73 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/render/RenderRitualDiviner.java @@ -0,0 +1,109 @@ +package WayofTime.bloodmagic.client.render; + +import WayofTime.bloodmagic.api.registry.RitualRegistry; +import WayofTime.bloodmagic.api.ritual.IMasterRitualStone; +import WayofTime.bloodmagic.api.ritual.Ritual; +import WayofTime.bloodmagic.api.ritual.RitualComponent; +import WayofTime.bloodmagic.client.helper.MiscIcons; +import WayofTime.bloodmagic.client.helper.RenderFakeBlocks; +import WayofTime.bloodmagic.item.ItemRitualDiviner; +import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.client.event.RenderWorldLastEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class RenderRitualDiviner +{ + @SubscribeEvent + public void render(RenderWorldLastEvent event) + { + Minecraft minecraft = Minecraft.getMinecraft(); + EntityPlayerSP player = minecraft.thePlayer; + World world = player.worldObj; + + if (minecraft.objectMouseOver == null || minecraft.objectMouseOver.typeOfHit != MovingObjectPosition.MovingObjectType.BLOCK) + { + return; + } + + TileEntity tileEntity = world.getTileEntity(minecraft.objectMouseOver.getBlockPos()); + + if (tileEntity instanceof IMasterRitualStone) + { + if (player.inventory.getCurrentItem() != null && player.inventory.getCurrentItem().getItem() instanceof ItemRitualDiviner) + { + ItemRitualDiviner ritualDiviner = (ItemRitualDiviner) player.inventory.getCurrentItem().getItem(); + EnumFacing direction = ritualDiviner.getDirection(player.inventory.getCurrentItem()); + Ritual ritual = RitualRegistry.getRitualForId(ritualDiviner.getCurrentRitual(player.inventory.getCurrentItem())); + + if (ritual == null) + { + return; + } + + GlStateManager.pushMatrix(); + GlStateManager.enableBlend(); + GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + + Vec3 vec3 = new Vec3(minecraft.objectMouseOver.getBlockPos().getX(), minecraft.objectMouseOver.getBlockPos().getY(), minecraft.objectMouseOver.getBlockPos().getZ()); + double posX = player.lastTickPosX + (player.posX - player.lastTickPosX) * event.partialTicks; + double posY = player.lastTickPosY + (player.posY - player.lastTickPosY) * event.partialTicks; + double posZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * event.partialTicks; + + for (RitualComponent ritualComponent : ritual.getComponents()) + { + Vec3 vX = vec3.add(new Vec3(ritualComponent.getX(direction), ritualComponent.getY(), ritualComponent.getZ(direction))); + double minX = vX.xCoord - posX; + double minY = vX.yCoord - posY; + double minZ = vX.zCoord - posZ; + + if (!world.getBlockState(new BlockPos(vX.xCoord, vX.yCoord, vX.zCoord)).getBlock().isOpaqueCube()) + { + TextureAtlasSprite texture = null; + + switch (ritualComponent.getRuneType()) + { + case BLANK: + texture = MiscIcons.INSTANCE.ritualStoneBlankIcon; + break; + case WATER: + texture = MiscIcons.INSTANCE.ritualStoneWaterIcon; + break; + case FIRE: + texture = MiscIcons.INSTANCE.ritualStoneFireIcon; + break; + case EARTH: + texture = MiscIcons.INSTANCE.ritualStoneEarthIcon; + break; + case AIR: + texture = MiscIcons.INSTANCE.ritualStoneAirIcon; + break; + case DAWN: + texture = MiscIcons.INSTANCE.ritualStoneDawnIcon; + break; + case DUSK: + texture = MiscIcons.INSTANCE.ritualStoneDuskIcon; + break; + } + + RenderFakeBlocks.drawFakeBlock(texture, minX, minY, minZ, world); + } + } + + GlStateManager.popMatrix(); + } + } + } +} diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index 45805212..321778fd 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -1,5 +1,7 @@ package WayofTime.bloodmagic.proxy; +import WayofTime.bloodmagic.client.helper.MiscIcons; +import WayofTime.bloodmagic.client.render.*; import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.client.model.obj.OBJLoader; import net.minecraftforge.common.MinecraftForge; @@ -8,10 +10,6 @@ import net.minecraftforge.fml.client.registry.RenderingRegistry; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.client.helper.ShaderHelper; import WayofTime.bloodmagic.client.mesh.CustomMeshDefinitionActivatable; -import WayofTime.bloodmagic.client.render.RenderAlchemyArray; -import WayofTime.bloodmagic.client.render.RenderAltar; -import WayofTime.bloodmagic.client.render.RenderDemonCrucible; -import WayofTime.bloodmagic.client.render.RenderItemRoutingNode; import WayofTime.bloodmagic.client.render.entity.BloodLightRenderFactory; import WayofTime.bloodmagic.client.render.entity.SentientArrowRenderFactory; import WayofTime.bloodmagic.client.render.entity.SoulSnareRenderFactory; @@ -56,6 +54,7 @@ public class ClientProxy extends CommonProxy OBJLoader.instance.addDomain(Constants.Mod.MODID); + MinecraftForge.EVENT_BUS.register(MiscIcons.INSTANCE); ModBlocks.initRenders(); ModItems.initRenders(); @@ -77,6 +76,8 @@ public class ClientProxy extends CommonProxy ModelLoader.setCustomMeshDefinition(ModItems.boundPickaxe, new CustomMeshDefinitionActivatable("ItemBoundPickaxe")); ModelLoader.setCustomMeshDefinition(ModItems.boundSword, new CustomMeshDefinitionActivatable("ItemBoundSword")); + MinecraftForge.EVENT_BUS.register(new RenderRitualDiviner()); + ShaderHelper.init(); }