#pragma once
#include <d3dx9.h>
#include <vector>
#include <memory>
class CEffectData;
class CEffectInstance;
enum class EEffectCommandType
{
CREATE_EFFECT,
DESTROY_EFFECT,
UPDATE_EFFECT_POSITION,
UPDATE_EFFECT_ROTATION,
UPDATE_EFFECT_MATRIX,
SHOW_EFFECT,
HIDE_EFFECT,
UPDATE_EFFECTS,
RENDER_EFFECTS,
UPDATE_SOUND_EFFECTS,
SET_EFFECT_TEXTURES
};
struct SEffectCommandData
{
EEffectCommandType type;
DWORD instanceIndex;
DWORD effectID;
D3DXVECTOR3 position;
D3DXVECTOR3 rotation;
D3DXMATRIX matrix;
std::vector<std::string> textures;
bool visible;
CEffectInstance* effectInstance;
const char* fileName;
SEffectCommandData()
: type(EEffectCommandType::CREATE_EFFECT)
, instanceIndex(0)
, effectID(0)
, position(0, 0, 0)
, rotation(0, 0, 0)
, visible(true)
, effectInstance(nullptr)
, fileName(nullptr)
{
D3DXMatrixIdentity(&matrix);
}
};
class CEffectCommand
{
public:
CEffectCommand(EEffectCommandType cmdType);
~CEffectCommand();
EEffectCommandType GetType() const { return m_data.type; }
const SEffectCommandData& GetData() const { return m_data; }
SEffectCommandData& GetData() { return m_data; }
static std::unique_ptr<CEffectCommand> CreateEffect(DWORD effectID, const D3DXVECTOR3& position, const D3DXVECTOR3& rotation);
static std::unique_ptr<CEffectCommand> CreateEffect(const char* fileName, const D3DXVECTOR3& position, const D3DXVECTOR3& rotation);
static std::unique_ptr<CEffectCommand> DestroyEffect(DWORD instanceIndex);
static std::unique_ptr<CEffectCommand> UpdateEffectPosition(DWORD instanceIndex, const D3DXVECTOR3& position);
static std::unique_ptr<CEffectCommand> UpdateEffectRotation(DWORD instanceIndex, const D3DXVECTOR3& rotation);
static std::unique_ptr<CEffectCommand> UpdateEffectMatrix(DWORD instanceIndex, const D3DXMATRIX& matrix);
static std::unique_ptr<CEffectCommand> ShowEffect(DWORD instanceIndex);
static std::unique_ptr<CEffectCommand> HideEffect(DWORD instanceIndex);
static std::unique_ptr<CEffectCommand> UpdateEffects();
static std::unique_ptr<CEffectCommand> RenderEffects();
static std::unique_ptr<CEffectCommand> UpdateSoundEffects();
static std::unique_ptr<CEffectCommand> SetEffectTextures(DWORD effectID, const std::vector<std::string>& textures);
private:
SEffectCommandData m_data;
};