    001    package net.minecraft.client.renderer.culling;
    002
    003    import cpw.mods.fml.relauncher.Side;
    004    import cpw.mods.fml.relauncher.SideOnly;
    005    import java.nio.FloatBuffer;
    006    import net.minecraft.client.renderer.GLAllocation;
    007    import net.minecraft.util.MathHelper;
    008    import org.lwjgl.opengl.GL11;
    009
    010    @SideOnly(Side.CLIENT)
    011    public class ClippingHelperImpl extends ClippingHelper
    012    {
    013        private static ClippingHelperImpl instance = new ClippingHelperImpl();
    014        private FloatBuffer projectionMatrixBuffer = GLAllocation.createDirectFloatBuffer(16);
    015        private FloatBuffer modelviewMatrixBuffer = GLAllocation.createDirectFloatBuffer(16);
    016        private FloatBuffer field_78564_h = GLAllocation.createDirectFloatBuffer(16);
    017
    018        /**
    019         * Initialises the ClippingHelper object then returns an instance of it.
    020         */
    021        public static ClippingHelper getInstance()
    022        {
    023            instance.init();
    024            return instance;
    025        }
    026
    027        /**
    028         * Normalize the frustum.
    029         */
    030        private void normalize(float[][] par1ArrayOfFloat, int par2)
    031        {
    032            float var3 = MathHelper.sqrt_float(par1ArrayOfFloat[par2][0] * par1ArrayOfFloat[par2][0] + par1ArrayOfFloat[par2][1] * par1ArrayOfFloat[par2][1] + par1ArrayOfFloat[par2][2] * par1ArrayOfFloat[par2][2]);
    033            par1ArrayOfFloat[par2][0] /= var3;
    034            par1ArrayOfFloat[par2][1] /= var3;
    035            par1ArrayOfFloat[par2][2] /= var3;
    036            par1ArrayOfFloat[par2][3] /= var3;
    037        }
    038
    039        private void init()
    040        {
    041            this.projectionMatrixBuffer.clear();
    042            this.modelviewMatrixBuffer.clear();
    043            this.field_78564_h.clear();
    044            GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, this.projectionMatrixBuffer);
    045            GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, this.modelviewMatrixBuffer);
    046            this.projectionMatrixBuffer.flip().limit(16);
    047            this.projectionMatrixBuffer.get(this.projectionMatrix);
    048            this.modelviewMatrixBuffer.flip().limit(16);
    049            this.modelviewMatrixBuffer.get(this.modelviewMatrix);
    050            this.clippingMatrix[0] = this.modelviewMatrix[0] * this.projectionMatrix[0] + this.modelviewMatrix[1] * this.projectionMatrix[4] + this.modelviewMatrix[2] * this.projectionMatrix[8] + this.modelviewMatrix[3] * this.projectionMatrix[12];
    051            this.clippingMatrix[1] = this.modelviewMatrix[0] * this.projectionMatrix[1] + this.modelviewMatrix[1] * this.projectionMatrix[5] + this.modelviewMatrix[2] * this.projectionMatrix[9] + this.modelviewMatrix[3] * this.projectionMatrix[13];
    052            this.clippingMatrix[2] = this.modelviewMatrix[0] * this.projectionMatrix[2] + this.modelviewMatrix[1] * this.projectionMatrix[6] + this.modelviewMatrix[2] * this.projectionMatrix[10] + this.modelviewMatrix[3] * this.projectionMatrix[14];
    053            this.clippingMatrix[3] = this.modelviewMatrix[0] * this.projectionMatrix[3] + this.modelviewMatrix[1] * this.projectionMatrix[7] + this.modelviewMatrix[2] * this.projectionMatrix[11] + this.modelviewMatrix[3] * this.projectionMatrix[15];
    054            this.clippingMatrix[4] = this.modelviewMatrix[4] * this.projectionMatrix[0] + this.modelviewMatrix[5] * this.projectionMatrix[4] + this.modelviewMatrix[6] * this.projectionMatrix[8] + this.modelviewMatrix[7] * this.projectionMatrix[12];
    055            this.clippingMatrix[5] = this.modelviewMatrix[4] * this.projectionMatrix[1] + this.modelviewMatrix[5] * this.projectionMatrix[5] + this.modelviewMatrix[6] * this.projectionMatrix[9] + this.modelviewMatrix[7] * this.projectionMatrix[13];
    056            this.clippingMatrix[6] = this.modelviewMatrix[4] * this.projectionMatrix[2] + this.modelviewMatrix[5] * this.projectionMatrix[6] + this.modelviewMatrix[6] * this.projectionMatrix[10] + this.modelviewMatrix[7] * this.projectionMatrix[14];
    057            this.clippingMatrix[7] = this.modelviewMatrix[4] * this.projectionMatrix[3] + this.modelviewMatrix[5] * this.projectionMatrix[7] + this.modelviewMatrix[6] * this.projectionMatrix[11] + this.modelviewMatrix[7] * this.projectionMatrix[15];
    058            this.clippingMatrix[8] = this.modelviewMatrix[8] * this.projectionMatrix[0] + this.modelviewMatrix[9] * this.projectionMatrix[4] + this.modelviewMatrix[10] * this.projectionMatrix[8] + this.modelviewMatrix[11] * this.projectionMatrix[12];
    059            this.clippingMatrix[9] = this.modelviewMatrix[8] * this.projectionMatrix[1] + this.modelviewMatrix[9] * this.projectionMatrix[5] + this.modelviewMatrix[10] * this.projectionMatrix[9] + this.modelviewMatrix[11] * this.projectionMatrix[13];
    060            this.clippingMatrix[10] = this.modelviewMatrix[8] * this.projectionMatrix[2] + this.modelviewMatrix[9] * this.projectionMatrix[6] + this.modelviewMatrix[10] * this.projectionMatrix[10] + this.modelviewMatrix[11] * this.projectionMatrix[14];
    061            this.clippingMatrix[11] = this.modelviewMatrix[8] * this.projectionMatrix[3] + this.modelviewMatrix[9] * this.projectionMatrix[7] + this.modelviewMatrix[10] * this.projectionMatrix[11] + this.modelviewMatrix[11] * this.projectionMatrix[15];
    062            this.clippingMatrix[12] = this.modelviewMatrix[12] * this.projectionMatrix[0] + this.modelviewMatrix[13] * this.projectionMatrix[4] + this.modelviewMatrix[14] * this.projectionMatrix[8] + this.modelviewMatrix[15] * this.projectionMatrix[12];
    063            this.clippingMatrix[13] = this.modelviewMatrix[12] * this.projectionMatrix[1] + this.modelviewMatrix[13] * this.projectionMatrix[5] + this.modelviewMatrix[14] * this.projectionMatrix[9] + this.modelviewMatrix[15] * this.projectionMatrix[13];
    064            this.clippingMatrix[14] = this.modelviewMatrix[12] * this.projectionMatrix[2] + this.modelviewMatrix[13] * this.projectionMatrix[6] + this.modelviewMatrix[14] * this.projectionMatrix[10] + this.modelviewMatrix[15] * this.projectionMatrix[14];
    065            this.clippingMatrix[15] = this.modelviewMatrix[12] * this.projectionMatrix[3] + this.modelviewMatrix[13] * this.projectionMatrix[7] + this.modelviewMatrix[14] * this.projectionMatrix[11] + this.modelviewMatrix[15] * this.projectionMatrix[15];
    066            this.frustum[0][0] = this.clippingMatrix[3] - this.clippingMatrix[0];
    067            this.frustum[0][1] = this.clippingMatrix[7] - this.clippingMatrix[4];
    068            this.frustum[0][2] = this.clippingMatrix[11] - this.clippingMatrix[8];
    069            this.frustum[0][3] = this.clippingMatrix[15] - this.clippingMatrix[12];
    070            this.normalize(this.frustum, 0);
    071            this.frustum[1][0] = this.clippingMatrix[3] + this.clippingMatrix[0];
    072            this.frustum[1][1] = this.clippingMatrix[7] + this.clippingMatrix[4];
    073            this.frustum[1][2] = this.clippingMatrix[11] + this.clippingMatrix[8];
    074            this.frustum[1][3] = this.clippingMatrix[15] + this.clippingMatrix[12];
    075            this.normalize(this.frustum, 1);
    076            this.frustum[2][0] = this.clippingMatrix[3] + this.clippingMatrix[1];
    077            this.frustum[2][1] = this.clippingMatrix[7] + this.clippingMatrix[5];
    078            this.frustum[2][2] = this.clippingMatrix[11] + this.clippingMatrix[9];
    079            this.frustum[2][3] = this.clippingMatrix[15] + this.clippingMatrix[13];
    080            this.normalize(this.frustum, 2);
    081            this.frustum[3][0] = this.clippingMatrix[3] - this.clippingMatrix[1];
    082            this.frustum[3][1] = this.clippingMatrix[7] - this.clippingMatrix[5];
    083            this.frustum[3][2] = this.clippingMatrix[11] - this.clippingMatrix[9];
    084            this.frustum[3][3] = this.clippingMatrix[15] - this.clippingMatrix[13];
    085            this.normalize(this.frustum, 3);
    086            this.frustum[4][0] = this.clippingMatrix[3] - this.clippingMatrix[2];
    087            this.frustum[4][1] = this.clippingMatrix[7] - this.clippingMatrix[6];
    088            this.frustum[4][2] = this.clippingMatrix[11] - this.clippingMatrix[10];
    089            this.frustum[4][3] = this.clippingMatrix[15] - this.clippingMatrix[14];
    090            this.normalize(this.frustum, 4);
    091            this.frustum[5][0] = this.clippingMatrix[3] + this.clippingMatrix[2];
    092            this.frustum[5][1] = this.clippingMatrix[7] + this.clippingMatrix[6];
    093            this.frustum[5][2] = this.clippingMatrix[11] + this.clippingMatrix[10];
    094            this.frustum[5][3] = this.clippingMatrix[15] + this.clippingMatrix[14];
    095            this.normalize(this.frustum, 5);
    096        }
    097    }