/* =========================================================================== IceTech GPL Source Code Copyright (C) 2026 Justin Marshall This file is part of the IceTech GPL Source Code (?IceTech Source Code?). IceTech Source Code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. IceTech Source Code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with IceTech Source Code. If not, see . In addition, the IceTech Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the IceTech Source Code. If not, please request a copy in writing from id Software at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing Justin Marshall, justinmarshall20@gmail.com =========================================================================== */ #ifndef __DECLPARTICLE_H__ #define __DECLPARTICLE_H__ /* =============================================================================== idDeclParticle =============================================================================== */ class idParticleParm { public: idParticleParm(void) { table = NULL; from = to = 0.0f; #ifdef PREY randomp = 0.0f; #endif } const idDeclTable* table; float from; float to; #ifdef PREY float randomp; // HUMANHEAD bjk #endif float Eval(float frac, idRandom& rand) const; float Integrate(float frac, idRandom& rand) const; }; typedef enum { PDIST_RECT, // ( sizeX sizeY sizeZ ) PDIST_CYLINDER, // ( sizeX sizeY sizeZ ) PDIST_SPHERE // ( sizeX sizeY sizeZ ringFraction ) // a ringFraction of zero allows the entire sphere, 0.9 would only // allow the outer 10% of the sphere } prtDistribution_t; typedef enum { PDIR_CONE, // parm0 is the solid cone angle PDIR_OUTWARD // direction is relative to offset from origin, parm0 is an upward bias } prtDirection_t; typedef enum { PPATH_STANDARD, PPATH_HELIX, // ( sizeX sizeY sizeZ radialSpeed climbSpeed ) PPATH_FLIES, PPATH_ORBIT, PPATH_DRIP } prtCustomPth_t; typedef enum { POR_VIEW, POR_AIMED, // angle and aspect are disregarded POR_X, POR_Y, POR_Z } prtOrientation_t; typedef struct renderEntity_s renderEntity_t; typedef struct renderView_s renderView_t; typedef struct { const renderEntity_t* renderEnt; // for shaderParms, etc const renderView_t* renderView; int index; // particle number in the system float frac; // 0.0 to 1.0 idRandom random; idVec3 origin; // dynamic smoke particles can have individual origins and axis idMat3 axis; float age; // in seconds, calculated as fraction * stage->particleLife idRandom originalRandom; // needed so aimed particles can reset the random for another origin calculation float animationFrameFrac; // set by ParticleTexCoords, used to make the cross faded version } particleGen_t; // // single particle stage // class idParticleStage { public: idParticleStage(void); virtual ~idParticleStage(void) {} void Default(); virtual int NumQuadsPerParticle() const; // includes trails and cross faded animations // returns the number of verts created, which will range from 0 to 4*NumQuadsPerParticle() virtual int CreateParticle(particleGen_t* g, idDrawVert* verts) const; void ParticleOrigin(particleGen_t* g, idVec3& origin) const; int ParticleVerts(particleGen_t* g, const idVec3 origin, idDrawVert* verts) const; void ParticleTexCoords(particleGen_t* g, idDrawVert* verts) const; void ParticleColors(particleGen_t* g, idDrawVert* verts) const; const char* GetCustomPathName(); const char* GetCustomPathDesc(); int NumCustomPathParms(); void SetCustomPathType(const char* p); void operator=(const idParticleStage& src); //------------------------------ const idMaterial* material; int totalParticles; // total number of particles, although some may be invisible at a given time float cycles; // allows things to oneShot ( 1 cycle ) or run for a set number of cycles // on a per stage basis int cycleMsec; // ( particleLife + deadTime ) in msec float spawnBunching; // 0.0 = all come out at first instant, 1.0 = evenly spaced over cycle time float particleLife; // total seconds of life for each particle float timeOffset; // time offset from system start for the first particle to spawn float deadTime; // time after particleLife before respawning //------------------------------- // standard path parms prtDistribution_t distributionType; float distributionParms[4]; prtDirection_t directionType; float directionParms[4]; idParticleParm speed; float gravity; // can be negative to float up bool worldGravity; // apply gravity in world space bool randomDistribution; // randomly orient the quad on emission ( defaults to true ) bool entityColor; // force color from render entity ( fadeColor is still valid ) //------------------------------ // custom path will completely replace the standard path calculations prtCustomPth_t customPathType; // use custom C code routines for determining the origin float customPathParms[8]; //-------------------------------- idVec3 offset; // offset from origin to spawn all particles, also applies to customPath int animationFrames; // if > 1, subdivide the texture S axis into frames and crossfade float animationRate; // frames per second float initialAngle; // in degrees, random angle is used if zero ( default ) idParticleParm rotationSpeed; // half the particles will have negative rotation speeds prtOrientation_t orientation; // view, aimed, or axis fixed float orientationParms[4]; idParticleParm size; idParticleParm aspect; // greater than 1 makes the T axis longer idVec4 color; idVec4 fadeColor; // either 0 0 0 0 for additive, or 1 1 1 0 for blended materials float fadeInFraction; // in 0.0 to 1.0 range float fadeOutFraction; // in 0.0 to 1.0 range float fadeIndexFraction; // in 0.0 to 1.0 range, causes later index smokes to be more faded bool hidden; // for editor use //----------------------------------- float boundsExpansion; // user tweak to fix poorly calculated bounds idBounds bounds; // derived #ifdef PREY bool lowSkippable; // HUMANHEAD bjk #endif }; // // group of particle stages // class idDeclParticle : public idDecl { public: virtual size_t Size(void) const; virtual const char* DefaultDefinition(void) const; virtual bool Parse(const char* text, const int textLength); virtual void FreeData(void); bool Save(const char* fileName = NULL); idListstages; idBounds bounds; float depthHack; private: bool RebuildTextSource(void); #ifdef PREY void CalcBounds(void); // HUMANHEAD bjk # ifdef PARTICLE_BOUNDS void GetStageBounds(idParticleStage* stage, idDrawVert* particleVerts); # else void GetStageBounds(idParticleStage* stage); # endif #else void GetStageBounds(idParticleStage* stage); #endif idParticleStage* ParseParticleStage(idLexer& src); void ParseParms(idLexer& src, float* parms, int maxParms); void ParseParametric(idLexer& src, idParticleParm* parm); void WriteStage(idFile* f, idParticleStage* stage); void WriteParticleParm(idFile* f, idParticleParm* parm, const char* name); }; #endif /* !__DECLPARTICLE_H__ */