summaryrefslogtreecommitdiff
path: root/sample/opengl/math_code.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sample/opengl/math_code.cpp')
-rw-r--r--sample/opengl/math_code.cpp488
1 files changed, 0 insertions, 488 deletions
diff --git a/sample/opengl/math_code.cpp b/sample/opengl/math_code.cpp
deleted file mode 100644
index b744f48..0000000
--- a/sample/opengl/math_code.cpp
+++ /dev/null
@@ -1,488 +0,0 @@
-/*
- * math_code.cpp
- *
- * Created on: 21.03.2011
- * Author: ttcheblokov
- */
-
-#include "math_code.h"
-
-void cutLowerHalfspace(float result[4][4], float level, float position, float viewmatrix[4][4], float projectionmatrix[4][4])
-{
- float viewprojectionmatrix[4][4],tm[4][4],n[4][4]={1.0f,0.0f,0.0f,0.0f,0.0f,1.0f,0.0f,0.0f,0.0f,0.0f,1.0f,0.0f,0.0f,0.0f,0.0f,1.0f};
- float cplane[4],clip_plane[4];
-
- cplane[0]=0.0f;
- cplane[1]=0.1f;
- cplane[2]=0.0f;
- cplane[3]=-level*0.1f;//+0.1f;
-
- mat4Mat4Mul(viewprojectionmatrix, projectionmatrix, viewmatrix);
- mat4Inverse(tm,viewprojectionmatrix);
- mat4Vec4Mul(clip_plane,tm,cplane);
-
- //clip_plane[0]/=cplane[1];
- //clip_plane[1]/=cplane[1];
- //clip_plane[2]/=cplane[1];
- //clip_plane[3]/=cplane[1];
-
- clip_plane[3] -= 1.0f;
-
- if((level<position))
- {
- clip_plane[0] *= -1.0f;
- clip_plane[1] *= -1.0f;
- clip_plane[2] *= -1.0f;
- clip_plane[3] *= -1.0f;
- }
-
- n[0][2]=clip_plane[0];
- n[1][2]=clip_plane[1];
- n[2][2]=clip_plane[2];
- n[3][2]=clip_plane[3];
-
- mat4Mat4Mul(result,n,projectionmatrix);
-}
-
-void cutUpperHalfspace(float result[4][4], float level, float position, float viewmatrix[4][4], float projectionmatrix[4][4])
-{
- float viewprojectionmatrix[4][4],tm[4][4],n[4][4]={1.0f,0.0f,0.0f,0.0f,0.0f,1.0f,0.0f,0.0f,0.0f,0.0f,1.0f,0.0f,0.0f,0.0f,0.0f,1.0f};
- float cplane[4],clip_plane[4];
-
- cplane[0]=0.0f;
- cplane[1]=-0.1f;
- cplane[2]=0.0f;
- cplane[3]=level*0.1f;//-0.1f;
-
- mat4Mat4Mul(viewprojectionmatrix, projectionmatrix, viewmatrix);
- mat4Inverse(tm,viewprojectionmatrix);
- mat4Vec4Mul(clip_plane,tm,cplane);
-
- //clip_plane[0]/=cplane[1];
- //clip_plane[1]/=cplane[1];
- //clip_plane[2]/=cplane[1];
- //clip_plane[3]/=cplane[1];
-
- clip_plane[3] -= 1.0f;
-
- if((level>position))
- {
- clip_plane[0] *= -1.0f;
- clip_plane[1] *= -1.0f;
- clip_plane[2] *= -1.0f;
- clip_plane[3] *= -1.0f;
- }
-
- n[0][2]=clip_plane[0];
- n[1][2]=clip_plane[1];
- n[2][2]=clip_plane[2];
- n[3][2]=clip_plane[3];
-
- mat4Mat4Mul(result,n,projectionmatrix);
-}
-
-void vec3CrossProductNormalized(float result[3], float a[3], float b[3])
- {
- float length;
- result[0]=a[1]*b[2]-a[2]*b[1];
- result[1]=a[2]*b[0]-a[0]*b[2];
- result[2]=a[0]*b[1]-a[1]*b[0];
- length=sqrt(result[0]*result[0]+result[1]*result[1]+result[2]*result[2]);
- result[0]/=length;
- result[1]/=length;
- result[2]/=length;
- }
-
- void vec4Sub(float a[4], float b[4], float c[4])
- {
- a[0]=b[0]-c[0];
- a[1]=b[1]-c[1];
- a[2]=b[2]-c[2];
- a[3]=b[3]-c[3];
- }
- void vec4Add(float a[4], float b[4], float c[4])
- {
- a[0]=b[0]+c[0];
- a[1]=b[1]+c[1];
- a[2]=b[2]+c[2];
- a[3]=b[3]+c[3];
- }
- float vec4DotProduct(float a[4], float b[4])
- {
- return (a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3]);
- }
-
- float vec3DotProduct(float a[3], float b[3])
- {
- return (a[0]*b[0]+a[1]*b[1]+a[2]*b[2]);
- }
-
- void vec4Normalize(float a[4])
- {
- float length;
- length=sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+a[3]*a[3]);
- a[0]/=length;
- a[1]/=length;
- a[2]/=length;
- a[3]/=length;
- }
- void vec3Normalize(float a[4])
- {
- float length;
- length=sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);
- a[0]/=length;
- a[1]/=length;
- a[2]/=length;
- }
- void mat4Add(float result[4][4], float a[4][4], float b[4][4])
- {
- int i,j;
- for (i=0;i<4;++i)
- for (j=0;j<4;++j)
- result[i][j]=a[i][j]+b[i][j];
- }
- void mat4ConstMul(float result[4][4], float a[4][4], float b)
- {
- int i,j;
- for (i=0;i<4;++i)
- for (j=0;j<4;++j)
- result[i][j]=a[i][j]*b;
- }
- void mat4Transpose(float result[4][4], float a[4][4])
- {
- int i,j;
- for (i=0;i<4;++i)
- for (j=0;j<4;++j)
- result[i][j]=a[j][i];
- }
- void mat4Mat4Mul(float result[4][4], float a[4][4], float b[4][4])
- {
- int i,j,k;
- float temp;
-
- for (i=0;i<4;++i)
- for (j=0;j<4;++j)
- {
- temp=0;
- for(k=0;k<4;++k)
- {
- temp+=a[k][j]*b[i][k];
- }
- result[i][j]=temp;
- }
- }
- void vec4Mat4Mul(float result[4], float a[4], float b[4][4])
- {
- int i,k;
- float temp;
-
- for (i=0;i<4;++i)
- {
- temp=0;
- for(k=0;k<4;++k)
- {
- temp+=a[k]*b[k][i];
- }
- result[i]=temp;
- }
- }
- void mat4Vec4Mul(float result[4], float a[4][4], float b[4])
- {
- int i,k;
- float temp;
- for (i=0;i<4;++i)
- {
- temp=0;
- for(k=0;k<4;++k)
- {
- temp+=a[i][k]*b[k];
- }
- result[i]=temp;
- }
- }
- void mat4CreateIdentity (float result[4][4])
- {
- int i;
- for (i=0;i<4;i++)
- {
- result[i][0] = 0;
- result[i][1] = 0;
- result[i][2] = 0;
- result[i][3] = 0;
- }
- result [0][0] = 1;
- result [1][1] = 1;
- result [2][2] = 1;
- result [3][3] = 1;
- }
- void mat4CreateScale (float result[4][4], float x, float y, float z)
- {
- int i;
- for (i=0;i<4;i++)
- {
- result[i][0] = 0;
- result[i][1] = 0;
- result[i][2] = 0;
- result[i][3] = 0;
- }
- result [0][0] = x;
- result [1][1] = y;
- result [2][2] = z;
- result [3][3] = 1;
- }
-
- void mat4CreateTranslation (float result[4][4], float x, float y, float z)
- {
- int i;
- for (i=0;i<4;i++)
- {
- result[i][0] = 0;
- result[i][1] = 0;
- result[i][2] = 0;
- result[i][3] = 0;
- }
- result [3][0] = x;
- result [3][1] = y;
- result [3][2] = z;
- result [0][0] = 1;
- result [1][1] = 1;
- result [2][2] = 1;
- result [3][3] = 1;
-
- }
-
- void mat4CreateProjection (float result[4][4], float w, float h, float zn, float zf)
- {
- for (int i=0;i<4;i++)
- {
- result[i][0] = 0;
- result[i][1] = 0;
- result[i][2] = 0;
- result[i][3] = 0;
- }
- result [0][0] = zn/w;
- result [1][1] = zn/h;
- result [2][2] = -(zf+zn)/(zf-zn);
- result [3][2] = -2.0f*zf*zn/(zf-zn);
- result [2][3] = -1.0f;
- }
-
- void mat4CreateView (float result[4][4], float eyepoint[3], float lookatpoint[3])
- {
- float xaxis[3];
- float yaxis[3];
- float zaxis[3];
- float up[3] = {0.0f,0.0f, 1.0f};
-
- zaxis[0] = - lookatpoint[0] + eyepoint[0];
- zaxis[1] = - lookatpoint[1] + eyepoint[1];
- zaxis[2] = - lookatpoint[2] + eyepoint[2];
-
- vec3Normalize(zaxis);
- vec3CrossProductNormalized(xaxis, up, zaxis);
- vec3CrossProductNormalized(yaxis, zaxis, xaxis);
-
- result[0][0] = xaxis[0];
- result[0][1] = yaxis[0];
- result[0][2] = zaxis[0];
- result[0][3] = 0;
- result[1][0] = xaxis[1];
- result[1][1] = yaxis[1];
- result[1][2] = zaxis[1];
- result[1][3] = 0;
- result[2][0] = xaxis[2];
- result[2][1] = yaxis[2];
- result[2][2] = zaxis[2];
- result[2][3] = 0;
- result[3][0] = -vec3DotProduct(xaxis,eyepoint);
- result[3][1] = -vec3DotProduct(yaxis,eyepoint);
- result[3][2] = -vec3DotProduct(zaxis,eyepoint);
- result[3][3] = 1.0f;
- }
-
- void mat4CreateOrthoProjection (float result[4][4], float xmin, float xmax, float ymin, float ymax, float zmin, float zmax)
- {
- for(int i=0;i<4;i++)
- {
- result[i][0]=0;
- result[i][1]=0;
- result[i][2]=0;
- result[i][3]=0;
- }
- result[0][0] = 2.0f/(xmax-xmin);
- result[1][1] = 2.0f/(ymax-ymin);
- result[2][2] = -2.0f/(zmax-zmin);
- result[3][3] = 1.0f;
- result[3][0] = - (xmax + xmin) / (xmax - xmin);
- result[3][1] = - (ymax + ymin) / (ymax - ymin);
- result[3][2] = - (zmax + zmin) / (zmax - zmin);
-
- }
-
- void mat4CreateRotation (float result[4][4], float angle, char axis)
- {
- int i;
- for (i=0;i<4;i++)
- {
- result[i][0] = 0;
- result[i][1] = 0;
- result[i][2] = 0;
- result[i][3] = 0;
- }
- result [3][3] = 1;
-
- switch (axis)
- {
- case 'x':
- result[0][0]=1.0f;
- result[0][1]=0.0f;
- result[0][2]=0.0f;
- result[1][0]=0.0f;
- result[1][1]=cos(angle);
- result[1][2]=sin(angle);
- result[2][0]=0.0f;
- result[2][1]=-sin(angle);
- result[2][2]=cos(angle);
- break;
- case 'y':
- result[0][0]=cos(angle);
- result[0][1]=0.0f;
- result[0][2]=-sin(angle);
- result[1][0]=0.0f;
- result[1][1]=1.0f;
- result[1][2]=0.0f;
- result[2][0]=sin(angle);
- result[2][1]=0.0f;
- result[2][2]=cos(angle);
- break;
- case 'z':
- result[0][0]=cos(angle);
- result[0][1]=sin(angle);
- result[0][2]=0.0f;
- result[1][0]=-sin(angle);
- result[1][1]=cos(angle);
- result[1][2]=0.0f;
- result[2][0]=0.0f;
- result[2][1]=0.0f;
- result[2][2]=1.0f;
- break;
- }
-
- }
- float sgn (float a)
- {
- if(a>0.0f) return (1.0f);
- if(a<0.0f) return (-1.0f);
- return(0.0f);
- }
-
- float det2x2(float a,float b,
- float c,float d)
- {
- return a * d - b * c;
- }
-
- float det3x3(float a1,float a2,float a3,
- float b1,float b2,float b3,
- float c1,float c2,float c3)
- {
- float ans;
- ans = a1 * det2x2( b2, b3, c2, c3)
- - b1 * det2x2( a2, a3, c2, c3)
- + c1 * det2x2( a2, a3, b2, b3);
- return ans;
- }
-
- float det4x4(float m[4][4])
- {
- float a1,a2,a3,a4,b1,b2,b3,b4,c1,c2,c3,c4,d1,d2,d3,d4;
-
-
- a1 = m[0][0]; b1 = m[0][1];
- c1 = m[0][2]; d1 = m[0][3];
-
- a2 = m[1][0]; b2 = m[1][1];
- c2 = m[1][2]; d2 = m[1][3];
-
- a3 = m[2][0]; b3 = m[2][1];
- c3 = m[2][2]; d3 = m[2][3];
-
- a4 = m[3][0]; b4 = m[3][1];
- c4 = m[3][2]; d4 = m[3][3];
-
- return a1 * det3x3( b2, b3, b4, c2, c3, c4, d2, d3, d4)
- - b1 * det3x3( a2, a3, a4, c2, c3, c4, d2, d3, d4)
- + c1 * det3x3( a2, a3, a4, b2, b3, b4, d2, d3, d4)
- - d1 * det3x3( a2, a3, a4, b2, b3, b4, c2, c3, c4);
- }
-
- void adjoint(float adj[4][4],float m[4][4])
- {
- float a1,a2,a3,a4,b1,b2,b3,b4,c1,c2,c3,c4,d1,d2,d3,d4;
-
- a1 = m[0][0]; b1 = m[0][1];
- c1 = m[0][2]; d1 = m[0][3];
-
- a2 = m[1][0]; b2 = m[1][1];
- c2 = m[1][2]; d2 = m[1][3];
-
- a3 = m[2][0]; b3 = m[2][1];
- c3 = m[2][2]; d3 = m[2][3];
-
- a4 = m[3][0]; b4 = m[3][1];
- c4 = m[3][2]; d4 = m[3][3];
-
- adj[0][0] = det3x3( b2, b3, b4, c2, c3, c4, d2, d3, d4);
- adj[1][0] = - det3x3( a2, a3, a4, c2, c3, c4, d2, d3, d4);
- adj[2][0] = det3x3( a2, a3, a4, b2, b3, b4, d2, d3, d4);
- adj[3][0] = - det3x3( a2, a3, a4, b2, b3, b4, c2, c3, c4);
-
- adj[0][1] = - det3x3( b1, b3, b4, c1, c3, c4, d1, d3, d4);
- adj[1][1] = det3x3( a1, a3, a4, c1, c3, c4, d1, d3, d4);
- adj[2][1] = - det3x3( a1, a3, a4, b1, b3, b4, d1, d3, d4);
- adj[3][1] = det3x3( a1, a3, a4, b1, b3, b4, c1, c3, c4);
-
- adj[0][2] = det3x3( b1, b2, b4, c1, c2, c4, d1, d2, d4);
- adj[1][2] = - det3x3( a1, a2, a4, c1, c2, c4, d1, d2, d4);
- adj[2][2] = det3x3( a1, a2, a4, b1, b2, b4, d1, d2, d4);
- adj[3][2] = - det3x3( a1, a2, a4, b1, b2, b4, c1, c2, c4);
-
- adj[0][3] = - det3x3( b1, b2, b3, c1, c2, c3, d1, d2, d3);
- adj[1][3] = det3x3( a1, a2, a3, c1, c2, c3, d1, d2, d3);
- adj[2][3] = - det3x3( a1, a2, a3, b1, b2, b3, d1, d2, d3);
- adj[3][3] = det3x3( a1, a2, a3, b1, b2, b3, c1, c2, c3);
- }
-
- void mat4Inverse(float result[4][4],float source[4][4])
- {
- float adj[4][4];
- float det;
- int i,j;
-
- adjoint(adj,source);
-
- det = det4x4(source);
- if (fabs(det) < 1e-8f)
- {
- return ;
- }
- else
- {
- det = 1 / det;
- for (i = 0; i < 4; i++)
- for (j = 0; j < 4; j++)
- result[i][j] = adj[i][j] * det;
- }
- }
-
- void mat4Mat4Copy (float result[4][4], float source[4][4])
- {
- int i;
- for (i=0;i<4;i++)
- {
- result[i][0] = source[i][0];
- result[i][1] = source[i][1];
- result[i][2] = source[i][2];
- result[i][3] = source[i][3];
- }
- }