home *** CD-ROM | disk | FTP | other *** search
/ Game Audio Programming / GameAudioProgramming.iso / Extras / Sensaura / SDK1.0 / data1.cab / Example_Files / DS3DDemo / Source / dxwldobj.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-06-13  |  9.0 KB  |  282 lines

  1. /*
  2.     Company:            Sensaura
  3.     Copyright:          (C) 1999
  4.  
  5.     Software Project:    Sensaura DirectSound3D Demo
  6.     File Name:            dxwldobj.cpp
  7.     File Description:    Source file for implementation of DirectXWorld 3D object classes
  8.     Author:                Adam Philp
  9.     File Version:        1.02.000
  10.     Last Update:        11-FEB-99
  11.  
  12.     Target Compiler:    Microsoft Visual C++ Version 5.0
  13. */
  14.  
  15. ///////////////////////    Included files ////////////////////////////////////////////////////////////
  16.  
  17. #include <windows.h>
  18. #include <math.h>
  19.  
  20. #include "dxwldobj.h"
  21. #include "dxworld.h"
  22. #include "directx.h"                    // DirectX functions and macros
  23.  
  24. ///////////////////////    Constants /////////////////////////////////////////////////////////////////
  25.  
  26. const D3DVALUE PI                = D3DVAL(3.1415926);
  27. const D3DVALUE MAX_DISTANCE        = D3DVAL(90.0);
  28. const D3DVALUE SAUCER_SPEED        = D3DVAL(20.0);
  29. const D3DVALUE BULLET_SPEED        = D3DVAL(250.0);
  30. const D3DVALUE METEOR_SPEED        = D3DVAL(20.0);
  31. const D3DVALUE EXPLOSION_SPEED    = D3DVAL(10.0);
  32.  
  33. /////////////////////// D3DRMGlobeObject class implementation //////////////////////////////////////
  34.  
  35. D3DRMGlobeObject::D3DRMGlobeObject(DirectXWorld* pWorld, 
  36.                                    LPDIRECT3DRMMESHBUILDER2* ppBuilder,
  37.                                    DWORD flags,    DWORD lifetime) 
  38. : D3DRMSphereObject(pWorld, ID_GLOBE, *ppBuilder, flags, lifetime)
  39. {
  40.     m_ppBuilder = NULL;
  41.  
  42.     TRY_D3DRM(m_pFrame->AddVisual((LPDIRECT3DRMVISUAL)*ppBuilder))
  43.     TRY_D3DRM(m_pFrame->SetPosition(m_pWorld->m_pScene, 0, 0, 0))
  44.     TRY_D3DRM(m_pFrame->SetRotation(m_pWorld->m_pScene, D3DVAL(0.1), D3DVAL(0.7), D3DVAL(0.2), D3DVAL(1.0)))
  45.  
  46.     if(pWorld->m_DirectSoundType == DIRECTSOUND3D_SENSAURA)
  47.         SensauraWrap(*ppBuilder);
  48.     else
  49.     {
  50.         TRY_D3DRM(m_pFrame->SetMaterialMode(D3DRMMATERIAL_FROMFRAME))
  51.         TRY_D3DRM(m_pFrame->SetColorRGB(D3DVAL(0), D3DVAL(0), D3DVAL(1)))
  52.     }
  53.     m_ppBuilder = ppBuilder;
  54.  
  55. D3DRM_ERROR:
  56.     return;
  57. }
  58.  
  59. D3DRMGlobeObject::~D3DRMGlobeObject()
  60. {
  61.     RELEASE((*m_ppBuilder))
  62. }
  63.  
  64. bool D3DRMGlobeObject::SensauraWrap(LPDIRECT3DRMMESHBUILDER pBuilder)
  65. {
  66.     bool bResult = false;
  67.     LPDIRECT3DRMTEXTURE2 pTexture = NULL;
  68.     LPDIRECT3DRMWRAP pWrap = NULL;
  69.     LPDIRECT3DRMMATERIAL pMaterial = NULL;
  70.  
  71.     TRY_D3DRM(m_pWorld->m_pD3DRM->CreateMaterial(D3DVAL(20.0), &pMaterial))
  72.     TRY_D3DRM(pBuilder->SetMaterial(pMaterial))
  73.     TRY_D3DRM(m_pWorld->m_pD3DRM->CreateWrap(D3DRMWRAP_CYLINDER, NULL,
  74.                                             D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0),
  75.                                             D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
  76.                                             D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0),
  77.                                             D3DVAL(0.0), D3DDivide(min.y, max.y-min.y),
  78.                                             D3DVAL(1.0), D3DDivide(-D3DVAL(1.0), max.y-min.y),
  79.                                             &pWrap))
  80.     TRY_D3DRM(pWrap->Apply((LPDIRECT3DRMOBJECT)pBuilder))
  81.     TRY_D3DRM(m_pWorld->m_pD3DRM->LoadTexture(".\\Objects\\sensaura.ppm", &pTexture))
  82.     TRY_D3DRM(pTexture->SetShades(32))
  83.     TRY_D3DRM(pBuilder->SetTexture(pTexture))
  84.  
  85.     bResult = true;
  86.  
  87. D3DRM_ERROR:
  88.     RELEASE(pMaterial)
  89.     RELEASE(pWrap)
  90.     RELEASE(pTexture)
  91.     return bResult;
  92. }
  93.  
  94. /////////////////////// D3DRMSaucerObject class implementation ////////////////////////////////////
  95.  
  96. D3DRMSaucerObject::D3DRMSaucerObject(DirectXWorld* pWorld,
  97.                                      LPDIRECT3DRMMESHBUILDER pBuilder,
  98.                                      DWORD flags, DWORD lifetime) 
  99. : D3DRMBoxObject(pWorld, ID_SAUCER, pBuilder, flags, lifetime)
  100. {
  101.     static D3DVALUE    v = SAUCER_SPEED;
  102.  
  103.     m_Velocity = v;                        // Set initial position and velocity
  104.     v = -v;
  105.     TRY_D3DRM(m_pFrame->AddVisual((LPDIRECT3DRMVISUAL)pBuilder))
  106.     TRY_D3DRM(m_pFrame->SetPosition(m_pWorld->m_pScene, 0, 0, 30))
  107.     TRY_D3DRM(m_pFrame->SetRotation(m_pWorld->m_pScene, 0, 1, 0, D3DVAL(0.1)))
  108.  
  109. D3DRM_ERROR:
  110.     return;
  111. }
  112.  
  113. /*
  114.     Function:        Update
  115.     Description:    Update the object's position, velocity, sound etc
  116.     Parameters:        delta -    time in seconds by which to advance the object's life
  117.     Return value:    true if successful, false otherwise
  118. */
  119.  
  120. bool D3DRMSaucerObject::Update(D3DVALUE delta)
  121. {
  122.     D3DVECTOR p, v, up = { 0, 1, 0 };
  123.  
  124.     if(!D3DRMBoxObject::Update(delta))
  125.         return false;
  126.                                         // Update velocity so that saucer orbits in a circle
  127.     TRY_D3DRM(m_pFrame->GetPosition(m_pWorld->m_pScene, &p))
  128.     D3DRMVectorCrossProduct(&v, &p, &up);
  129.     D3DRMVectorNormalize(&v);
  130.     D3DRMVectorScale(&v, &v, m_Velocity);
  131.     TRY_D3DRM(m_pFrame->SetVelocity(m_pWorld->m_pScene, v.x, v.y, v.z, FALSE))
  132.     return true;
  133.  
  134. D3DRM_ERROR:
  135.     return false;
  136. }
  137.  
  138. /////////////////////// D3DRMMeteorObject class implementation ////////////////////////////////////
  139.  
  140. D3DRMMeteorObject::D3DRMMeteorObject(DirectXWorld* pWorld,
  141.                                      LPDIRECT3DRMMESHBUILDER pBuilder,
  142.                                      DWORD flags, DWORD lifetime) 
  143. : D3DRMBoxObject(pWorld, ID_METEOR, pBuilder, flags, lifetime)
  144. {
  145.      static D3DVALUE    v = METEOR_SPEED;
  146.  
  147.     v = -v;                                // Set initial position and velocity
  148.     TRY_D3DRM(m_pFrame->AddVisual((LPDIRECT3DRMVISUAL)pBuilder))
  149.     TRY_D3DRM(m_pFrame->SetPosition(m_pWorld->m_pScene, 0, 0, 50))
  150.     TRY_D3DRM(m_pFrame->SetVelocity(m_pWorld->m_pScene, v, 0, 0, FALSE))
  151.     TRY_D3DRM(m_pFrame->SetRotation(m_pWorld->m_pScene, 1, 0, 0, RandomD3DVALUE(-0.2, 0.2)))
  152.  
  153. D3DRM_ERROR:
  154.     return;
  155. }
  156.  
  157. /*
  158.     Function:        Update
  159.     Description:    Update the object's position, velocity, sound etc
  160.     Parameters:        delta -    time in seconds by which to advance the object's life
  161.     Return value:    true if successful, false otherwise
  162. */
  163.  
  164. bool D3DRMMeteorObject::Update(D3DVALUE delta)
  165. {
  166.     D3DVECTOR    p, v;
  167.     bool          bChange = false;
  168.  
  169.     if(!D3DRMBoxObject::Update(delta))
  170.         return false;
  171.                                         // Keep meteor within a certain range
  172.     m_pFrame->GetPosition(m_pWorld->m_pScene, &p);
  173.     m_pFrame->GetVelocity(m_pWorld->m_pScene, &v, FALSE);
  174.     if(p.x > MAX_DISTANCE || p.x < -MAX_DISTANCE) 
  175.     {
  176.         v.x = -v.x;
  177.         p.x = p.x > MAX_DISTANCE ? MAX_DISTANCE : -MAX_DISTANCE;
  178.         bChange = true;
  179.     }
  180.     if(p.y > MAX_DISTANCE || p.y < -MAX_DISTANCE) 
  181.     {
  182.         v.y = -v.y;
  183.         p.y = p.y > MAX_DISTANCE ? MAX_DISTANCE : -MAX_DISTANCE;
  184.         bChange = true;
  185.     }
  186.     if(p.z > MAX_DISTANCE || p.z < -MAX_DISTANCE) 
  187.     {
  188.         p.z = p.z > MAX_DISTANCE ? MAX_DISTANCE : -MAX_DISTANCE;
  189.         v.z = -v.z;
  190.         bChange = true;
  191.     }
  192.     if(bChange) 
  193.     {
  194.         TRY_D3DRM(m_pFrame->SetPosition(m_pWorld->m_pScene, p.x, p.y, p.z))
  195.         TRY_D3DRM(m_pFrame->SetVelocity(m_pWorld->m_pScene, v.x, v.y, v.z, FALSE))
  196.     }
  197.     return true;
  198.  
  199. D3DRM_ERROR:
  200.     return false;
  201. }
  202.  
  203. /////////////////////// D3DRMBulletObject class implementation ////////////////////////////////////
  204.  
  205. D3DRMBulletObject::D3DRMBulletObject(DirectXWorld* pWorld,
  206.                                      LPDIRECT3DRMMESHBUILDER pBuilder,
  207.                                      DWORD flags, DWORD lifetime)
  208. : D3DRMSphereObject(pWorld, ID_BULLET, pBuilder, flags, lifetime)
  209. {
  210.     D3DVALUE        colors[3] = { 0, 0, 0 };
  211.     int                i = (int)(RandomD3DVALUE (0, 2.99));;
  212.     static D3DVALUE    bulletOffset = D3DVAL(-2.0);
  213.  
  214.     colors[i] = 1;                    // Make bullet red, green or blue at random
  215.     TRY_D3DRM(m_pFrame->SetMaterialMode(D3DRMMATERIAL_FROMFRAME))
  216.     TRY_D3DRM(m_pFrame->AddVisual((LPDIRECT3DRMVISUAL)pBuilder))
  217.     TRY_D3DRM(m_pFrame->SetColorRGB(colors[0], colors[1], colors[2]))
  218.                                     // Set initial position and velocity
  219.     TRY_D3DRM(m_pFrame->SetPosition(m_pWorld->m_pCamera, bulletOffset, 0, 0))
  220.     TRY_D3DRM(m_pFrame->SetVelocity(m_pWorld->m_pCamera, 0, 0, BULLET_SPEED, FALSE))
  221.  
  222.     bulletOffset = -bulletOffset;
  223.  
  224. D3DRM_ERROR:
  225.     return;
  226. }
  227.  
  228. /////////////////////// D3DRMExplosionObject class implementation ////////////////////////////////////
  229.  
  230. D3DRMExplosionObject::D3DRMExplosionObject(DirectXWorld* pWorld, DWORD id,        
  231.                                            LPDIRECT3DRMMESHBUILDER pBuilder, LPD3DVECTOR pos,
  232.                                            DWORD flags, DWORD lifetime)
  233. : D3DRMBoxObject(pWorld, ID_EXPLOSION+id, pBuilder, flags, lifetime)
  234. {                                        // Give the object a random color
  235.     m_Red = D3DVAL(rand() > RAND_MAX/2 ? 1 : 0);
  236.     m_Green = D3DVAL(rand() > RAND_MAX/2 ? 1 : 0);
  237.     m_Blue = D3DVAL(rand() > RAND_MAX/2 ? 1 : 0);
  238.     
  239.     TRY_D3DRM(m_pFrame->SetMaterialMode(D3DRMMATERIAL_FROMFRAME))
  240.     TRY_D3DRM(m_pFrame->AddVisual((LPDIRECT3DRMVISUAL)pBuilder))
  241.                                         // Set initial position and velocity
  242.     TRY_D3DRM(m_pFrame->SetPosition(m_pWorld->m_pScene, pos->x, pos->y, pos->z))
  243.     TRY_D3DRM(m_pFrame->SetVelocity(m_pWorld->m_pScene,
  244.                                     RandomD3DVALUE(-EXPLOSION_SPEED, EXPLOSION_SPEED),    
  245.                                     RandomD3DVALUE(-EXPLOSION_SPEED, EXPLOSION_SPEED),    
  246.                                     RandomD3DVALUE(-EXPLOSION_SPEED, EXPLOSION_SPEED),
  247.                                     FALSE))
  248.     TRY_D3DRM(m_pFrame->SetRotation(m_pWorld->m_pScene, 
  249.                                     RandomD3DVALUE(0, 1), 
  250.                                     RandomD3DVALUE(0, 1), 
  251.                                     RandomD3DVALUE(D3DVAL(0.1), 1),
  252.                                     RandomD3DVALUE(1, 10)))
  253.  
  254. D3DRM_ERROR:
  255.     return;
  256. }
  257.  
  258. /*
  259.     Function:        Update
  260.     Description:    Update the object's position, velocity, sound etc
  261.     Parameters:        delta -    time in seconds by which to advance the object's life
  262.     Return value:    true if successful, false otherwise
  263. */
  264.  
  265. bool D3DRMExplosionObject::Update(D3DVALUE delta)
  266. {
  267.     D3DVALUE brightness = D3DVAL(3000-m_dwAge)/D3DVAL(3000);
  268.     if(brightness < 0)
  269.         brightness = 0;
  270.                                         // Fade the object's color over time
  271.     if(!D3DRMBoxObject::Update(delta))
  272.         return false;
  273.     if(!m_bKilled)
  274.         TRY_D3DRM(m_pFrame->SetColorRGB(brightness*m_Red, brightness*m_Green, brightness*m_Blue))
  275.  
  276.     return true;
  277.  
  278. D3DRM_ERROR:
  279.     return false;
  280. }
  281.  
  282.