void rebuildMatrices() { if (!needsRebuild) { return; } needsRebuild = false; warp_Vector forward, up, right; forward = warp_Vector.sub(lookat, pos); up = new warp_Vector(0f, 1f, 0f); right = warp_Vector.getNormal(up, forward); up = warp_Vector.getNormal(forward, right); forward.normalize(); up.normalize(); right.normalize(); normalmatrix = new warp_Matrix(right, up, forward); normalmatrix.rotate(0, 0, rollfactor); matrix = normalmatrix.getClone(); matrix.shift(pos.x, pos.y, pos.z); normalmatrix = normalmatrix.inverse(); matrix = matrix.inverse(); }
public void project(warp_Matrix vertexProjection, warp_Matrix normalProjection, warp_Camera camera) // Projects this vertex into camera space { pos2 = pos.transform(vertexProjection); n2 = n.transform(normalProjection); float fact; if (camera.isOrthographic) { x = (int)(pos2.x * (camera.screenscale / camera.orthoViewWidth) + (camera.screenwidth >> 1)); y = (int)(-pos2.y * (camera.screenscale / camera.orthoViewHeight) + (camera.screenheight >> 1)); } else { fact = camera.screenscale / camera.fovfact / ((pos2.z > 0.1) ? pos2.z : 0.1f); x = (int)(pos2.x * fact + (camera.screenwidth >> 1)); y = (int)(-pos2.y * fact + (camera.screenheight >> 1)); } z = (int)(65536f * pos2.z); sw = -(pos2.z); nx = (int)(n2.x * 127 + 127); ny = (int)(n2.y * 127 + 127); if (parent.material == null) { return; } if (parent.material.texture == null) { return; } tx = (int)((float)parent.material.texture.width * u); ty = (int)((float)parent.material.texture.height * v); }
public warp_Matrix inverse() { warp_Matrix m = new warp_Matrix(); float q1 = m12; float q6 = m10 * m01; float q7 = m10 * m21; float q8 = m02; float q13 = m20 * m01; float q14 = m20 * m11; float q21 = m02 * m21; float q22 = m03 * m21; float q25 = m01 * m12; float q26 = m01 * m13; float q27 = m02 * m11; float q28 = m03 * m11; float q29 = m10 * m22; float q30 = m10 * m23; float q31 = m20 * m12; float q32 = m20 * m13; float q35 = m00 * m22; float q36 = m00 * m23; float q37 = m20 * m02; float q38 = m20 * m03; float q41 = m00 * m12; float q42 = m00 * m13; float q43 = m10 * m02; float q44 = m10 * m03; float q45 = m00 * m11; float q48 = m00 * m21; float q49 = q45 * m22 - q48 * q1 - q6 * m22 + q7 * q8; float q50 = q13 * q1 - q14 * q8; float q51 = 1 / (q49 + q50); m.m00 = (m11 * m22 * m33 - m11 * m23 * m32 - m21 * m12 * m33 + m21 * m13 * m32 + m31 * m12 * m23 - m31 * m13 * m22) * q51; m.m01 = -(m01 * m22 * m33 - m01 * m23 * m32 - q21 * m33 + q22 * m32) * q51; m.m02 = (q25 * m33 - q26 * m32 - q27 * m33 + q28 * m32) * q51; m.m03 = -(q25 * m23 - q26 * m22 - q27 * m23 + q28 * m22 + q21 * m13 - q22 * m12) * q51; m.m10 = -(q29 * m33 - q30 * m32 - q31 * m33 + q32 * m32) * q51; m.m11 = (q35 * m33 - q36 * m32 - q37 * m33 + q38 * m32) * q51; m.m12 = -(q41 * m33 - q42 * m32 - q43 * m33 + q44 * m32) * q51; m.m13 = (q41 * m23 - q42 * m22 - q43 * m23 + q44 * m22 + q37 * m13 - q38 * m12) * q51; m.m20 = (q7 * m33 - q30 * m31 - q14 * m33 + q32 * m31) * q51; m.m21 = -(q48 * m33 - q36 * m31 - q13 * m33 + q38 * m31) * q51; m.m22 = (q45 * m33 - q42 * m31 - q6 * m33 + q44 * m31) * q51; m.m23 = -(q45 * m23 - q42 * m21 - q6 * m23 + q44 * m21 + q13 * m13 - q38 * m11) * q51; return(m); }
public void project(warp_Matrix vertexProjection, warp_Matrix normalProjection, warp_Camera camera) // Projects this vertex into camera space { pos2 = pos.transform(vertexProjection); n2 = n.transform(normalProjection); float fact; if (camera.isOrthographic) { x = (int)(pos2.x * (camera.screenscale / camera.orthoViewWidth) + (camera.screenwidth >> 1)); y = (int)(-pos2.y * (camera.screenscale / camera.orthoViewHeight) + (camera.screenheight >> 1)); } else { fact = camera.screenscale / camera.fovfact / ((pos2.z > 0.1) ? pos2.z : 0.1f); x = (int)(pos2.x * fact + (camera.screenwidth >> 1)); y = (int)(-pos2.y * fact + (camera.screenheight >> 1)); } z = (int)(65536f * pos2.z); sw = -(pos2.z); nx = (int)(n2.x * 127 + 127); ny = (int)(n2.y * 127 + 127); if (parent.material == null) return; if (parent.material.texture == null) return; tx = (int)((float)parent.material.texture.width * u); ty = (int)((float)parent.material.texture.height * v); }
public static warp_Matrix quaternionMatrix(warp_Quaternion quat) { warp_Matrix m = new warp_Matrix(); float xx = quat.X * quat.X; float xy = quat.X * quat.Y; float xz = quat.X * quat.Z; float xw = quat.X * quat.W; float yy = quat.Y * quat.Y; float yz = quat.Y * quat.Z; float yw = quat.Y * quat.W; float zz = quat.Z * quat.Z; float zw = quat.Z * quat.W; m.m00 = 1 - 2 * (yy + zz); m.m01 = 2 * (xy - zw); m.m02 = 2 * (xz + yw); m.m10 = 2 * (xy + zw); m.m11 = 1 - 2 * (xx + zz); m.m12 = 2 * (yz - xw); m.m20 = 2 * (xz - yw); m.m21 = 2 * (yz + xw); m.m22 = 1 - 2 * (xx + yy); m.m03 = m.m13 = m.m23 = m.m30 = m.m31 = m.m32 = 0; m.m33 = 1; return(m); }
public static warp_Matrix quaternionMatrix( warp_Quaternion quat ) { warp_Matrix m = new warp_Matrix(); float xx = quat.X * quat.X; float xy = quat.X * quat.Y; float xz = quat.X * quat.Z; float xw = quat.X * quat.W; float yy = quat.Y * quat.Y; float yz = quat.Y * quat.Z; float yw = quat.Y * quat.W; float zz = quat.Z * quat.Z; float zw = quat.Z * quat.W; m.m00 = 1 - 2 * ( yy + zz ); m.m01 = 2 * ( xy - zw) ; m.m02 = 2*(xz + yw); m.m10 = 2*(xy + zw); m.m11 = 1 - 2* ( xx + zz ); m.m12 = 2*(yz - xw); m.m20 = 2*(xz - yw); m.m21 = 2*(yz + xw); m.m22 = 1 - 2 * ( xx + yy ); m.m03 = m.m13 = m.m23 = m.m30 = m.m31 = m.m32 = 0; m.m33 = 1; return m; }
public static warp_Matrix shiftMatrix(float dx, float dy, float dz) // matrix for shifting { warp_Matrix m=new warp_Matrix(); m.m03=dx; m.m13=dy; m.m23=dz; return m; }
public warp_Matrix rotateMatrix(warp_Quaternion quat) { reset(); warp_Matrix temp = warp_Matrix.quaternionMatrix(quat); warp_Matrix result = warp_Matrix.multiply(this, temp); return(result); }
public warp_Vector transform(warp_Matrix m) // Modifies the vector by matrix m { float newx = x * m.m00 + y * m.m01 + z * m.m02 + m.m03; float newy = x * m.m10 + y * m.m11 + z * m.m12 + m.m13; float newz = x * m.m20 + y * m.m21 + z * m.m22 + m.m23; return(new warp_Vector(newx, newy, newz)); }
public warp_Vector transform(warp_Matrix m) // Modifies the vector by matrix m { float newx = x*m.m00 + y*m.m01 + z*m.m02+ m.m03; float newy = x*m.m10 + y*m.m11 + z*m.m12+ m.m13; float newz = x*m.m20 + y*m.m21 + z*m.m22+ m.m23; return new warp_Vector(newx,newy,newz); }
public static warp_Matrix scaleMatrix(float dx, float dy, float dz) { warp_Matrix m = new warp_Matrix(); m.m00 = dx; m.m11 = dy; m.m22 = dz; return(m); }
public static warp_Matrix shiftMatrix(float dx, float dy, float dz) // matrix for shifting { warp_Matrix m = new warp_Matrix(); m.m03 = dx; m.m13 = dy; m.m23 = dz; return(m); }
/* * public string toString() * { * // todo * } */ public warp_Matrix getClone() { warp_Matrix m = new warp_Matrix(); m.m00 = m00; m.m01 = m01; m.m02 = m02; m.m03 = m03; m.m10 = m10; m.m11 = m11; m.m12 = m12; m.m13 = m13; m.m20 = m20; m.m21 = m21; m.m22 = m22; m.m23 = m23; m.m30 = m30; m.m31 = m31; m.m32 = m32; m.m33 = m33; return(m); }
static public warp_Quaternion matrix(warp_Matrix xfrm) { warp_Quaternion quat = new warp_Quaternion(); // Check the sum of the diagonal float tr = xfrm[0, 0] + xfrm[1, 1] + xfrm[2, 2]; if (tr > 0.0f) { // The sum is positive // 4 muls, 1 div, 6 adds, 1 trig function call float s = ( float )Math.Sqrt(tr + 1.0f); quat.W = s * 0.5f; s = 0.5f / s; quat.X = (xfrm[1, 2] - xfrm[2, 1]) * s; quat.Y = (xfrm[2, 0] - xfrm[0, 2]) * s; quat.Z = (xfrm[0, 1] - xfrm[1, 0]) * s; } else { // The sum is negative // 4 muls, 1 div, 8 adds, 1 trig function call int[] nIndex = { 1, 2, 0 }; int i, j, k; i = 0; if (xfrm[1, 1] > xfrm[i, i]) { i = 1; } if (xfrm[2, 2] > xfrm[i, i]) { i = 2; } j = nIndex[i]; k = nIndex[j]; float s = ( float )Math.Sqrt((xfrm[i, i] - (xfrm[j, j] + xfrm[k, k])) + 1.0f); quat[i] = s * 0.5f; if (s != 0.0) { s = 0.5f / s; } quat[j] = (xfrm[i, j] + xfrm[j, i]) * s; quat[k] = (xfrm[i, k] + xfrm[k, i]) * s; quat[3] = (xfrm[j, k] - xfrm[k, j]) * s; } return(quat); }
public void preTransform(warp_Matrix n) { warp_Matrix m = this.getClone(); m00 = m.m00 * n.m00 + m.m01 * n.m10 + m.m02 * n.m20; m01 = m.m00 * n.m01 + m.m01 * n.m11 + m.m02 * n.m21; m02 = m.m00 * n.m02 + m.m01 * n.m12 + m.m02 * n.m22; m03 = m.m00 * n.m03 + m.m01 * n.m13 + m.m02 * n.m23 + m.m03; m10 = m.m10 * n.m00 + m.m11 * n.m10 + m.m12 * n.m20; m11 = m.m10 * n.m01 + m.m11 * n.m11 + m.m12 * n.m21; m12 = m.m10 * n.m02 + m.m11 * n.m12 + m.m12 * n.m22; m13 = m.m10 * n.m03 + m.m11 * n.m13 + m.m12 * n.m23 + m.m13; m20 = m.m20 * n.m00 + m.m21 * n.m10 + m.m22 * n.m20; m21 = m.m20 * n.m01 + m.m21 * n.m11 + m.m22 * n.m21; m22 = m.m20 * n.m02 + m.m21 * n.m12 + m.m22 * n.m22; m23 = m.m20 * n.m03 + m.m21 * n.m13 + m.m22 * n.m23 + m.m23; }
public void transform(warp_Matrix n) { warp_Matrix m = this.getClone(); m00 = n.m00 * m.m00 + n.m01 * m.m10 + n.m02 * m.m20; m01 = n.m00 * m.m01 + n.m01 * m.m11 + n.m02 * m.m21; m02 = n.m00 * m.m02 + n.m01 * m.m12 + n.m02 * m.m22; m03 = n.m00 * m.m03 + n.m01 * m.m13 + n.m02 * m.m23 + n.m03; m10 = n.m10 * m.m00 + n.m11 * m.m10 + n.m12 * m.m20; m11 = n.m10 * m.m01 + n.m11 * m.m11 + n.m12 * m.m21; m12 = n.m10 * m.m02 + n.m11 * m.m12 + n.m12 * m.m22; m13 = n.m10 * m.m03 + n.m11 * m.m13 + n.m12 * m.m23 + n.m13; m20 = n.m20 * m.m00 + n.m21 * m.m10 + n.m22 * m.m20; m21 = n.m20 * m.m01 + n.m21 * m.m11 + n.m22 * m.m21; m22 = n.m20 * m.m02 + n.m21 * m.m12 + n.m22 * m.m22; m23 = n.m20 * m.m03 + n.m21 * m.m13 + n.m22 * m.m23 + n.m23; }
public static warp_Matrix rotateMatrix(float dx, float dy, float dz) { warp_Matrix res = new warp_Matrix(); float SIN; float COS; if (dx != 0) { warp_Matrix m = new warp_Matrix(); SIN = warp_Math.sin(dx); COS = warp_Math.cos(dx); m.m11 = COS; m.m12 = SIN; m.m21 = -SIN; m.m22 = COS; res.transform(m); } if (dy != 0) { warp_Matrix m = new warp_Matrix(); SIN = warp_Math.sin(dy); COS = warp_Math.cos(dy); m.m00 = COS; m.m02 = SIN; m.m20 = -SIN; m.m22 = COS; res.transform(m); } if (dz != 0) { warp_Matrix m = new warp_Matrix(); SIN = warp_Math.sin(dz); COS = warp_Math.cos(dz); m.m00 = COS; m.m01 = SIN; m.m10 = -SIN; m.m11 = COS; res.transform(m); } return(res); }
public static warp_Matrix Ode2WarpMatrix( Ode.Matrix3 m ) { warp_Matrix result = new warp_Matrix(); result.m11 = ( float )m.m11; result.m12 = ( float )m.m12; result.m13 = ( float )m.m13; result.m21 = ( float )m.m21; result.m22 = ( float )m.m22; result.m23 = ( float )m.m23; result.m31 = ( float )m.m31; result.m32 = ( float )m.m32; result.m33 = ( float )m.m33; return result; }
public static Ode.Matrix3 Warp2OdeMatrix3( warp_Matrix m ) { Ode.Matrix3 odeM = new Ode.Matrix3(); odeM.m11 = m.m11; odeM.m12 = m.m12; odeM.m13 = m.m13; odeM.m21 = m.m21; odeM.m22 = m.m22; odeM.m23 = m.m23; odeM.m31 = m.m31; odeM.m32 = m.m32; odeM.m33 = m.m33; return odeM; }
static public warp_Quaternion matrix(warp_Matrix xfrm) { warp_Quaternion quat = new warp_Quaternion(); // Check the sum of the diagonal float tr = xfrm[0, 0] + xfrm[1, 1] + xfrm[2, 2]; if (tr > 0.0f) { // The sum is positive // 4 muls, 1 div, 6 adds, 1 trig function call float s = (float)Math.Sqrt(tr + 1.0f); quat.W = s * 0.5f; s = 0.5f / s; quat.X = (xfrm[1, 2] - xfrm[2, 1]) * s; quat.Y = (xfrm[2, 0] - xfrm[0, 2]) * s; quat.Z = (xfrm[0, 1] - xfrm[1, 0]) * s; } else { // The sum is negative // 4 muls, 1 div, 8 adds, 1 trig function call int[] nIndex = { 1, 2, 0 }; int i, j, k; i = 0; if (xfrm[1, 1] > xfrm[i, i]) i = 1; if (xfrm[2, 2] > xfrm[i, i]) i = 2; j = nIndex[i]; k = nIndex[j]; float s = (float)Math.Sqrt((xfrm[i, i] - (xfrm[j, j] + xfrm[k, k])) + 1.0f); quat[i] = s * 0.5f; if (s != 0.0) { s = 0.5f / s; } quat[j] = (xfrm[i, j] + xfrm[j, i]) * s; quat[k] = (xfrm[i, k] + xfrm[k, i]) * s; quat[3] = (xfrm[j, k] - xfrm[k, j]) * s; } return quat; }
public static warp_Matrix multiply(warp_Matrix m1, warp_Matrix m2) { warp_Matrix m = new warp_Matrix(); m.m00 = m1.m00 * m2.m00 + m1.m01 * m2.m10 + m1.m02 * m2.m20; m.m01 = m1.m00 * m2.m01 + m1.m01 * m2.m11 + m1.m02 * m2.m21; m.m02 = m1.m00 * m2.m02 + m1.m01 * m2.m12 + m1.m02 * m2.m22; m.m03 = m1.m00 * m2.m03 + m1.m01 * m2.m13 + m1.m02 * m2.m23 + m1.m03; m.m10 = m1.m10 * m2.m00 + m1.m11 * m2.m10 + m1.m12 * m2.m20; m.m11 = m1.m10 * m2.m01 + m1.m11 * m2.m11 + m1.m12 * m2.m21; m.m12 = m1.m10 * m2.m02 + m1.m11 * m2.m12 + m1.m12 * m2.m22; m.m13 = m1.m10 * m2.m03 + m1.m11 * m2.m13 + m1.m12 * m2.m23 + m1.m13; m.m20 = m1.m20 * m2.m00 + m1.m21 * m2.m10 + m1.m22 * m2.m20; m.m21 = m1.m20 * m2.m01 + m1.m21 * m2.m11 + m1.m22 * m2.m21; m.m22 = m1.m20 * m2.m02 + m1.m21 * m2.m12 + m1.m22 * m2.m22; m.m23 = m1.m20 * m2.m03 + m1.m21 * m2.m13 + m1.m22 * m2.m23 + m1.m23; return(m); }
void rebuildMatrices() { if (!needsRebuild) return; needsRebuild = false; warp_Vector forward, up, right; forward = warp_Vector.sub(lookat, pos); up = new warp_Vector(0f, 1f, 0f); right = warp_Vector.getNormal(up, forward); up = warp_Vector.getNormal(forward, right); forward.normalize(); up.normalize(); right.normalize(); normalmatrix = new warp_Matrix(right, up, forward); normalmatrix.rotate(0, 0, rollfactor); matrix = normalmatrix.getClone(); matrix.shift(pos.x, pos.y, pos.z); normalmatrix = normalmatrix.inverse(); matrix = matrix.inverse(); }
public void project(warp_Matrix m) { matrix2 = m.getClone(); matrix2.transform(m); v2 = v.transform(matrix2); }
public void rotate(warp_Matrix m) { transform(m); }
public static warp_Object TUBE(warp_Vector[] path, float r, int steps, bool closed) { warp_Vector[] circle = new warp_Vector[steps]; float angle; for (int i = 0; i < steps; i++) { angle = 2 * 3.14159265f * (float)i / (float)steps; circle[i] = new warp_Vector(r * warp_Math.cos(angle), r * warp_Math.sin(angle), 0f); } warp_Object newObject = new warp_Object(); int segments = path.GetLength(0); warp_Vector forward, up, right; warp_Matrix frenetmatrix; warp_Vertex tempvertex; float relx, rely; int a, b, c, d; for (int i = 0; i < segments; i++) { // Calculate frenet frame matrix if (i != segments - 1) { forward = warp_Vector.sub(path[i + 1], path[i]); } else { if (!closed) { forward = warp_Vector.sub(path[i], path[i - 1]); } else { forward = warp_Vector.sub(path[1], path[0]); } } forward.normalize(); up = new warp_Vector(0f, 0f, 1f); right = warp_Vector.getNormal(forward, up); up = warp_Vector.getNormal(forward, right); frenetmatrix = new warp_Matrix(right, up, forward); frenetmatrix.shift(path[i].x, path[i].y, path[i].z); // Add nodes relx = (float)i / (float)(segments - 1); for (int k = 0; k < steps; k++) { rely = (float)k / (float)steps; tempvertex = new warp_Vertex(circle[k].transform(frenetmatrix)); tempvertex.u = relx; tempvertex.v = rely; newObject.addVertex(tempvertex); } } for (int i = 0; i < segments - 1; i++) { for (int k = 0; k < steps - 1; k++) { a = i * steps + k; b = a + 1; c = a + steps; d = b + steps; newObject.addTriangle(a, c, b); newObject.addTriangle(b, c, d); } a = (i + 1) * steps - 1; b = a + 1 - steps; c = a + steps; d = b + steps; newObject.addTriangle(a, c, b); newObject.addTriangle(b, c, d); } return(newObject); }
public void rotateSelf( warp_Matrix m ) { matrix.rotateSelf( m ); normalmatrix.rotateSelf( m ); }
public void preTransform(warp_Matrix n) { warp_Matrix m=this.getClone(); m00 = m.m00*n.m00 + m.m01*n.m10 + m.m02*n.m20; m01 = m.m00*n.m01 + m.m01*n.m11 + m.m02*n.m21; m02 = m.m00*n.m02 + m.m01*n.m12 + m.m02*n.m22; m03 = m.m00*n.m03 + m.m01*n.m13 + m.m02*n.m23 + m.m03; m10 = m.m10*n.m00 + m.m11*n.m10 + m.m12*n.m20; m11 = m.m10*n.m01 + m.m11*n.m11 + m.m12*n.m21; m12 = m.m10*n.m02 + m.m11*n.m12 + m.m12*n.m22; m13 = m.m10*n.m03 + m.m11*n.m13 + m.m12*n.m23 + m.m13; m20 = m.m20*n.m00 + m.m21*n.m10 + m.m22*n.m20; m21 = m.m20*n.m01 + m.m21*n.m11 + m.m22*n.m21; m22 = m.m20*n.m02 + m.m21*n.m12 + m.m22*n.m22; m23 = m.m20*n.m03 + m.m21*n.m13 + m.m22*n.m23 + m.m23; }
public void rotateSelf( warp_Matrix m ) { preTransform( m ); }
public static warp_Matrix rotateMatrix(float dx, float dy, float dz) { warp_Matrix res=new warp_Matrix(); float SIN; float COS; if (dx!=0) { warp_Matrix m =new warp_Matrix(); SIN=warp_Math.sin(dx); COS=warp_Math.cos(dx); m.m11=COS; m.m12=SIN; m.m21=-SIN; m.m22=COS; res.transform(m); } if (dy!=0) { warp_Matrix m =new warp_Matrix(); SIN=warp_Math.sin(dy); COS=warp_Math.cos(dy); m.m00=COS; m.m02=SIN; m.m20=-SIN; m.m22=COS; res.transform(m); } if (dz!=0) { warp_Matrix m =new warp_Matrix(); SIN=warp_Math.sin(dz); COS=warp_Math.cos(dz); m.m00=COS; m.m01=SIN; m.m10=-SIN; m.m11=COS; res.transform(m); } return res; }
/* public string toString() { // todo } */ public warp_Matrix getClone() { warp_Matrix m=new warp_Matrix(); m.m00=m00; m.m01=m01; m.m02=m02; m.m03=m03; m.m10=m10; m.m11=m11; m.m12=m12; m.m13=m13; m.m20=m20; m.m21=m21; m.m22=m22; m.m23=m23; m.m30=m30; m.m31=m31; m.m32=m32; m.m33=m33; return m; }
public bool RotateSelf( string name, warp_Matrix m ) { if ( _scene == null ) { return false; } warp_Object o = _scene.sceneobject( name ); if ( o == null ) { return false; } o.rotateSelf( m ); return true; }
public bool RotateScene( warp_Matrix m ) { if ( _scene == null ) { return false; } _scene.rotate( m ); return true; }
public void normalize() { objectsNeedRebuild = true; rebuild(); warp_Vector min, max, tempmax, tempmin; if (objects == 0) { return; } matrix = new warp_Matrix(); normalmatrix = new warp_Matrix(); max = wobject[0].maximum(); min = wobject[0].maximum(); for (int i = 0; i < objects; i++) { tempmax = wobject[i].maximum(); tempmin = wobject[i].maximum(); if (tempmax.x > max.x) { max.x = tempmax.x; } if (tempmax.y > max.y) { max.y = tempmax.y; } if (tempmax.z > max.z) { max.z = tempmax.z; } if (tempmin.x < min.x) { min.x = tempmin.x; } if (tempmin.y < min.y) { min.y = tempmin.y; } if (tempmin.z < min.z) { min.z = tempmin.z; } } float xdist = max.x - min.x; float ydist = max.y - min.y; float zdist = max.z - min.z; float xmed = (max.x + min.x) / 2; float ymed = (max.y + min.y) / 2; float zmed = (max.z + min.z) / 2; float diameter = (xdist > ydist) ? xdist : ydist; diameter = (zdist > diameter) ? zdist : diameter; normalizedOffset = new warp_Vector(xmed, ymed, zmed); normalizedScale = 2 / diameter; shift(normalizedOffset.reverse()); scale(normalizedScale); }
public static warp_Matrix multiply(warp_Matrix m1, warp_Matrix m2) { warp_Matrix m=new warp_Matrix(); m.m00 = m1.m00*m2.m00 + m1.m01*m2.m10 + m1.m02*m2.m20; m.m01 = m1.m00*m2.m01 + m1.m01*m2.m11 + m1.m02*m2.m21; m.m02 = m1.m00*m2.m02 + m1.m01*m2.m12 + m1.m02*m2.m22; m.m03 = m1.m00*m2.m03 + m1.m01*m2.m13 + m1.m02*m2.m23 + m1.m03; m.m10 = m1.m10*m2.m00 + m1.m11*m2.m10 + m1.m12*m2.m20; m.m11 = m1.m10*m2.m01 + m1.m11*m2.m11 + m1.m12*m2.m21; m.m12 = m1.m10*m2.m02 + m1.m11*m2.m12 + m1.m12*m2.m22; m.m13 = m1.m10*m2.m03 + m1.m11*m2.m13 + m1.m12*m2.m23 + m1.m13; m.m20 = m1.m20*m2.m00 + m1.m21*m2.m10 + m1.m22*m2.m20; m.m21 = m1.m20*m2.m01 + m1.m21*m2.m11 + m1.m22*m2.m21; m.m22 = m1.m20*m2.m02 + m1.m21*m2.m12 + m1.m22*m2.m22; m.m23 = m1.m20*m2.m03 + m1.m21*m2.m13 + m1.m22*m2.m23 + m1.m23; return m; }
public static warp_Matrix scaleMatrix(float dx, float dy, float dz) { warp_Matrix m=new warp_Matrix(); m.m00=dx; m.m11=dy; m.m22=dz; return m; }
public void rotateSelf(warp_Matrix m) { preTransform(m); }
public warp_Matrix inverse() { warp_Matrix m=new warp_Matrix(); float q1 = m12; float q6 = m10*m01; float q7 = m10*m21; float q8 = m02; float q13 = m20*m01; float q14 = m20*m11; float q21 = m02*m21; float q22 = m03*m21; float q25 = m01*m12; float q26 = m01*m13; float q27 = m02*m11; float q28 = m03*m11; float q29 = m10*m22; float q30 = m10*m23; float q31 = m20*m12; float q32 = m20*m13; float q35 = m00*m22; float q36 = m00*m23; float q37 = m20*m02; float q38 = m20*m03; float q41 = m00*m12; float q42 = m00*m13; float q43 = m10*m02; float q44 = m10*m03; float q45 = m00*m11; float q48 = m00*m21; float q49 = q45*m22-q48*q1-q6*m22+q7*q8; float q50 = q13*q1-q14*q8; float q51 = 1/(q49+q50); m.m00 = (m11*m22*m33-m11*m23*m32-m21*m12*m33+m21*m13*m32+m31*m12*m23-m31*m13*m22)*q51; m.m01 = -(m01*m22*m33-m01*m23*m32-q21*m33+q22*m32)*q51; m.m02 = (q25*m33-q26*m32-q27*m33+q28*m32)*q51; m.m03 = -(q25*m23-q26*m22-q27*m23+q28*m22+q21*m13-q22*m12)*q51; m.m10 = -(q29*m33-q30*m32-q31*m33+q32*m32)*q51; m.m11 = (q35*m33-q36*m32-q37*m33+q38*m32)*q51; m.m12 = -(q41*m33-q42*m32-q43*m33+q44*m32)*q51; m.m13 = (q41*m23-q42*m22-q43*m23+q44*m22+q37*m13-q38*m12)*q51; m.m20 = (q7*m33-q30*m31-q14*m33+q32*m31)*q51; m.m21 = -(q48*m33-q36*m31-q13*m33+q38*m31)*q51; m.m22 = (q45*m33-q42*m31-q6*m33+q44*m31)*q51; m.m23 = -(q45*m23-q42*m21-q6*m23+q44*m21+q13*m13-q38*m11)*q51; return m; }
public void project(warp_Matrix normalProjection) { n2 = n.transform(normalProjection); dist = getDist(); }
public void rotate( warp_Matrix m ) { transform( m ); }
public void transform(warp_Matrix m) { matrix.transform(m); normalmatrix.transform(m); }
public void transform(warp_Matrix n) { warp_Matrix m=this.getClone(); m00 = n.m00*m.m00 + n.m01*m.m10 + n.m02*m.m20; m01 = n.m00*m.m01 + n.m01*m.m11 + n.m02*m.m21; m02 = n.m00*m.m02 + n.m01*m.m12 + n.m02*m.m22; m03 = n.m00*m.m03 + n.m01*m.m13 + n.m02*m.m23 + n.m03; m10 = n.m10*m.m00 + n.m11*m.m10 + n.m12*m.m20; m11 = n.m10*m.m01 + n.m11*m.m11 + n.m12*m.m21; m12 = n.m10*m.m02 + n.m11*m.m12 + n.m12*m.m22; m13 = n.m10*m.m03 + n.m11*m.m13 + n.m12*m.m23 + n.m13; m20 = n.m20*m.m00 + n.m21*m.m10 + n.m22*m.m20; m21 = n.m20*m.m01 + n.m21*m.m11 + n.m22*m.m21; m22 = n.m20*m.m02 + n.m21*m.m12 + n.m22*m.m22; m23 = n.m20*m.m03 + n.m21*m.m13 + n.m22*m.m23 + n.m23; }
public void render(warp_Camera cam) { rasterizer.rebuildReferences(this); warp_Math.clearBuffer(zBuffer, zFar); //System.Array.Copy(screen.zBuffer,0,zBuffer,0,zBuffer.Length); if (useId) { warp_Math.clearBuffer(idBuffer, -1); } if (scene.environment.background != null) { screen.drawBackground(scene.environment.background, 0, 0, screen.width, screen.height); } else { screen.clear(scene.environment.bgcolor); } cam.setScreensize(screen.width, screen.height); scene.prepareForRendering(); emptyQueues(); // Project warp_Matrix m = warp_Matrix.multiply(cam.getMatrix(), scene.matrix); warp_Matrix nm = warp_Matrix.multiply(cam.getNormalMatrix(), scene.normalmatrix); warp_Matrix vertexProjection, normalProjection; warp_Object obj; warp_Triangle t; warp_Vertex v; int w = screen.width; int h = screen.height; for (int id = scene.objects - 1; id >= 0; id--) { obj = scene.wobject[id]; if (obj.visible) { vertexProjection = obj.matrix.getClone(); normalProjection = obj.normalmatrix.getClone(); vertexProjection.transform(m); normalProjection.transform(nm); for (int i = obj.vertices - 1; i >= 0; i--) { v = obj.fastvertex[i]; v.project(vertexProjection, normalProjection, cam); v.clipFrustrum(w, h); } for (int i = obj.triangles - 1; i >= 0; i--) { t = obj.fasttriangle[i]; t.project(normalProjection); t.clipFrustrum(w, h); enqueueTriangle(t); } } } //screen.lockImage(); warp_Triangle[] tri; tri = getOpaqueQueue(); if (tri != null) { for (int i = tri.GetLength(0) - 1; i >= 0; i--) { rasterizer.loadMaterial(tri[i].parent.material); rasterizer.render(tri[i]); } } tri = getTransparentQueue(); if (tri != null) { for (int i = 0; i < tri.GetLength(0); i++) { rasterizer.loadMaterial(tri[i].parent.material); rasterizer.render(tri[i]); } } //screen.unlockImage(); }
public void project(warp_Matrix normalProjection) { n2=n.transform(normalProjection); dist=getDist(); }
public void rotateSelf(warp_Matrix m) { matrix.rotateSelf(m); normalmatrix.rotateSelf(m); }
public static warp_Object TUBE(warp_Vector[] path, float r, int steps, bool closed) { warp_Vector[] circle = new warp_Vector[steps]; float angle; for (int i = 0; i < steps; i++) { angle = 2 * 3.14159265f * (float) i / (float) steps; circle[i] = new warp_Vector(r * warp_Math.cos(angle), r * warp_Math.sin(angle), 0f); } warp_Object newObject = new warp_Object(); int segments = path.GetLength(0); warp_Vector forward, up, right; warp_Matrix frenetmatrix; warp_Vertex tempvertex; float relx, rely; int a, b, c, d; for (int i = 0; i < segments; i++) { // Calculate frenet frame matrix if (i != segments - 1) { forward = warp_Vector.sub(path[i + 1], path[i]); } else { if (!closed) { forward = warp_Vector.sub(path[i], path[i - 1]); } else { forward = warp_Vector.sub(path[1], path[0]); } } forward.normalize(); up = new warp_Vector(0f, 0f, 1f); right = warp_Vector.getNormal(forward, up); up = warp_Vector.getNormal(forward, right); frenetmatrix = new warp_Matrix(right, up, forward); frenetmatrix.shift(path[i].x, path[i].y, path[i].z); // Add nodes relx = (float) i / (float) (segments - 1); for (int k = 0; k < steps; k++) { rely = (float) k / (float) steps; tempvertex = new warp_Vertex(circle[k].transform(frenetmatrix)); tempvertex.u = relx; tempvertex.v = rely; newObject.addVertex(tempvertex); } } for (int i = 0; i < segments - 1; i++) { for (int k = 0; k < steps - 1; k++) { a = i * steps + k; b = a + 1; c = a + steps; d = b + steps; newObject.addTriangle(a, c, b); newObject.addTriangle(b, c, d); } a = (i + 1) * steps - 1; b = a + 1 - steps; c = a + steps; d = b + steps; newObject.addTriangle(a, c, b); newObject.addTriangle(b, c, d); } return newObject; }