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