Files
RP412/MUNGA_L4/L4PARTICLES.h
T
CydandClaude Opus 4.8 4abbf8879f Initial import of Red Planet v4.10 Win32 source
Imports the current Win32 source for the pod-racing game 'Red Planet',
built on the MUNGA engine and its L4 (Win32/DirectX) platform layer:

- MUNGA / MUNGA_L4: cross-platform engine core and Win32 backend
- RP / RP_L4: Red Planet game logic and Win32 application
- DivLoader, Setup1: asset loader and installer project
- lib, MUNGA_L4/openal, MUNGA_L4/sos: third-party audio dependencies

Removed stale Subversion metadata and added .gitignore/.gitattributes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 07:59:51 -05:00

159 lines
3.1 KiB
C++

#pragma once
#include <memory.h>
#include <d3d9.h>
#include <d3dx9.h>
#include "../munga/time.h"
#include "l4d3d.h"
#define COLOR_POINT_COUNT 10
#define MAX_PARTICLE_EFFECTS 32
#define EFFECT_GROUPING_EPSILON 1.0f
#define L4BASICVERTEX_FVF (D3DFVF_XYZ | D3DFVF_TEX1 | D3DFVF_DIFFUSE | D3DFVF_NORMAL)
struct L4BASICVERTEX
{
float x, y, z;
float nx, ny, nz;
DWORD color;
float u, v;
};
union L4COLOR
{
DWORD argb;
struct
{
unsigned char b;
unsigned char g;
unsigned char r;
unsigned char a;
};
};
struct COLOR_POINT
{
bool active;
Scalar time;
L4COLOR color;
};
struct PARTICLE_EFFECT
{
int id;
struct
{
float left, top, right, bottom;
} textureBounds;
bool rotate;
float fragSize;
float velocity;
COLOR_POINT colors[COLOR_POINT_COUNT];
float gravity;
float varianceX;
float varianceY;
float varianceZ;
int fragCount;
float fragLifetime;
float maxRepeat;
};
struct INDIE_EFFECT : public PARTICLE_EFFECT
{
int maxIssue;
float releasePeriod;
float duration;
};
class ParticleEngine;
class ParticleEmitter;
class Particle
{
friend class ParticleEngine;
public:
Particle(PARTICLE_EFFECT *effect);
void Execute(Scalar dT);
inline bool IsAlive() { return (mEffect && ( mAge < mEffect->fragLifetime)); }
inline Particle *Next() { return mNextParticle; }
inline Particle *Prev() { return mPrevParticle; }
private:
float mX, mY, mZ;
L4COLOR mColor;
D3DXVECTOR3 mVelocity;
D3DXVECTOR3 mAcceleration;
D3DXMATRIX mTextureTransform;
PARTICLE_EFFECT *mEffect;
Scalar mAge;
Particle *mNextParticle;
Particle *mPrevParticle;
friend int compare(const Particle *, const Particle *, const D3DXMATRIX *);
friend void mergesort(Particle **, Particle **, const D3DXMATRIX *);
};
class ParticleEmitter
{
public:
ParticleEmitter();
bool IsActive() { return mActive; }
void SetEffect(int effect);
void SetEffect(INDIE_EFFECT *effect) { mEffect = effect; }
float GetMaxRepeat() { return mEffect->maxRepeat; }
void Execute();
void Fire() { mActive = true; }
void Start()
{
mActive = true;
mActivated = (Scalar)Now();
}
void SetPosition(float x, float y, float z)
{
mPosition.x = x;
mPosition.y = y;
mPosition.z = z;
}
private:
PARTICLE_EFFECT *mEffect;
bool mActive;
Scalar mActivated;
D3DXVECTOR3 mPosition;
};
class ParticleEngine
{
friend class ParticleEmitter;
public:
static void Destroy();
static void Initialize(LPDIRECT3DDEVICE9 device);
static void InstallEffect(int effectNumber, PARTICLE_EFFECT effect);
static void RenderParticles(const D3DXMATRIX *view_matrix, Scalar timeSlice);
private:
static void CreateParticle(D3DXVECTOR3 position, PARTICLE_EFFECT *effect);
static int BuildParticleVertices(const Particle *p, L4BASICVERTEX *verts, D3DXMATRIX *view_matrix);
static void ExecuteParticles(const D3DXMATRIX *view_matrix, Scalar timeSlice);
static LPDIRECT3DDEVICE9 mDevice;
static PARTICLE_EFFECT mInstalledEffects[];
static LPDIRECT3DTEXTURE9 mParticleTexture;
static bool mActiveParticles;
static LPDIRECT3DVERTEXBUFFER9 mVertBuffer;
static Particle *mParticlesHead;
static Particle *mParticlesTail;
static long mTotalParticleCount;
static long mMaxParticleCount;
};