summaryrefslogtreecommitdiffstats
path: root/src/render
diff options
context:
space:
mode:
Diffstat (limited to 'src/render')
-rw-r--r--src/render/Particle.cpp4
-rw-r--r--src/render/ParticleMgr.cpp252
-rw-r--r--src/render/ParticleMgr.h206
-rw-r--r--src/render/Sprite.cpp6
-rw-r--r--src/render/Sprite2d.cpp7
5 files changed, 461 insertions, 14 deletions
diff --git a/src/render/Particle.cpp b/src/render/Particle.cpp
index aade3578..18ea4c6c 100644
--- a/src/render/Particle.cpp
+++ b/src/render/Particle.cpp
@@ -1229,7 +1229,9 @@ void CParticle::Update()
moveStep.z = point.point.z;
if ( psystem->m_Type == PARTICLE_DEBRIS2 )
{
- particle->m_vecVelocity *= CVector(0.8f, 0.8f, -0.4f);
+ particle->m_vecVelocity.x *= 0.8f;
+ particle->m_vecVelocity.y *= 0.8f;
+ particle->m_vecVelocity.z *= -0.4f;
if ( particle->m_vecVelocity.z < 0.005f )
particle->m_vecVelocity.z = 0.0f;
}
diff --git a/src/render/ParticleMgr.cpp b/src/render/ParticleMgr.cpp
new file mode 100644
index 00000000..d259c4b4
--- /dev/null
+++ b/src/render/ParticleMgr.cpp
@@ -0,0 +1,252 @@
+#include "common.h"
+#include "patcher.h"
+#include "FileMgr.h"
+#include "ParticleMgr.h"
+
+_TODO("work_buff");
+UInt8 work_buff[55000];
+
+cParticleSystemMgr mod_ParticleSystemManager;
+
+const Char *ParticleFilename = "PARTICLE.CFG";
+
+//cParticleSystemMgr::cParticleSystemMgr()
+void cParticleSystemMgr::ctor()
+{
+ memset(this, 0, sizeof(*this));
+}
+
+void cParticleSystemMgr::Initialise()
+{
+ LoadParticleData();
+
+ for ( Int32 i = 0; i < MAX_PARTICLES; i++ )
+ m_aParticles[i].m_pParticles = NULL;
+}
+
+void cParticleSystemMgr::LoadParticleData()
+{
+ CFileMgr::SetDir("DATA");
+ CFileMgr::LoadFile(ParticleFilename, work_buff, ARRAY_SIZE(work_buff), "r");
+ CFileMgr::SetDir("");
+
+ tParticleSystemData *entry = NULL;
+ Int32 type = PARTICLE_FIRST;
+
+ Char *lineStart = (Char *)work_buff;
+ Char *lineEnd = lineStart + 1;
+
+ Char line[500];
+ Char delims[4];
+
+ while ( true )
+ {
+ ASSERT(lineStart != NULL);
+ ASSERT(lineEnd != NULL);
+
+ while ( *lineEnd != '\n' )
+ ++lineEnd;
+
+ Int32 lineLength = lineEnd - lineStart;
+
+ ASSERT(lineLength < 500);
+
+ strncpy(line, lineStart, lineLength);
+
+ line[lineLength] = '\0';
+
+ if ( !strcmp(line, ";the end") )
+ break;
+
+ if ( *line != ';' )
+ {
+ Int32 param = CFG_PARAM_FIRST;
+
+ strcpy(delims, " \t");
+
+ Char *value = strtok(line, delims);
+
+ ASSERT(value != NULL);
+
+ do
+ {
+ switch ( param )
+ {
+ case CFG_PARAM_PARTICLE_TYPE_NAME:
+ ASSERT(type < MAX_PARTICLES);
+ entry = &m_aParticles[type];
+ ASSERT(entry != NULL);
+ entry->m_Type = (tParticleType)type++;
+ strcpy(entry->m_aName, value);
+ break;
+
+ case CFG_PARAM_RENDER_COLOURING_R:
+ entry->m_RenderColouring.red = atoi(value);
+ break;
+
+ case CFG_PARAM_RENDER_COLOURING_G:
+ entry->m_RenderColouring.green = atoi(value);
+ break;
+
+ case CFG_PARAM_RENDER_COLOURING_B:
+ entry->m_RenderColouring.blue = atoi(value);
+ break;
+
+ case CFG_PARAM_INITIAL_COLOR_VARIATION:
+ entry->m_InitialColorVariation = min(atoi(value), 100);
+ break;
+
+ case CFG_PARAM_FADE_DESTINATION_COLOR_R:
+ entry->m_FadeDestinationColor.red = atoi(value);
+ break;
+
+ case CFG_PARAM_FADE_DESTINATION_COLOR_G:
+ entry->m_FadeDestinationColor.green = atoi(value);
+ break;
+
+ case CFG_PARAM_FADE_DESTINATION_COLOR_B:
+ entry->m_FadeDestinationColor.blue = atoi(value);
+ break;
+
+ case CFG_PARAM_COLOR_FADE_TIME:
+ entry->m_ColorFadeTime = atoi(value);
+ break;
+
+ case CFG_PARAM_DEFAULT_INITIAL_RADIUS:
+ entry->m_fDefaultInitialRadius = atof(value);
+ break;
+
+ case CFG_PARAM_EXPANSION_RATE:
+ entry->m_fExpansionRate = atof(value);
+ break;
+
+ case CFG_PARAM_INITIAL_INTENSITY:
+ entry->m_nFadeToBlackInitialIntensity = atoi(value);
+ break;
+
+ case CFG_PARAM_FADE_TIME:
+ entry->m_nFadeToBlackTime = atoi(value);
+ break;
+
+ case CFG_PARAM_FADE_AMOUNT:
+ entry->m_nFadeToBlackAmount = atoi(value);
+ break;
+
+ case CFG_PARAM_INITIAL_ALPHA_INTENSITY:
+ entry->m_nFadeAlphaInitialIntensity = atoi(value);
+ break;
+
+ case CFG_PARAM_FADE_ALPHA_TIME:
+ entry->m_nFadeAlphaTime = atoi(value);
+ break;
+
+ case CFG_PARAM_FADE_ALPHA_AMOUNT:
+ entry->m_nFadeAlphaAmount = atoi(value);
+ break;
+
+ case CFG_PARAM_INITIAL_ANGLE:
+ entry->m_nZRotationInitialAngle = atoi(value);
+ break;
+
+ case CFG_PARAM_CHANGE_TIME:
+ entry->m_nZRotationChangeTime = atoi(value);
+ break;
+
+ case CFG_PARAM_ANGLE_CHANGE_AMOUNT:
+ entry->m_nZRotationAngleChangeAmount = atoi(value);
+ break;
+
+ case CFG_PARAM_INITIAL_Z_RADIUS:
+ entry->m_fInitialZRadius = atof(value);
+ break;
+
+ case CFG_PARAM_Z_RADIUS_CHANGE_TIME:
+ entry->m_nZRadiusChangeTime = atoi(value);
+ break;
+
+ case CFG_PARAM_Z_RADIUS_CHANGE_AMOUNT:
+ entry->m_fZRadiusChangeAmount = atof(value);
+ break;
+
+ case CFG_PARAM_ANIMATION_SPEED:
+ entry->m_nAnimationSpeed = atoi(value);
+ break;
+
+ case CFG_PARAM_START_ANIMATION_FRAME:
+ entry->m_nStartAnimationFrame = atoi(value);
+ break;
+
+ case CFG_PARAM_FINAL_ANIMATION_FRAME:
+ entry->m_nFinalAnimationFrame = atoi(value);
+ break;
+
+ case CFG_PARAM_ROTATION_SPEED:
+ entry->m_nRotationSpeed = atoi(value);
+ break;
+
+ case CFG_PARAM_GRAVITATIONAL_ACCELERATION:
+ entry->m_fGravitationalAcceleration = atof(value);
+ break;
+
+ case CFG_PARAM_FRICTION_DECCELERATION:
+ entry->m_nFrictionDecceleration = atoi(value);
+ break;
+
+ case CFG_PARAM_LIFE_SPAN:
+ entry->m_nLifeSpan = atoi(value);
+ break;
+
+ case CFG_PARAM_POSITION_RANDOM_ERROR:
+ entry->m_fPositionRandomError = atof(value);
+ break;
+
+ case CFG_PARAM_VELOCITY_RANDOM_ERROR:
+ entry->m_fVelocityRandomError = atof(value);
+ break;
+
+ case CFG_PARAM_EXPANSION_RATE_ERROR:
+ entry->m_fExpansionRateError = atof(value);
+ break;
+
+ case CFG_PARAM_ROTATION_RATE_ERROR:
+ entry->m_nRotationRateError = atoi(value);
+ break;
+
+ case CFG_PARAM_LIFE_SPAN_ERROR_SHAPE:
+ entry->m_nLifeSpanErrorShape = atoi(value);
+ break;
+
+ case CFG_PARAM_TRAIL_LENGTH_MULTIPLIER:
+ entry->m_fTrailLengthMultiplier = atof(value);
+ break;
+
+ case CFG_PARAM_PARTICLE_CREATE_RANGE:
+ entry->m_fCreateRange = SQR(atof(value));
+ break;
+
+ case CFG_PARAM_FLAGS:
+ entry->Flags = atoi(value);
+ break;
+ }
+
+ value = strtok(NULL, delims);
+
+ param++;
+
+ if ( param > CFG_PARAM_LAST )
+ param = CFG_PARAM_FIRST;
+
+ } while ( value != NULL );
+ }
+
+ lineEnd++;
+ lineStart = lineEnd;
+ lineEnd++;
+ }
+}
+
+STARTPATCHES
+ InjectHook(0x50FCB0, &cParticleSystemMgr::ctor, PATCH_JUMP);
+ InjectHook(0x50FCD0, &cParticleSystemMgr::Initialise, PATCH_JUMP);
+ InjectHook(0x50FDF0, &cParticleSystemMgr::LoadParticleData, PATCH_JUMP);
+ENDPATCHES \ No newline at end of file
diff --git a/src/render/ParticleMgr.h b/src/render/ParticleMgr.h
new file mode 100644
index 00000000..a2dcbdb5
--- /dev/null
+++ b/src/render/ParticleMgr.h
@@ -0,0 +1,206 @@
+#pragma once
+
+class CParticle;
+
+enum tParticleType
+{
+ PARTICLE_SPARK = 0,
+ PARTICLE_SPARK_SMALL,
+ PARTICLE_WHEEL_DIRT,
+ PARTICLE_WHEEL_WATER,
+ PARTICLE_BLOOD,
+ PARTICLE_BLOOD_SMALL,
+ PARTICLE_BLOOD_SPURT,
+ PARTICLE_DEBRIS,
+ PARTICLE_DEBRIS2,
+ PARTICLE_WATER,
+ PARTICLE_FLAME,
+ PARTICLE_FIREBALL,
+ PARTICLE_GUNFLASH,
+ PARTICLE_GUNFLASH_NOANIM,
+ PARTICLE_GUNSMOKE,
+ PARTICLE_GUNSMOKE2,
+ PARTICLE_SMOKE,
+ PARTICLE_SMOKE_SLOWMOTION,
+ PARTICLE_GARAGEPAINT_SPRAY,
+ PARTICLE_SHARD,
+ PARTICLE_SPLASH,
+ PARTICLE_CARFLAME,
+ PARTICLE_STEAM,
+ PARTICLE_STEAM2,
+ PARTICLE_STEAM_NY,
+ PARTICLE_STEAM_NY_SLOWMOTION,
+ PARTICLE_ENGINE_STEAM,
+ PARTICLE_RAINDROP,
+ PARTICLE_RAINDROP_SMALL,
+ PARTICLE_RAIN_SPLASH,
+ PARTICLE_RAIN_SPLASH_BIGGROW,
+ PARTICLE_RAIN_SPLASHUP,
+ PARTICLE_WATERSPRAY,
+ PARTICLE_EXPLOSION_MEDIUM,
+ PARTICLE_EXPLOSION_LARGE,
+ PARTICLE_EXPLOSION_MFAST,
+ PARTICLE_EXPLOSION_LFAST,
+ PARTICLE_CAR_SPLASH,
+ PARTICLE_BOAT_SPLASH,
+ PARTICLE_BOAT_THRUSTJET,
+ PARTICLE_BOAT_WAKE,
+ PARTICLE_WATER_HYDRANT,
+ PARTICLE_WATER_CANNON,
+ PARTICLE_EXTINGUISH_STEAM,
+ PARTICLE_PED_SPLASH,
+ PARTICLE_PEDFOOT_DUST,
+ PARTICLE_HELI_DUST,
+ PARTICLE_HELI_ATTACK,
+ PARTICLE_ENGINE_SMOKE,
+ PARTICLE_ENGINE_SMOKE2,
+ PARTICLE_CARFLAME_SMOKE,
+ PARTICLE_FIREBALL_SMOKE,
+ PARTICLE_PAINT_SMOKE,
+ PARTICLE_TREE_LEAVES,
+ PARTICLE_CARCOLLISION_DUST,
+ PARTICLE_CAR_DEBRIS,
+ PARTICLE_HELI_DEBRIS,
+ PARTICLE_EXHAUST_FUMES,
+ PARTICLE_RUBBER_SMOKE,
+ PARTICLE_BURNINGRUBBER_SMOKE,
+ PARTICLE_BULLETHIT_SMOKE,
+ PARTICLE_GUNSHELL_FIRST,
+ PARTICLE_GUNSHELL,
+ PARTICLE_GUNSHELL_BUMP1,
+ PARTICLE_GUNSHELL_BUMP2,
+ PARTICLE_TEST,
+ PARTICLE_BIRD_FRONT,
+ PARTICLE_RAINDROP_2D,
+
+ MAX_PARTICLES,
+ PARTICLE_FIRST = PARTICLE_SPARK,
+ PARTICLE_LAST = PARTICLE_RAINDROP_2D
+};
+
+enum
+{
+ ZCHECK_FIRST = BIT(0),
+ ZCHECK_STEP = BIT(1),
+ DRAW_OPAQUE = BIT(2),
+ SCREEN_TRAIL = BIT(3),
+ SPEED_TRAIL = BIT(4),
+ RAND_VERT_V = BIT(5),
+ CYCLE_ANIM = BIT(6),
+ DRAW_DARK = BIT(7),
+ VERT_TRAIL = BIT(8),
+ _FLAG9 = BIT(9), // unused
+ DRAWTOP2D = BIT(10),
+ CLIPOUT2D = BIT(11),
+ ZCHECK_BUMP = BIT(12),
+ ZCHECK_BUMP_FIRST = BIT(13)
+};
+
+
+struct tParticleSystemData
+{
+ tParticleType m_Type;
+ Char m_aName[20];
+ Float m_fCreateRange;
+ Float m_fDefaultInitialRadius;
+ Float m_fExpansionRate;
+ UInt16 m_nZRotationInitialAngle;
+ Int16 m_nZRotationAngleChangeAmount;
+ UInt16 m_nZRotationChangeTime;
+ UInt16 m_nZRadiusChangeTime;
+ Float m_fInitialZRadius;
+ Float m_fZRadiusChangeAmount;
+ UInt16 m_nFadeToBlackTime;
+ Int16 m_nFadeToBlackAmount;
+ UInt8 m_nFadeToBlackInitialIntensity;
+ UInt8 m_nFadeAlphaInitialIntensity;
+ UInt16 m_nFadeAlphaTime;
+ Int16 m_nFadeAlphaAmount;
+ UInt16 m_nStartAnimationFrame;
+ UInt16 m_nFinalAnimationFrame;
+ UInt16 m_nAnimationSpeed;
+ UInt16 m_nRotationSpeed;
+ char _pad1[2];
+ Float m_fGravitationalAcceleration;
+ Int32 m_nFrictionDecceleration;
+ Int32 m_nLifeSpan;
+ Float m_fPositionRandomError;
+ Float m_fVelocityRandomError;
+ Float m_fExpansionRateError;
+ Int32 m_nRotationRateError;
+ UInt32 m_nLifeSpanErrorShape;
+ Float m_fTrailLengthMultiplier;
+ UInt32 Flags;
+ RwRGBA m_RenderColouring;
+ UInt8 m_InitialColorVariation;
+ RwRGBA m_FadeDestinationColor;
+ char _pad2[3];
+ UInt32 m_ColorFadeTime;
+
+ RwRaster **m_ppRaster;
+ CParticle *m_pParticles;
+};
+VALIDATE_SIZE(tParticleSystemData, 0x88);
+
+
+class cParticleSystemMgr
+{
+ enum
+ {
+ CFG_PARAM_PARTICLE_TYPE_NAME = 0,
+ CFG_PARAM_RENDER_COLOURING_R,
+ CFG_PARAM_RENDER_COLOURING_G,
+ CFG_PARAM_RENDER_COLOURING_B,
+ CFG_PARAM_INITIAL_COLOR_VARIATION,
+ CFG_PARAM_FADE_DESTINATION_COLOR_R,
+ CFG_PARAM_FADE_DESTINATION_COLOR_G,
+ CFG_PARAM_FADE_DESTINATION_COLOR_B,
+ CFG_PARAM_COLOR_FADE_TIME,
+ CFG_PARAM_DEFAULT_INITIAL_RADIUS,
+ CFG_PARAM_EXPANSION_RATE,
+ CFG_PARAM_INITIAL_INTENSITY,
+ CFG_PARAM_FADE_TIME,
+ CFG_PARAM_FADE_AMOUNT,
+ CFG_PARAM_INITIAL_ALPHA_INTENSITY,
+ CFG_PARAM_FADE_ALPHA_TIME,
+ CFG_PARAM_FADE_ALPHA_AMOUNT,
+ CFG_PARAM_INITIAL_ANGLE,
+ CFG_PARAM_CHANGE_TIME,
+ CFG_PARAM_ANGLE_CHANGE_AMOUNT,
+ CFG_PARAM_INITIAL_Z_RADIUS,
+ CFG_PARAM_Z_RADIUS_CHANGE_TIME,
+ CFG_PARAM_Z_RADIUS_CHANGE_AMOUNT,
+ CFG_PARAM_ANIMATION_SPEED,
+ CFG_PARAM_START_ANIMATION_FRAME,
+ CFG_PARAM_FINAL_ANIMATION_FRAME,
+ CFG_PARAM_ROTATION_SPEED,
+ CFG_PARAM_GRAVITATIONAL_ACCELERATION,
+ CFG_PARAM_FRICTION_DECCELERATION,
+ CFG_PARAM_LIFE_SPAN,
+ CFG_PARAM_POSITION_RANDOM_ERROR,
+ CFG_PARAM_VELOCITY_RANDOM_ERROR,
+ CFG_PARAM_EXPANSION_RATE_ERROR,
+ CFG_PARAM_ROTATION_RATE_ERROR,
+ CFG_PARAM_LIFE_SPAN_ERROR_SHAPE,
+ CFG_PARAM_TRAIL_LENGTH_MULTIPLIER,
+ CFG_PARAM_PARTICLE_CREATE_RANGE,
+ CFG_PARAM_FLAGS,
+
+ MAX_CFG_PARAMS,
+ CFG_PARAM_FIRST = CFG_PARAM_PARTICLE_TYPE_NAME,
+ CFG_PARAM_LAST = CFG_PARAM_FLAGS
+ };
+
+public:
+ tParticleSystemData m_aParticles[MAX_PARTICLES];
+
+ cParticleSystemMgr() { ctor(); } void ctor();
+
+ void Initialise();
+ void LoadParticleData();
+ //void RangeCheck(tParticleSystemData *pData);
+};
+
+VALIDATE_SIZE(cParticleSystemMgr, 0x2420);
+
+extern cParticleSystemMgr mod_ParticleSystemManager; \ No newline at end of file
diff --git a/src/render/Sprite.cpp b/src/render/Sprite.cpp
index 509564ac..900b4dba 100644
--- a/src/render/Sprite.cpp
+++ b/src/render/Sprite.cpp
@@ -4,12 +4,6 @@
#include "Camera.h"
#include "Sprite.h"
-// Get rid of bullshit windows definitions, we're not running on an 8086
-#ifdef far
-#undef far
-#undef near
-#endif
-
float &CSprite::m_f2DNearScreenZ = *(float*)0x8F1ABC;
float &CSprite::m_f2DFarScreenZ = *(float*)0x8F2C94;
float &CSprite::m_fRecipNearClipPlane = *(float*)0x8F5FFC;
diff --git a/src/render/Sprite2d.cpp b/src/render/Sprite2d.cpp
index 2311a75e..ff6cd0db 100644
--- a/src/render/Sprite2d.cpp
+++ b/src/render/Sprite2d.cpp
@@ -4,12 +4,6 @@
#include "Camera.h"
#include "Sprite2d.h"
-// Get rid of bullshit windows definitions, we're not running on an 8086
-#ifdef far
-#undef far
-#undef near
-#endif
-
RwIm2DVertex *CSprite2d::maVertices = (RwIm2DVertex*)0x6E9168;
float &CSprite2d::RecipNearClip = *(float*)0x880DB4;
int32 &CSprite2d::mCurrentBank = *(int32*)0x8F1AF4;
@@ -18,7 +12,6 @@ int32 *CSprite2d::mCurrentSprite = (int32*)0x6F4500;
int32 *CSprite2d::mBankStart = (int32*)0x774BE8;
RwIm2DVertex *CSprite2d::maBankVertices = (RwIm2DVertex*)0x8429F8;
-
void
CSprite2d::SetRecipNearClip(void)
{