home *** CD-ROM | disk | FTP | other *** search
/ CD-ROM User 1995 January / CDuser6Jan95.iso / DYNASTY / WING / DUMB3D.CP_ / DUMB3D.CP
Text File  |  1994-06-19  |  8KB  |  310 lines

  1. /**************************************************************************
  2.     dumb3d.cpp - A simple linear algebra library for 3D.
  3.  
  4.     History:
  5.         08/09/93 Checker    Created
  6.  **************************************************************************/
  7. /**************************************************************************
  8.  
  9.    THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  10.    KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  11.    IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  12.    PURPOSE.
  13.  
  14.    Copyright (c) 1993  Microsoft Corporation.  All Rights Reserved.
  15.  
  16.  **************************************************************************/
  17.  
  18. //*** We're intentionally converting doubles to floats all over...
  19. #pragma warning ( 4 : 4136 )
  20.  
  21. #include"dumb3d.hpp"
  22.  
  23. #include<math.h>
  24.  
  25. /*----------------------------------------------------------------------------
  26.  
  27. matrix multiplication.
  28.  
  29. */
  30.  
  31. matrix_4x4 operator*( matrix_4x4 const &Multiplicand,
  32.         matrix_4x4 const &Multiplier )
  33. {
  34.     matrix_4x4 ReturnMatrix;
  35.  
  36.     for(int i = 0;i < 4;i++)
  37.     {
  38.         for(int j = 0;j < 4;j++)
  39.         {
  40.             real Value = 0;
  41.             
  42.             for(int k = 0;k < 4;k++)
  43.             {
  44.                 Value += Multiplicand.GetElement(i,k) *
  45.                         Multiplier.GetElement(k,j);
  46.             }
  47.  
  48.             ReturnMatrix.SetElement(i,j,Value);
  49.         }
  50.     }
  51.  
  52.     return ReturnMatrix;
  53. }
  54.  
  55. vector_4 operator*( matrix_4x4 const &Multiplicand,
  56.         vector_4 const &Multiplier )
  57. {
  58.     vector_4 ReturnPoint;
  59.  
  60.     for(int i = 0;i < 4;i++)
  61.     {
  62.         real Value = 0;
  63.         
  64.         for(int k = 0;k < 4;k++)
  65.         {
  66.             Value += Multiplicand.GetElement(i,k) *
  67.                     Multiplier.GetElement(k);
  68.         }
  69.  
  70.         ReturnPoint.SetElement(i,Value);
  71.     }
  72.  
  73.     return ReturnPoint;
  74. }
  75.  
  76. point_4 operator*( matrix_4x4 const &Multiplicand,
  77.         point_4 const &Multiplier )
  78. {
  79.     point_4 ReturnPoint;
  80.  
  81.     for(int i = 0;i < 4;i++)
  82.     {
  83.         real Value = 0;
  84.         
  85.         for(int k = 0;k < 4;k++)
  86.         {
  87.             Value += Multiplicand.GetElement(i,k) *
  88.                     Multiplier.GetElement(k);
  89.         }
  90.  
  91.         ReturnPoint.SetElement(i,Value);
  92.     }
  93.  
  94.     return ReturnPoint;
  95. }
  96.  
  97.  
  98. /*----------------------------------------------------------------------------
  99.  
  100. constructor.
  101.  
  102. */
  103.  
  104. matrix_4x4::matrix_4x4( void )
  105. {
  106.     for(int Counter = 0;Counter < 16;Counter++)
  107.     {
  108.         aElements[0][Counter] = 0;
  109.     }
  110.  
  111.     aElements[0][0] = aElements[1][1] = aElements[2][2] = aElements[3][3] = 1;
  112. }
  113.  
  114.  
  115. /*----------------------------------------------------------------------------
  116.  
  117. Rotations.
  118.  
  119. */
  120.  
  121. matrix_4x4 &matrix_4x4::ConcatenateXRotation( real Degrees )
  122. {
  123.     real Temp01, Temp11, Temp21, Temp31;
  124.     real Temp02, Temp12, Temp22, Temp32;
  125.  
  126.     real Radians = (Degrees/360) * M_PI * 2;
  127.  
  128.     real Sin = sin(Radians), Cos = cos(Radians);
  129.  
  130.     Temp01 = aElements[0][1] * Cos + aElements[0][2] * Sin;
  131.     Temp11 = aElements[1][1] * Cos + aElements[1][2] * Sin;
  132.     Temp21 = aElements[2][1] * Cos + aElements[2][2] * Sin;
  133.     Temp31 = aElements[3][1] * Cos + aElements[3][2] * Sin;
  134.  
  135.     Temp02 = aElements[0][1] * -Sin + aElements[0][2] * Cos;
  136.     Temp12 = aElements[1][1] * -Sin + aElements[1][2] * Cos;
  137.     Temp22 = aElements[2][1] * -Sin + aElements[2][2] * Cos;
  138.     Temp32 = aElements[3][1] * -Sin + aElements[3][2] * Cos;
  139.  
  140.     aElements[0][1] = Temp01;
  141.     aElements[1][1] = Temp11;
  142.     aElements[2][1] = Temp21;
  143.     aElements[3][1] = Temp31;
  144.     aElements[0][2] = Temp02;
  145.     aElements[1][2] = Temp12;
  146.     aElements[2][2] = Temp22;
  147.     aElements[3][2] = Temp32;
  148.  
  149.     return *this;
  150. }
  151.  
  152. matrix_4x4 &matrix_4x4::ConcatenateYRotation( real Degrees )
  153. {
  154.     real Temp00, Temp10, Temp20, Temp30;
  155.     real Temp02, Temp12, Temp22, Temp32;
  156.  
  157.     real Radians = (Degrees/360) * M_PI * 2;
  158.  
  159.     real Sin = sin(Radians), Cos = cos(Radians);
  160.  
  161.     Temp00 = aElements[0][0] * Cos + aElements[0][2] * -Sin;
  162.     Temp10 = aElements[1][0] * Cos + aElements[1][2] * -Sin;
  163.     Temp20 = aElements[2][0] * Cos + aElements[2][2] * -Sin;
  164.     Temp30 = aElements[3][0] * Cos + aElements[3][2] * -Sin;
  165.  
  166.     Temp02 = aElements[0][0] * Sin + aElements[0][2] * Cos;
  167.     Temp12 = aElements[1][0] * Sin + aElements[1][2] * Cos;
  168.     Temp22 = aElements[2][0] * Sin + aElements[2][2] * Cos;
  169.     Temp32 = aElements[3][0] * Sin + aElements[3][2] * Cos;
  170.  
  171.     aElements[0][0] = Temp00;
  172.     aElements[1][0] = Temp10;
  173.     aElements[2][0] = Temp20;
  174.     aElements[3][0] = Temp30;
  175.     aElements[0][2] = Temp02;
  176.     aElements[1][2] = Temp12;
  177.     aElements[2][2] = Temp22;
  178.     aElements[3][2] = Temp32;
  179.  
  180.     return *this;
  181. }
  182.  
  183. matrix_4x4 &matrix_4x4::ConcatenateZRotation( real Degrees )
  184. {
  185.     real Temp00, Temp10, Temp20, Temp30;
  186.     real Temp01, Temp11, Temp21, Temp31;
  187.  
  188.     real Radians = (Degrees/360) * M_PI * 2;
  189.  
  190.     real Sin = sin(Radians), Cos = cos(Radians);
  191.  
  192.     Temp00 = aElements[0][0] * Cos + aElements[0][1] * Sin;
  193.     Temp10 = aElements[1][0] * Cos + aElements[1][1] * Sin;
  194.     Temp20 = aElements[2][0] * Cos + aElements[2][1] * Sin;
  195.     Temp30 = aElements[3][0] * Cos + aElements[3][1] * Sin;
  196.  
  197.     Temp01 = aElements[0][0] * -Sin + aElements[0][1] * Cos;
  198.     Temp11 = aElements[1][0] * -Sin + aElements[1][1] * Cos;
  199.     Temp21 = aElements[2][0] * -Sin + aElements[2][1] * Cos;
  200.     Temp31 = aElements[3][0] * -Sin + aElements[3][1] * Cos;
  201.  
  202.     aElements[0][0] = Temp00;
  203.     aElements[1][0] = Temp10;
  204.     aElements[2][0] = Temp20;
  205.     aElements[3][0] = Temp30;
  206.     aElements[0][1] = Temp01;
  207.     aElements[1][1] = Temp11;
  208.     aElements[2][1] = Temp21;
  209.     aElements[3][1] = Temp31;
  210.  
  211.     return *this;
  212. }
  213.  
  214. /*----------------------------------------------------------------------------
  215.  
  216. Translations.
  217.  
  218. */
  219.  
  220. matrix_4x4 &matrix_4x4::ConcatenateXTranslation( real Distance )
  221. {
  222.     aElements[0][3] = aElements[0][0] * Distance + aElements[0][3];
  223.     aElements[1][3] = aElements[1][0] * Distance + aElements[1][3];
  224.     aElements[2][3] = aElements[2][0] * Distance + aElements[2][3];
  225.     aElements[3][3] = aElements[3][0] * Distance + aElements[3][3];
  226.  
  227.     return *this;
  228. }
  229.  
  230. matrix_4x4 &matrix_4x4::ConcatenateYTranslation( real Distance )
  231. {
  232.     aElements[0][3] = aElements[0][1] * Distance + aElements[0][3];
  233.     aElements[1][3] = aElements[1][1] * Distance + aElements[1][3];
  234.     aElements[2][3] = aElements[2][1] * Distance + aElements[2][3];
  235.     aElements[3][3] = aElements[3][1] * Distance + aElements[3][3];
  236.  
  237.     return *this;
  238. }
  239.  
  240. matrix_4x4 &matrix_4x4::ConcatenateZTranslation( real Distance )
  241. {
  242.     aElements[0][3] = aElements[0][2] * Distance + aElements[0][3];
  243.     aElements[1][3] = aElements[1][2] * Distance + aElements[1][3];
  244.     aElements[2][3] = aElements[2][2] * Distance + aElements[2][3];
  245.     aElements[3][3] = aElements[3][2] * Distance + aElements[3][3];
  246.  
  247.     return *this;
  248. }
  249.  
  250. /*----------------------------------------------------------------------------
  251.  
  252. vector normalize.
  253.  
  254. */
  255.  
  256. vector_4 &vector_4::Normalize( void )
  257. {
  258.     real Length = sqrt(GetX()*GetX() + GetY()*GetY() + GetZ()*GetZ());
  259.  
  260.     SetX(GetX() / Length);
  261.     SetY(GetY() / Length);
  262.     SetZ(GetZ() / Length);
  263.  
  264.     return *this;
  265. }
  266.     
  267. /*----------------------------------------------------------------------------
  268.  
  269. view transform ctor.
  270.  
  271. */
  272.  
  273. view_transform::view_transform( point_4 const &Viewpoint,
  274.     vector_4 const &ViewDirection, vector_4 const &Up )
  275. {
  276.     // translate the viewpoint to the orgin
  277.  
  278.     this->ConcatenateXTranslation(-Viewpoint.GetX());
  279.     this->ConcatenateYTranslation(-Viewpoint.GetY());
  280.     this->ConcatenateZTranslation(-Viewpoint.GetZ());
  281.  
  282.     // get view vectors set up
  283.  
  284.     vector_4 Right = -CrossProduct(ViewDirection,Up);
  285.     vector_4 ReallyUp = CrossProduct(Right,ViewDirection);
  286.     
  287.     matrix_4x4 LookDownZ;
  288.  
  289.     for(int Counter = 0;Counter < 3;Counter++)
  290.     {
  291.         LookDownZ.SetElement(0,Counter,Right.GetElement(Counter));
  292.     }
  293.  
  294.     for(Counter = 0;Counter < 3;Counter++)
  295.     {
  296.         LookDownZ.SetElement(1,Counter,ReallyUp.GetElement(Counter));
  297.     }
  298.  
  299.     for(Counter = 0;Counter < 3;Counter++)
  300.     {
  301.         LookDownZ.SetElement(2,Counter,ViewDirection.GetElement(Counter));
  302.     }
  303.  
  304.     this->matrix_4x4::operator=(LookDownZ * *this);
  305. }
  306.  
  307. //*** Turn on float conversion warning
  308. #pragma warning ( default : 4136 )
  309.  
  310.