home *** CD-ROM | disk | FTP | other *** search
- /*
- Company: Sensaura
- Copyright: (C) 1999
-
- Software Project: Sensaura DirectSound3D Demo
- File Name: dxwldobj.cpp
- File Description: Source file for implementation of DirectXWorld 3D object classes
- Author: Adam Philp
- File Version: 1.02.000
- Last Update: 11-FEB-99
-
- Target Compiler: Microsoft Visual C++ Version 5.0
- */
-
- /////////////////////// Included files ////////////////////////////////////////////////////////////
-
- #include <windows.h>
- #include <math.h>
-
- #include "dxwldobj.h"
- #include "dxworld.h"
- #include "directx.h" // DirectX functions and macros
-
- /////////////////////// Constants /////////////////////////////////////////////////////////////////
-
- const D3DVALUE PI = D3DVAL(3.1415926);
- const D3DVALUE MAX_DISTANCE = D3DVAL(90.0);
- const D3DVALUE SAUCER_SPEED = D3DVAL(20.0);
- const D3DVALUE BULLET_SPEED = D3DVAL(250.0);
- const D3DVALUE METEOR_SPEED = D3DVAL(20.0);
- const D3DVALUE EXPLOSION_SPEED = D3DVAL(10.0);
-
- /////////////////////// D3DRMGlobeObject class implementation //////////////////////////////////////
-
- D3DRMGlobeObject::D3DRMGlobeObject(DirectXWorld* pWorld,
- LPDIRECT3DRMMESHBUILDER2* ppBuilder,
- DWORD flags, DWORD lifetime)
- : D3DRMSphereObject(pWorld, ID_GLOBE, *ppBuilder, flags, lifetime)
- {
- m_ppBuilder = NULL;
-
- TRY_D3DRM(m_pFrame->AddVisual((LPDIRECT3DRMVISUAL)*ppBuilder))
- TRY_D3DRM(m_pFrame->SetPosition(m_pWorld->m_pScene, 0, 0, 0))
- TRY_D3DRM(m_pFrame->SetRotation(m_pWorld->m_pScene, D3DVAL(0.1), D3DVAL(0.7), D3DVAL(0.2), D3DVAL(1.0)))
-
- if(pWorld->m_DirectSoundType == DIRECTSOUND3D_SENSAURA)
- SensauraWrap(*ppBuilder);
- else
- {
- TRY_D3DRM(m_pFrame->SetMaterialMode(D3DRMMATERIAL_FROMFRAME))
- TRY_D3DRM(m_pFrame->SetColorRGB(D3DVAL(0), D3DVAL(0), D3DVAL(1)))
- }
- m_ppBuilder = ppBuilder;
-
- D3DRM_ERROR:
- return;
- }
-
- D3DRMGlobeObject::~D3DRMGlobeObject()
- {
- RELEASE((*m_ppBuilder))
- }
-
- bool D3DRMGlobeObject::SensauraWrap(LPDIRECT3DRMMESHBUILDER pBuilder)
- {
- bool bResult = false;
- LPDIRECT3DRMTEXTURE2 pTexture = NULL;
- LPDIRECT3DRMWRAP pWrap = NULL;
- LPDIRECT3DRMMATERIAL pMaterial = NULL;
-
- TRY_D3DRM(m_pWorld->m_pD3DRM->CreateMaterial(D3DVAL(20.0), &pMaterial))
- TRY_D3DRM(pBuilder->SetMaterial(pMaterial))
- TRY_D3DRM(m_pWorld->m_pD3DRM->CreateWrap(D3DRMWRAP_CYLINDER, NULL,
- D3DVAL(0.0), D3DVAL(0.0), D3DVAL(0.0),
- D3DVAL(0.0), D3DVAL(1.0), D3DVAL(0.0),
- D3DVAL(0.0), D3DVAL(0.0), D3DVAL(1.0),
- D3DVAL(0.0), D3DDivide(min.y, max.y-min.y),
- D3DVAL(1.0), D3DDivide(-D3DVAL(1.0), max.y-min.y),
- &pWrap))
- TRY_D3DRM(pWrap->Apply((LPDIRECT3DRMOBJECT)pBuilder))
- TRY_D3DRM(m_pWorld->m_pD3DRM->LoadTexture(".\\Objects\\sensaura.ppm", &pTexture))
- TRY_D3DRM(pTexture->SetShades(32))
- TRY_D3DRM(pBuilder->SetTexture(pTexture))
-
- bResult = true;
-
- D3DRM_ERROR:
- RELEASE(pMaterial)
- RELEASE(pWrap)
- RELEASE(pTexture)
- return bResult;
- }
-
- /////////////////////// D3DRMSaucerObject class implementation ////////////////////////////////////
-
- D3DRMSaucerObject::D3DRMSaucerObject(DirectXWorld* pWorld,
- LPDIRECT3DRMMESHBUILDER pBuilder,
- DWORD flags, DWORD lifetime)
- : D3DRMBoxObject(pWorld, ID_SAUCER, pBuilder, flags, lifetime)
- {
- static D3DVALUE v = SAUCER_SPEED;
-
- m_Velocity = v; // Set initial position and velocity
- v = -v;
- TRY_D3DRM(m_pFrame->AddVisual((LPDIRECT3DRMVISUAL)pBuilder))
- TRY_D3DRM(m_pFrame->SetPosition(m_pWorld->m_pScene, 0, 0, 30))
- TRY_D3DRM(m_pFrame->SetRotation(m_pWorld->m_pScene, 0, 1, 0, D3DVAL(0.1)))
-
- D3DRM_ERROR:
- return;
- }
-
- /*
- Function: Update
- Description: Update the object's position, velocity, sound etc
- Parameters: delta - time in seconds by which to advance the object's life
- Return value: true if successful, false otherwise
- */
-
- bool D3DRMSaucerObject::Update(D3DVALUE delta)
- {
- D3DVECTOR p, v, up = { 0, 1, 0 };
-
- if(!D3DRMBoxObject::Update(delta))
- return false;
- // Update velocity so that saucer orbits in a circle
- TRY_D3DRM(m_pFrame->GetPosition(m_pWorld->m_pScene, &p))
- D3DRMVectorCrossProduct(&v, &p, &up);
- D3DRMVectorNormalize(&v);
- D3DRMVectorScale(&v, &v, m_Velocity);
- TRY_D3DRM(m_pFrame->SetVelocity(m_pWorld->m_pScene, v.x, v.y, v.z, FALSE))
- return true;
-
- D3DRM_ERROR:
- return false;
- }
-
- /////////////////////// D3DRMMeteorObject class implementation ////////////////////////////////////
-
- D3DRMMeteorObject::D3DRMMeteorObject(DirectXWorld* pWorld,
- LPDIRECT3DRMMESHBUILDER pBuilder,
- DWORD flags, DWORD lifetime)
- : D3DRMBoxObject(pWorld, ID_METEOR, pBuilder, flags, lifetime)
- {
- static D3DVALUE v = METEOR_SPEED;
-
- v = -v; // Set initial position and velocity
- TRY_D3DRM(m_pFrame->AddVisual((LPDIRECT3DRMVISUAL)pBuilder))
- TRY_D3DRM(m_pFrame->SetPosition(m_pWorld->m_pScene, 0, 0, 50))
- TRY_D3DRM(m_pFrame->SetVelocity(m_pWorld->m_pScene, v, 0, 0, FALSE))
- TRY_D3DRM(m_pFrame->SetRotation(m_pWorld->m_pScene, 1, 0, 0, RandomD3DVALUE(-0.2, 0.2)))
-
- D3DRM_ERROR:
- return;
- }
-
- /*
- Function: Update
- Description: Update the object's position, velocity, sound etc
- Parameters: delta - time in seconds by which to advance the object's life
- Return value: true if successful, false otherwise
- */
-
- bool D3DRMMeteorObject::Update(D3DVALUE delta)
- {
- D3DVECTOR p, v;
- bool bChange = false;
-
- if(!D3DRMBoxObject::Update(delta))
- return false;
- // Keep meteor within a certain range
- m_pFrame->GetPosition(m_pWorld->m_pScene, &p);
- m_pFrame->GetVelocity(m_pWorld->m_pScene, &v, FALSE);
- if(p.x > MAX_DISTANCE || p.x < -MAX_DISTANCE)
- {
- v.x = -v.x;
- p.x = p.x > MAX_DISTANCE ? MAX_DISTANCE : -MAX_DISTANCE;
- bChange = true;
- }
- if(p.y > MAX_DISTANCE || p.y < -MAX_DISTANCE)
- {
- v.y = -v.y;
- p.y = p.y > MAX_DISTANCE ? MAX_DISTANCE : -MAX_DISTANCE;
- bChange = true;
- }
- if(p.z > MAX_DISTANCE || p.z < -MAX_DISTANCE)
- {
- p.z = p.z > MAX_DISTANCE ? MAX_DISTANCE : -MAX_DISTANCE;
- v.z = -v.z;
- bChange = true;
- }
- if(bChange)
- {
- TRY_D3DRM(m_pFrame->SetPosition(m_pWorld->m_pScene, p.x, p.y, p.z))
- TRY_D3DRM(m_pFrame->SetVelocity(m_pWorld->m_pScene, v.x, v.y, v.z, FALSE))
- }
- return true;
-
- D3DRM_ERROR:
- return false;
- }
-
- /////////////////////// D3DRMBulletObject class implementation ////////////////////////////////////
-
- D3DRMBulletObject::D3DRMBulletObject(DirectXWorld* pWorld,
- LPDIRECT3DRMMESHBUILDER pBuilder,
- DWORD flags, DWORD lifetime)
- : D3DRMSphereObject(pWorld, ID_BULLET, pBuilder, flags, lifetime)
- {
- D3DVALUE colors[3] = { 0, 0, 0 };
- int i = (int)(RandomD3DVALUE (0, 2.99));;
- static D3DVALUE bulletOffset = D3DVAL(-2.0);
-
- colors[i] = 1; // Make bullet red, green or blue at random
- TRY_D3DRM(m_pFrame->SetMaterialMode(D3DRMMATERIAL_FROMFRAME))
- TRY_D3DRM(m_pFrame->AddVisual((LPDIRECT3DRMVISUAL)pBuilder))
- TRY_D3DRM(m_pFrame->SetColorRGB(colors[0], colors[1], colors[2]))
- // Set initial position and velocity
- TRY_D3DRM(m_pFrame->SetPosition(m_pWorld->m_pCamera, bulletOffset, 0, 0))
- TRY_D3DRM(m_pFrame->SetVelocity(m_pWorld->m_pCamera, 0, 0, BULLET_SPEED, FALSE))
-
- bulletOffset = -bulletOffset;
-
- D3DRM_ERROR:
- return;
- }
-
- /////////////////////// D3DRMExplosionObject class implementation ////////////////////////////////////
-
- D3DRMExplosionObject::D3DRMExplosionObject(DirectXWorld* pWorld, DWORD id,
- LPDIRECT3DRMMESHBUILDER pBuilder, LPD3DVECTOR pos,
- DWORD flags, DWORD lifetime)
- : D3DRMBoxObject(pWorld, ID_EXPLOSION+id, pBuilder, flags, lifetime)
- { // Give the object a random color
- m_Red = D3DVAL(rand() > RAND_MAX/2 ? 1 : 0);
- m_Green = D3DVAL(rand() > RAND_MAX/2 ? 1 : 0);
- m_Blue = D3DVAL(rand() > RAND_MAX/2 ? 1 : 0);
-
- TRY_D3DRM(m_pFrame->SetMaterialMode(D3DRMMATERIAL_FROMFRAME))
- TRY_D3DRM(m_pFrame->AddVisual((LPDIRECT3DRMVISUAL)pBuilder))
- // Set initial position and velocity
- TRY_D3DRM(m_pFrame->SetPosition(m_pWorld->m_pScene, pos->x, pos->y, pos->z))
- TRY_D3DRM(m_pFrame->SetVelocity(m_pWorld->m_pScene,
- RandomD3DVALUE(-EXPLOSION_SPEED, EXPLOSION_SPEED),
- RandomD3DVALUE(-EXPLOSION_SPEED, EXPLOSION_SPEED),
- RandomD3DVALUE(-EXPLOSION_SPEED, EXPLOSION_SPEED),
- FALSE))
- TRY_D3DRM(m_pFrame->SetRotation(m_pWorld->m_pScene,
- RandomD3DVALUE(0, 1),
- RandomD3DVALUE(0, 1),
- RandomD3DVALUE(D3DVAL(0.1), 1),
- RandomD3DVALUE(1, 10)))
-
- D3DRM_ERROR:
- return;
- }
-
- /*
- Function: Update
- Description: Update the object's position, velocity, sound etc
- Parameters: delta - time in seconds by which to advance the object's life
- Return value: true if successful, false otherwise
- */
-
- bool D3DRMExplosionObject::Update(D3DVALUE delta)
- {
- D3DVALUE brightness = D3DVAL(3000-m_dwAge)/D3DVAL(3000);
- if(brightness < 0)
- brightness = 0;
- // Fade the object's color over time
- if(!D3DRMBoxObject::Update(delta))
- return false;
- if(!m_bKilled)
- TRY_D3DRM(m_pFrame->SetColorRGB(brightness*m_Red, brightness*m_Green, brightness*m_Blue))
-
- return true;
-
- D3DRM_ERROR:
- return false;
- }
-
-