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 }