OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
visualobjects.h
Go to the documentation of this file.
1#pragma once
2
3#include "drawbuckets.h"
4#include "drawclusters.h"
5#include "drawcommands.h"
6#include "instancestorage.h"
7
8#include <unordered_set>
9
10class SceneGlobals;
11class Camera;
12class RtScene;
13class Landscape;
14class Sky;
15class AnimMesh;
16
17class VisualObjects final {
18 public:
19 class Item final {
20 public:
21 Item()=default;
22 Item(VisualObjects& owner,size_t id)
23 :owner(&owner),id(id){}
24 Item(Item&& obj):owner(obj.owner),id(obj.id){
25 obj.owner=nullptr;
26 obj.id =0;
27 }
29 std::swap(obj.owner,owner);
30 std::swap(obj.id, id);
31 return *this;
32 }
34 if(owner)
35 owner->free(this->id);
36 }
37
38 bool isEmpty() const { return owner==nullptr; }
39
40 void setObjMatrix(const Tempest::Matrix4x4& mt);
41 void setAsGhost (bool g);
42 void setFatness (float f);
43 void setWind (zenkit::AnimationType m, float intensity);
44 void startMMAnim (std::string_view anim, float intensity, uint64_t timeUntil);
45
46 const Material& material() const;
47 const Bounds& bounds() const;
48 Tempest::Matrix4x4 position() const;
49 const StaticMesh* mesh() const;
50 std::pair<uint32_t,uint32_t> meshSlice() const;
51
52 private:
53 VisualObjects* owner = nullptr;
54 size_t id = 0;
55 };
56
57 VisualObjects(const SceneGlobals& globals, const std::pair<Tempest::Vec3, Tempest::Vec3>& bbox);
59
60 Item get(const StaticMesh& mesh, const Material& mat, size_t iboOffset, size_t iboLength, bool staticDraw);
61 Item get(const AnimMesh& mesh, const Material& mat, size_t iboOff, size_t iboLen, const InstanceStorage::Id& anim);
62 Item get(const StaticMesh& mesh, const Material& mat, size_t iboOff, size_t iboLen, const PackedMesh::Cluster* cluster, DrawCommands::Type type);
63
64 InstanceStorage::Id alloc(size_t size);
65 bool realloc(InstanceStorage::Id& id, size_t size);
66 auto instanceSsbo() const -> const Tempest::StorageBuffer&;
67
68 const DrawClusters& clusters() const { return clustersMem; }
69 const DrawCommands& drawCommands() const { return drawCmd; }
70 const DrawBuckets& drawBuckets() const { return bucketsMem; };
71
72 void resetRendering();
73
74 void preFrameUpdate ();
75 void prepareGlobals (Tempest::Encoder<Tempest::CommandBuffer>& cmd, uint8_t fId);
76 void postFrameupdate();
77
78 void visibilityPass (Tempest::Encoder<Tempest::CommandBuffer>& cmd, int pass);
79 void visibilityVsm (Tempest::Encoder<Tempest::CommandBuffer>& cmd);
80
81 void drawTranslucent(Tempest::Encoder<Tempest::CommandBuffer>& cmd);
82 void drawWater (Tempest::Encoder<Tempest::CommandBuffer>& cmd);
83 void drawGBuffer (Tempest::Encoder<Tempest::CommandBuffer>& cmd);
84 void drawShadow (Tempest::Encoder<Tempest::CommandBuffer>& cmd, int layer);
85 void drawVsm (Tempest::Encoder<Tempest::CommandBuffer>& cmd);
86 void drawHiZ (Tempest::Encoder<Tempest::CommandBuffer>& cmd);
87
88 bool updateRtScene(RtScene& out);
89
90 void dbgClusters(Tempest::Painter& p, Tempest::Vec2 wsz);
91
92 private:
93 struct InstanceDesc;
94 struct MorphDesc;
95 struct MorphData;
96
97 struct MorphAnim {
98 size_t id = 0;
99 uint64_t timeStart = 0;
100 uint64_t timeUntil = 0;
101 float intensity = 0;
102 };
103
104 struct Object {
105 bool isEmpty() const { return cmdId==uint16_t(-1); }
106
107 Tempest::Matrix4x4 pos;
108 InstanceStorage::Id objInstance;
109 InstanceStorage::Id objMorphAnim;
110
112 uint32_t iboOff = 0;
113 uint32_t iboLen = 0;
114 uint32_t animPtr = 0;
115 DrawBuckets::Id bucketId;
116 uint16_t cmdId = uint16_t(-1);
117 uint32_t clusterId = 0;
118 uint64_t timeShift = 0;
119
121 MorphAnim morphAnim[Resources::MAX_MORPH_LAYERS];
122 zenkit::AnimationType wind = zenkit::AnimationType::NONE;
123 float windIntensity = 0;
124 float fatness = 0;
125 bool isGhost = false;
126 };
127
128 void preFrameUpdateWind();
129 void preFrameUpdateMorph();
130
131 size_t implAlloc();
132 void free(size_t id);
133
134 uint32_t clusterId(const PackedMesh::Cluster* cx, size_t firstMeshlet, size_t meshletCount, uint16_t bucketId, uint16_t commandId);
135 uint32_t clusterId(const DrawBuckets::Bucket& bucket, size_t firstMeshlet, size_t meshletCount, uint16_t bucketId, uint16_t commandId);
136
137 void startMMAnim(size_t i, std::string_view animName, float intensity, uint64_t timeUntil);
138 void setAsGhost(size_t i, bool g);
139
140 void notifyTlas(const Material& m, RtScene::Category cat);
141 void updateInstance(size_t id, Tempest::Matrix4x4* pos = nullptr);
142 void updateRtAs(size_t id);
143
144 void dbgDraw(Tempest::Painter& p, Tempest::Vec2 wsz, const Camera& cam, const DrawClusters::Cluster& cx);
145 void dbgDrawBBox(Tempest::Painter& p, Tempest::Vec2 wsz, const Camera& cam, const DrawClusters::Cluster& c);
146
147 const SceneGlobals& scene;
148
149 InstanceStorage instanceMem;
150 DrawBuckets bucketsMem;
151 DrawClusters clustersMem;
152 DrawCommands drawCmd;
153
154 std::vector<Object> objects;
155 std::unordered_set<size_t> objectsWind;
156 std::unordered_set<size_t> objectsMorph;
157 std::unordered_set<size_t> objectsFree;
158
159 friend class Item;
160 };
161
Definition item.h:14
static const size_t MAX_MORPH_LAYERS
Definition resources.h:53
Definition sky.h:12
std::pair< uint32_t, uint32_t > meshSlice() const
const Bounds & bounds() const
const Material & material() const
bool isEmpty() const
void setAsGhost(bool g)
Item & operator=(Item &&obj)
Item(VisualObjects &owner, size_t id)
void startMMAnim(std::string_view anim, float intensity, uint64_t timeUntil)
const StaticMesh * mesh() const
void setWind(zenkit::AnimationType m, float intensity)
void setObjMatrix(const Tempest::Matrix4x4 &mt)
Tempest::Matrix4x4 position() const
void setFatness(float f)
bool updateRtScene(RtScene &out)
const DrawClusters & clusters() const
auto instanceSsbo() const -> const Tempest::StorageBuffer &
void drawGBuffer(Tempest::Encoder< Tempest::CommandBuffer > &cmd)
void visibilityVsm(Tempest::Encoder< Tempest::CommandBuffer > &cmd)
void dbgClusters(Tempest::Painter &p, Tempest::Vec2 wsz)
Item get(const StaticMesh &mesh, const Material &mat, size_t iboOffset, size_t iboLength, bool staticDraw)
void prepareGlobals(Tempest::Encoder< Tempest::CommandBuffer > &cmd, uint8_t fId)
void drawHiZ(Tempest::Encoder< Tempest::CommandBuffer > &cmd)
void visibilityPass(Tempest::Encoder< Tempest::CommandBuffer > &cmd, int pass)
void drawWater(Tempest::Encoder< Tempest::CommandBuffer > &cmd)
InstanceStorage::Id alloc(size_t size)
bool realloc(InstanceStorage::Id &id, size_t size)
const DrawBuckets & drawBuckets() const
const DrawCommands & drawCommands() const
void drawTranslucent(Tempest::Encoder< Tempest::CommandBuffer > &cmd)
void drawVsm(Tempest::Encoder< Tempest::CommandBuffer > &cmd)
void drawShadow(Tempest::Encoder< Tempest::CommandBuffer > &cmd, int layer)