Ritual holograms!

This commit is contained in:
Arcaratus 2016-02-18 21:59:10 -05:00
parent 035ba94976
commit da711c0461
6 changed files with 238 additions and 5 deletions

View file

@ -31,6 +31,11 @@ public class RitualComponent
}
}
public int getY()
{
return this.getOffset().getY();
}
public int getZ(EnumFacing direction)
{
switch (direction)

View file

@ -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 <a href="https://github.com/williewillus/Botania/blob/MC18/"></a>
*/
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));
}
}

View file

@ -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();
}
}

View file

@ -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;

View file

@ -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();
}
}
}
}

View file

@ -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();
}