verus/Verus/src/Scene/SceneNodes/Block.h

96 lines
2.2 KiB
C++

#pragma once
namespace verus
{
namespace Scene
{
class BlockLight
{
public:
Transform3 _tr = Transform3::identity();
LightPwn _light;
};
VERUS_TYPEDEFS(BlockLight);
class BlockEmitter
{
public:
Transform3 _tr = Transform3::identity();
//CEmitterPwn _emitter;
};
VERUS_TYPEDEFS(BlockEmitter);
//! Block is a scene node which has a model and material info.
//! Most blocks form the scene's so called static or immovable geometry.
class Block : public SceneNode
{
Vector4 _userColor = Vector4(0);
Vector<BlockLight> _vLights;
Vector<BlockEmitter> _vEmitters;
ModelPwn _model;
MaterialPwn _material;
int _matIndex = 0;
bool _collide = true;
bool _async_loadedModel = false;
public:
struct Desc
{
pugi::xml_node _node;
CSZ _name = nullptr;
CSZ _model = nullptr;
CSZ _modelMat = nullptr;
CSZ _blockMat = nullptr;
int _matIndex = 0;
bool _collide = true;
};
VERUS_TYPEDEFS(Desc);
Block();
~Block();
void Init(RcDesc desc);
void Done();
VERUS_P(void LoadExtra(CSZ xml));
virtual void Update() override;
virtual void Draw() override;
virtual String GetUrl() override { return _C(_model->GetMesh().GetUrl()); }
bool IsLoadedModel() const { return _model->IsLoaded(); }
virtual void SetDynamic(bool mode) override;
virtual void SetColor(RcVector4 color) override { _userColor = color; }
virtual Vector4 GetColor() override { return _userColor; }
ModelPtr GetModel() { return _model; }
MaterialPtr GetMaterial(bool orModelMat = true);
int GetMaterialIndex() const { return _matIndex; }
virtual void UpdateBounds() override;
// Serialization:
virtual void SaveXML(pugi::xml_node node) override;
virtual void LoadXML(pugi::xml_node node) override;
};
VERUS_TYPEDEFS(Block);
class BlockPtr : public Ptr<Block>
{
public:
void Init(Block::RcDesc desc);
};
VERUS_TYPEDEFS(BlockPtr);
class BlockPwn : public BlockPtr
{
public:
~BlockPwn() { Done(); }
void Done();
};
VERUS_TYPEDEFS(BlockPwn);
}
}