Пример #1
0
        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();
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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;
        }
Пример #7
0
		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;
		}
Пример #8
0
        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);
        }
Пример #9
0
        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));
        }
Пример #10
0
		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);
		}
Пример #11
0
        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);
        }
Пример #12
0
        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);
        }
Пример #13
0
/*
 *              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);
        }
Пример #14
0
        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);
        }
Пример #15
0
        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;
        }
Пример #16
0
        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;
        }
Пример #17
0
        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);
        }
Пример #18
0
        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;
        }
Пример #19
0
        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;
        }
Пример #21
0
        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();
        }
Пример #23
0
 public void project(warp_Matrix m)
 {
     matrix2 = m.getClone();
     matrix2.transform(m);
     v2 = v.transform(matrix2);
 }
 public void project(warp_Matrix m)
 {
     matrix2 = m.getClone();
     matrix2.transform(m);
     v2 = v.transform(matrix2);
 }
Пример #25
0
 public void rotate(warp_Matrix m)
 {
     transform(m);
 }
Пример #26
0
        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);
        }
Пример #27
0
 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;
        }
Пример #32
0
        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;
        }
Пример #33
0
        public bool RotateScene( warp_Matrix m )
        {
            if ( _scene == null )
            {
                return false;
            }

            _scene.rotate( m );

            return true;
        }
Пример #34
0
		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;
        }
Пример #36
0
        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 scaleMatrix(float dx, float dy, float dz)
        {
            warp_Matrix m=new warp_Matrix();

            m.m00=dx;
            m.m11=dy;
            m.m22=dz;

            return m;
        }
Пример #38
0
 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;
        }
Пример #40
0
 public void project(warp_Matrix normalProjection)
 {
     n2   = n.transform(normalProjection);
     dist = getDist();
 }
 public void rotate( warp_Matrix m )
 {
     transform( m );
 }
Пример #42
0
		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;
        }
Пример #44
0
        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();
        }
Пример #45
0
		public void project(warp_Matrix normalProjection)
		{
			n2=n.transform(normalProjection);
			dist=getDist();
		}
Пример #46
0
 public void rotateSelf(warp_Matrix m)
 {
     matrix.rotateSelf(m);
     normalmatrix.rotateSelf(m);
 }
Пример #47
0
		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;
		}
Пример #48
0
 public void transform(warp_Matrix m)
 {
     matrix.transform(m);
     normalmatrix.transform(m);
 }