You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
5.5 KiB
166 lines
5.5 KiB
5 years ago
|
//========= 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
|