Seaside/SpyCustom/sdk/particles_new.h
2021-06-16 18:48:15 +03:00

295 lines
7.8 KiB
C++

#ifndef PARTICLES_NEW_H
#define PARTICLES_NEW_H
#ifdef _WIN32
#pragma once
#endif
#include "particlemgr.h"
#include "particles.h"
#include "particlesphererenderer.h"
#include "smartptr.h"
#include "particles_simple.h"
#include "utlobjectreference.h"
class CNewParticleEffect : public IParticleEffect, public CParticleCollection, public CDefaultClientRenderable
{
public:
DECLARE_CLASS_NOBASE(CNewParticleEffect);
DECLARE_REFERENCED_CLASS(CNewParticleEffect);
public:
friend class CRefCountAccessor;
CNewParticleEffect* m_pNext;
CNewParticleEffect* m_pPrev;
void SetSortOrigin(const Vector& vSortOrigin);
bool ShouldDraw(void);
virtual bool IsTransparent(void);
virtual bool IsTwoPass(void);
virtual bool UsesPowerOfTwoFrameBufferTexture(void);
virtual bool UsesFullFrameBufferTexture(void);
const QAngle& GetRenderAngles(void);
const matrix3x4_t& RenderableToWorldTransform();
void GetRenderBounds(Vector& mins, Vector& maxs);
void DetectChanges(void);
const Vector& GetRenderOrigin(void);
PMaterialHandle GetPMaterial(const char* name);
bool RecalculateBoundingBox();
Particle* AddParticle(unsigned int particleSize, PMaterialHandle material, const Vector& origin);
const char* GetEffectName();
void SetDontRemove(bool bSet);
void SetDrawn(bool bDrawn);
void SetFirstFrameFlag(bool bFirst);
void SetNeedsBBoxUpdate(bool bNeedsUpdate);
void SetAutoUpdateBBox(bool bNeedsUpdate);
void SetRemoveFlag(void);
bool GetRemoveFlag(void);
bool GetFirstFrameFlag(void);
bool GetNeedsBBoxUpdate(void);
bool GetAutoUpdateBBox(void);
bool ShouldPerformCullCheck() const;
void MarkShouldPerformCullCheck(bool bEnable);
CBaseEntity* GetOwner(void) { return m_hOwner; }
void SetOwner(CBaseEntity* pOwner) { m_hOwner = pOwner; }
CNewParticleEffect* ReplaceWith(const char* pParticleSystemName);
static CSmartPtr<CNewParticleEffect> Create(CBaseEntity* pOwner, const char* pParticleSystemName,
const char* pDebugName = NULL);
static CSmartPtr<CNewParticleEffect> Create(CBaseEntity* pOwner, CParticleSystemDefinition* pDef,
const char* pDebugName = NULL);
virtual int DrawModel(int flags);
void DebugDrawBbox(bool bCulled);
public:
void StopEmission(bool bInfiniteOnly = false, bool bRemoveAllParticles = false, bool bWakeOnStop = false);
void SetDormant(bool bDormant);
void SetControlPoint(int nWhichPoint, const Vector& v);
void SetControlPointEntity(int nWhichPoint, CBaseEntity* pEntity);
void SetControlPointOrientation(int nWhichPoint, const Quaternion& q);
void SetControlPointOrientation(int nWhichPoint, const Vector& forward, const Vector& right, const Vector& up);
void SetControlPointForwardVector(int nWhichPoint, const Vector& v);
void SetControlPointUpVector(int nWhichPoint, const Vector& v);
void SetControlPointRightVector(int nWhichPoint, const Vector& v);
FORCEINLINE EHANDLE const& GetControlPointEntity(int nWhichPoint)
{
return m_hControlPointOwners[nWhichPoint];
}
public:
virtual void SimulateParticles(CParticleSimulateIterator* pIterator)
{
}
virtual void RenderParticles(CParticleRenderIterator* pIterator)
{
}
virtual void SetParticleCullRadius(float radius);
virtual void NotifyRemove(void);
virtual const Vector& GetSortOrigin(void);
virtual void Update(float flTimeDelta);
void SetDynamicallyAllocated(bool bDynamic = true);
virtual bool ShouldSimulate() const { return m_bSimulate; }
virtual void SetShouldSimulate(bool bSim) { m_bSimulate = bSim; }
int AllocateToolParticleEffectId();
int GetToolParticleEffectId() const;
CNewParticleEffect(CBaseEntity* pOwner, const char* pEffectName);
CNewParticleEffect(CBaseEntity* pOwner, CParticleSystemDefinition* pEffect);
virtual ~CNewParticleEffect();
protected:
int IsReleased();
const char* m_pDebugName;
bool m_bDontRemove : 1;
bool m_bRemove : 1;
bool m_bDrawn : 1;
bool m_bNeedsBBoxUpdate : 1;
bool m_bIsFirstFrame : 1;
bool m_bAutoUpdateBBox : 1;
bool m_bAllocated : 1;
bool m_bSimulate : 1;
bool m_bShouldPerformCullCheck : 1;
int m_nToolParticleEffectId;
Vector m_vSortOrigin;
EHANDLE m_hOwner;
EHANDLE m_hControlPointOwners[MAX_PARTICLE_CONTROL_POINTS];
Vector m_LastMin;
Vector m_LastMax;
private:
void AddRef();
void Release();
void RecordControlPointOrientation(int nWhichPoint);
void Construct();
int m_RefCount;
CNewParticleEffect(const CNewParticleEffect&);
};
inline int CNewParticleEffect::GetToolParticleEffectId() const
{
return m_nToolParticleEffectId;
}
inline int CNewParticleEffect::AllocateToolParticleEffectId()
{
m_nToolParticleEffectId = ParticleMgr()->AllocateToolParticleEffectId();
return m_nToolParticleEffectId;
}
inline void CNewParticleEffect::SetSortOrigin(const Vector& vSortOrigin)
{
m_vSortOrigin = vSortOrigin;
}
inline const Vector& CNewParticleEffect::GetSortOrigin(void)
{
return m_vSortOrigin;
}
inline bool CNewParticleEffect::ShouldDraw(void)
{
return true;
}
inline bool CNewParticleEffect::IsTransparent(void)
{
return CParticleCollection::IsTranslucent();
}
inline const QAngle& CNewParticleEffect::GetRenderAngles(void)
{
return vec3_angle;
}
inline const matrix3x4_t& CNewParticleEffect::RenderableToWorldTransform()
{
static matrix3x4_t mat;
SetIdentityMatrix(mat);
PositionMatrix(GetRenderOrigin(), mat);
return mat;
}
inline Vector const& CNewParticleEffect::GetRenderOrigin(void)
{
return m_vSortOrigin;
}
inline PMaterialHandle CNewParticleEffect::GetPMaterial(const char* name)
{
Assert(0);
return NULL;
}
inline Particle* CNewParticleEffect::AddParticle(unsigned int particleSize, PMaterialHandle material, const Vector& origin)
{
Assert(0);
return NULL;
}
inline const char* CNewParticleEffect::GetEffectName()
{
return GetName();
}
inline void CNewParticleEffect::SetDontRemove(bool bSet)
{
m_bDontRemove = bSet;
}
inline void CNewParticleEffect::SetDrawn(bool bDrawn)
{
m_bDrawn = bDrawn;
}
inline void CNewParticleEffect::SetFirstFrameFlag(bool bFirst)
{
m_bIsFirstFrame = bFirst;
}
inline void CNewParticleEffect::SetDynamicallyAllocated(bool bDynamic)
{
m_bAllocated = bDynamic;
}
inline void CNewParticleEffect::SetNeedsBBoxUpdate(bool bNeedsUpdate)
{
m_bNeedsBBoxUpdate = bNeedsUpdate;
}
inline void CNewParticleEffect::SetAutoUpdateBBox(bool bNeedsUpdate)
{
m_bAutoUpdateBBox = bNeedsUpdate;
}
inline void CNewParticleEffect::SetRemoveFlag(void)
{
m_bRemove = true;
}
inline bool CNewParticleEffect::GetRemoveFlag(void)
{
return m_bRemove;
}
inline bool CNewParticleEffect::GetFirstFrameFlag(void)
{
return m_bIsFirstFrame;
}
inline bool CNewParticleEffect::GetNeedsBBoxUpdate(void)
{
return m_bNeedsBBoxUpdate;
}
inline bool CNewParticleEffect::GetAutoUpdateBBox(void)
{
return m_bAutoUpdateBBox;
}
inline bool CNewParticleEffect::ShouldPerformCullCheck() const
{
return m_bShouldPerformCullCheck;
}
inline void CNewParticleEffect::MarkShouldPerformCullCheck(bool bEnable)
{
m_bShouldPerformCullCheck = bEnable;
}
inline CSmartPtr<CNewParticleEffect> CNewParticleEffect::Create(CBaseEntity* pOwner, const char* pParticleSystemName, const char* pDebugName)
{
CNewParticleEffect* pRet = new CNewParticleEffect(pOwner, pParticleSystemName);
pRet->m_pDebugName = pDebugName;
pRet->SetDynamicallyAllocated(true);
return pRet;
}
inline CSmartPtr<CNewParticleEffect> CNewParticleEffect::Create(CBaseEntity* pOwner, CParticleSystemDefinition* pDef, const char* pDebugName)
{
CNewParticleEffect* pRet = new CNewParticleEffect(pOwner, pDef);
pRet->m_pDebugName = pDebugName;
pRet->SetDynamicallyAllocated(true);
return pRet;
}
typedef CUtlReference<CNewParticleEffect> HPARTICLEFFECT;
#endif