package cn.academy.core.client.util; import cn.lambdalib.annoreg.core.Registrant; import cn.lambdalib.annoreg.mc.RegInitCallback; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.Vec3; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.common.MinecraftForge; import org.lwjgl.BufferUtils; import org.lwjgl.util.vector.Matrix4f; import org.lwjgl.util.vector.Vector3f; import java.nio.FloatBuffer; import static org.lwjgl.opengl.GL11.*; /** * This class stores render camera position in world space each frame. */ @SideOnly(Side.CLIENT) @Registrant public class CameraPosition { @RegInitCallback private static void _init() { MinecraftForge.EVENT_BUS.register(new CameraPosition()); } private CameraPosition() {} private static Vector3f result; private static final Matrix4f matrix = new Matrix4f(); private static final FloatBuffer floatBuffer = BufferUtils.createFloatBuffer(16); public static Vector3f get() { if (result == null) { Minecraft mc = Minecraft.getMinecraft(); EntityPlayer p = mc.thePlayer; return new Vector3f((float) p.posX, (float) p.posY, (float) p.posZ); } else { return new Vector3f(result); } } private static final Vec3 zero = Vec3.createVectorHelper(0, 0, 0); public static Vec3 getVec3() { return zero; } @SubscribeEvent public void onRender(RenderWorldLastEvent evt) { // update result floatBuffer.clear(); glGetFloat(GL_MODELVIEW_MATRIX, floatBuffer); matrix.load(floatBuffer); matrix.invert(); if (result == null) { result = new Vector3f(); } result.set(matrix.m30, matrix.m31, matrix.m32); } }