mirror of
https://github.com/dhewm/dhewm3.git
synced 2024-12-11 13:30:59 +00:00
736ec20d4d
Don't include the lazy precompiled.h everywhere, only what's required for the compilation unit. platform.h needs to be included instead to provide all essential defines and types. All includes use the relative path to the neo or the game specific root. Move all idlib related includes from idlib/Lib.h to precompiled.h. precompiled.h still exists for the MFC stuff in tools/. Add some missing header guards.
226 lines
7.9 KiB
C++
226 lines
7.9 KiB
C++
/*
|
|
===========================================================================
|
|
|
|
Doom 3 GPL Source Code
|
|
Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
|
|
|
|
This file is part of the Doom 3 GPL Source Code ("Doom 3 Source Code").
|
|
|
|
Doom 3 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.
|
|
|
|
Doom 3 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 Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
In addition, the Doom 3 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 Doom 3 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 id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
|
|
|
|
===========================================================================
|
|
*/
|
|
|
|
#ifndef __DECLPARTICLE_H__
|
|
#define __DECLPARTICLE_H__
|
|
|
|
#include "idlib/containers/List.h"
|
|
#include "idlib/math/Vector.h"
|
|
#include "idlib/math/Matrix.h"
|
|
#include "idlib/math/Random.h"
|
|
#include "idlib/bv/Bounds.h"
|
|
#include "framework/DeclManager.h"
|
|
#include "framework/DeclTable.h"
|
|
|
|
/*
|
|
===============================================================================
|
|
|
|
idDeclParticle
|
|
|
|
===============================================================================
|
|
*/
|
|
|
|
class idParticleParm {
|
|
public:
|
|
idParticleParm( void ) { table = NULL; from = to = 0.0f; }
|
|
|
|
const idDeclTable * table;
|
|
float from;
|
|
float to;
|
|
|
|
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
|
|
};
|
|
|
|
|
|
//
|
|
// 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 );
|
|
|
|
idList<idParticleStage *>stages;
|
|
idBounds bounds;
|
|
float depthHack;
|
|
|
|
private:
|
|
bool RebuildTextSource( void );
|
|
void GetStageBounds( idParticleStage *stage );
|
|
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__ */
|