mirror of
https://github.com/GTAmodding/re3.git
synced 2024-11-16 11:18:59 +00:00
seagulls, ships
This commit is contained in:
parent
e4649b41e1
commit
895580c724
3 changed files with 373 additions and 71 deletions
|
@ -35,6 +35,7 @@
|
||||||
#include "Streaming.h"
|
#include "Streaming.h"
|
||||||
#include "PathFind.h"
|
#include "PathFind.h"
|
||||||
#include "Wanted.h"
|
#include "Wanted.h"
|
||||||
|
#include "WaterLevel.h"
|
||||||
#include "General.h"
|
#include "General.h"
|
||||||
|
|
||||||
CPad Pads[MAX_PADS];
|
CPad Pads[MAX_PADS];
|
||||||
|
@ -306,6 +307,21 @@ void PinkCarsCheat()
|
||||||
gbBlackCars = false;
|
gbBlackCars = false;
|
||||||
gbPinkCars = true;
|
gbPinkCars = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NoSeaBedCheat(void)
|
||||||
|
{
|
||||||
|
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
|
||||||
|
CWaterLevel::m_bRenderSeaBed = !CWaterLevel::m_bRenderSeaBed;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderWaterLayersCheat(void)
|
||||||
|
{
|
||||||
|
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
|
||||||
|
if ( ++CWaterLevel::m_nRenderWaterLayers > 5 )
|
||||||
|
CWaterLevel::m_nRenderWaterLayers = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#ifdef KANGAROO_CHEAT
|
#ifdef KANGAROO_CHEAT
|
||||||
|
@ -1052,6 +1068,16 @@ void CPad::AddToPCCheatString(char c)
|
||||||
AltDodoCheat();
|
AltDodoCheat();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(PC_WATER) && defined(WATER_CHEATS)
|
||||||
|
// SEABEDCHEAT
|
||||||
|
if (!_CHEATCMP("TAEHCDEBAESON"))
|
||||||
|
NoSeaBedCheat();
|
||||||
|
|
||||||
|
// WATERLAYERSCHEAT
|
||||||
|
if (!_CHEATCMP("TAEHCSREYALRETAW"))
|
||||||
|
RenderWaterLayersCheat();
|
||||||
|
#endif
|
||||||
|
|
||||||
#undef _CHEATCMP
|
#undef _CHEATCMP
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -205,7 +205,8 @@ enum Config {
|
||||||
#define RELOADABLES // some debug menu options to reload TXD files
|
#define RELOADABLES // some debug menu options to reload TXD files
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//#define PC_WATER
|
#define PC_WATER
|
||||||
|
#define WATER_CHEATS
|
||||||
|
|
||||||
// Particle
|
// Particle
|
||||||
#define PC_PARTICLE
|
#define PC_PARTICLE
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include "Weather.h"
|
#include "Weather.h"
|
||||||
#include "Camera.h"
|
#include "Camera.h"
|
||||||
#include "Vehicle.h"
|
#include "Vehicle.h"
|
||||||
|
#include "PlayerPed.h"
|
||||||
#include "Boat.h"
|
#include "Boat.h"
|
||||||
#include "World.h"
|
#include "World.h"
|
||||||
#include "General.h"
|
#include "General.h"
|
||||||
|
@ -23,6 +24,7 @@
|
||||||
#include <rpworld.h>
|
#include <rpworld.h>
|
||||||
#include <rpmatfx.h>
|
#include <rpmatfx.h>
|
||||||
#include "Occlusion.h"
|
#include "Occlusion.h"
|
||||||
|
#include "Replay.h"
|
||||||
#include "WaterLevel.h"
|
#include "WaterLevel.h"
|
||||||
|
|
||||||
#define RwIm3DVertexSet_RGBA(vert, rgba) RwIm3DVertexSetRGBA(vert, rgba.red, rgba.green, rgba.blue, rgba.alpha) // (RwRGBAAssign(&(_dst)->color, &_src))
|
#define RwIm3DVertexSet_RGBA(vert, rgba) RwIm3DVertexSetRGBA(vert, rgba.red, rgba.green, rgba.blue, rgba.alpha) // (RwRGBAAssign(&(_dst)->color, &_src))
|
||||||
|
@ -136,22 +138,22 @@ WaterLevelInitialise(Const char *pWaterDat)
|
||||||
int32 slot = CTxdStore::FindTxdSlot("particle");
|
int32 slot = CTxdStore::FindTxdSlot("particle");
|
||||||
CTxdStore::SetCurrentTxd(slot);
|
CTxdStore::SetCurrentTxd(slot);
|
||||||
|
|
||||||
if ( gpWaterTex == NULL )
|
if ( gpWaterTex == nil )
|
||||||
gpWaterTex = RwTextureRead("waterclear256", NULL);
|
gpWaterTex = RwTextureRead("waterclear256", nil);
|
||||||
gpWaterRaster = RwTextureGetRaster(gpWaterTex);
|
gpWaterRaster = RwTextureGetRaster(gpWaterTex);
|
||||||
|
|
||||||
if ( gpWaterEnvTex == NULL )
|
if ( gpWaterEnvTex == nil )
|
||||||
gpWaterEnvTex = RwTextureRead("waterreflection2", NULL);
|
gpWaterEnvTex = RwTextureRead("waterreflection2", nil);
|
||||||
gpWaterEnvRaster = RwTextureGetRaster(gpWaterEnvTex);
|
gpWaterEnvRaster = RwTextureGetRaster(gpWaterEnvTex);
|
||||||
|
|
||||||
#ifdef PC_WATER
|
#ifdef PC_WATER
|
||||||
if ( gpWaterEnvBaseTex == NULL )
|
if ( gpWaterEnvBaseTex == nil )
|
||||||
gpWaterEnvBaseTex = RwTextureRead("sandywater", NULL);
|
gpWaterEnvBaseTex = RwTextureRead("sandywater", nil);
|
||||||
gpWaterEnvBaseRaster = RwTextureGetRaster(gpWaterEnvBaseTex);
|
gpWaterEnvBaseRaster = RwTextureGetRaster(gpWaterEnvBaseTex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ( gpWaterWakeTex == NULL )
|
if ( gpWaterWakeTex == nil )
|
||||||
gpWaterWakeTex = RwTextureRead("waterwake", NULL);
|
gpWaterWakeTex = RwTextureRead("waterwake", nil);
|
||||||
gpWaterWakeRaster = RwTextureGetRaster(gpWaterWakeTex);
|
gpWaterWakeRaster = RwTextureGetRaster(gpWaterWakeTex);
|
||||||
|
|
||||||
CTxdStore::PopCurrentTxd();
|
CTxdStore::PopCurrentTxd();
|
||||||
|
@ -169,7 +171,7 @@ CWaterLevel::Shutdown()
|
||||||
#define _DELETE_TEXTURE(t) if ( t ) \
|
#define _DELETE_TEXTURE(t) if ( t ) \
|
||||||
{ \
|
{ \
|
||||||
RwTextureDestroy(t); \
|
RwTextureDestroy(t); \
|
||||||
t = NULL; \
|
t = nil; \
|
||||||
}
|
}
|
||||||
|
|
||||||
_DELETE_TEXTURE(gpWaterTex);
|
_DELETE_TEXTURE(gpWaterTex);
|
||||||
|
@ -366,7 +368,7 @@ CWaterLevel::CreateWavyAtomic()
|
||||||
|
|
||||||
static RwFrame *wakeEnvFrame;
|
static RwFrame *wakeEnvFrame;
|
||||||
|
|
||||||
if ( wakeEnvFrame == NULL )
|
if ( wakeEnvFrame == nil )
|
||||||
{
|
{
|
||||||
wakeEnvFrame = RwFrameCreate();
|
wakeEnvFrame = RwFrameCreate();
|
||||||
RwMatrixSetIdentity(RwFrameGetMatrix(wakeEnvFrame));
|
RwMatrixSetIdentity(RwFrameGetMatrix(wakeEnvFrame));
|
||||||
|
@ -412,7 +414,7 @@ CWaterLevel::GetWaterLevel(float fX, float fY, float fZ, float *pfOutLevel, bool
|
||||||
if ( nBlock == 0x80 )
|
if ( nBlock == 0x80 )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
ASSERT( pfOutLevel != NULL );
|
ASSERT( pfOutLevel != nil );
|
||||||
*pfOutLevel = ms_aWaterZs[nBlock];
|
*pfOutLevel = ms_aWaterZs[nBlock];
|
||||||
|
|
||||||
float fAngle = (CTimer::GetTimeInMilliseconds() & 4095) * (TWOPI / 4096.0f);
|
float fAngle = (CTimer::GetTimeInMilliseconds() & 4095) * (TWOPI / 4096.0f);
|
||||||
|
@ -444,9 +446,6 @@ CWaterLevel::GetWaterLevelNoWaves(float fX, float fY, float fZ, float *pfOutLeve
|
||||||
int32 x = WATER_TO_SMALL_SECTOR_X(fX + WATER_X_OFFSET);
|
int32 x = WATER_TO_SMALL_SECTOR_X(fX + WATER_X_OFFSET);
|
||||||
int32 y = WATER_TO_SMALL_SECTOR_Y(fY);
|
int32 y = WATER_TO_SMALL_SECTOR_Y(fY);
|
||||||
|
|
||||||
ASSERT( x >= 0 && x < MAX_SMALL_SECTORS );
|
|
||||||
ASSERT( y >= 0 && y < MAX_SMALL_SECTORS );
|
|
||||||
|
|
||||||
if ( x < 0 || x >= MAX_SMALL_SECTORS ) return false;
|
if ( x < 0 || x >= MAX_SMALL_SECTORS ) return false;
|
||||||
if ( y < 0 || y >= MAX_SMALL_SECTORS ) return false;
|
if ( y < 0 || y >= MAX_SMALL_SECTORS ) return false;
|
||||||
|
|
||||||
|
@ -455,13 +454,14 @@ CWaterLevel::GetWaterLevelNoWaves(float fX, float fY, float fZ, float *pfOutLeve
|
||||||
if ( nBlock == 0x80 )
|
if ( nBlock == 0x80 )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
ASSERT( pfOutLevel != NULL );
|
ASSERT( pfOutLevel != nil );
|
||||||
*pfOutLevel = ms_aWaterZs[nBlock];
|
*pfOutLevel = ms_aWaterZs[nBlock];
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
float CWaterLevel::GetWaterWavesOnly(short x, short y)
|
float
|
||||||
|
CWaterLevel::GetWaterWavesOnly(short x, short y)
|
||||||
{
|
{
|
||||||
float fAngle = (CTimer::GetTimeInMilliseconds() & 4095) * (TWOPI / 4096.0f);
|
float fAngle = (CTimer::GetTimeInMilliseconds() & 4095) * (TWOPI / 4096.0f);
|
||||||
|
|
||||||
|
@ -472,9 +472,10 @@ float CWaterLevel::GetWaterWavesOnly(short x, short y)
|
||||||
return fWave * fWindFactor;
|
return fWave * fWindFactor;
|
||||||
}
|
}
|
||||||
|
|
||||||
CVector CWaterLevel::GetWaterNormal(float fX, float fY)
|
CVector
|
||||||
|
CWaterLevel::GetWaterNormal(float fX, float fY)
|
||||||
{
|
{
|
||||||
//TODO: BUG ? ignore x offset
|
//TODO: BUG ? no x offset
|
||||||
|
|
||||||
int32 x = WATER_TO_SMALL_SECTOR_X(fX);
|
int32 x = WATER_TO_SMALL_SECTOR_X(fX);
|
||||||
int32 y = WATER_TO_SMALL_SECTOR_Y(fY);
|
int32 y = WATER_TO_SMALL_SECTOR_Y(fY);
|
||||||
|
@ -497,7 +498,8 @@ CVector CWaterLevel::GetWaterNormal(float fX, float fY)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline float _GetWaterDrawDist()
|
inline float
|
||||||
|
_GetWaterDrawDist()
|
||||||
{
|
{
|
||||||
if ( TheCamera.GetPosition().z < 15.0f ) return 1200.0f;
|
if ( TheCamera.GetPosition().z < 15.0f ) return 1200.0f;
|
||||||
if ( TheCamera.GetPosition().z > 60.0f ) return 2000.0f;
|
if ( TheCamera.GetPosition().z > 60.0f ) return 2000.0f;
|
||||||
|
@ -536,7 +538,8 @@ _GetCamBounds(bool *bUseCamStartY, bool *bUseCamEndY, bool *bUseCamStartX, bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline bool _IsColideWithBlock(int32 x, int32 y, int32 &block)
|
inline bool
|
||||||
|
_IsColideWithBlock(int32 x, int32 y, int32 &block)
|
||||||
{
|
{
|
||||||
block = CWaterLevel::aWaterFineBlockList[x + 0][y + 0];
|
block = CWaterLevel::aWaterFineBlockList[x + 0][y + 0];
|
||||||
if (!(block & 0x80))
|
if (!(block & 0x80))
|
||||||
|
@ -873,7 +876,8 @@ CWaterLevel::RenderWater()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CWaterLevel::RenderTransparentWater(void)
|
void
|
||||||
|
CWaterLevel::RenderTransparentWater(void)
|
||||||
{
|
{
|
||||||
bool bUseCamEndX = false;
|
bool bUseCamEndX = false;
|
||||||
bool bUseCamStartY = false;
|
bool bUseCamStartY = false;
|
||||||
|
@ -1212,7 +1216,8 @@ void CWaterLevel::RenderOneFlatSmallWaterPoly(float fX, float fY, float fZ, RwRG
|
||||||
TempBufferIndicesStored += 6;
|
TempBufferIndicesStored += 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWaterLevel::RenderOneFlatLargeWaterPoly(float fX, float fY, float fZ, RwRGBA const &color)
|
void
|
||||||
|
CWaterLevel::RenderOneFlatLargeWaterPoly(float fX, float fY, float fZ, RwRGBA const &color)
|
||||||
{
|
{
|
||||||
if ( TempBufferIndicesStored >= TEMPBUFFERINDEXSIZE-6 || TempBufferVerticesStored >= TEMPBUFFERVERTSIZE-4 )
|
if ( TempBufferIndicesStored >= TEMPBUFFERINDEXSIZE-6 || TempBufferVerticesStored >= TEMPBUFFERVERTSIZE-4 )
|
||||||
RenderAndEmptyRenderBuffer();
|
RenderAndEmptyRenderBuffer();
|
||||||
|
@ -1253,7 +1258,8 @@ void CWaterLevel::RenderOneFlatLargeWaterPoly(float fX, float fY, float fZ, RwRG
|
||||||
TempBufferIndicesStored += 6;
|
TempBufferIndicesStored += 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWaterLevel::RenderOneFlatHugeWaterPoly(float fX, float fY, float fZ, RwRGBA const &color)
|
void
|
||||||
|
CWaterLevel::RenderOneFlatHugeWaterPoly(float fX, float fY, float fZ, RwRGBA const &color)
|
||||||
{
|
{
|
||||||
if ( TempBufferIndicesStored >= TEMPBUFFERINDEXSIZE-6 || TempBufferVerticesStored >= TEMPBUFFERVERTSIZE-4 )
|
if ( TempBufferIndicesStored >= TEMPBUFFERINDEXSIZE-6 || TempBufferVerticesStored >= TEMPBUFFERVERTSIZE-4 )
|
||||||
RenderAndEmptyRenderBuffer();
|
RenderAndEmptyRenderBuffer();
|
||||||
|
@ -1301,7 +1307,8 @@ void CWaterLevel::RenderOneFlatHugeWaterPoly(float fX, float fY, float fZ, RwRGB
|
||||||
TempBufferIndicesStored += 6;
|
TempBufferIndicesStored += 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWaterLevel::RenderOneFlatExtraHugeWaterPoly(float fX, float fY, float fZ, RwRGBA const &color)
|
void
|
||||||
|
CWaterLevel::RenderOneFlatExtraHugeWaterPoly(float fX, float fY, float fZ, RwRGBA const &color)
|
||||||
{
|
{
|
||||||
if ( TempBufferIndicesStored >= TEMPBUFFERINDEXSIZE-6 || TempBufferVerticesStored >= TEMPBUFFERVERTSIZE-4 )
|
if ( TempBufferIndicesStored >= TEMPBUFFERINDEXSIZE-6 || TempBufferVerticesStored >= TEMPBUFFERVERTSIZE-4 )
|
||||||
RenderAndEmptyRenderBuffer();
|
RenderAndEmptyRenderBuffer();
|
||||||
|
@ -1349,7 +1356,8 @@ void CWaterLevel::RenderOneFlatExtraHugeWaterPoly(float fX, float fY, float fZ,
|
||||||
TempBufferIndicesStored += 6;
|
TempBufferIndicesStored += 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWaterLevel::RenderOneWavySector(float fX, float fY, float fZ, RwRGBA const &color, bool bDontRender)
|
void
|
||||||
|
CWaterLevel::RenderOneWavySector(float fX, float fY, float fZ, RwRGBA const &color, bool bDontRender)
|
||||||
{
|
{
|
||||||
CVector vecSectorPos(fX + (SMALL_SECTOR_SIZE/2), fY + (SMALL_SECTOR_SIZE/2), fZ + 2.0f);
|
CVector vecSectorPos(fX + (SMALL_SECTOR_SIZE/2), fY + (SMALL_SECTOR_SIZE/2), fZ + 2.0f);
|
||||||
|
|
||||||
|
@ -1387,10 +1395,10 @@ void CWaterLevel::RenderOneWavySector(float fX, float fY, float fZ, RwRGBA const
|
||||||
float waveWind = CWeather::WindClipped * fWave2Ampl + 0.05f;
|
float waveWind = CWeather::WindClipped * fWave2Ampl + 0.05f;
|
||||||
|
|
||||||
float waveA = (TWOPI / 16.0f)
|
float waveA = (TWOPI / 16.0f)
|
||||||
* ((fNormalDirectionScalar1 * fabs(camMat->at.x + camMat->at.y) + fNormMult) * (CWeather::WindClipped * 0.4f + 0.2f));
|
* ((fNormalDirectionScalar1 * Abs(camMat->at.x + camMat->at.y) + fNormMult) * (CWeather::WindClipped * 0.4f + 0.2f));
|
||||||
|
|
||||||
float waveB = TWOPI / (16.0f * fWave2NormScale)
|
float waveB = TWOPI / (16.0f * fWave2NormScale)
|
||||||
* ((fNormalDirectionScalar2 * fabs(camMat->at.y - camMat->at.x) + fNormMultB) * (CWeather::WindClipped * 0.2f + 0.1f));
|
* ((fNormalDirectionScalar2 * Abs(camMat->at.y - camMat->at.x) + fNormMultB) * (CWeather::WindClipped * 0.2f + 0.1f));
|
||||||
|
|
||||||
CVector vA(1.0f, 0.0f, 0.0f);
|
CVector vA(1.0f, 0.0f, 0.0f);
|
||||||
CVector vB(0.0f, 1.0f, 0.0f);
|
CVector vB(0.0f, 1.0f, 0.0f);
|
||||||
|
@ -1423,8 +1431,8 @@ void CWaterLevel::RenderOneWavySector(float fX, float fY, float fZ, RwRGBA const
|
||||||
|
|
||||||
wavyMorphVerts->z = wind * Sin(waveMulA) + waveWind * Sin(waveMulB);
|
wavyMorphVerts->z = wind * Sin(waveMulA) + waveWind * Sin(waveMulB);
|
||||||
|
|
||||||
vA.z = (waveA * Cos(waveMulA)) - (waveB * cos(waveMulB));
|
vA.z = (waveA * Cos(waveMulA)) - (waveB * Cos(waveMulB));
|
||||||
vB.z = (waveA * Cos(waveMulA)) + (waveB * cos(waveMulB));
|
vB.z = (waveA * Cos(waveMulA)) + (waveB * Cos(waveMulB));
|
||||||
|
|
||||||
CVector norm = CrossProduct(vA, vB);
|
CVector norm = CrossProduct(vA, vB);
|
||||||
norm.Normalise();
|
norm.Normalise();
|
||||||
|
@ -1470,7 +1478,8 @@ void CWaterLevel::RenderOneWavySector(float fX, float fY, float fZ, RwRGBA const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int16 _RoundValue(int32 v)
|
int16
|
||||||
|
_RoundValue(int32 v)
|
||||||
{
|
{
|
||||||
int16 result = v;
|
int16 result = v;
|
||||||
|
|
||||||
|
@ -1480,7 +1489,8 @@ int16 _RoundValue(int32 v)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWaterLevel::RenderWavyMask(float fX, float fY, float fZ,
|
void
|
||||||
|
CWaterLevel::RenderWavyMask(float fX, float fY, float fZ,
|
||||||
float fSectorX, float fSectorY,
|
float fSectorX, float fSectorY,
|
||||||
#ifdef PC_WATER
|
#ifdef PC_WATER
|
||||||
float fCamPosX, float fCamPosY,
|
float fCamPosX, float fCamPosY,
|
||||||
|
@ -1647,7 +1657,7 @@ void CWaterLevel::RenderWavyMask(float fX, float fY, float fZ,
|
||||||
CParticle::AddParticle(PARTICLE_WATER_SPARK,
|
CParticle::AddParticle(PARTICLE_WATER_SPARK,
|
||||||
vecPos,
|
vecPos,
|
||||||
CVector(0.0f, 0.0f, 0.0f),
|
CVector(0.0f, 0.0f, 0.0f),
|
||||||
NULL,
|
nil,
|
||||||
0.0f,
|
0.0f,
|
||||||
15,
|
15,
|
||||||
CGeneral::GetRandomNumberInRange(-90, 90),
|
CGeneral::GetRandomNumberInRange(-90, 90),
|
||||||
|
@ -1670,7 +1680,7 @@ void CWaterLevel::RenderWavyMask(float fX, float fY, float fZ,
|
||||||
CParticle::AddParticle(PARTICLE_WATER_SPARK,
|
CParticle::AddParticle(PARTICLE_WATER_SPARK,
|
||||||
vecPos,
|
vecPos,
|
||||||
CVector(0.0f, 0.0f, 0.0f),
|
CVector(0.0f, 0.0f, 0.0f),
|
||||||
NULL,
|
nil,
|
||||||
0.0f,
|
0.0f,
|
||||||
15,
|
15,
|
||||||
CGeneral::GetRandomNumberInRange(-90, 90),
|
CGeneral::GetRandomNumberInRange(-90, 90),
|
||||||
|
@ -1693,7 +1703,7 @@ void CWaterLevel::RenderWavyMask(float fX, float fY, float fZ,
|
||||||
CParticle::AddParticle(PARTICLE_WATER_SPARK,
|
CParticle::AddParticle(PARTICLE_WATER_SPARK,
|
||||||
vecPos,
|
vecPos,
|
||||||
CVector(0.0f, 0.0f, 0.0f),
|
CVector(0.0f, 0.0f, 0.0f),
|
||||||
NULL,
|
nil,
|
||||||
0.0f,
|
0.0f,
|
||||||
15,
|
15,
|
||||||
CGeneral::GetRandomNumberInRange(-90, 90),
|
CGeneral::GetRandomNumberInRange(-90, 90),
|
||||||
|
@ -1716,7 +1726,7 @@ void CWaterLevel::RenderWavyMask(float fX, float fY, float fZ,
|
||||||
CParticle::AddParticle(PARTICLE_WATER_SPARK,
|
CParticle::AddParticle(PARTICLE_WATER_SPARK,
|
||||||
vecPos,
|
vecPos,
|
||||||
CVector(0.0f, 0.0f, 0.0f),
|
CVector(0.0f, 0.0f, 0.0f),
|
||||||
NULL,
|
nil,
|
||||||
0.0f,
|
0.0f,
|
||||||
15,
|
15,
|
||||||
CGeneral::GetRandomNumberInRange(-90, 90),
|
CGeneral::GetRandomNumberInRange(-90, 90),
|
||||||
|
@ -1796,7 +1806,8 @@ void CWaterLevel::RenderWavyMask(float fX, float fY, float fZ,
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef PC_WATER
|
#ifdef PC_WATER
|
||||||
void CWaterLevel::PreCalcWaterGeometry(void)
|
void
|
||||||
|
CWaterLevel::PreCalcWaterGeometry(void)
|
||||||
{
|
{
|
||||||
if ( !RequireWavySector )
|
if ( !RequireWavySector )
|
||||||
{
|
{
|
||||||
|
@ -1869,7 +1880,8 @@ void CWaterLevel::PreCalcWaterGeometry(void)
|
||||||
MaskCalculatedThisFrame = false;
|
MaskCalculatedThisFrame = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWaterLevel::PreCalcWavySector(RwRGBA const &color)
|
bool
|
||||||
|
CWaterLevel::PreCalcWavySector(RwRGBA const &color)
|
||||||
{
|
{
|
||||||
float fAngle = (CTimer::GetTimeInMilliseconds() & 4095) * (TWOPI / 4096.0f);
|
float fAngle = (CTimer::GetTimeInMilliseconds() & 4095) * (TWOPI / 4096.0f);
|
||||||
|
|
||||||
|
@ -1933,10 +1945,10 @@ bool CWaterLevel::PreCalcWavySector(RwRGBA const &color)
|
||||||
float waveMulA = (morphVertYHalf + morphVertXHalf) * (TWOPI / 16.0f) + fAngle;
|
float waveMulA = (morphVertYHalf + morphVertXHalf) * (TWOPI / 16.0f) + fAngle;
|
||||||
float waveMulB = (morphVertYHalf - morphVertXHalf) * (TWOPI / (16.0f * fWave2InvLength)) + fAngle;
|
float waveMulB = (morphVertYHalf - morphVertXHalf) * (TWOPI / (16.0f * fWave2InvLength)) + fAngle;
|
||||||
|
|
||||||
wavyMorphVerts->z = wind * sinf(waveMulA) + waveWind * sin(waveMulB);
|
wavyMorphVerts->z = wind * Sin(waveMulA) + waveWind * Sin(waveMulB);
|
||||||
|
|
||||||
vA.z = (waveA * cos(waveMulA)) - (waveB * cos(waveMulB));
|
vA.z = (waveA * Cos(waveMulA)) - (waveB * Cos(waveMulB));
|
||||||
vB.z = (waveA * cos(waveMulA)) + (waveB * cos(waveMulB));
|
vB.z = (waveA * Cos(waveMulA)) + (waveB * Cos(waveMulB));
|
||||||
|
|
||||||
CVector norm = CrossProduct(vA, vB);
|
CVector norm = CrossProduct(vA, vB);
|
||||||
norm.Normalise();
|
norm.Normalise();
|
||||||
|
@ -1958,7 +1970,8 @@ bool CWaterLevel::PreCalcWavySector(RwRGBA const &color)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWaterLevel::PreCalcWavyMask(float fX, float fY, float fZ,
|
bool
|
||||||
|
CWaterLevel::PreCalcWavyMask(float fX, float fY, float fZ,
|
||||||
float fSectorX, float fSectorY,
|
float fSectorX, float fSectorY,
|
||||||
float fCamPosX, float fCamPosY,
|
float fCamPosX, float fCamPosY,
|
||||||
float fCamDirX, float fCamDirY,
|
float fCamDirX, float fCamDirY,
|
||||||
|
@ -2060,7 +2073,7 @@ bool CWaterLevel::PreCalcWavyMask(float fX, float fY, float fZ,
|
||||||
CParticle::AddParticle(PARTICLE_WATER_SPARK,
|
CParticle::AddParticle(PARTICLE_WATER_SPARK,
|
||||||
vecPos,
|
vecPos,
|
||||||
CVector(0.0f, 0.0f, 0.0f),
|
CVector(0.0f, 0.0f, 0.0f),
|
||||||
NULL,
|
nil,
|
||||||
0.0f,
|
0.0f,
|
||||||
15,
|
15,
|
||||||
CGeneral::GetRandomNumberInRange(-90, 90),
|
CGeneral::GetRandomNumberInRange(-90, 90),
|
||||||
|
@ -2083,7 +2096,7 @@ bool CWaterLevel::PreCalcWavyMask(float fX, float fY, float fZ,
|
||||||
CParticle::AddParticle(PARTICLE_WATER_SPARK,
|
CParticle::AddParticle(PARTICLE_WATER_SPARK,
|
||||||
vecPos,
|
vecPos,
|
||||||
CVector(0.0f, 0.0f, 0.0f),
|
CVector(0.0f, 0.0f, 0.0f),
|
||||||
NULL,
|
nil,
|
||||||
0.0f,
|
0.0f,
|
||||||
15,
|
15,
|
||||||
CGeneral::GetRandomNumberInRange(-90, 90),
|
CGeneral::GetRandomNumberInRange(-90, 90),
|
||||||
|
@ -2106,7 +2119,7 @@ bool CWaterLevel::PreCalcWavyMask(float fX, float fY, float fZ,
|
||||||
CParticle::AddParticle(PARTICLE_WATER_SPARK,
|
CParticle::AddParticle(PARTICLE_WATER_SPARK,
|
||||||
vecPos,
|
vecPos,
|
||||||
CVector(0.0f, 0.0f, 0.0f),
|
CVector(0.0f, 0.0f, 0.0f),
|
||||||
NULL,
|
nil,
|
||||||
0.0f,
|
0.0f,
|
||||||
15,
|
15,
|
||||||
CGeneral::GetRandomNumberInRange(-90, 90),
|
CGeneral::GetRandomNumberInRange(-90, 90),
|
||||||
|
@ -2129,7 +2142,7 @@ bool CWaterLevel::PreCalcWavyMask(float fX, float fY, float fZ,
|
||||||
CParticle::AddParticle(PARTICLE_WATER_SPARK,
|
CParticle::AddParticle(PARTICLE_WATER_SPARK,
|
||||||
vecPos,
|
vecPos,
|
||||||
CVector(0.0f, 0.0f, 0.0f),
|
CVector(0.0f, 0.0f, 0.0f),
|
||||||
NULL,
|
nil,
|
||||||
0.0f,
|
0.0f,
|
||||||
15,
|
15,
|
||||||
CGeneral::GetRandomNumberInRange(-90, 90),
|
CGeneral::GetRandomNumberInRange(-90, 90),
|
||||||
|
@ -2183,7 +2196,8 @@ bool CWaterLevel::PreCalcWavyMask(float fX, float fY, float fZ,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void CWaterLevel::RenderBoatWakes(void)
|
void
|
||||||
|
CWaterLevel::RenderBoatWakes(void)
|
||||||
{
|
{
|
||||||
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, (void *)gpWaterWakeRaster);
|
RwRenderStateSet(rwRENDERSTATETEXTURERASTER, (void *)gpWaterWakeRaster);
|
||||||
#ifndef PC_WATER
|
#ifndef PC_WATER
|
||||||
|
@ -2205,7 +2219,7 @@ void CWaterLevel::RenderBoatWakes(void)
|
||||||
{
|
{
|
||||||
CBoat *pBoat = CBoat::apFrameWakeGeneratingBoats[idx];
|
CBoat *pBoat = CBoat::apFrameWakeGeneratingBoats[idx];
|
||||||
|
|
||||||
if ( pBoat == NULL )
|
if ( pBoat == nil )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
CVector2D vecDistA(pBoat->GetForward().x, pBoat->GetForward().y);
|
CVector2D vecDistA(pBoat->GetForward().x, pBoat->GetForward().y);
|
||||||
|
@ -2301,19 +2315,21 @@ void CWaterLevel::RenderBoatWakes(void)
|
||||||
RenderAndEmptyRenderBuffer();
|
RenderAndEmptyRenderBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
inline float _GetWindedWave(float fX, float fY)
|
inline float
|
||||||
|
_GetWindedWave(float fX, float fY)
|
||||||
{
|
{
|
||||||
float fAngle = (CTimer::GetTimeInMilliseconds() & 4095) * (TWOPI / 4096.0f);
|
float fAngle = (CTimer::GetTimeInMilliseconds() & 4095) * (TWOPI / 4096.0f);
|
||||||
float x = WATER_HUGE_X(fX + WATER_X_OFFSET);
|
float x = WATER_HUGE_X(fX + WATER_X_OFFSET);
|
||||||
float y = WATER_HUGE_Y(fY);
|
float y = WATER_HUGE_Y(fY);
|
||||||
|
|
||||||
float fWindFactor (CWeather::WindClipped * 0.4f + 0.2f);
|
float fWindFactor (CWeather::WindClipped * 0.4f + 0.2f);
|
||||||
float fWave = sin(( (x - floorf(x)) + (y - floorf(y)) ) * TWOPI + fAngle);
|
float fWave = Sin(( (x - floorf(x)) + (y - floorf(y)) ) * TWOPI + fAngle);
|
||||||
|
|
||||||
return fWindFactor * fWave;
|
return fWindFactor * fWave;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWaterLevel::RenderWakeSegment(CVector2D &vecA, CVector2D &vecB, CVector2D &vecC, CVector2D &vecD,
|
void
|
||||||
|
CWaterLevel::RenderWakeSegment(CVector2D &vecA, CVector2D &vecB, CVector2D &vecC, CVector2D &vecD,
|
||||||
float &fSizeA, float &fSizeB,
|
float &fSizeA, float &fSizeB,
|
||||||
float &fAlphaA, float &fAlphaB,
|
float &fAlphaA, float &fAlphaB,
|
||||||
float &fWakeZ)
|
float &fWakeZ)
|
||||||
|
@ -2398,7 +2414,8 @@ void CWaterLevel::RenderWakeSegment(CVector2D &vecA, CVector2D &vecB, CVector2D
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWaterLevel::RenderOneSlopedUnderWaterPoly(float fX, float fY, float fZ, RwRGBA const&color)
|
void
|
||||||
|
CWaterLevel::RenderOneSlopedUnderWaterPoly(float fX, float fY, float fZ, RwRGBA const&color)
|
||||||
{
|
{
|
||||||
CVector2D camPos(TheCamera.GetPosition().x, TheCamera.GetPosition().y);
|
CVector2D camPos(TheCamera.GetPosition().x, TheCamera.GetPosition().y);
|
||||||
|
|
||||||
|
@ -2475,7 +2492,8 @@ void CWaterLevel::RenderOneSlopedUnderWaterPoly(float fX, float fY, float fZ, Rw
|
||||||
TempBufferIndicesStored += 6;
|
TempBufferIndicesStored += 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWaterLevel::RenderOneFlatSmallWaterPolyBlended(float fX, float fY, float fZ, float fCamX, float fCamY,
|
void
|
||||||
|
CWaterLevel::RenderOneFlatSmallWaterPolyBlended(float fX, float fY, float fZ, float fCamX, float fCamY,
|
||||||
RwRGBA const &color, RwRGBA const &colorTrans,
|
RwRGBA const &color, RwRGBA const &colorTrans,
|
||||||
float fDrawDist)
|
float fDrawDist)
|
||||||
{
|
{
|
||||||
|
@ -2588,7 +2606,7 @@ CWaterLevel::RenderAndEmptyRenderBuffer()
|
||||||
{
|
{
|
||||||
LittleTest();
|
LittleTest();
|
||||||
|
|
||||||
if ( RwIm3DTransform(TempBufferRenderVertices, TempBufferVerticesStored, NULL, rwIM3D_VERTEXUV) )
|
if ( RwIm3DTransform(TempBufferRenderVertices, TempBufferVerticesStored, nil, rwIM3D_VERTEXUV) )
|
||||||
{
|
{
|
||||||
RwIm3DRenderIndexedPrimitive(rwPRIMTYPETRILIST, TempBufferRenderIndexList, TempBufferIndicesStored);
|
RwIm3DRenderIndexedPrimitive(rwPRIMTYPETRILIST, TempBufferRenderIndexList, TempBufferIndicesStored);
|
||||||
RwIm3DEnd();
|
RwIm3DEnd();
|
||||||
|
@ -2599,18 +2617,19 @@ CWaterLevel::RenderAndEmptyRenderBuffer()
|
||||||
TempBufferVerticesStored = 0;
|
TempBufferVerticesStored = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWaterLevel::GetGroundLevel(CVector const &vecPosn, float *pfOutLevel, ColData *pData, float fDistance)
|
bool
|
||||||
|
CWaterLevel::GetGroundLevel(CVector const &vecPosn, float *pfOutLevel, ColData *pData, float fDistance)
|
||||||
{
|
{
|
||||||
CColPoint point;
|
CColPoint point;
|
||||||
CEntity *entity;
|
CEntity *entity;
|
||||||
|
|
||||||
if ( !CWorld::ProcessVerticalLine(vecPosn + CVector(0.0f, 0.0f, fDistance),
|
if ( !CWorld::ProcessVerticalLine(vecPosn + CVector(0.0f, 0.0f, fDistance),
|
||||||
-fDistance, point, entity, true, false, false, false, true, false, NULL) )
|
-fDistance, point, entity, true, false, false, false, true, false, nil) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
*pfOutLevel = point.point.z;
|
*pfOutLevel = point.point.z;
|
||||||
|
|
||||||
if ( pData != NULL )
|
if ( pData != nil )
|
||||||
{
|
{
|
||||||
pData->SurfaceType = point.surfaceB;
|
pData->SurfaceType = point.surfaceB;
|
||||||
pData->PieceType = point.pieceB;
|
pData->PieceType = point.pieceB;
|
||||||
|
@ -2619,7 +2638,8 @@ bool CWaterLevel::GetGroundLevel(CVector const &vecPosn, float *pfOutLevel, ColD
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWaterLevel::IsLocationOutOfWorldBounds_WS(CVector const &vecPosn, int nOffset)
|
bool
|
||||||
|
CWaterLevel::IsLocationOutOfWorldBounds_WS(CVector const &vecPosn, int nOffset)
|
||||||
{
|
{
|
||||||
int32 x = int32((vecPosn.x / 50.0f) + 48.0f);
|
int32 x = int32((vecPosn.x / 50.0f) + 48.0f);
|
||||||
int32 y = int32((vecPosn.y / 50.0f) + 40.0f);
|
int32 y = int32((vecPosn.y / 50.0f) + 40.0f);
|
||||||
|
@ -2627,7 +2647,8 @@ bool CWaterLevel::IsLocationOutOfWorldBounds_WS(CVector const &vecPosn, int nOff
|
||||||
return x < nOffset || x >= 80 - nOffset || y < nOffset || y >= 80 - nOffset;
|
return x < nOffset || x >= 80 - nOffset || y < nOffset || y >= 80 - nOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWaterLevel::GetGroundLevel_WS(CVector const &vecPosn, float *pfOutLevel, ColData *pData, float fDistance)
|
bool
|
||||||
|
CWaterLevel::GetGroundLevel_WS(CVector const &vecPosn, float *pfOutLevel, ColData *pData, float fDistance)
|
||||||
{
|
{
|
||||||
if ( IsLocationOutOfWorldBounds_WS(vecPosn, 0) )
|
if ( IsLocationOutOfWorldBounds_WS(vecPosn, 0) )
|
||||||
return false;
|
return false;
|
||||||
|
@ -2635,7 +2656,8 @@ bool CWaterLevel::GetGroundLevel_WS(CVector const &vecPosn, float *pfOutLevel, C
|
||||||
return GetGroundLevel(vecPosn, pfOutLevel, pData, fDistance);
|
return GetGroundLevel(vecPosn, pfOutLevel, pData, fDistance);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWaterLevel::GetWaterDepth(CVector const &vecPosn, float *pfDepth, float *pfLevelNoWaves, float *pfGroundLevel)
|
bool
|
||||||
|
CWaterLevel::GetWaterDepth(CVector const &vecPosn, float *pfDepth, float *pfLevelNoWaves, float *pfGroundLevel)
|
||||||
{
|
{
|
||||||
float fLevelNoWaves;
|
float fLevelNoWaves;
|
||||||
float fGroundLevel;
|
float fGroundLevel;
|
||||||
|
@ -2643,38 +2665,291 @@ bool CWaterLevel::GetWaterDepth(CVector const &vecPosn, float *pfDepth, float *p
|
||||||
if ( !GetWaterLevelNoWaves(vecPosn.x, vecPosn.y, vecPosn.z, &fLevelNoWaves) )
|
if ( !GetWaterLevelNoWaves(vecPosn.x, vecPosn.y, vecPosn.z, &fLevelNoWaves) )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if ( !GetGroundLevel(vecPosn, &fGroundLevel, NULL, 30.0f) )
|
if ( !GetGroundLevel(vecPosn, &fGroundLevel, nil, 30.0f) )
|
||||||
fGroundLevel = -100.0;
|
fGroundLevel = -100.0;
|
||||||
|
|
||||||
if ( pfDepth != NULL )
|
if ( pfDepth != nil )
|
||||||
*pfDepth = fLevelNoWaves - fGroundLevel;
|
*pfDepth = fLevelNoWaves - fGroundLevel;
|
||||||
|
|
||||||
if ( pfLevelNoWaves != NULL )
|
if ( pfLevelNoWaves != nil )
|
||||||
*pfLevelNoWaves = fLevelNoWaves;
|
*pfLevelNoWaves = fLevelNoWaves;
|
||||||
|
|
||||||
if ( pfGroundLevel != NULL )
|
if ( pfGroundLevel != nil )
|
||||||
*pfGroundLevel = fGroundLevel;
|
*pfGroundLevel = fGroundLevel;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWaterLevel::RenderSeaBirds()
|
void
|
||||||
|
CWaterLevel::RenderSeaBirds()
|
||||||
{
|
{
|
||||||
|
CVector cur_pos = TheCamera.GetPosition();
|
||||||
|
|
||||||
|
if ( !CCullZones::CamNoRain()
|
||||||
|
&& !CCullZones::PlayerNoRain()
|
||||||
|
&& (CWeather::NewWeatherType == WEATHER_SUNNY || CWeather::NewWeatherType == WEATHER_EXTRA_SUNNY)
|
||||||
|
&& CClock::ms_nGameClockHours > 6 && CClock::ms_nGameClockHours < 20 )
|
||||||
|
{
|
||||||
|
static CVector prev_pos(0.0f, 0.0f, 0.0f);
|
||||||
|
static CVector prev_front(0.0f, 0.0f, 0.0f);
|
||||||
|
static int32 timecounter;
|
||||||
|
|
||||||
|
if ( Abs(prev_pos.x - cur_pos.x) + Abs(prev_pos.y - cur_pos.y) + Abs(prev_pos.z - cur_pos.z) > 1.5f )
|
||||||
|
{
|
||||||
|
prev_pos = cur_pos;
|
||||||
|
timecounter = CTimer::GetTimeInMilliseconds();
|
||||||
|
}
|
||||||
|
else if ( (CTimer::GetTimeInMilliseconds() - timecounter) > 5000 )
|
||||||
|
{
|
||||||
|
static int32 birdgenTime = 0;
|
||||||
|
|
||||||
|
if ( (CTimer::GetTimeInMilliseconds() - birdgenTime) > 1000 )
|
||||||
|
{
|
||||||
|
birdgenTime = CTimer::GetTimeInMilliseconds();
|
||||||
|
|
||||||
|
CVector vecPos = cur_pos;
|
||||||
|
|
||||||
|
float fAngle = CGeneral::GetRandomNumberInRange(90.0f, 150.0f);
|
||||||
|
|
||||||
|
uint16 nSinCosIdx = CGeneral::GetRandomNumber() % (CParticle::SIN_COS_TABLE_SIZE-1);
|
||||||
|
|
||||||
|
float fCos = CParticle::Cos(nSinCosIdx);
|
||||||
|
float fSin = CParticle::Sin(nSinCosIdx);
|
||||||
|
|
||||||
|
vecPos.x += (fCos - fSin) * fAngle;
|
||||||
|
vecPos.y += (fSin + fCos) * fAngle;
|
||||||
|
vecPos.z += CGeneral::GetRandomNumberInRange(10.0f, 30.0f);
|
||||||
|
|
||||||
|
CVector vecDir(CGeneral::GetRandomNumberInRange(-1.0f, 1.0f),
|
||||||
|
CGeneral::GetRandomNumberInRange(-1.0f, 1.0f),
|
||||||
|
0.0f);
|
||||||
|
|
||||||
|
CParticle::AddParticle(PARTICLE_BIRD_FRONT, vecPos, vecDir, nil, 0.0f, 0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWaterLevel::RenderShipsOnHorizon()
|
void
|
||||||
|
CWaterLevel::RenderShipsOnHorizon()
|
||||||
{
|
{
|
||||||
|
CVector cur_pos = FindPlayerPed()->GetPosition();
|
||||||
|
|
||||||
|
static CVector prev_pos(0.0f, 0.0f, 0.0f);
|
||||||
|
static CVector prev_front(0.0f, 0.0f, 0.0f);
|
||||||
|
static int32 timecounter;
|
||||||
|
|
||||||
|
if ( Abs(prev_pos.x - cur_pos.x) + Abs(prev_pos.y - cur_pos.y) + Abs(prev_pos.z - cur_pos.z) > 1.5f )
|
||||||
|
{
|
||||||
|
prev_pos = cur_pos;
|
||||||
|
timecounter = CTimer::GetTimeInMilliseconds();
|
||||||
|
}
|
||||||
|
else if ( (CTimer::GetTimeInMilliseconds() - timecounter) > 5000 )
|
||||||
|
{
|
||||||
|
static int32 shipgenTime = 0;
|
||||||
|
|
||||||
|
if ( (CTimer::GetTimeInMilliseconds() - shipgenTime) > 4000 )
|
||||||
|
{
|
||||||
|
shipgenTime = CTimer::GetTimeInMilliseconds();
|
||||||
|
|
||||||
|
CVector vecPos = cur_pos;
|
||||||
|
|
||||||
|
float fAngle = CGeneral::GetRandomNumberInRange(450.0f, 750.0f);
|
||||||
|
|
||||||
|
uint16 nSinCosIdx = CGeneral::GetRandomNumber() % (CParticle::SIN_COS_TABLE_SIZE-1);
|
||||||
|
|
||||||
|
float fCos = CParticle::Cos(nSinCosIdx);
|
||||||
|
float fSin = CParticle::Sin(nSinCosIdx);
|
||||||
|
|
||||||
|
vecPos.x += (fCos - fSin) * fAngle;
|
||||||
|
vecPos.y += (fSin + fCos) * fAngle;
|
||||||
|
|
||||||
|
float fLevelNoWaves;
|
||||||
|
|
||||||
|
if ( GetWaterLevelNoWaves(vecPos.x, vecPos.y, vecPos.z, &fLevelNoWaves) )
|
||||||
|
{
|
||||||
|
if ( IsLocationOutOfWorldBounds_WS(vecPos, 1) )
|
||||||
|
{
|
||||||
|
vecPos.z = fLevelNoWaves + 9.5f;
|
||||||
|
|
||||||
|
CVector vecDir
|
||||||
|
(
|
||||||
|
CGeneral::GetRandomNumberInRange(-0.1f, 0.1f),
|
||||||
|
0.0f,
|
||||||
|
0.0f
|
||||||
|
);
|
||||||
|
|
||||||
|
CParticle::AddParticle(PARTICLE_SHIP_SIDE, vecPos, vecDir,
|
||||||
|
nil, 0.0f, 0, 0, CGeneral::GetRandomNumber() & 7, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWaterLevel::HandleSeaLifeForms()
|
void
|
||||||
|
CWaterLevel::HandleSeaLifeForms()
|
||||||
{
|
{
|
||||||
|
if ( CReplay::IsPlayingBack() )
|
||||||
|
return;
|
||||||
|
|
||||||
|
CVector cur_pos = FindPlayerPed()->GetPosition();
|
||||||
|
|
||||||
|
static CVector prev_pos(0.0f, 0.0f, 0.0f);
|
||||||
|
static int32 timecounter;
|
||||||
|
|
||||||
|
if ( Abs(prev_pos.x - cur_pos.x) + Abs(prev_pos.y - cur_pos.y) + Abs(prev_pos.z - cur_pos.z) > 1.5f )
|
||||||
|
{
|
||||||
|
prev_pos = cur_pos;
|
||||||
|
timecounter = CTimer::GetTimeInMilliseconds();
|
||||||
|
}
|
||||||
|
else if ( (CTimer::GetTimeInMilliseconds() - timecounter) > 5000 )
|
||||||
|
{
|
||||||
|
//TODO(MIAMI)
|
||||||
|
// if ( CWaterCreatures::IsSpaceForMoreWaterCreatures() )
|
||||||
|
{
|
||||||
|
for ( int32 i = 0; i < 3; i++ )
|
||||||
|
{
|
||||||
|
CVector vecPos = cur_pos;
|
||||||
|
|
||||||
|
float fAngle = CGeneral::GetRandomNumberInRange(15.0f, 30.0f);
|
||||||
|
|
||||||
|
uint16 nSinCosIdx = CGeneral::GetRandomNumber() % (CParticle::SIN_COS_TABLE_SIZE-1);
|
||||||
|
|
||||||
|
float fCos = CParticle::Cos(nSinCosIdx);
|
||||||
|
float fSin = CParticle::Sin(nSinCosIdx);
|
||||||
|
|
||||||
|
vecPos.x += (fCos - fSin) * fAngle;
|
||||||
|
vecPos.y += (fSin + fCos) * fAngle;
|
||||||
|
|
||||||
|
//TODO(MIAMI)
|
||||||
|
//CWaterCreatures::CreateOne(vecPos, 0xFFFFFFFF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO(MIAMI)
|
||||||
|
//CWaterCreatures::UpdateAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWaterLevel::HandleBeachToysStuff(void)
|
void
|
||||||
|
CWaterLevel::HandleBeachToysStuff(void)
|
||||||
{
|
{
|
||||||
|
CVector cur_pos = FindPlayerPed()->GetPosition();
|
||||||
|
|
||||||
|
static bool bBeachBallInit = true;
|
||||||
|
static CVector FirstBeachBallPos = cur_pos;
|
||||||
|
static bool bLoungeInit = true;
|
||||||
|
static CVector FirstLoungePos = cur_pos;
|
||||||
|
static CVector prev_pos(0.0f, 0.0f, 0.0f);
|
||||||
|
static int32 timecounter;
|
||||||
|
|
||||||
|
if ( Abs(prev_pos.x - cur_pos.x) + Abs(prev_pos.y - cur_pos.y) + Abs(prev_pos.z - cur_pos.z) > 1.5f )
|
||||||
|
{
|
||||||
|
prev_pos = cur_pos;
|
||||||
|
timecounter = CTimer::GetTimeInMilliseconds();
|
||||||
|
}
|
||||||
|
else if ( (CTimer::GetTimeInMilliseconds() - timecounter) > 5000 )
|
||||||
|
{
|
||||||
|
static int32 toygenTime = CTimer::GetTimeInMilliseconds();
|
||||||
|
|
||||||
|
if ( (CTimer::GetTimeInMilliseconds() - toygenTime) > 20000 )
|
||||||
|
{
|
||||||
|
toygenTime = CTimer::GetTimeInMilliseconds();
|
||||||
|
|
||||||
|
if ( bBeachBallInit || (cur_pos - FirstBeachBallPos).MagnitudeSqr() > 6400.0f )
|
||||||
|
{
|
||||||
|
for ( int32 i = 0; i < 3; i++ )
|
||||||
|
{
|
||||||
|
CVector vecPos = cur_pos;
|
||||||
|
|
||||||
|
float fAngle = CGeneral::GetRandomNumberInRange(20.0f, 35.0f);
|
||||||
|
|
||||||
|
uint16 nSinCosIdx = CGeneral::GetRandomNumber() % (CParticle::SIN_COS_TABLE_SIZE-1);
|
||||||
|
|
||||||
|
float fCos = CParticle::Cos(nSinCosIdx);
|
||||||
|
float fSin = CParticle::Sin(nSinCosIdx);
|
||||||
|
|
||||||
|
vecPos.x += (fCos - fSin) * fAngle;
|
||||||
|
vecPos.y += (fSin + fCos) * fAngle;
|
||||||
|
|
||||||
|
if ( TheCamera.IsSphereVisible(vecPos, 1.0f, &TheCamera.GetCameraMatrix()) )
|
||||||
|
{
|
||||||
|
float fWaterLevel;
|
||||||
|
|
||||||
|
if ( !GetWaterLevel(vecPos.x, vecPos.y, vecPos.z, &fWaterLevel, false) )
|
||||||
|
{
|
||||||
|
float fGroundLevel;
|
||||||
|
ColData coldata;
|
||||||
|
|
||||||
|
if ( GetGroundLevel(vecPos, &fGroundLevel, &coldata, 30.0f) )
|
||||||
|
{
|
||||||
|
if ( coldata.SurfaceType == 18 )
|
||||||
|
{
|
||||||
|
CEntity *toy = CreateBeachToy(vecPos, BEACHTOY_BALL);
|
||||||
|
|
||||||
|
if ( toy )
|
||||||
|
{
|
||||||
|
FirstBeachBallPos = cur_pos;
|
||||||
|
bBeachBallInit = false;
|
||||||
|
i = 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( bLoungeInit || (cur_pos - FirstLoungePos).MagnitudeSqr() > 6400.0f )
|
||||||
|
{
|
||||||
|
for ( int32 i = 0; i < 5; i++ )
|
||||||
|
{
|
||||||
|
CVector vecPos = cur_pos;
|
||||||
|
|
||||||
|
float fAngle = CGeneral::GetRandomNumberInRange(20.0f, 35.0f);
|
||||||
|
|
||||||
|
uint16 nSinCosIdx = CGeneral::GetRandomNumber() % (CParticle::SIN_COS_TABLE_SIZE-1);
|
||||||
|
|
||||||
|
float fCos = CParticle::Cos(nSinCosIdx);
|
||||||
|
float fSin = CParticle::Sin(nSinCosIdx);
|
||||||
|
|
||||||
|
vecPos.x += (fCos - fSin) * fAngle;
|
||||||
|
vecPos.y += (fSin + fCos) * fAngle;
|
||||||
|
|
||||||
|
if ( TheCamera.IsSphereVisible(vecPos, 2.0f, &TheCamera.GetCameraMatrix()) )
|
||||||
|
{
|
||||||
|
float fWaterLevel;
|
||||||
|
|
||||||
|
if ( !GetWaterLevel(vecPos.x, vecPos.y, vecPos.z, &fWaterLevel, false) )
|
||||||
|
{
|
||||||
|
float fGroundLevel;
|
||||||
|
ColData coldata;
|
||||||
|
|
||||||
|
if ( GetGroundLevel(vecPos, &fGroundLevel, &coldata, 30.0f) )
|
||||||
|
{
|
||||||
|
if ( coldata.SurfaceType == 18 )
|
||||||
|
{
|
||||||
|
CEntity *toy = CreateBeachToy(vecPos, BEACHTOY_LOUNGE);
|
||||||
|
if ( toy )
|
||||||
|
{
|
||||||
|
toy->SetHeading(DEGTORAD(CGeneral::GetRandomNumberInRange(0.0f, 359.0f)));
|
||||||
|
FirstLoungePos = cur_pos;
|
||||||
|
bLoungeInit = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CEntity *CWaterLevel::CreateBeachToy(CVector const &vec, eBeachToy beachtoy)
|
CEntity *
|
||||||
|
CWaterLevel::CreateBeachToy(CVector const &vec, eBeachToy beachtoy)
|
||||||
{
|
{
|
||||||
return NULL;
|
//TODO(MIAMI)
|
||||||
|
return nil;
|
||||||
}
|
}
|
Loading…
Reference in a new issue