home *** CD-ROM | disk | FTP | other *** search
- //
- // File Name: 3DstarF.cpp
- //
- // Description: Implementation of a 3D matrix class -
- // starfield specific
- //
- // Author: John De Goes
- //
- // Project: Cutting Edge 3D Game Programming
- //
-
- #include "StarF.hpp"
-
- // Function that merges to matrices - try to avoid calling
- // this function very often.
- void Matrix3D::MergeMatrix(float NewMatrix[4][4])
- {
- // Multiply NewMatirx by Matrix; store result in TempMatrix
- float TempMatrix[4][4];
- for (short unsigned int i = 0; i < 4; i++)
- for (short unsigned int j = 0; j < 4; j++)
- TempMatrix[i][j] = (Matrix[i][0] * NewMatrix[0][j])
- + (Matrix[i][1] * NewMatrix[1][j])
- + (Matrix[i][2] * NewMatrix[2][j])
- + (Matrix[i][3] * NewMatrix[3][j]);
- // Copy TempMatrix to Matrix
- for (i = 0; i < 4; i++)
- {
- Matrix[i][0] = TempMatrix[i][0];
- Matrix[i][1] = TempMatrix[i][1];
- Matrix[i][2] = TempMatrix[i][2];
- Matrix[i][3] = TempMatrix[i][3];
- }
- }
-
- void Matrix3D::Rotate(int Xa, int Ya, int Za)
- {
- float Rmat[4][4];
- // Initialize Z rotation matrix (aligning 3D world with 2D screen):
- Rmat[0][0]=COS(Za); Rmat[0][1]=SIN(Za); Rmat[0][2]=0; Rmat[0][3]=0;
- Rmat[1][0]=-SIN(Za); Rmat[1][1]=COS(Za); Rmat[1][2]=0; Rmat[1][3]=0;
- Rmat[2][0]=0; Rmat[2][1]=0; Rmat[2][2]=1; Rmat[2][3]=0;
- Rmat[3][0]=0; Rmat[3][1]=0; Rmat[3][2]=0; Rmat[3][3]=1;
-
- // Merge matrix with master matrix:
- MergeMatrix(Rmat);
-
- // Initialize X rotation matrix:
- Rmat[0][0]=1; Rmat[0][1]=0; Rmat[0][2]=0; Rmat[0][3]=0;
- Rmat[1][0]=0; Rmat[1][1]=COS(Xa); Rmat[1][2]=SIN(Xa); Rmat[1][3]=0;
- Rmat[2][0]=0; Rmat[2][1]=-SIN(Xa); Rmat[2][2]=COS(Xa); Rmat[2][3]=0;
- Rmat[3][0]=0; Rmat[3][1]=0; Rmat[3][2]=0; Rmat[3][3]=1;
-
- // Merge matrix with master matrix:
- MergeMatrix(Rmat);
-
- // Initialize Y rotation matrix:
- Rmat[0][0]=COS(Ya); Rmat[0][1]=0; Rmat[0][2]=-SIN(Ya); Rmat[0][3]=0;
- Rmat[1][0]=0; Rmat[1][1]=1; Rmat[1][2]=0; Rmat[1][3]=0;
- Rmat[2][0]=SIN(Ya); Rmat[2][1]=0; Rmat[2][2]=COS(Ya); Rmat[2][3]=0;
- Rmat[3][0]=0; Rmat[3][1]=0; Rmat[3][2]=0; Rmat[3][3]=1;
-
- // Merge matrix with master matrix:
- MergeMatrix(Rmat);
- }
-
- void Matrix3D::Translate(float Xt, float Yt, float Zt)
- {
- float Tmat[4][4];
- // Initialize translation matrix:
- Tmat[0][0]=1; Tmat[0][1]=0; Tmat[0][2]=0; Tmat[0][3]=0;
- Tmat[1][0]=0; Tmat[1][1]=1; Tmat[1][2]=0; Tmat[1][3]=0;
- Tmat[2][0]=0; Tmat[2][1]=0; Tmat[2][2]=1; Tmat[2][3]=0;
- Tmat[3][0]=Xt; Tmat[3][1]=Yt; Tmat[3][2]=Zt; Tmat[3][3]=1;
-
- // Merge matrix with master matrix:
- MergeMatrix(Tmat);
- }
-
- void Matrix3D::Scale(float Xs, float Ys, float Zs)
- {
- float Smat[4][4];
- // Initialize scaling matrix:
- Smat[0][0] = Xs; Smat[0][1] = 0; Smat[0][2] = 0; Smat[0][3] = 0;
- Smat[1][0] = 0; Smat[1][1] = Ys; Smat[1][2] = 0; Smat[1][3] = 0;
- Smat[2][0] = 0; Smat[2][1] = 0; Smat[2][2] = Zs; Smat[2][3] = 0;
- Smat[3][0] = 0; Smat[3][1] = 0; Smat[3][2] = 0; Smat[3][3] = 1;
-
- // Merge matrix with master matrix:
- MergeMatrix(Smat);
- }
-
- void Matrix3D::Shear(float Xs, float Ys)
- {
- float Smat[4][4];
- // Initialize shearing matrix:
- Smat[0][0] = 1; Smat[0][1] = 0; Smat[0][2] = Xs; Smat[0][3] = 0;
- Smat[1][0] = 0; Smat[1][1] = 1; Smat[1][2] = Ys; Smat[1][3] = 0;
- Smat[2][0] = 0; Smat[2][1] = 0; Smat[2][2] = 1; Smat[2][3] = 0;
- Smat[3][0] = 0; Smat[3][1] = 0; Smat[3][2] = 0; Smat[3][3] = 1;
-
- // Merge matrix with master matrix:
- MergeMatrix(Smat);
- }
-
- void Matrix3D::Initialize()
- {
- Matrix[0][0] = 1; Matrix[0][1] = 0; Matrix[0][2] = 0; Matrix[0][3] = 0;
- Matrix[1][0] = 0; Matrix[1][1] = 1; Matrix[1][2] = 0; Matrix[1][3] = 0;
- Matrix[2][0] = 0; Matrix[2][1] = 0; Matrix[2][2] = 1; Matrix[2][3] = 0;
- Matrix[3][0] = 0; Matrix[3][1] = 0; Matrix[3][2] = 0; Matrix[3][3] = 1;
- }
-
- Vertex &Matrix3D::Transform(Vertex &V)
- {
- // Initialize temporary variables:
- float OldX = V.Wx;
- float OldY = V.Wy;
- float OldZ = V.Wz;
-
- // Transform vertex using master matrix (vector*matrix):
- V.Wx = OldX * Matrix[0][0] +
- OldY * Matrix[1][0] +
- OldZ * Matrix[2][0] +
- Matrix[3][0];
-
- V.Wy = OldX * Matrix[0][1] +
- OldY * Matrix[1][1] +
- OldZ * Matrix[2][1] +
- Matrix[3][1];
-
- V.Wz = OldX * Matrix[0][2] +
- OldY * Matrix[1][2] +
- OldZ * Matrix[2][2] +
- Matrix[3][2];
- return V;
- }
-