source-engine/public/movieobjects/dmeparticlesystemdefinition.h

166 lines
5.5 KiB
C
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: A particle system definition
//
//=============================================================================
#ifndef DMEPARTICLESYSTEMDEFINITION_H
#define DMEPARTICLESYSTEMDEFINITION_H
#ifdef _WIN32
#pragma once
#endif
#include "datamodel/dmelement.h"
#include "datamodel/dmattribute.h"
#include "datamodel/dmattributevar.h"
#include "datamodel/dmehandle.h"
#include "particles/particles.h"
//-----------------------------------------------------------------------------
// Forward declarations
//-----------------------------------------------------------------------------
class CDmeEditorTypeDictionary;
class CDmeParticleSystemDefinition;
//-----------------------------------------------------------------------------
// Base class for particle functions inside a particle system definition
//-----------------------------------------------------------------------------
class CDmeParticleFunction : public CDmElement
{
DEFINE_ELEMENT( CDmeParticleFunction, CDmElement );
public:
virtual const char *GetFunctionType() const { return NULL; }
virtual void Resolve();
virtual void OnElementUnserialized();
// Used for backward compat
void AddMissingFields( const DmxElementUnpackStructure_t *pUnpack );
// Returns the editor type dictionary
CDmeEditorTypeDictionary* GetEditorTypeDictionary();
// Marks a particle system as a new instance
// This is basically a workaround to prevent newly-copied particle functions
// from recompiling themselves a zillion times
void MarkNewInstance();
protected:
void UpdateAttributes( const DmxElementUnpackStructure_t *pUnpack );
private:
// Defines widgets to edit this bad boy
CDmeHandle< CDmeEditorTypeDictionary > m_hTypeDictionary;
bool m_bSkipNextResolve;
};
//-----------------------------------------------------------------------------
// Something that updates particles
//-----------------------------------------------------------------------------
class CDmeParticleOperator : public CDmeParticleFunction
{
DEFINE_ELEMENT( CDmeParticleOperator, CDmeParticleFunction );
public:
// Sets the particle operator
void SetFunction( IParticleOperatorDefinition *pDefinition );
// Returns the function type
virtual const char *GetFunctionType() const;
private:
CDmaString m_FunctionName;
};
//-----------------------------------------------------------------------------
// A child of a particle system
//-----------------------------------------------------------------------------
class CDmeParticleChild : public CDmeParticleFunction
{
DEFINE_ELEMENT( CDmeParticleChild, CDmeParticleFunction );
public:
// Sets the particle operator
void SetChildParticleSystem( CDmeParticleSystemDefinition *pDef, IParticleOperatorDefinition *pDefinition );
// Returns the function type
virtual const char *GetFunctionType() const;
CDmaElement< CDmeParticleSystemDefinition > m_Child;
};
//-----------------------------------------------------------------------------
// Represents an editable entity; draws its helpers
//-----------------------------------------------------------------------------
class CDmeParticleSystemDefinition : public CDmElement
{
DEFINE_ELEMENT( CDmeParticleSystemDefinition, CDmElement );
public:
virtual void OnElementUnserialized();
virtual void Resolve();
// Add, remove
CDmeParticleFunction* AddOperator( ParticleFunctionType_t type, const char *pFunctionName );
CDmeParticleFunction* AddChild( CDmeParticleSystemDefinition *pChild );
void RemoveFunction( ParticleFunctionType_t type, CDmeParticleFunction *pParticleFunction );
void RemoveFunction( ParticleFunctionType_t type, int nIndex );
// Find
int FindFunction( ParticleFunctionType_t type, CDmeParticleFunction *pParticleFunction );
int FindFunction( ParticleFunctionType_t type, const char *pFunctionName );
// Iteration
int GetParticleFunctionCount( ParticleFunctionType_t type ) const;
CDmeParticleFunction *GetParticleFunction( ParticleFunctionType_t type, int nIndex );
// Reordering
void MoveFunctionUp( ParticleFunctionType_t type, CDmeParticleFunction *pElement );
void MoveFunctionDown( ParticleFunctionType_t type, CDmeParticleFunction *pElement );
// Returns the editor type dictionary
CDmeEditorTypeDictionary* GetEditorTypeDictionary();
// Recompiles the particle system when a change occurs
void RecompileParticleSystem();
// Marks a particle system as a new instance
// This is basically a workaround to prevent newly-copied particle functions
// from recompiling themselves a zillion times
void MarkNewInstance();
// Should we use name-based lookup?
bool UseNameBasedLookup() const;
private:
CDmaElementArray< CDmeParticleFunction > m_ParticleFunction[PARTICLE_FUNCTION_COUNT];
CDmaVar< bool > m_bPreventNameBasedLookup;
// Defines widgets to edit this bad boy
CDmeHandle< CDmeEditorTypeDictionary > m_hTypeDictionary;
};
//-----------------------------------------------------------------------------
// Should we use name-based lookup?
//-----------------------------------------------------------------------------
inline bool CDmeParticleSystemDefinition::UseNameBasedLookup() const
{
return !m_bPreventNameBasedLookup;
}
//-----------------------------------------------------------------------------
// Human readable string for the particle functions
//-----------------------------------------------------------------------------
const char *GetParticleFunctionTypeName( ParticleFunctionType_t type );
#endif // DMEPARTICLESYSTEMDEFINITION_H