home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / Graphics / sKulpt / skulpt-src / Objects-Geom.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-08-30  |  6.4 KB  |  224 lines

  1. #define STRICT
  2.  
  3. // Includes standard Windows
  4. #include <windows.h>
  5. #include <windowsx.h>
  6. #include <time.h>
  7. #include <stdlib.h>
  8. #include <malloc.h>
  9. #include <memory.h>
  10. #include <stdio.h>
  11. #include <math.h>
  12.  
  13. // Includes D3D
  14. #define  D3D_OVERLOADS
  15. #include <ddraw.h>
  16. #include <d3d.h>
  17. #include <d3dx.h>
  18.  
  19. // Includes utilitaires D3D
  20. #include "d3dmath.h"
  21. #include "d3dutil.h"
  22. #include "D3DEnum.h"
  23.  
  24. // Ids Resources
  25. #include "resource.h"
  26.  
  27. // Constantes
  28. #include "const.h"
  29.  
  30. // Types
  31. #include "types.h"
  32.  
  33. // Variables globales projet
  34. #include "vars.h"
  35.  
  36. // Prototypes fonctions autres modules
  37. #include "proto.h"
  38.  
  39. // Macros
  40. #include "macros.h"
  41.  
  42. void vAddSphere(D3DVECTOR vCenter, float r, int horiz, int vert, BOOL bHalf)
  43. {
  44.     float hIncr = 2.f * g_PI / horiz;    
  45.     float vIncr = g_PI / vert;
  46.  
  47.     D3DVECTOR a, b, c;
  48.  
  49.     for(int i = 0; i < (bHalf ? vert / 2 : vert) ; i++)
  50.     {
  51.         float rTemp1, rTemp2;        // rayon des deux cercles
  52.         
  53.         rTemp1 = (float) sin(i * vIncr) * r;
  54.         rTemp2 = (float) sin((i + 1) * vIncr) * r;
  55.  
  56.         for(int j = 0; j < horiz; j++)
  57.         {
  58.             a.x = (float) cos(   j    * hIncr) * rTemp1 + vCenter.x;
  59.             a.y = (float) cos(   i    * vIncr) * r      + vCenter.y;
  60.             a.z = (float) sin(   j    * hIncr) * rTemp1 + vCenter.z;
  61.  
  62.             b.x = (float) cos((j + 1) * hIncr) * rTemp1 + vCenter.x;
  63.             b.y = (float) cos(   i    * vIncr) * r      + vCenter.y;
  64.             b.z = (float) sin((j + 1) * hIncr) * rTemp1 + vCenter.z;
  65.  
  66.             c.x = (float) cos(   j    * hIncr) * rTemp2 + vCenter.x;
  67.             c.y = (float) cos((i + 1) * vIncr) * r      + vCenter.y;
  68.             c.z = (float) sin(   j    * hIncr) * rTemp2 + vCenter.z;
  69.  
  70.             iMakeTriangle(iMakeVertex(a, XDC_ALLOWSAME),
  71.                           iMakeVertex(b, XDC_ALLOWSAME),
  72.                           iMakeVertex(c, XDC_ALLOWSAME),
  73.                           0);
  74.  
  75.             a.x = (float) cos((j + 1) * hIncr) * rTemp2 + vCenter.x;
  76.             a.y = (float) cos((i + 1) * vIncr) * r      + vCenter.y;
  77.             a.z = (float) sin((j + 1) * hIncr) * rTemp2 + vCenter.z;
  78.  
  79.             iMakeTriangle(iMakeVertex(a, XDC_ALLOWSAME),
  80.                           iMakeVertex(b, XDC_ALLOWSAME),
  81.                           iMakeVertex(c, XDC_ALLOWSAME),
  82.                           0);
  83.         }
  84.     }
  85. }
  86.  
  87. void vAddBoing(D3DVECTOR vCenter, float r)
  88. {
  89.     int horiz = 14, vert = 6;
  90.     float hIncr = 2.f * g_PI / horiz;    
  91.     float vIncr = g_PI / vert;
  92.  
  93.     D3DVECTOR a, b, c;
  94.  
  95.     for(int i = 0; i < vert; i++)
  96.     {
  97.         float rTemp1, rTemp2;        // rayon des deux cercles
  98.         
  99.         rTemp1 = (float) sin(i * vIncr) * r;
  100.         rTemp2 = (float) sin((i + 1) * vIncr) * r;
  101.  
  102.         for(int j = 0; j < horiz; j++)
  103.         {
  104.             a.x = (float) cos(   j    * hIncr) * rTemp1 + vCenter.x;
  105.             a.y = (float) cos(   i    * vIncr) * r      + vCenter.y;
  106.             a.z = (float) sin(   j    * hIncr) * rTemp1 + vCenter.z;
  107.  
  108.             b.x = (float) cos((j + 1) * hIncr) * rTemp1 + vCenter.x;
  109.             b.y = (float) cos(   i    * vIncr) * r      + vCenter.y;
  110.             b.z = (float) sin((j + 1) * hIncr) * rTemp1 + vCenter.z;
  111.  
  112.             c.x = (float) cos(   j    * hIncr) * rTemp2 + vCenter.x;
  113.             c.y = (float) cos((i + 1) * vIncr) * r      + vCenter.y;
  114.             c.z = (float) sin(   j    * hIncr) * rTemp2 + vCenter.z;
  115.  
  116.             if((i & 1)?(j & 1):!(j & 1))
  117.                 iMakeTriangle(iMakeVertex(a, XDC_ALLOWSAME),
  118.                               iMakeVertex(b, XDC_ALLOWSAME),
  119.                               iMakeVertex(c, XDC_ALLOWSAME),
  120.                               2);
  121.             else
  122.                 iMakeTriangle(iMakeVertex(a, XDC_ALLOWSAME),
  123.                               iMakeVertex(b, XDC_ALLOWSAME),
  124.                               iMakeVertex(c, XDC_ALLOWSAME),
  125.                               0);
  126.  
  127.             a.x = (float) cos((j + 1) * hIncr) * rTemp2 + vCenter.x;
  128.             a.y = (float) cos((i + 1) * vIncr) * r      + vCenter.y;
  129.             a.z = (float) sin((j + 1) * hIncr) * rTemp2 + vCenter.z;
  130.  
  131.             if((i & 1)?(j & 1):!(j & 1))
  132.                 iMakeTriangle(iMakeVertex(a, XDC_ALLOWSAME),
  133.                               iMakeVertex(b, XDC_ALLOWSAME),
  134.                               iMakeVertex(c, XDC_ALLOWSAME),
  135.                               2);
  136.             else
  137.                 iMakeTriangle(iMakeVertex(a, XDC_ALLOWSAME),
  138.                               iMakeVertex(b, XDC_ALLOWSAME),
  139.                               iMakeVertex(c, XDC_ALLOWSAME),
  140.                               0);
  141.         }
  142.     }
  143. }
  144.  
  145. #define AddTorusCalcX(i,j) ((float) (((r * cos((j) * 2*g_PI/m)) + R) * cos((i) * 2*g_PI/n) + vCenter.x))
  146. #define AddTorusCalcY(i,j) ((float) (r * sin((j) * 2*g_PI/m) + vCenter.y))
  147. #define AddTorusCalcZ(i,j) ((float) (((r * cos((j) * 2*g_PI/m)) + R) * sin((i) * 2*g_PI/n) + vCenter.z))
  148.  
  149. void vAddTorus(D3DVECTOR vCenter, float R, float r, int n, int m)
  150. {
  151.     D3DVECTOR a, b, c, d;
  152.  
  153.     for(int i = 0; i <= n; i++)
  154.         for(int j = 0; j <= m; j++)
  155.         {
  156.             a.x=AddTorusCalcX( i , j );    a.y=AddTorusCalcY( i , j );    a.z=AddTorusCalcZ( i , j );    
  157.             b.x=AddTorusCalcX( i ,j+1);    b.y=AddTorusCalcY( i ,j+1);    b.z=AddTorusCalcZ( i ,j+1);
  158.             c.x=AddTorusCalcX(i+1, j );    c.y=AddTorusCalcY(i+1, j );    c.z=AddTorusCalcZ(i+1, j );
  159.             d.x=AddTorusCalcX(i+1,j+1);    d.y=AddTorusCalcY(i+1,j+1);    d.z=AddTorusCalcZ(i+1,j+1);
  160.  
  161.             if((i & 1)?(j & 1):!(j & 1))
  162.             {
  163.                 iMakeTriangle(iMakeVertex(a, XDC_ALLOWSAME),
  164.                               iMakeVertex(b, XDC_ALLOWSAME),
  165.                               iMakeVertex(c, XDC_ALLOWSAME),
  166.                               2);
  167.                 iMakeTriangle(iMakeVertex(c, XDC_ALLOWSAME),
  168.                               iMakeVertex(b, XDC_ALLOWSAME),
  169.                               iMakeVertex(d, XDC_ALLOWSAME),
  170.                               2);
  171.             }
  172.             else
  173.             {
  174.                 iMakeTriangle(iMakeVertex(a, XDC_ALLOWSAME),
  175.                               iMakeVertex(b, XDC_ALLOWSAME),
  176.                               iMakeVertex(c, XDC_ALLOWSAME),
  177.                               0);
  178.                 iMakeTriangle(iMakeVertex(c, XDC_ALLOWSAME),
  179.                               iMakeVertex(b, XDC_ALLOWSAME),
  180.                               iMakeVertex(d, XDC_ALLOWSAME),
  181.                               0);
  182.             }
  183.         }
  184. }
  185.  
  186. void vAddDisk(D3DVECTOR vCenter, float r, int iSubdiv)
  187. {
  188.     float fIncr = 2.f * g_PI / iSubdiv;    
  189.  
  190.     D3DVECTOR a, b;
  191.  
  192.     for(int j = 0; j < iSubdiv; j++)
  193.     {
  194.         a.x = (float) sin(   j    * fIncr) * r      + vCenter.x;
  195.         a.y = (float) cos(   j    * fIncr) * r      + vCenter.y;
  196.         b.x = (float) sin((j + 1) * fIncr) * r      + vCenter.x;
  197.         b.y = (float) cos((j + 1) * fIncr) * r      + vCenter.y;
  198.         a.z = b.z = vCenter.z;
  199.         iMakeTriangle(iMakeVertex(vCenter, XDC_ALLOWSAME),
  200.                       iMakeVertex(a, XDC_ALLOWSAME),
  201.                       iMakeVertex(b, XDC_ALLOWSAME),
  202.                       (j & 1) ? 0 : 2);
  203.     }
  204. }
  205.  
  206. void vAddCircle(D3DVECTOR vCenter, float r, int iSubdiv)
  207. {
  208.     float fIncr = 2.f * g_PI / iSubdiv;    
  209.  
  210.     D3DVECTOR a, b;
  211.  
  212.     for(int j = 0; j < iSubdiv; j++)
  213.     {
  214.         a.x = (float) sin(   j    * fIncr) * r      + vCenter.x;
  215.         a.y = (float) cos(   j    * fIncr) * r      + vCenter.y;
  216.         b.x = (float) sin((j + 1) * fIncr) * r      + vCenter.x;
  217.         b.y = (float) cos((j + 1) * fIncr) * r      + vCenter.y;
  218.         a.z = b.z = vCenter.z;
  219.  
  220.         iMakeEdge(iMakeVertex(a, XDC_ALLOWSAME), iMakeVertex(b, XDC_ALLOWSAME));
  221.     }
  222. }
  223.  
  224.