summaryrefslogtreecommitdiffstats
path: root/src/render/Glass.cpp
diff options
context:
space:
mode:
authorSergeanur <s.anureev@yandex.ua>2021-07-17 23:03:57 +0200
committerSergeanur <s.anureev@yandex.ua>2021-07-17 23:03:57 +0200
commitc937bdbfea8f522d14d7a41f24372bddf5bdafcc (patch)
treeeb8f97f6cf9fac31d7ab90388af232d51cc9c137 /src/render/Glass.cpp
parentMerge pull request #1219 from withmorten/miami-ini (diff)
downloadre3-c937bdbfea8f522d14d7a41f24372bddf5bdafcc.tar
re3-c937bdbfea8f522d14d7a41f24372bddf5bdafcc.tar.gz
re3-c937bdbfea8f522d14d7a41f24372bddf5bdafcc.tar.bz2
re3-c937bdbfea8f522d14d7a41f24372bddf5bdafcc.tar.lz
re3-c937bdbfea8f522d14d7a41f24372bddf5bdafcc.tar.xz
re3-c937bdbfea8f522d14d7a41f24372bddf5bdafcc.tar.zst
re3-c937bdbfea8f522d14d7a41f24372bddf5bdafcc.zip
Diffstat (limited to 'src/render/Glass.cpp')
-rw-r--r--src/render/Glass.cpp1027
1 files changed, 0 insertions, 1027 deletions
diff --git a/src/render/Glass.cpp b/src/render/Glass.cpp
deleted file mode 100644
index b4ec8c7e..00000000
--- a/src/render/Glass.cpp
+++ /dev/null
@@ -1,1027 +0,0 @@
-#include "common.h"
-
-#include "Glass.h"
-#include "Timer.h"
-#include "Object.h"
-#include "Vehicle.h"
-#include "Pools.h"
-#include "General.h"
-#include "AudioScriptObject.h"
-#include "World.h"
-#include "Timecycle.h"
-#include "Particle.h"
-#include "Camera.h"
-#include "RenderBuffer.h"
-#include "Shadows.h"
-#include "ModelIndices.h"
-#include "main.h"
-#include "soundlist.h"
-#include "SurfaceTable.h"
-
-
-uint32 CGlass::NumGlassEntities;
-CEntity *CGlass::apEntitiesToBeRendered[NUM_GLASSENTITIES];
-CFallingGlassPane CGlass::aGlassPanes[NUM_GLASSPANES];
-
-
-CVector2D CentersWithTriangle[NUM_GLASSTRIANGLES];
-const CVector2D CoorsWithTriangle[NUM_GLASSTRIANGLES][3] =
-{
- {
- CVector2D(0.0f, 0.0f),
- CVector2D(0.0f, 1.0f),
- CVector2D(0.4f, 0.5f)
- },
-
- {
- CVector2D(0.0f, 1.0f),
- CVector2D(1.0f, 1.0f),
- CVector2D(0.4f, 0.5f)
- },
-
- {
- CVector2D(0.0f, 0.0f),
- CVector2D(0.4f, 0.5f),
- CVector2D(0.7f, 0.0f)
- },
-
- {
- CVector2D(0.7f, 0.0f),
- CVector2D(0.4f, 0.5f),
- CVector2D(1.0f, 1.0f)
- },
-
- {
- CVector2D(0.7f, 0.0f),
- CVector2D(1.0f, 1.0f),
- CVector2D(1.0f, 0.0f)
- }
-};
-
-#define TEMPBUFFERVERTHILIGHTOFFSET 0
-#define TEMPBUFFERINDEXHILIGHTOFFSET 0
-#define TEMPBUFFERVERTHILIGHTSIZE 256
-#define TEMPBUFFERINDEXHILIGHTSIZE 512
-
-#define TEMPBUFFERVERTSHATTEREDOFFSET TEMPBUFFERVERTHILIGHTSIZE
-#define TEMPBUFFERINDEXSHATTEREDOFFSET TEMPBUFFERINDEXHILIGHTSIZE
-#define TEMPBUFFERVERTSHATTEREDSIZE 384
-#define TEMPBUFFERINDEXSHATTEREDSIZE 768
-
-#define TEMPBUFFERVERTREFLECTIONOFFSET TEMPBUFFERVERTSHATTEREDSIZE
-#define TEMPBUFFERINDEXREFLECTIONOFFSET TEMPBUFFERINDEXSHATTEREDSIZE
-#define TEMPBUFFERVERTREFLECTIONSIZE 512
-#define TEMPBUFFERINDEXREFLECTIONSIZE 1024
-
-int32 TempBufferIndicesStoredHiLight = 0;
-int32 TempBufferVerticesStoredHiLight = 0;
-int32 TempBufferIndicesStoredShattered = 0;
-int32 TempBufferVerticesStoredShattered = 0;
-int32 TempBufferIndicesStoredReflection = 0;
-int32 TempBufferVerticesStoredReflection = 0;
-
-void
-CFallingGlassPane::Update(void)
-{
- if ( CTimer::GetTimeInMilliseconds() >= m_nTimer )
- {
- // Apply MoveSpeed
- if ( m_bCarGlass )
- GetPosition() += m_vecMoveSpeed * CTimer::GetTimeStep() * 0.35f;
- else
- GetPosition() += m_vecMoveSpeed * CTimer::GetTimeStep();
-
- // Apply Gravity
- if ( m_bCarGlass )
- m_vecMoveSpeed.z -= 0.01f * CTimer::GetTimeStep();
- else
- m_vecMoveSpeed.z -= 0.02f * CTimer::GetTimeStep();
-
- // Apply TurnSpeed
- GetRight() += CrossProduct(m_vecTurn, GetRight());
- GetForward() += CrossProduct(m_vecTurn, GetForward());
- GetUp() += CrossProduct(m_vecTurn, GetUp());
-
- if ( GetPosition().z < m_fGroundZ )
- {
- CVector pos;
- CVector dir;
-
- m_bActive = false;
-
- pos = CVector(GetPosition().x, GetPosition().y, m_fGroundZ);
-
- PlayOneShotScriptObject(SCRIPT_SOUND_GLASS_LIGHT_BREAK, pos);
-
- RwRGBA color = { 255, 255, 255, 255 };
-
- if ( !m_bCarGlass )
- {
- static int32 nFrameGen = 0;
-
- for ( int32 i = 0; i < 4; i++ )
- {
- dir.x = CGeneral::GetRandomNumberInRange(-0.35f, 0.35f);
- dir.y = CGeneral::GetRandomNumberInRange(-0.35f, 0.35f);
- dir.z = CGeneral::GetRandomNumberInRange(0.05f, 0.20f);
-
- CParticle::AddParticle(PARTICLE_CAR_DEBRIS,
- pos,
- dir,
- nil,
- CGeneral::GetRandomNumberInRange(0.02f, 0.2f),
- color,
- CGeneral::GetRandomNumberInRange(-40, 40),
- 0,
- ++nFrameGen & 3,
- 500);
- }
- }
- }
- }
-}
-
-void
-CFallingGlassPane::Render(void)
-{
- float distToCamera = (TheCamera.GetPosition() - GetPosition()).Magnitude();
-
- CVector fwdNorm = GetForward();
- fwdNorm.Normalise();
- uint8 alpha = CGlass::CalcAlphaWithNormal(&fwdNorm);
-
-#ifdef FIX_BUGS
- uint16 time = Clamp(CTimer::GetTimeInMilliseconds() > m_nTimer ? CTimer::GetTimeInMilliseconds() - m_nTimer : 0u, 0u, 500u);
-#else
- uint16 time = Clamp(CTimer::GetTimeInMilliseconds() - m_nTimer, 0, 500);
-#endif
-
- uint8 color = int32( float(alpha) * (float(time) / 500) );
-
- if ( TempBufferIndicesStoredHiLight >= TEMPBUFFERINDEXHILIGHTSIZE-7 || TempBufferVerticesStoredHiLight >= TEMPBUFFERVERTHILIGHTSIZE-4 )
- CGlass::RenderHiLightPolys();
-
- // HiLight Polys
-
- if ( m_bCarGlass && color < 64 )
- color = 64;
-
- RwIm3DVertexSetRGBA (&TempBufferRenderVertices[TempBufferVerticesStoredHiLight + 0], color, color, color, color);
- RwIm3DVertexSetRGBA (&TempBufferRenderVertices[TempBufferVerticesStoredHiLight + 1], color, color, color, color);
- RwIm3DVertexSetRGBA (&TempBufferRenderVertices[TempBufferVerticesStoredHiLight + 2], color, color, color, color);
-
- RwIm3DVertexSetU (&TempBufferRenderVertices[TempBufferVerticesStoredHiLight + 0], 0.5f);
- RwIm3DVertexSetV (&TempBufferRenderVertices[TempBufferVerticesStoredHiLight + 0], 0.5f);
- RwIm3DVertexSetU (&TempBufferRenderVertices[TempBufferVerticesStoredHiLight + 1], 0.5f);
- RwIm3DVertexSetV (&TempBufferRenderVertices[TempBufferVerticesStoredHiLight + 1], 0.6f);
- RwIm3DVertexSetU (&TempBufferRenderVertices[TempBufferVerticesStoredHiLight + 2], 0.6f);
- RwIm3DVertexSetV (&TempBufferRenderVertices[TempBufferVerticesStoredHiLight + 2], 0.6f);
-
- ASSERT(m_nTriIndex < NUM_GLASSTRIANGLES);
-
- CVector2D p0 = CoorsWithTriangle[m_nTriIndex][0] - CentersWithTriangle[m_nTriIndex];
- CVector2D p1 = CoorsWithTriangle[m_nTriIndex][1] - CentersWithTriangle[m_nTriIndex];
- CVector2D p2 = CoorsWithTriangle[m_nTriIndex][2] - CentersWithTriangle[m_nTriIndex];
- CVector v0 = *this * CVector(p0.x, 0.0f, p0.y);
- CVector v1 = *this * CVector(p1.x, 0.0f, p1.y);
- CVector v2 = *this * CVector(p2.x, 0.0f, p2.y);
-
- RwIm3DVertexSetPos (&TempBufferRenderVertices[TempBufferVerticesStoredHiLight + 0], v0.x, v0.y, v0.z);
- RwIm3DVertexSetPos (&TempBufferRenderVertices[TempBufferVerticesStoredHiLight + 1], v1.x, v1.y, v1.z);
- RwIm3DVertexSetPos (&TempBufferRenderVertices[TempBufferVerticesStoredHiLight + 2], v2.x, v2.y, v2.z);
-
- TempBufferRenderIndexList[TempBufferIndicesStoredHiLight + 0] = TempBufferVerticesStoredHiLight + 0;
- TempBufferRenderIndexList[TempBufferIndicesStoredHiLight + 1] = TempBufferVerticesStoredHiLight + 1;
- TempBufferRenderIndexList[TempBufferIndicesStoredHiLight + 2] = TempBufferVerticesStoredHiLight + 2;
- TempBufferRenderIndexList[TempBufferIndicesStoredHiLight + 3] = TempBufferVerticesStoredHiLight + 0;
- TempBufferRenderIndexList[TempBufferIndicesStoredHiLight + 4] = TempBufferVerticesStoredHiLight + 2;
- TempBufferRenderIndexList[TempBufferIndicesStoredHiLight + 5] = TempBufferVerticesStoredHiLight + 1;
-
- TempBufferVerticesStoredHiLight += 3;
- TempBufferIndicesStoredHiLight += 6;
-
- if ( m_bShattered )
- {
- if ( TempBufferIndicesStoredShattered >= TEMPBUFFERINDEXSHATTEREDSIZE-7 || TempBufferVerticesStoredShattered >= TEMPBUFFERVERTSHATTEREDSIZE-4 )
- CGlass::RenderShatteredPolys();
-
- uint8 shatteredColor = 140;
- if ( distToCamera > 30.0f )
- shatteredColor = int32((1.0f - (distToCamera - 30.0f) * 4.0f / 40.0f) * 140);
-
- RwIm3DVertexSetRGBA (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 0], shatteredColor, shatteredColor, shatteredColor, shatteredColor);
- RwIm3DVertexSetRGBA (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 1], shatteredColor, shatteredColor, shatteredColor, shatteredColor);
- RwIm3DVertexSetRGBA (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 2], shatteredColor, shatteredColor, shatteredColor, shatteredColor);
-
- RwIm3DVertexSetU (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 0], 4.0f * CoorsWithTriangle[m_nTriIndex][0].x * m_fStep);
- RwIm3DVertexSetV (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 0], 4.0f * CoorsWithTriangle[m_nTriIndex][0].y * m_fStep);
- RwIm3DVertexSetU (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 1], 4.0f * CoorsWithTriangle[m_nTriIndex][1].x * m_fStep);
- RwIm3DVertexSetV (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 1], 4.0f * CoorsWithTriangle[m_nTriIndex][1].y * m_fStep);
- RwIm3DVertexSetU (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 2], 4.0f * CoorsWithTriangle[m_nTriIndex][2].x * m_fStep);
- RwIm3DVertexSetV (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 2], 4.0f * CoorsWithTriangle[m_nTriIndex][2].y * m_fStep);
-
- RwIm3DVertexSetPos (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 0], v0.x, v0.y, v0.z);
- RwIm3DVertexSetPos (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 1], v1.x, v1.y, v1.z);
- RwIm3DVertexSetPos (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 2], v2.x, v2.y, v2.z);
-
- TempBufferRenderIndexList[TempBufferIndicesStoredShattered + 0] = TempBufferVerticesStoredShattered - TEMPBUFFERVERTSHATTEREDOFFSET + 0;
- TempBufferRenderIndexList[TempBufferIndicesStoredShattered + 1] = TempBufferVerticesStoredShattered - TEMPBUFFERVERTSHATTEREDOFFSET + 1;
- TempBufferRenderIndexList[TempBufferIndicesStoredShattered + 2] = TempBufferVerticesStoredShattered - TEMPBUFFERVERTSHATTEREDOFFSET + 2;
- TempBufferRenderIndexList[TempBufferIndicesStoredShattered + 3] = TempBufferVerticesStoredShattered - TEMPBUFFERVERTSHATTEREDOFFSET + 0;
- TempBufferRenderIndexList[TempBufferIndicesStoredShattered + 4] = TempBufferVerticesStoredShattered - TEMPBUFFERVERTSHATTEREDOFFSET + 2;
- TempBufferRenderIndexList[TempBufferIndicesStoredShattered + 5] = TempBufferVerticesStoredShattered - TEMPBUFFERVERTSHATTEREDOFFSET + 1;
-
- TempBufferIndicesStoredShattered += 6;
- TempBufferVerticesStoredShattered += 3;
- }
-}
-
-void
-CGlass::Init(void)
-{
- for ( int32 i = 0; i < NUM_GLASSPANES; i++ )
- aGlassPanes[i].m_bActive = false;
-
- for ( int32 i = 0; i < NUM_GLASSTRIANGLES; i++ )
- CentersWithTriangle[i] = (CoorsWithTriangle[i][0] + CoorsWithTriangle[i][1] + CoorsWithTriangle[i][2]) / 3;
-}
-
-void
-CGlass::Update(void)
-{
- for ( int32 i = 0; i < NUM_GLASSPANES; i++ )
- {
- if ( aGlassPanes[i].m_bActive )
- aGlassPanes[i].Update();
- }
-}
-
-void
-CGlass::Render(void)
-{
- TempBufferVerticesStoredHiLight = 0;
- TempBufferIndicesStoredHiLight = 0;
-
- TempBufferVerticesStoredShattered = TEMPBUFFERVERTSHATTEREDOFFSET;
- TempBufferIndicesStoredShattered = TEMPBUFFERINDEXSHATTEREDOFFSET;
-
- TempBufferVerticesStoredReflection = TEMPBUFFERVERTREFLECTIONOFFSET;
- TempBufferIndicesStoredReflection = TEMPBUFFERINDEXREFLECTIONOFFSET;
-
- RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void *)FALSE);
- RwRenderStateSet(rwRENDERSTATETEXTUREFILTER, (void *)rwFILTERLINEAR);
- RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void *)TRUE);
- RwRenderStateSet(rwRENDERSTATEFOGCOLOR, (void *)RWRGBALONG(CTimeCycle::GetFogRed(), CTimeCycle::GetFogGreen(), CTimeCycle::GetFogBlue(), 255));
- RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDONE);
- RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDONE);
- RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void *)TRUE);
-
- PUSH_RENDERGROUP("CGlass::Render");
-
- for ( int32 i = 0; i < NUM_GLASSPANES; i++ )
- {
- if ( aGlassPanes[i].m_bActive )
- aGlassPanes[i].Render();
- }
-
- for ( uint32 i = 0; i < NumGlassEntities; i++ )
- RenderEntityInGlass(apEntitiesToBeRendered[i]);
-
- POP_RENDERGROUP();
-
- NumGlassEntities = 0;
-
- RenderHiLightPolys();
- RenderShatteredPolys();
- RenderReflectionPolys();
-
- RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void *)TRUE);
- RwRenderStateSet(rwRENDERSTATEZTESTENABLE, (void *)TRUE);
- RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDSRCALPHA);
- RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDINVSRCALPHA);
- RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void *)FALSE);
-}
-
-CFallingGlassPane *
-CGlass::FindFreePane(void)
-{
- for ( int32 i = 0; i < NUM_GLASSPANES; i++ )
- {
- if ( !aGlassPanes[i].m_bActive )
- return &aGlassPanes[i];
- }
-
- return nil;
-}
-
-void
-CGlass::GeneratePanesForWindow(uint32 type, CVector pos, CVector up, CVector right, CVector speed, CVector center,
- float moveSpeed, bool cracked, bool explosion, int32 stepmul, bool carGlass)
-{
- float upLen = up.Magnitude();
- float rightLen = right.Magnitude();
-
- float upSteps = upLen + 0.75f;
- if ( upSteps < 1.0f ) upSteps = 1.0f;
-
- float rightSteps = rightLen + 0.75f;
- if ( rightSteps < 1.0f ) rightSteps = 1.0f;
-
- uint32 ysteps = stepmul * (uint32)upSteps;
- if ( ysteps > 3 ) ysteps = 3;
-
- uint32 xsteps = stepmul * (uint32)rightSteps;
- if ( xsteps > 3 ) xsteps = 3;
-
- if ( explosion )
- {
- if ( ysteps > 1 ) ysteps = 1;
- if ( xsteps > 1 ) xsteps = 1;
- }
-
- float upScl = upLen / float(ysteps);
- float rightScl = rightLen / float(xsteps);
-
- bool bZFound;
- float groundZ = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, pos.z, &bZFound);
- if ( !bZFound ) groundZ = pos.z - 2.0f;
-
- for ( uint32 y = 0; y < ysteps; y++ )
- {
- for ( uint32 x = 0; x < xsteps; x++ )
- {
- float stepy = float(y) * upLen / float(ysteps);
- float stepx = float(x) * rightLen / float(xsteps);
-
- for ( int32 i = 0; i < NUM_GLASSTRIANGLES; i++ )
- {
- CFallingGlassPane *pane = FindFreePane();
- if ( pane )
- {
- pane->m_nTriIndex = i;
-
- pane->GetRight() = (right * rightScl) / rightLen;
- pane->GetUp() = (up * upScl) / upLen;
-
- CVector fwd = CrossProduct(pane->GetRight(), pane->GetUp());
- fwd.Normalise();
-
- pane->GetForward() = fwd;
-
- pane->GetPosition() = right / rightLen * (rightScl * CentersWithTriangle[i].x + stepx)
- + up / upLen * (upScl * CentersWithTriangle[i].y + stepy)
- + pos;
-
- pane->m_vecMoveSpeed.x = float((CGeneral::GetRandomNumber() & 127) - 64) * 0.0015f + speed.x;
- pane->m_vecMoveSpeed.y = float((CGeneral::GetRandomNumber() & 127) - 64) * 0.0015f + speed.y;
- pane->m_vecMoveSpeed.z = 0.0f + speed.z;
-
- if ( moveSpeed != 0.0f )
- {
- CVector dist = pane->GetPosition() - center;
- dist.Normalise();
-
- pane->m_vecMoveSpeed += moveSpeed * dist;
- }
-
- pane->m_vecTurn.x = float((CGeneral::GetRandomNumber() & 127) - 64) * 0.002f;
- pane->m_vecTurn.y = float((CGeneral::GetRandomNumber() & 127) - 64) * 0.002f;
- pane->m_vecTurn.z = float((CGeneral::GetRandomNumber() & 127) - 64) * 0.002f;
-
- switch ( type )
- {
- case 0:
- case 2:
- pane->m_nTimer = CTimer::GetTimeInMilliseconds();
- break;
- case 1:
- float dist = (pane->GetPosition() - center).Magnitude();
- pane->m_nTimer = uint32(dist*100 + CTimer::GetTimeInMilliseconds());
- break;
- }
-
- pane->m_fGroundZ = groundZ;
- pane->m_bShattered = cracked;
- pane->m_fStep = upLen / float(ysteps);
- pane->m_bCarGlass = carGlass;
- pane->m_bActive = true;
- }
- }
- }
- }
-}
-
-void
-CGlass::AskForObjectToBeRenderedInGlass(CEntity *entity)
-{
-#ifdef FIX_BUGS
- if ( NumGlassEntities < NUM_GLASSENTITIES )
-#else
- if ( NumGlassEntities < NUM_GLASSENTITIES-1 )
-#endif
- {
- apEntitiesToBeRendered[NumGlassEntities++] = entity;
- }
-}
-
-void
-CGlass::RenderEntityInGlass(CEntity *entity)
-{
- ASSERT(entity!=nil);
- CObject *object = (CObject *)entity;
-
- if ( object->bGlassBroken )
- return;
-
- float distToCamera = (TheCamera.GetPosition() - object->GetPosition()).Magnitude();
-
- if ( distToCamera > 40.0f )
- return;
-
- CVector fwdNorm = object->GetForward();
- fwdNorm.Normalise();
- uint8 alpha = CalcAlphaWithNormal(&fwdNorm);
-
- CColModel *col = object->GetColModel();
- ASSERT(col!=nil);
- if ( col->numTriangles >= 2 )
- {
- CVector a = object->GetMatrix() * col->vertices[0].Get();
- CVector b = object->GetMatrix() * col->vertices[1].Get();
- CVector c = object->GetMatrix() * col->vertices[2].Get();
- CVector d = object->GetMatrix() * col->vertices[3].Get();
-
- if ( object->bGlassCracked )
- {
- uint8 color = 255;
- if ( distToCamera > 30.0f )
- color = int32((1.0f - (distToCamera - 30.0f) * 4.0f / 40.0f) * 255);
-
- if ( TempBufferIndicesStoredShattered >= TEMPBUFFERINDEXSHATTEREDSIZE-13 || TempBufferVerticesStoredShattered >= TEMPBUFFERVERTSHATTEREDSIZE-5 )
- RenderShatteredPolys();
-
- RwIm3DVertexSetRGBA (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 0], color, color, color, color);
- RwIm3DVertexSetRGBA (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 1], color, color, color, color);
- RwIm3DVertexSetRGBA (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 2], color, color, color, color);
- RwIm3DVertexSetRGBA (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 3], color, color, color, color);
-
- RwIm3DVertexSetU (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 0], 0.0f);
- RwIm3DVertexSetV (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 0], 0.0f);
- RwIm3DVertexSetU (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 1], 16.0f);
- RwIm3DVertexSetV (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 1], 0.0f);
- RwIm3DVertexSetU (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 2], 0.0f);
- RwIm3DVertexSetV (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 2], 16.0f);
- RwIm3DVertexSetU (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 3], 16.0f);
- RwIm3DVertexSetV (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 3], 16.0f);
-
- RwIm3DVertexSetPos (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 0], a.x, a.y, a.z);
- RwIm3DVertexSetPos (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 1], b.x, b.y, b.z);
- RwIm3DVertexSetPos (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 2], c.x, c.y, c.z);
- RwIm3DVertexSetPos (&TempBufferRenderVertices[TempBufferVerticesStoredShattered + 3], d.x, d.y, d.z);
-
- TempBufferRenderIndexList[TempBufferIndicesStoredShattered + 0] = col->triangles[0].a + TempBufferVerticesStoredShattered - TEMPBUFFERVERTSHATTEREDOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredShattered + 1] = col->triangles[0].b + TempBufferVerticesStoredShattered - TEMPBUFFERVERTSHATTEREDOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredShattered + 2] = col->triangles[0].c + TempBufferVerticesStoredShattered - TEMPBUFFERVERTSHATTEREDOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredShattered + 3] = col->triangles[1].a + TempBufferVerticesStoredShattered - TEMPBUFFERVERTSHATTEREDOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredShattered + 4] = col->triangles[1].b + TempBufferVerticesStoredShattered - TEMPBUFFERVERTSHATTEREDOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredShattered + 5] = col->triangles[1].c + TempBufferVerticesStoredShattered - TEMPBUFFERVERTSHATTEREDOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredShattered + 6] = col->triangles[0].a + TempBufferVerticesStoredShattered - TEMPBUFFERVERTSHATTEREDOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredShattered + 7] = col->triangles[0].c + TempBufferVerticesStoredShattered - TEMPBUFFERVERTSHATTEREDOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredShattered + 8] = col->triangles[0].b + TempBufferVerticesStoredShattered - TEMPBUFFERVERTSHATTEREDOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredShattered + 9] = col->triangles[1].a + TempBufferVerticesStoredShattered - TEMPBUFFERVERTSHATTEREDOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredShattered + 10] = col->triangles[1].c + TempBufferVerticesStoredShattered - TEMPBUFFERVERTSHATTEREDOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredShattered + 11] = col->triangles[1].b + TempBufferVerticesStoredShattered - TEMPBUFFERVERTSHATTEREDOFFSET;
-
- TempBufferIndicesStoredShattered += 12;
- TempBufferVerticesStoredShattered += 4;
- }
-
- if ( TempBufferIndicesStoredReflection >= TEMPBUFFERINDEXREFLECTIONSIZE-13 || TempBufferVerticesStoredReflection >= TEMPBUFFERVERTREFLECTIONSIZE-5 )
- RenderReflectionPolys();
-
- uint8 color = 100;
- if ( distToCamera > 30.0f )
- color = int32((1.0f - (distToCamera - 30.0f) * 4.0f / 40.0f) * 100);
-
- RwIm3DVertexSetRGBA (&TempBufferRenderVertices[TempBufferVerticesStoredReflection + 0], color, color, color, color);
- RwIm3DVertexSetRGBA (&TempBufferRenderVertices[TempBufferVerticesStoredReflection + 1], color, color, color, color);
- RwIm3DVertexSetRGBA (&TempBufferRenderVertices[TempBufferVerticesStoredReflection + 2], color, color, color, color);
- RwIm3DVertexSetRGBA (&TempBufferRenderVertices[TempBufferVerticesStoredReflection + 3], color, color, color, color);
-
- float FwdAngle = CGeneral::GetATanOfXY(TheCamera.GetForward().x, TheCamera.GetForward().y);
- float v = 2.0f * TheCamera.GetForward().z * 0.2f;
- float u = float(object->m_randomSeed & 15) * 0.02f + (FwdAngle / TWOPI);
-
- RwIm3DVertexSetU (&TempBufferRenderVertices[TempBufferVerticesStoredReflection + 0], u);
- RwIm3DVertexSetV (&TempBufferRenderVertices[TempBufferVerticesStoredReflection + 0], v);
- RwIm3DVertexSetU (&TempBufferRenderVertices[TempBufferVerticesStoredReflection + 1], u+0.2f);
- RwIm3DVertexSetV (&TempBufferRenderVertices[TempBufferVerticesStoredReflection + 1], v);
- RwIm3DVertexSetU (&TempBufferRenderVertices[TempBufferVerticesStoredReflection + 2], u);
- RwIm3DVertexSetV (&TempBufferRenderVertices[TempBufferVerticesStoredReflection + 2], v+0.2f);
- RwIm3DVertexSetU (&TempBufferRenderVertices[TempBufferVerticesStoredReflection + 3], u+0.2f);
- RwIm3DVertexSetV (&TempBufferRenderVertices[TempBufferVerticesStoredReflection + 3], v+0.2f);
-
- RwIm3DVertexSetPos (&TempBufferRenderVertices[TempBufferVerticesStoredReflection + 0], a.x, a.y, a.z);
- RwIm3DVertexSetPos (&TempBufferRenderVertices[TempBufferVerticesStoredReflection + 1], b.x, b.y, b.z);
- RwIm3DVertexSetPos (&TempBufferRenderVertices[TempBufferVerticesStoredReflection + 2], c.x, c.y, c.z);
- RwIm3DVertexSetPos (&TempBufferRenderVertices[TempBufferVerticesStoredReflection + 3], d.x, d.y, d.z);
-
- TempBufferRenderIndexList[TempBufferIndicesStoredReflection + 0] = col->triangles[0].a + TempBufferVerticesStoredReflection - TEMPBUFFERVERTREFLECTIONOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredReflection + 1] = col->triangles[0].b + TempBufferVerticesStoredReflection - TEMPBUFFERVERTREFLECTIONOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredReflection + 2] = col->triangles[0].c + TempBufferVerticesStoredReflection - TEMPBUFFERVERTREFLECTIONOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredReflection + 3] = col->triangles[1].a + TempBufferVerticesStoredReflection - TEMPBUFFERVERTREFLECTIONOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredReflection + 4] = col->triangles[1].b + TempBufferVerticesStoredReflection - TEMPBUFFERVERTREFLECTIONOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredReflection + 5] = col->triangles[1].c + TempBufferVerticesStoredReflection - TEMPBUFFERVERTREFLECTIONOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredReflection + 6] = col->triangles[0].a + TempBufferVerticesStoredReflection - TEMPBUFFERVERTREFLECTIONOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredReflection + 7] = col->triangles[0].c + TempBufferVerticesStoredReflection - TEMPBUFFERVERTREFLECTIONOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredReflection + 8] = col->triangles[0].b + TempBufferVerticesStoredReflection - TEMPBUFFERVERTREFLECTIONOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredReflection + 9] = col->triangles[1].a + TempBufferVerticesStoredReflection - TEMPBUFFERVERTREFLECTIONOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredReflection + 10] = col->triangles[1].c + TempBufferVerticesStoredReflection - TEMPBUFFERVERTREFLECTIONOFFSET;
- TempBufferRenderIndexList[TempBufferIndicesStoredReflection + 11] = col->triangles[1].b + TempBufferVerticesStoredReflection - TEMPBUFFERVERTREFLECTIONOFFSET;
-
- TempBufferIndicesStoredReflection += 12;
- TempBufferVerticesStoredReflection += 4;
- }
-}
-
-int32
-CGlass::CalcAlphaWithNormal(CVector *normal)
-{
- ASSERT(normal!=nil);
-
- float fwdDir = 2.0f * DotProduct(*normal, TheCamera.GetForward());
- float fwdDot = DotProduct(TheCamera.GetForward()-fwdDir*(*normal), CVector(0.57f, 0.57f, -0.57f));
- return int32(lerp(fwdDot*fwdDot*fwdDot*fwdDot*fwdDot*fwdDot, 20.0f, 255.0f));
-}
-
-void
-CGlass::RenderHiLightPolys(void)
-{
- if ( TempBufferVerticesStoredHiLight != TEMPBUFFERVERTHILIGHTOFFSET )
- {
- RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDONE);
- RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDONE);
- RwRenderStateSet(rwRENDERSTATETEXTURERASTER, (void *)RwTextureGetRaster(gpShadowExplosionTex));
-
- LittleTest();
-
- if ( RwIm3DTransform(TempBufferRenderVertices, TempBufferVerticesStoredHiLight, nil, rwIM3D_VERTEXUV) )
- {
- RwIm3DRenderIndexedPrimitive(rwPRIMTYPETRILIST, TempBufferRenderIndexList, TempBufferIndicesStoredHiLight);
- RwIm3DEnd();
- }
-
- TempBufferVerticesStoredHiLight = TEMPBUFFERVERTHILIGHTOFFSET;
- TempBufferIndicesStoredHiLight = TEMPBUFFERINDEXHILIGHTOFFSET;
- }
-}
-
-void
-CGlass::RenderShatteredPolys(void)
-{
- if ( TempBufferVerticesStoredShattered != TEMPBUFFERVERTSHATTEREDOFFSET )
- {
- RwRenderStateSet(rwRENDERSTATETEXTURERASTER, (void *)RwTextureGetRaster(gpCrackedGlassTex));
- RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDSRCALPHA);
- RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDINVSRCALPHA);
-
- LittleTest();
-
- if ( RwIm3DTransform(&TempBufferRenderVertices[TEMPBUFFERVERTSHATTEREDOFFSET], TempBufferVerticesStoredShattered - TEMPBUFFERVERTSHATTEREDOFFSET, nil, rwIM3D_VERTEXUV) )
- {
- RwIm3DRenderIndexedPrimitive(rwPRIMTYPETRILIST, &TempBufferRenderIndexList[TEMPBUFFERINDEXSHATTEREDOFFSET], TempBufferIndicesStoredShattered - TEMPBUFFERINDEXSHATTEREDOFFSET);
- RwIm3DEnd();
- }
-
- TempBufferIndicesStoredShattered = TEMPBUFFERINDEXSHATTEREDOFFSET;
- TempBufferVerticesStoredShattered = TEMPBUFFERVERTSHATTEREDOFFSET;
- }
-}
-
-void
-CGlass::RenderReflectionPolys(void)
-{
- if ( TempBufferVerticesStoredReflection != TEMPBUFFERVERTREFLECTIONOFFSET )
- {
- RwRenderStateSet(rwRENDERSTATETEXTURERASTER, (void *)RwTextureGetRaster(gpShadowHeadLightsTex));
- RwRenderStateSet(rwRENDERSTATESRCBLEND, (void *)rwBLENDSRCALPHA);
- RwRenderStateSet(rwRENDERSTATEDESTBLEND, (void *)rwBLENDINVSRCALPHA);
-
- LittleTest();
-
- if ( RwIm3DTransform(&TempBufferRenderVertices[TEMPBUFFERVERTREFLECTIONOFFSET], TempBufferVerticesStoredReflection - TEMPBUFFERVERTREFLECTIONOFFSET, nil, rwIM3D_VERTEXUV) )
- {
- RwIm3DRenderIndexedPrimitive(rwPRIMTYPETRILIST, &TempBufferRenderIndexList[TEMPBUFFERINDEXREFLECTIONOFFSET], TempBufferIndicesStoredReflection - TEMPBUFFERINDEXREFLECTIONOFFSET);
- RwIm3DEnd();
- }
-
- TempBufferIndicesStoredReflection = TEMPBUFFERINDEXREFLECTIONOFFSET;
- TempBufferVerticesStoredReflection = TEMPBUFFERVERTREFLECTIONOFFSET;
- }
-}
-
-void
-CGlass::WindowRespondsToCollision(CEntity *entity, float amount, CVector speed, CVector point, bool explosion)
-{
- ASSERT(entity!=nil);
-
- CObject *object = (CObject *)entity;
-
- if ( object->bGlassBroken )
- return;
-
- object->bGlassCracked = true;
-
- CColModel *col = object->GetColModel();
- ASSERT(col!=nil);
-
- if ( col->numTriangles == 2 )
- {
- CVector a = col->vertices[0].Get();
- CVector b = col->vertices[1].Get();
- CVector c = col->vertices[2].Get();
- CVector d = col->vertices[3].Get();
-
- float minx = Min(Min(a.x, b.x), Min(c.x, d.x));
- float maxx = Max(Max(a.x, b.x), Max(c.x, d.x));
- float miny = Min(Min(a.y, b.y), Min(c.y, d.y));
- float maxy = Max(Max(a.y, b.y), Max(c.y, d.y));
- float minz = Min(Min(a.z, b.z), Min(c.z, d.z));
- float maxz = Max(Max(a.z, b.z), Max(c.z, d.z));
-
- CVector pa = object->GetMatrix() * CVector(minx, miny, minz);
- CVector pb = object->GetMatrix() * CVector(maxx, maxy, minz);
-
- if ( amount > 300.0f )
- {
- PlayOneShotScriptObject(SCRIPT_SOUND_GLASS_BREAK_L, object->GetPosition());
-
- GeneratePanesForWindow(0,
- pa,
- CVector(0.0f, 0.0f, maxz-minz),
- pb - pa,
- speed, point, 0.1f, !!object->bGlassCracked, explosion, 1, false);
- }
- else
- {
- PlayOneShotScriptObject(SCRIPT_SOUND_GLASS_BREAK_S, object->GetPosition());
-
- GeneratePanesForWindow(1,
- pa,
- CVector(0.0f, 0.0f, maxz-minz),
- pb - pa,
- speed, point, 0.1f, !!object->bGlassCracked, explosion, 1, false);
- }
- }
-
- object->bGlassBroken = true;
- object->bIsVisible = false;
- object->bUsesCollision = false;
-}
-
-void
-CGlass::WindowRespondsToSoftCollision(CEntity *entity, float amount)
-{
- ASSERT(entity!=nil);
-
- CObject *object = (CObject *)entity;
-
- if ( entity->bUsesCollision && amount > 50.0f && !object->bGlassCracked )
- {
- PlayOneShotScriptObject(SCRIPT_SOUND_GLASS_CRACK, object->GetPosition());
- object->bGlassCracked = true;
- }
-}
-
-void
-CGlass::WasGlassHitByBullet(CEntity *entity, CVector point)
-{
- ASSERT(entity!=nil);
-
- CObject *object = (CObject *)entity;
-
- if ( IsGlass(object->GetModelIndex()) )
- {
- if ( object->bUsesCollision )
- {
- if ( !object->bGlassCracked )
- {
- PlayOneShotScriptObject(SCRIPT_SOUND_GLASS_CRACK, object->GetPosition());
- object->bGlassCracked = true;
- }
- else
- {
- if ( (CGeneral::GetRandomNumber() & 3) == 2 )
- WindowRespondsToCollision(object, 0.0f, CVector(0.0f, 0.0f, 0.0f), point, false);
- }
- }
- }
-}
-
-void
-CGlass::WindowRespondsToExplosion(CEntity *entity, CVector point)
-{
- ASSERT(entity!=nil);
-
- CObject *object = (CObject *)entity;
-
- if ( object->bUsesCollision )
- {
- CVector distToGlass = object->GetPosition() - point;
-
- float fDistToGlass = distToGlass.Magnitude();
-
- if ( fDistToGlass < 10.0f )
- {
- distToGlass *= (0.3f / fDistToGlass); // normalise
- WindowRespondsToCollision(object, 10000.0f, distToGlass, object->GetPosition(), true);
- }
- else
- {
- if ( fDistToGlass < 30.0f )
- object->bGlassCracked = true;
- }
- }
-}
-
-
-void
-CGlass::CarWindscreenShatters(CVehicle *vehicle, bool unk)
-{
- ASSERT(vehicle!=nil);
-
- CColModel *col = vehicle->GetColModel();
- ASSERT(col!=nil);
-
- if ( col->numTriangles < 2 )
- return;
-
- CColTriangle *tria = nil;
- int32 triIndex = -1;
- CColTriangle *trib = nil;
-
- for ( int32 i = 0; i < col->numTriangles; i++ )
- {
- CColTriangle *tri = &col->triangles[i];
- if ( tri->surface == SURFACE_GLASS )
- {
- if ( tria )
- {
- trib = tri;
- break;
- }
-
- triIndex = i;
- tria = tri;
- }
- }
-
- if ( trib == nil )
- return;
-
- CCollision::CalculateTrianglePlanes(col);
-
- CColTrianglePlane *triPlanes = col->trianglePlanes;
-
- if ( triPlanes == nil )
- return;
-
- CVector planeNormal;
- triPlanes[triIndex].GetNormal(planeNormal);
- planeNormal = Multiply3x3(vehicle->GetMatrix(), planeNormal);
-
- CVector vec1 = CrossProduct(vehicle->GetRight(), planeNormal);
- vec1.Normalise();
-
- CVector vec2 = CrossProduct(planeNormal, vehicle->GetUp());
- vec2.Normalise();
-
- CVector v[6];
- float proj1[6];
- float proj2[6];
-
- v[0] = col->vertices[tria->a].Get();
- v[1] = col->vertices[tria->b].Get();
- v[2] = col->vertices[tria->c].Get();
-
- v[3] = col->vertices[trib->a].Get();
- v[4] = col->vertices[trib->b].Get();
- v[5] = col->vertices[trib->c].Get();
-
- v[0] = vehicle->GetMatrix() * v[0];
- v[1] = vehicle->GetMatrix() * v[1];
- v[2] = vehicle->GetMatrix() * v[2];
- v[3] = vehicle->GetMatrix() * v[3];
- v[4] = vehicle->GetMatrix() * v[4];
- v[5] = vehicle->GetMatrix() * v[5];
-
- proj1[0] = DotProduct(v[0], vec1);
- proj2[0] = DotProduct(v[0], vec2);
- proj1[1] = DotProduct(v[1], vec1);
- proj2[1] = DotProduct(v[1], vec2);
- proj1[2] = DotProduct(v[2], vec1);
- proj2[2] = DotProduct(v[2], vec2);
-
- proj1[3] = DotProduct(v[3], vec1);
- proj2[3] = DotProduct(v[3], vec2);
- proj1[4] = DotProduct(v[4], vec1);
- proj2[4] = DotProduct(v[4], vec2);
- proj1[5] = DotProduct(v[5], vec1);
- proj2[5] = DotProduct(v[5], vec2);
-
- int32 originIndex = 0;
- float max1 = proj1[0];
- float max2 = proj2[0];
- float origin = proj1[0] + proj2[0];
-
- for ( int32 i = 1; i < 6; i++ )
- {
- float o = proj1[i] + proj2[i];
- if ( o < origin )
- {
- origin = o;
- originIndex = i;
- }
-
- if ( proj1[i] > max1 )
- max1 = proj1[i];
- if ( proj2[i] > max2 )
- max2 = proj2[i];
- }
-
- float bound1 = max1 - proj1[originIndex];
- float bound2 = max2 - proj2[originIndex];
-
- PlayOneShotScriptObject(SCRIPT_SOUND_GLASS_BREAK_L, vehicle->GetPosition());
-
- CVector center = v[originIndex] + ((0.5f*bound1) * vec1) + ((0.5f*bound2) * vec2);
- CVector speed = vehicle->m_vecMoveSpeed;
- CVector right = bound2 * vec2;
- CVector up = bound1 * vec1;
- CVector pos = v[originIndex];
-
- GeneratePanesForWindow(2, pos, up, right, speed, center, 0.1f, false, false, 2, true);
-}
-
-bool
-CGlass::HasGlassBeenShatteredAtCoors(float x, float y, float z)
-{
- CEntity *entity = nil;
- float dist = 20.0f;
-
- int32 nStartX = Max(CWorld::GetSectorIndexX(x - 30.0f), 0);
- int32 nStartY = Max(CWorld::GetSectorIndexY(y - 30.0f), 0);
- int32 nEndX = Min(CWorld::GetSectorIndexX(x + 30.0f), NUMSECTORS_X-1);
- int32 nEndY = Min(CWorld::GetSectorIndexY(y + 30.0f), NUMSECTORS_Y-1);
-
- CWorld::AdvanceCurrentScanCode();
-
- for ( int32 ys = nStartY; ys <= nEndY; ys++ )
- {
- for ( int32 xs = nStartX; xs <= nEndX; xs++ )
- {
- CSector *sector = CWorld::GetSector(xs, ys);
-
- ASSERT(sector != nil);
-
- FindWindowSectorList(sector->m_lists[ENTITYLIST_OBJECTS], &dist, &entity, x, y, z);
- FindWindowSectorList(sector->m_lists[ENTITYLIST_DUMMIES], &dist, &entity, x, y, z);
- }
- }
-
- if ( entity )
- {
- if ( entity->GetType() == ENTITY_TYPE_DUMMY )
- return false;
-
- return !!((CObject*)entity)->bGlassBroken;
- }
-
- return false;
-}
-
-void
-CGlass::FindWindowSectorList(CPtrList &list, float *dist, CEntity **entity, float x, float y, float z)
-{
- ASSERT(dist!=nil);
- ASSERT(entity!=nil);
-
- CPtrNode *node = list.first;
-
- while ( node != nil )
- {
- CEntity *ent = (CEntity *)node->item;
- uint16 scanCode = ent->m_scanCode;
- node = node->next;
-
- ASSERT(ent!=nil);
-
- if ( IsGlass(ent->GetModelIndex()) )
- {
- if ( scanCode != CWorld::GetCurrentScanCode() )
- {
- ent->m_scanCode = CWorld::GetCurrentScanCode();
-
- float dst = (CVector(x,y,z) - ent->GetPosition()).Magnitude();
-
- if ( dst < *dist )
- {
- *dist = dst;
- *entity = ent;
- }
- }
- }
- }
-}
-
-void
-CGlass::BreakGlassPhysically(CVector pos, float radius)
-{
- static uint32 breakTime = 0;
-
- if ( CTimer::GetTimeInMilliseconds() < breakTime + 1000 && CTimer::GetTimeInMilliseconds() >= breakTime )
- return;
-
- CColSphere sphere;
- sphere.piece = 0;
- sphere.radius = radius;
- sphere.surface = 0;
-
- for ( int32 i = CPools::GetObjectPool()->GetSize() - 1; i >= 0; i-- )
- {
- CObject *object = CPools::GetObjectPool()->GetSlot(i);
- if (object)
- {
- if ( IsGlass(object->GetModelIndex()) )
- {
- if ( object->bUsesCollision )
- {
- CColModel *col = object->GetColModel();
- ASSERT(col!=nil);
-
- if ( col->numTriangles < 2 )
- continue;
-
- bool hit = false;
-
- CVector dist = pos - object->GetPosition();
-
- sphere.center.x = DotProduct(dist, object->GetRight());
- sphere.center.y = DotProduct(dist, object->GetForward());
- sphere.center.z = DotProduct(dist, object->GetUp());
-
- CCollision::CalculateTrianglePlanes(col);
-
- for ( int32 j = 0; j < col->numTriangles; j++ )
- {
- if ( CCollision::TestSphereTriangle(sphere,
- col->vertices, col->triangles[j], col->trianglePlanes[j]) )
- {
- hit = true;
- }
- }
-
- if ( hit )
- {
- breakTime = CTimer::GetTimeInMilliseconds();
-
- if ( object->bGlassCracked )
- {
- CVector a = col->vertices[0].Get();
- CVector b = col->vertices[1].Get();
- CVector c = col->vertices[2].Get();
- CVector d = col->vertices[3].Get();
-
- float minx = Min(Min(a.x, b.x), Min(c.x, d.x));
- float maxx = Max(Max(a.x, b.x), Max(c.x, d.x));
- float miny = Min(Min(a.y, b.y), Min(c.y, d.y));
- float maxy = Max(Max(a.y, b.y), Max(c.y, d.y));
- float minz = Min(Min(a.z, b.z), Min(c.z, d.z));
- float maxz = Max(Max(a.z, b.z), Max(c.z, d.z));
-
- CVector pa = object->GetMatrix() * CVector(minx, miny, minz);
- CVector pb = object->GetMatrix() * CVector(maxx, maxy, minz);
-
- PlayOneShotScriptObject(SCRIPT_SOUND_GLASS_BREAK_S, object->GetPosition());
-
- GeneratePanesForWindow(1,
- pa,
- CVector(0.0f, 0.0f, maxz-minz),
- pb - pa,
- CVector(0.0f, 0.0f, 0.0f), pos, 0.1f, !!object->bGlassCracked, false, 1, false);
-
- object->bGlassBroken = true;
- object->bIsVisible = false;
- object->bUsesCollision = false;
- }
- else
- {
- PlayOneShotScriptObject(SCRIPT_SOUND_GLASS_CRACK, object->GetPosition());
- object->bGlassCracked = true;
- }
- }
- }
- }
- }
- }
-} \ No newline at end of file