home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / C++ / Snippets / QD3D Juggler / Juggler Sources / CClubMaker.cp < prev    next >
Encoding:
Text File  |  1995-12-27  |  2.6 KB  |  89 lines  |  [TEXT/CWIE]

  1. //
  2. //    CClub.cp
  3. //
  4. //    class CClub
  5. //    A juggling club.
  6. //    Implimented as a Tri-Grid.
  7. //
  8. //    by James Jennings
  9. //    Started November 23, 1995
  10. //
  11.  
  12. #include "CClubMaker.h"
  13. #include "QD3D Debug Macros.h"
  14. #include "StQ3Disposer.h"
  15.  
  16. #include "ObjectHandle.h"    // to dispose of an array of stuff
  17.  
  18. const short lathNumber = 13;    // number of "lath faces" + 1
  19. const short numberOfClubPoints = 11;
  20. static const float club[numberOfClubPoints][2] = {
  21.     //    { z-coord, x or y-coord}, measured in cm
  22.         {  0.0, 0.0   },    // bottom face (black)
  23.         {  0.0, 3.3/2 },    // knob (black)
  24.         {  2.2, 3.2/2 },
  25.         {  2.2, 1.9/2 },    // handle (silver)
  26.         { 23.0, 3.1/2 },    // throat (blue)
  27.         { 32.5, 6.0/2 },    // body (white)
  28.         { 37.0, 7.5/2 },
  29.         { 40.5, 7.6/2 },
  30.         { 44.0, 7.0/2 },    // cap (silver)
  31.         { 52.0, 4.2/2 },    // end
  32.         { 52.0, 0.0   }        // top face (black)
  33.     };
  34. static const TQ3Point3D centerOfGravity = { 0.0, 0.0, 28.0};
  35. static const float scale = 0.01 * 5;    // convert to meters, and blow up a bit
  36.  
  37. void
  38. CClubMaker::Make()
  39. {
  40.     TQ3TriGridData data;
  41.     
  42.     data.numRows = numberOfClubPoints;
  43.     data.numColumns = lathNumber;
  44.     data.facetAttributeSet = nil;
  45.     data.triGridAttributeSet = ::Q3AttributeSet_New();
  46.     ThrowIfNil_(data.triGridAttributeSet);
  47.     StQ3Disposer tgColor(data.triGridAttributeSet);
  48.     TQ3ColorRGB color = { 1, 0, 0};
  49.     ::Q3AttributeSet_Add(data.triGridAttributeSet, kQ3AttributeTypeDiffuseColor, &color);
  50.     
  51.     // Allocate the vertices as a self-disposing handle.
  52.     StHandleBlock verts( data.numRows  *data.numColumns * sizeof(TQ3Vertex3D) );
  53.     StHandleLocker locker(verts);
  54.     data.vertices = (TQ3Vertex3D*)*Handle(verts);
  55.     
  56.     // an array of attribute objects that disposes itself.
  57.     ObjectArrayHandle<StQ3Disposer> oah(data.numRows * data.numColumns);
  58.     
  59.     int i=0;
  60.     for (int r=0; r<data.numRows; r++) {
  61.         float z   = club[r][0]*scale;    // convert to meters
  62.         float rho = club[r][1]*scale;
  63.         for (int c=0; c<data.numColumns; c++, i++) {
  64.             float angle = c * kQ32Pi/(data.numColumns-1);
  65.             TQ3Vertex3D *v = &(data.vertices[i]);
  66.             ::Q3Point3D_Set(&(v->point), rho*cos(angle), rho*sin(angle), z);
  67.             // Add a parameterization.
  68.             v->attributeSet = ::Q3AttributeSet_New();
  69.             ThrowIfNil_(v->attributeSet);
  70.             oah[i] = v->attributeSet;    // put it in the self disposing array
  71.             TQ3Param2D p;
  72.             p.u = z/(club[numberOfClubPoints-1][0]*scale);
  73.             p.v = (float)c/(data.numColumns-1);
  74.             ::Q3AttributeSet_Add(v->attributeSet, kQ3AttributeTypeShadingUV, &p);
  75.         }
  76.     }
  77.     
  78.     mObject = ::Q3TriGrid_New(&data);
  79.     ThrowIfNil_(mObject);
  80. }
  81.  
  82. void
  83. CClubMaker::GetCenterOfGravity(TQ3Point3D &com)
  84. {
  85.     ::Q3Point3D_Set(&com,    centerOfGravity.x * scale, 
  86.                             centerOfGravity.y * scale, 
  87.                             centerOfGravity.z * scale);
  88. }
  89.