summaryrefslogtreecommitdiffstats
path: root/src/render/Rubbish.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/render/Rubbish.cpp')
-rw-r--r--src/render/Rubbish.cpp436
1 files changed, 0 insertions, 436 deletions
diff --git a/src/render/Rubbish.cpp b/src/render/Rubbish.cpp
deleted file mode 100644
index 8da6b025..00000000
--- a/src/render/Rubbish.cpp
+++ /dev/null
@@ -1,436 +0,0 @@
-#include "common.h"
-#include "main.h"
-
-#include "General.h"
-#include "Timer.h"
-#include "Weather.h"
-#include "Camera.h"
-#include "World.h"
-#include "Vehicle.h"
-#include "ZoneCull.h"
-#include "TxdStore.h"
-#include "RenderBuffer.h"
-#include "Rubbish.h"
-
-#define RUBBISH_MAX_DIST (18.0f)
-#define RUBBISH_FADE_DIST (16.5f)
-
-RwTexture *gpRubbishTexture[4];
-RwImVertexIndex RubbishIndexList[6];
-RwImVertexIndex RubbishIndexList2[6]; // unused
-RwIm3DVertex RubbishVertices[4];
-bool CRubbish::bRubbishInvisible;
-int CRubbish::RubbishVisibility;
-COneSheet CRubbish::aSheets[NUM_RUBBISH_SHEETS];
-COneSheet CRubbish::StartEmptyList;
-COneSheet CRubbish::EndEmptyList;
-COneSheet CRubbish::StartStaticsList;
-COneSheet CRubbish::EndStaticsList;
-COneSheet CRubbish::StartMoversList;
-COneSheet CRubbish::EndMoversList;
-
-
-void
-COneSheet::AddToList(COneSheet *list)
-{
- this->m_next = list->m_next;
- this->m_prev = list;
- list->m_next = this;
- this->m_next->m_prev = this;
-}
-
-void
-COneSheet::RemoveFromList(void)
-{
- m_next->m_prev = m_prev;
- m_prev->m_next = m_next;
-}
-
-
-void
-CRubbish::Render(void)
-{
- int type;
-
- PUSH_RENDERGROUP("CRubbish::Render");
-
- RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
- RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
- RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)TRUE);
-
- for(type = 0; type < 4; type++){
- RwRenderStateSet(rwRENDERSTATETEXTURERASTER, RwTextureGetRaster(gpRubbishTexture[type]));
-
- TempBufferIndicesStored = 0;
- TempBufferVerticesStored = 0;
-
- COneSheet *sheet;
- for(sheet = &aSheets[type*NUM_RUBBISH_SHEETS / 4];
- sheet < &aSheets[(type+1)*NUM_RUBBISH_SHEETS / 4];
- sheet++){
- if(sheet->m_state == 0)
- continue;
-
- uint32 alpha = 128;
- CVector pos;
- if(sheet->m_state == 1){
- pos = sheet->m_basePos;
- if(!sheet->m_isVisible)
- alpha = 0;
- }else{
- pos = sheet->m_animatedPos;
- // Not fully visible during animation, calculate current alpha
- if(!sheet->m_isVisible || !sheet->m_targetIsVisible){
- float t = (float)(CTimer::GetTimeInMilliseconds() - sheet->m_moveStart)/sheet->m_moveDuration;
- float f1 = sheet->m_isVisible ? 1.0f-t : 0.0f;
- float f2 = sheet->m_targetIsVisible ? t : 0.0f;
- alpha = 128 * (f1+f2);
- }
- }
-
- float camDist = (pos - TheCamera.GetPosition()).Magnitude2D();
- if(camDist < RUBBISH_MAX_DIST){
- if(camDist >= RUBBISH_FADE_DIST)
- alpha -= alpha*(camDist-RUBBISH_FADE_DIST)/(RUBBISH_MAX_DIST-RUBBISH_FADE_DIST);
- alpha = (RubbishVisibility*alpha)/256;
-
- float vx = Sin(sheet->m_angle) * 0.4f;
- float vy = Cos(sheet->m_angle) * 0.4f;
-
- int v = TempBufferVerticesStored;
- RwIm3DVertexSetPos(&TempBufferRenderVertices[v+0], pos.x + vx, pos.y + vy, pos.z);
- RwIm3DVertexSetRGBA(&TempBufferRenderVertices[v+0], 255, 255, 255, alpha);
- RwIm3DVertexSetPos(&TempBufferRenderVertices[v+1], pos.x - vy, pos.y + vx, pos.z);
- RwIm3DVertexSetRGBA(&TempBufferRenderVertices[v+1], 255, 255, 255, alpha);
- RwIm3DVertexSetPos(&TempBufferRenderVertices[v+2], pos.x + vy, pos.y - vx, pos.z);
- RwIm3DVertexSetRGBA(&TempBufferRenderVertices[v+2], 255, 255, 255, alpha);
- RwIm3DVertexSetPos(&TempBufferRenderVertices[v+3], pos.x - vx, pos.y - vy, pos.z);
- RwIm3DVertexSetRGBA(&TempBufferRenderVertices[v+3], 255, 255, 255, alpha);
- RwIm3DVertexSetU(&TempBufferRenderVertices[v+0], 0.0f);
- RwIm3DVertexSetV(&TempBufferRenderVertices[v+0], 0.0f);
- RwIm3DVertexSetU(&TempBufferRenderVertices[v+1], 1.0f);
- RwIm3DVertexSetV(&TempBufferRenderVertices[v+1], 0.0f);
- RwIm3DVertexSetU(&TempBufferRenderVertices[v+2], 0.0f);
- RwIm3DVertexSetV(&TempBufferRenderVertices[v+2], 1.0f);
- RwIm3DVertexSetU(&TempBufferRenderVertices[v+3], 1.0f);
- RwIm3DVertexSetV(&TempBufferRenderVertices[v+3], 1.0f);
-
- int i = TempBufferIndicesStored;
- TempBufferRenderIndexList[i+0] = RubbishIndexList[0] + TempBufferVerticesStored;
- TempBufferRenderIndexList[i+1] = RubbishIndexList[1] + TempBufferVerticesStored;
- TempBufferRenderIndexList[i+2] = RubbishIndexList[2] + TempBufferVerticesStored;
- TempBufferRenderIndexList[i+3] = RubbishIndexList[3] + TempBufferVerticesStored;
- TempBufferRenderIndexList[i+4] = RubbishIndexList[4] + TempBufferVerticesStored;
- TempBufferRenderIndexList[i+5] = RubbishIndexList[5] + TempBufferVerticesStored;
- TempBufferVerticesStored += 4;
- TempBufferIndicesStored += 6;
- }
- }
-
- if(TempBufferIndicesStored != 0){
- LittleTest();
- if(RwIm3DTransform(TempBufferRenderVertices, TempBufferVerticesStored, nil, rwIM3D_VERTEXUV)){
- RwIm3DRenderIndexedPrimitive(rwPRIMTYPETRILIST, TempBufferRenderIndexList, TempBufferIndicesStored);
- RwIm3DEnd();
- }
- }
- }
-
- RwRenderStateSet(rwRENDERSTATEFOGENABLE, (void*)FALSE);
- RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)FALSE);
- RwRenderStateSet(rwRENDERSTATEVERTEXALPHAENABLE, (void*)TRUE);
-
- POP_RENDERGROUP();
-}
-
-void
-CRubbish::StirUp(CVehicle *veh)
-{
- if((CTimer::GetFrameCounter() ^ (veh->m_randomSeed&3)) == 0)
- return;
-
- if(Abs(veh->GetPosition().x - TheCamera.GetPosition().x) < 20.0f &&
- Abs(veh->GetPosition().y - TheCamera.GetPosition().y) < 20.0f)
- if(Abs(veh->GetMoveSpeed().x) > 0.05f || Abs(veh->GetMoveSpeed().y) > 0.05f){
- float speed = veh->GetMoveSpeed().Magnitude2D();
- if(speed > 0.05f){
- bool movingForward = DotProduct2D(veh->GetMoveSpeed(), veh->GetForward()) > 0.0f;
- COneSheet *sheet = StartStaticsList.m_next;
- CVector2D size = veh->GetColModel()->boundingBox.max;
-
- // Check all static sheets
- while(sheet != &EndStaticsList){
- COneSheet *next = sheet->m_next;
- CVector2D carToSheet = sheet->m_basePos - veh->GetPosition();
- float distFwd = DotProduct2D(carToSheet, veh->GetForward());
-
- // sheet has to be a bit behind car
- if(movingForward && distFwd < -0.5f*size.y && distFwd > -1.5f*size.y ||
- !movingForward && distFwd > 0.5f*size.y && distFwd < 1.5f*size.y){
- float distSide = Abs(DotProduct2D(carToSheet, veh->GetRight()));
- if(distSide < 1.5*size.x){
- // Check with higher speed for sheet directly behind car
- float speedToCheck = distSide < size.x ? speed : speed*0.5f;
- if(speedToCheck > 0.05f){
- sheet->m_state = 2;
- if(speedToCheck > 0.15f)
- sheet->m_animationType = 2;
- else
- sheet->m_animationType = 1;
- sheet->m_moveDuration = 2000;
- sheet->m_xDist = veh->GetMoveSpeed().x;
- sheet->m_yDist = veh->GetMoveSpeed().y;
- float dist = Sqrt(SQR(sheet->m_xDist)+SQR(sheet->m_yDist));
- sheet->m_xDist *= 25.0f*speed/dist;
- sheet->m_yDist *= 25.0f*speed/dist;
- sheet->m_animHeight = 3.0f*speed;
- sheet->m_moveStart = CTimer::GetTimeInMilliseconds();
- float tx = sheet->m_basePos.x + sheet->m_xDist;
- float ty = sheet->m_basePos.y + sheet->m_yDist;
- float tz = sheet->m_basePos.z + 3.0f;
- sheet->m_targetZ = CWorld::FindGroundZFor3DCoord(tx, ty, tz, nil) + 0.1f;
- sheet->RemoveFromList();
- sheet->AddToList(&StartMoversList);
- }
- }
- }
-
- sheet = next;
- }
- }
- }
-}
-
-static float aAnimations[3][34] = {
- { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f },
-
- // Normal move
- { 0.0f, 0.05f, 0.12f, 0.25f, 0.42f, 0.57f, 0.68f, 0.8f, 0.86f, 0.9f, 0.93f, 0.95f, 0.96f, 0.97f, 0.98f, 0.99f, 1.0f, // XY movemnt
- 0.15f, 0.35f, 0.6f, 0.9f, 1.2f, 1.25f, 1.3f, 1.2f, 1.1f, 0.95f, 0.8f, 0.6f, 0.45f, 0.3f, 0.2f, 0.1f, 0 }, // Z movement
-
- // Stirred up by fast vehicle
- { 0.0f, 0.05f, 0.12f, 0.25f, 0.42f, 0.57f, 0.68f, 0.8f, 0.95f, 1.1f, 1.15f, 1.18f, 1.15f, 1.1f, 1.05f, 1.03f, 1.0f,
- 0.15f, 0.35f, 0.6f, 0.9f, 1.2f, 1.25f, 1.3f, 1.2f, 1.1f, 0.95f, 0.8f, 0.6f, 0.45f, 0.3f, 0.2f, 0.1f, 0 }
-};
-
-void
-CRubbish::Update(void)
-{
- bool foundGround;
-
- // FRAMETIME
- if(bRubbishInvisible)
- RubbishVisibility = Max(RubbishVisibility-5, 0);
- else
- RubbishVisibility = Min(RubbishVisibility+5, 255);
-
- // Spawn a new sheet
- COneSheet *sheet = StartEmptyList.m_next;
- if(sheet != &EndEmptyList){
- float spawnDist;
- float spawnAngle;
-
- spawnDist = (CGeneral::GetRandomNumber()&0xFF)/256.0f + RUBBISH_MAX_DIST;
- uint8 r = CGeneral::GetRandomNumber();
- if(r&1)
- spawnAngle = (CGeneral::GetRandomNumber()&0xFF)/256.0f * 6.28f;
- else
- spawnAngle = (r-128)/160.0f + TheCamera.Orientation;
- sheet->m_basePos.x = TheCamera.GetPosition().x + spawnDist*Sin(spawnAngle);
- sheet->m_basePos.y = TheCamera.GetPosition().y + spawnDist*Cos(spawnAngle);
- sheet->m_basePos.z = CWorld::FindGroundZFor3DCoord(sheet->m_basePos.x, sheet->m_basePos.y, TheCamera.GetPosition().z, &foundGround) + 0.1f;
- if(foundGround){
- // Found ground, so add to statics list
- sheet->m_angle = (CGeneral::GetRandomNumber()&0xFF)/256.0f * 6.28f;
- sheet->m_state = 1;
- if(CCullZones::FindAttributesForCoors(sheet->m_basePos, nil) & ATTRZONE_NORAIN)
- sheet->m_isVisible = false;
- else
- sheet->m_isVisible = true;
- sheet->RemoveFromList();
- sheet->AddToList(&StartStaticsList);
- }
- }
-
- // Process animation
- sheet = StartMoversList.m_next;
- while(sheet != &EndMoversList){
- uint32 currentTime = CTimer::GetTimeInMilliseconds() - sheet->m_moveStart;
- if(currentTime < sheet->m_moveDuration){
- // Animation
- int step = 16 * currentTime / sheet->m_moveDuration; // 16 steps in animation
- int stepTime = sheet->m_moveDuration/16; // time in each step
- float s = (float)(currentTime - stepTime*step) / stepTime; // position on step
- float t = (float)currentTime / sheet->m_moveDuration; // position on total animation
- // factors for xy and z-movment
- float fxy = aAnimations[sheet->m_animationType][step]*(1.0f-s) + aAnimations[sheet->m_animationType][step+1]*s;
- float fz = aAnimations[sheet->m_animationType][step+17]*(1.0f-s) + aAnimations[sheet->m_animationType][step+1+17]*s;
- sheet->m_animatedPos.x = sheet->m_basePos.x + fxy*sheet->m_xDist;
- sheet->m_animatedPos.y = sheet->m_basePos.y + fxy*sheet->m_yDist;
- sheet->m_animatedPos.z = (1.0f-t)*sheet->m_basePos.z + t*sheet->m_targetZ + fz*sheet->m_animHeight;
- sheet->m_angle += CTimer::GetTimeStep()*0.04f;
- if(sheet->m_angle > 6.28f)
- sheet->m_angle -= 6.28f;
- sheet = sheet->m_next;
- }else{
- // End of animation, back into statics list
- sheet->m_basePos.x += sheet->m_xDist;
- sheet->m_basePos.y += sheet->m_yDist;
- sheet->m_basePos.z = sheet->m_targetZ;
- sheet->m_state = 1;
- sheet->m_isVisible = sheet->m_targetIsVisible;
-
- COneSheet *next = sheet->m_next;
- sheet->RemoveFromList();
- sheet->AddToList(&StartStaticsList);
- sheet = next;
- }
- }
-
- // Stir up a sheet by wind
- // FRAMETIME
- int freq;
- if(CWeather::Wind < 0.1f)
- freq = 31;
- else if(CWeather::Wind < 0.4f)
- freq = 7;
- else if(CWeather::Wind < 0.7f)
- freq = 1;
- else
- freq = 0;
- if((CTimer::GetFrameCounter() & freq) == 0){
- // Pick a random sheet and set animation state if static
- int i = CGeneral::GetRandomNumber() % NUM_RUBBISH_SHEETS;
- if(aSheets[i].m_state == 1){
- aSheets[i].m_moveStart = CTimer::GetTimeInMilliseconds();
- aSheets[i].m_moveDuration = CWeather::Wind*1500.0f + 1000.0f;
- aSheets[i].m_animHeight = 0.2f;
- aSheets[i].m_xDist = 3.0f*CWeather::Wind;
- aSheets[i].m_yDist = 3.0f*CWeather::Wind;
- // Check if target position is ok
- float tx = aSheets[i].m_basePos.x + aSheets[i].m_xDist;
- float ty = aSheets[i].m_basePos.y + aSheets[i].m_yDist;
- float tz = aSheets[i].m_basePos.z + 3.0f;
- aSheets[i].m_targetZ = CWorld::FindGroundZFor3DCoord(tx, ty, tz, &foundGround) + 0.1f;
- if(CCullZones::FindAttributesForCoors(CVector(tx, ty, aSheets[i].m_targetZ), nil) & ATTRZONE_NORAIN)
- aSheets[i].m_targetIsVisible = false;
- else
- aSheets[i].m_targetIsVisible = true;
- if(foundGround){
- // start animation
- aSheets[i].m_state = 2;
- aSheets[i].m_animationType = 1;
- aSheets[i].RemoveFromList();
- aSheets[i].AddToList(&StartMoversList);
- }
- }
- }
-
- // Remove sheets that are too far away
- int i = (CTimer::GetFrameCounter()%(NUM_RUBBISH_SHEETS/4))*4;
- int last = ((CTimer::GetFrameCounter()%(NUM_RUBBISH_SHEETS/4)) + 1)*4;
- for(; i < last; i++){
- if(aSheets[i].m_state == 1 &&
- (aSheets[i].m_basePos - TheCamera.GetPosition()).MagnitudeSqr2D() > SQR(RUBBISH_MAX_DIST+1.0f)){
- aSheets[i].m_state = 0;
- aSheets[i].RemoveFromList();
- aSheets[i].AddToList(&StartEmptyList);
- }
- }
-}
-
-void
-CRubbish::SetVisibility(bool visible)
-{
- bRubbishInvisible = !visible;
-}
-
-void
-CRubbish::Init(void)
-{
- int i;
- for(i = 0; i < NUM_RUBBISH_SHEETS; i++){
- aSheets[i].m_state = 0;
- if(i < NUM_RUBBISH_SHEETS-1)
- aSheets[i].m_next = &aSheets[i+1];
- else
- aSheets[i].m_next = &EndEmptyList;
- if(i > 0)
- aSheets[i].m_prev = &aSheets[i-1];
- else
- aSheets[i].m_prev = &StartEmptyList;
- }
-
- StartEmptyList.m_next = &aSheets[0];
- StartEmptyList.m_prev = nil;
- EndEmptyList.m_next = nil;
- EndEmptyList.m_prev = &aSheets[NUM_RUBBISH_SHEETS-1];
-
- StartStaticsList.m_next = &EndStaticsList;
- StartStaticsList.m_prev = nil;
- EndStaticsList.m_next = nil;
- EndStaticsList.m_prev = &StartStaticsList;
-
- StartMoversList.m_next = &EndMoversList;
- StartMoversList.m_prev = nil;
- EndMoversList.m_next = nil;
- EndMoversList.m_prev = &StartMoversList;
-
- // unused
- RwIm3DVertexSetU(&RubbishVertices[0], 0.0f);
- RwIm3DVertexSetV(&RubbishVertices[0], 0.0f);
- RwIm3DVertexSetU(&RubbishVertices[1], 1.0f);
- RwIm3DVertexSetV(&RubbishVertices[1], 0.0f);
- RwIm3DVertexSetU(&RubbishVertices[2], 0.0f);
- RwIm3DVertexSetV(&RubbishVertices[2], 1.0f);
- RwIm3DVertexSetU(&RubbishVertices[3], 1.0f);
- RwIm3DVertexSetV(&RubbishVertices[3], 1.0f);
-
- // unused
- RubbishIndexList2[0] = 0;
- RubbishIndexList2[1] = 2;
- RubbishIndexList2[2] = 1;
- RubbishIndexList2[3] = 1;
- RubbishIndexList2[4] = 2;
- RubbishIndexList2[5] = 3;
-
- RubbishIndexList[0] = 0;
- RubbishIndexList[1] = 1;
- RubbishIndexList[2] = 2;
- RubbishIndexList[3] = 1;
- RubbishIndexList[4] = 3;
- RubbishIndexList[5] = 2;
-
- CTxdStore::PushCurrentTxd();
- int slot = CTxdStore::FindTxdSlot("particle");
- CTxdStore::SetCurrentTxd(slot);
- gpRubbishTexture[0] = RwTextureRead("gameleaf01_64", nil);
- gpRubbishTexture[1] = RwTextureRead("gameleaf02_64", nil);
- gpRubbishTexture[2] = RwTextureRead("newspaper01_64", nil);
- gpRubbishTexture[3] = RwTextureRead("newspaper02_64", nil);
- CTxdStore::PopCurrentTxd();
- RubbishVisibility = 255;
- bRubbishInvisible = false;
-}
-
-void
-CRubbish::Shutdown(void)
-{
- RwTextureDestroy(gpRubbishTexture[0]);
-#if GTA_VERSION >= GTA3_PC_11
- gpRubbishTexture[0] = nil;
-#endif
- RwTextureDestroy(gpRubbishTexture[1]);
-#if GTA_VERSION >= GTA3_PC_11
- gpRubbishTexture[1] = nil;
-#endif
- RwTextureDestroy(gpRubbishTexture[2]);
-#if GTA_VERSION >= GTA3_PC_11
- gpRubbishTexture[2] = nil;
-#endif
- RwTextureDestroy(gpRubbishTexture[3]);
-#if GTA_VERSION >= GTA3_PC_11
- gpRubbishTexture[3] = nil;
-#endif
-}