66 lines
2.6 KiB
C++
66 lines
2.6 KiB
C++
#pragma once
|
|
|
|
#include <XCEngine/Components/Component.h>
|
|
#include <XCEngine/Core/Asset/AssetRef.h>
|
|
#include <XCEngine/Core/Asset/ResourceHandle.h>
|
|
#include <XCEngine/Resources/Material/Material.h>
|
|
|
|
#include <cstdint>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
namespace XCEngine {
|
|
namespace Components {
|
|
|
|
class MeshRendererComponent : public Component {
|
|
public:
|
|
std::string GetName() const override { return "MeshRenderer"; }
|
|
|
|
size_t GetMaterialCount() const { return m_materials.size(); }
|
|
Resources::Material* GetMaterial(size_t index) const;
|
|
const Resources::ResourceHandle<Resources::Material>& GetMaterialHandle(size_t index) const;
|
|
const std::string& GetMaterialPath(size_t index) const;
|
|
const std::vector<std::string>& GetMaterialPaths() const { return m_materialPaths; }
|
|
const std::vector<Resources::AssetRef>& GetMaterialAssetRefs() const { return m_materialRefs; }
|
|
|
|
void SetMaterialPath(size_t index, const std::string& materialPath);
|
|
void SetMaterial(size_t index, const Resources::ResourceHandle<Resources::Material>& material);
|
|
void SetMaterial(size_t index, Resources::Material* material);
|
|
void SetMaterials(const std::vector<Resources::ResourceHandle<Resources::Material>>& materials);
|
|
void ClearMaterials();
|
|
|
|
bool GetCastShadows() const { return m_castShadows; }
|
|
void SetCastShadows(bool value) { m_castShadows = value; }
|
|
|
|
bool GetReceiveShadows() const { return m_receiveShadows; }
|
|
void SetReceiveShadows(bool value) { m_receiveShadows = value; }
|
|
|
|
uint32_t GetRenderLayer() const { return m_renderLayer; }
|
|
void SetRenderLayer(uint32_t value) { m_renderLayer = value; }
|
|
|
|
void Serialize(std::ostream& os) const override;
|
|
void Deserialize(std::istream& is) override;
|
|
|
|
private:
|
|
struct PendingMaterialLoadState;
|
|
|
|
void BeginAsyncMaterialLoad(size_t index, const std::string& materialPath);
|
|
void EnsureDeferredAsyncMaterialLoadStarted(size_t index);
|
|
void ResolvePendingMaterials();
|
|
void EnsureMaterialSlot(size_t index);
|
|
static std::string MaterialPathFromHandle(const Resources::ResourceHandle<Resources::Material>& material);
|
|
|
|
std::vector<Resources::ResourceHandle<Resources::Material>> m_materials;
|
|
std::vector<std::string> m_materialPaths;
|
|
std::vector<Resources::AssetRef> m_materialRefs;
|
|
std::vector<std::shared_ptr<PendingMaterialLoadState>> m_pendingMaterialLoads;
|
|
std::vector<bool> m_asyncMaterialLoadRequested;
|
|
bool m_castShadows = true;
|
|
bool m_receiveShadows = true;
|
|
uint32_t m_renderLayer = 0;
|
|
};
|
|
|
|
} // namespace Components
|
|
} // namespace XCEngine
|