diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2024-01-13 11:31:13 +0000 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2024-01-13 11:31:13 +0000 |
commit | 332355a9f4a4199e0ddb51852546d44ec54e176f (patch) | |
tree | 4998cde56004f53a0218dc5f00d578f939ffea08 /game/scenary/illuminator.h | |
parent | Integer support in persistence (diff) | |
parent | Only create VAOs for the light type(s) in use (diff) | |
download | ilt-332355a9f4a4199e0ddb51852546d44ec54e176f.tar.bz2 ilt-332355a9f4a4199e0ddb51852546d44ec54e176f.tar.xz ilt-332355a9f4a4199e0ddb51852546d44ec54e176f.zip |
Merge branch 'model-lights'
Diffstat (limited to 'game/scenary/illuminator.h')
-rw-r--r-- | game/scenary/illuminator.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/game/scenary/illuminator.h b/game/scenary/illuminator.h new file mode 100644 index 0000000..893e5c7 --- /dev/null +++ b/game/scenary/illuminator.h @@ -0,0 +1,60 @@ +#pragma once + +#include "assetFactory/asset.h" +#include "gfx/gl/instanceVertices.h" +#include "gfx/renderable.h" + +class SceneShader; +class Location; +class Texture; + +class Illuminator : public Asset, public Renderable, public StdTypeDefs<Illuminator> { + Mesh::Ptr bodyMesh; + std::shared_ptr<Texture> texture; + glVertexArray instanceVAO; + std::optional<glVertexArray> instancesSpotLightVAO, instancesPointLightVAO; + +public: + struct LightCommonVertex { + RelativePosition3D position; + RGB colour; + RelativeDistance kq; + }; + + struct SpotLightVertex : LightCommonVertex { + Direction3D direction; + Angle arc; + }; + + struct PointLightVertex : LightCommonVertex { }; + + struct SpotLight : Persistence::Persistable, SpotLightVertex, StdTypeDefs<SpotLight> { + private: + friend Persistence::SelectionPtrBase<std::shared_ptr<SpotLight>>; + bool persist(Persistence::PersistenceStore & store) override; + }; + + struct PointLight : Persistence::Persistable, PointLightVertex, StdTypeDefs<PointLight> { + private: + friend Persistence::SelectionPtrBase<std::shared_ptr<PointLight>>; + bool persist(Persistence::PersistenceStore & store) override; + }; + +public: + using LocationVertex = std::pair<glm::mat4, GlobalPosition3D>; + mutable InstanceVertices<LocationVertex> instances; + mutable InstanceVertices<SpotLightVertex> instancesSpotLight; + mutable InstanceVertices<PointLightVertex> instancesPointLight; + void render(const SceneShader &) const override; + void lights(const SceneShader &) const override; + +protected: + friend Persistence::SelectionPtrBase<std::shared_ptr<Illuminator>>; + bool persist(Persistence::PersistenceStore & store) override; + void postLoad() override; + + std::vector<SpotLight::Ptr> spotLight; + std::vector<PointLight::Ptr> pointLight; + std::vector<InstanceVertices<SpotLightVertex>::InstanceProxy> spotLightInstances; + std::vector<InstanceVertices<PointLightVertex>::InstanceProxy> pointLightInstances; +}; |