OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
worldview.cpp
Go to the documentation of this file.
1#include "worldview.h"
2
3#include <Tempest/Application>
4
6#include "world/world.h"
7#include "gothic.h"
8
9using namespace Tempest;
10
11WorldView::WorldView(const World& world, const PackedMesh& wmesh)
12 : owner(world),aabb(wmesh.bbox()),gSky(sGlobal,world),gLights(sGlobal),visuals(sGlobal,wmesh.bbox()),
13 objGroup(visuals),pfxGroup(*this,sGlobal,visuals),land(visuals,wmesh) {
14 pfxGroup.resetTicks();
15 }
16
18 // cmd buffers must not be in use
19 Resources::device().waitIdle();
20 }
21
23 return gSky.sunLight();
24 }
25
26const Tempest::Vec3& WorldView::ambientLight() const {
27 return gSky.ambientLight();
28 }
29
30std::pair<Vec3, Vec3> WorldView::bbox() const {
31 return aabb;
32 }
33
34bool WorldView::isInPfxRange(const Vec3& pos) const {
35 return pfxGroup.isInPfxRange(pos);
36 }
37
38void WorldView::tick(uint64_t /*dt*/) {
39 auto& cam = owner.gameSession().camera();
40 pfxGroup.setViewerPos(cam.destPosition());
41 }
42
44 visuals.resetRendering();
45 }
46
47void WorldView::preFrameUpdate(const Camera& camera, uint64_t tickCount, uint8_t fId) {
48 const auto ldir = gSky.sunLight().dir();
49 Tempest::Matrix4x4 shadow [Resources::ShadowLayers];
50 Tempest::Matrix4x4 shadowLwc[Resources::ShadowLayers];
51 for(size_t i=0; i<Resources::ShadowLayers; ++i) {
52 shadow [i] = camera.viewShadow(ldir,i);
53 shadowLwc[i] = camera.viewShadowLwc(ldir,i);
54 }
55
56 sGlobal.setViewProject(camera.view(),camera.projective(),camera.zNear(),camera.zFar(),shadow);
57 sGlobal.setViewLwc(camera.viewLwc(),camera.projective(),shadowLwc);
58 sGlobal.setViewVsm(camera.viewShadowVsm(ldir), camera.viewShadowVsmLwc(ldir));
59 sGlobal.originLwc = camera.originLwc();
60 sGlobal.setUnderWater(camera.isInWater());
61 sGlobal.setSky(gSky);
62 sGlobal.setWorld(*this);
63
64 pfxGroup.tick(tickCount);
65 gLights.tick(tickCount);
66 sGlobal.setTime(tickCount);
67 sGlobal.commitUbo(fId);
68
69 pfxGroup.preFrameUpdate(fId);
70 visuals .preFrameUpdate();
71 }
72
73void WorldView::prepareGlobals(Tempest::Encoder<Tempest::CommandBuffer>& cmd, uint8_t fId) {
74 sGlobal.prepareGlobals(cmd, fId);
75 gLights.prepareGlobals(cmd, fId);
76 visuals.prepareGlobals(cmd, fId);
77 }
78
79void WorldView::setGbuffer(const Texture2d& diffuse, const Texture2d& norm) {
80 sGlobal.gbufDiffuse = &diffuse;
81 sGlobal.gbufNormals = &norm;
82 sGlobal.setResolution(uint32_t(diffuse.w()),uint32_t(diffuse.h()));
83 }
84
85void WorldView::setShadowMaps(const Tempest::Texture2d* sh[]) {
86 const Texture2d* shadow[Resources::ShadowLayers] = {};
87 for(size_t i=0; i<Resources::ShadowLayers; ++i)
88 if(sh[i]==nullptr || sh[i]->isEmpty())
89 shadow[i] = &Resources::fallbackBlack(); else
90 shadow[i] = sh[i];
91 sGlobal.setShadowMap(shadow);
92 }
93
95 const Tempest::ZBuffer& pageData,
96 const Tempest::StorageImage& pageTbl,
97 const Tempest::StorageImage& pageHiZ,
98 const Tempest::StorageBuffer& pageList) {
99 sGlobal.setVirtualShadowMap(enabled, pageData, pageTbl, pageHiZ, pageList);
100 }
101
102void WorldView::setHiZ(const Tempest::Texture2d& hiZ) {
103 sGlobal.setHiZ(hiZ);
104 }
105
106void WorldView::setSceneImages(const Tempest::Texture2d& clr, const Tempest::Texture2d& depthAux, const Tempest::ZBuffer& depthNative) {
107 sGlobal.sceneColor = &clr;
108 sGlobal.sceneDepth = &depthAux;
109 sGlobal.zbuffer = &textureCast<const Texture2d&>(depthNative);
110 }
111
113 gLights.dbgLights(p);
114 }
115
117 for(uint8_t i=0; i<SceneGlobals::V_Count; ++i)
118 sGlobal.frustrum[i] = fr[i];
119 }
120
121void WorldView::visibilityPass(Tempest::Encoder<Tempest::CommandBuffer>& cmd, int pass) {
122 cmd.setDebugMarker("Visibility");
123 visuals.visibilityPass(cmd, pass);
124 }
125
126void WorldView::visibilityVsm(Tempest::Encoder<Tempest::CommandBuffer>& cmd) {
127 visuals.visibilityVsm(cmd);
128 }
129
130void WorldView::drawHiZ(Tempest::Encoder<Tempest::CommandBuffer>& cmd) {
131 visuals.drawHiZ(cmd);
132 }
133
134void WorldView::drawShadow(Tempest::Encoder<CommandBuffer>& cmd, uint8_t fId, uint8_t layer) {
135 visuals.drawShadow(cmd,layer);
136 pfxGroup.drawShadow(cmd,fId,layer);
137 }
138
139void WorldView::drawVsm(Tempest::Encoder<Tempest::CommandBuffer>& cmd) {
140 visuals.drawVsm(cmd);
141 }
142
143void WorldView::drawGBuffer(Tempest::Encoder<CommandBuffer>& cmd, uint8_t fId) {
144 visuals.drawGBuffer(cmd);
145 pfxGroup.drawGBuffer(cmd, fId);
146 }
147
148void WorldView::drawWater(Tempest::Encoder<Tempest::CommandBuffer>& cmd) {
149 visuals.drawWater(cmd);
150 }
151
152void WorldView::drawTranslucent(Tempest::Encoder<CommandBuffer>& cmd, uint8_t fId) {
153 visuals.drawTranslucent(cmd);
154 pfxGroup.drawTranslucent(cmd, fId);
155 }
156
157MeshObjects::Mesh WorldView::addView(std::string_view visual, int32_t headTex, int32_t teethTex, int32_t bodyColor) {
158 if(auto mesh=Resources::loadMesh(visual))
159 return MeshObjects::Mesh(objGroup,*mesh,headTex,teethTex,bodyColor,false);
160 return MeshObjects::Mesh();
161 }
162
164 if(mesh!=nullptr) {
165 bool staticDraw = false;
166 return MeshObjects::Mesh(objGroup,*mesh,0,0,0,staticDraw);
167 }
168 return MeshObjects::Mesh();
169 }
170
171MeshObjects::Mesh WorldView::addItmView(std::string_view visual, int32_t material) {
172 if(auto mesh=Resources::loadMesh(visual))
173 return MeshObjects::Mesh(objGroup,*mesh,material,0,0,true);
174 return MeshObjects::Mesh();
175 }
176
177MeshObjects::Mesh WorldView::addAtachView(const ProtoMesh::Attach& visual, const int32_t version) {
178 return MeshObjects::Mesh(objGroup,visual,version,false);
179 }
180
182 if(mesh!=nullptr)
183 return MeshObjects::Mesh(objGroup,*mesh,0,0,0,staticDraw);
184 return MeshObjects::Mesh();
185 }
186
188 if(auto mesh=Resources::loadMesh(visual))
189 return MeshObjects::Mesh(objGroup,*mesh,0,0,0,true);
190 return MeshObjects::Mesh();
191 }
192
193MeshObjects::Mesh WorldView::addDecalView(const zenkit::VisualDecal& vob) {
194 if(auto mesh=Resources::decalMesh(vob))
195 return MeshObjects::Mesh(objGroup,*mesh,0,0,0,true);
196 return MeshObjects::Mesh();
197 }
198
199LightGroup::Light WorldView::addLight(const zenkit::VLight& vob) {
200 auto l = gLights.add(vob);
201 l.setTimeOffset(owner.tickCount());
202 return l;
203 }
204
205LightGroup::Light WorldView::addLight(std::string_view preset) {
206 auto l = gLights.add(preset);
207 l.setTimeOffset(owner.tickCount());
208 return l;
209 }
210
211void WorldView::dbgClusters(Tempest::Painter& p, Vec2 wsz) {
212 visuals.dbgClusters(p, wsz);
213 }
214
216 return visuals.clusters();
217 }
218
220 return visuals.drawCommands();
221 }
222
224 return visuals.drawBuckets();
225 }
226
227const Tempest::StorageBuffer& WorldView::instanceSsbo() const {
228 return visuals.instanceSsbo();
229 }
230
232 const int64_t now = owner.time().timeInDay().toInt();
233 gSky.updateLight(now);
234 if(!gLights.updateLights())
235 return false;
236 sGlobal.lights = &gLights.lightsSsbo();
237 return true;
238 }
239
241 if(!Gothic::options().doRayQuery)
242 return false;
243 if(!visuals.updateRtScene(sGlobal.rtScene))
244 return false;
245 return true;
246 }
247
249 visuals.postFrameupdate();
250 }
Tempest::Matrix4x4 viewShadowLwc(const Tempest::Vec3 &ldir, size_t layer) const
Definition camera.cpp:266
Tempest::Matrix4x4 view() const
Definition camera.cpp:915
float zFar() const
Definition camera.cpp:102
Tempest::Matrix4x4 projective() const
Definition camera.cpp:259
bool isInWater() const
Definition camera.cpp:194
float zNear() const
Definition camera.cpp:97
Tempest::Matrix4x4 viewLwc() const
Definition camera.cpp:920
Tempest::Matrix4x4 viewShadowVsm(const Tempest::Vec3 &ldir) const
Definition camera.cpp:274
Tempest::Matrix4x4 viewShadow(const Tempest::Vec3 &ldir, size_t layer) const
Definition camera.cpp:321
Tempest::Matrix4x4 viewShadowVsmLwc(const Tempest::Vec3 &ldir) const
Definition camera.cpp:278
Tempest::Vec3 originLwc() const
Definition camera.h:116
Camera & camera()
Definition gamesession.h:48
static auto options() -> const Options &
Definition gothic.cpp:496
void setTimeOffset(uint64_t t)
auto & lightsSsbo() const
Definition lightgroup.h:52
bool updateLights()
Light add(const zenkit::LightPreset &vob)
void prepareGlobals(Tempest::Encoder< Tempest::CommandBuffer > &cmd, uint8_t fId)
void dbgLights(DbgPainter &p) const
void tick(uint64_t time)
Tempest::Vec3 dir() const
Definition lightsource.h:12
void preFrameUpdate(uint8_t fId)
void tick(uint64_t ticks)
void drawGBuffer(Tempest::Encoder< Tempest::CommandBuffer > &cmd, uint8_t fId)
void drawShadow(Tempest::Encoder< Tempest::CommandBuffer > &cmd, uint8_t fId, int layer)
void setViewerPos(const Tempest::Vec3 &pos)
bool isInPfxRange(const Tempest::Vec3 &pos) const
void resetTicks()
void drawTranslucent(Tempest::Encoder< Tempest::CommandBuffer > &cmd, uint8_t fId)
@ ShadowLayers
Definition resources.h:49
static const ProtoMesh * loadMesh(std::string_view name)
static Tempest::Device & device()
Definition resources.h:83
static const Tempest::Texture2d & fallbackBlack()
static const ProtoMesh * decalMesh(const zenkit::VisualDecal &decal)
const Tempest::Texture2d * zbuffer
const Tempest::Texture2d * gbufDiffuse
void setUnderWater(bool w)
void setVirtualShadowMap(bool enabled, const Tempest::ZBuffer &vsmPageData, const Tempest::StorageImage &pageTbl, const Tempest::StorageImage &pageHiZ, const Tempest::StorageBuffer &vsmPageList)
const Tempest::Texture2d * gbufNormals
void setViewProject(const Tempest::Matrix4x4 &view, const Tempest::Matrix4x4 &proj, float zNear, float zFar, const Tempest::Matrix4x4 *sh)
void setResolution(uint32_t w, uint32_t h)
Frustrum frustrum[V_Count]
const Tempest::Texture2d * sceneColor
void setHiZ(const Tempest::Texture2d &hiZ)
RtScene rtScene
void commitUbo(uint8_t fId)
void setShadowMap(const Tempest::Texture2d *tex[])
void setViewLwc(const Tempest::Matrix4x4 &view, const Tempest::Matrix4x4 &proj, const Tempest::Matrix4x4 *sh)
Tempest::Vec3 originLwc
const Tempest::StorageBuffer * lights
void setSky(const Sky &s)
void prepareGlobals(Tempest::Encoder< Tempest::CommandBuffer > &cmd, uint8_t frameId)
void setWorld(const WorldView &wview)
void setViewVsm(const Tempest::Matrix4x4 &view, const Tempest::Matrix4x4 &viewLwc)
void setTime(uint64_t time)
const Tempest::Texture2d * sceneDepth
const Tempest::Vec3 & ambientLight() const
Definition sky.h:24
void updateLight(const int64_t now)
Definition sky.cpp:84
const LightSource & sunLight() const
Definition sky.h:23
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)
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)
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)
void prepareGlobals(Tempest::Encoder< Tempest::CommandBuffer > &cmd, uint8_t fId)
Definition worldview.cpp:73
void resetRendering()
Definition worldview.cpp:43
const DrawBuckets & drawBuckets() const
void setShadowMaps(const Tempest::Texture2d *shadow[])
Definition worldview.cpp:85
void tick(uint64_t dt)
Definition worldview.cpp:38
MeshObjects::Mesh addStaticView(const ProtoMesh *visual, bool staticDraw=false)
void drawShadow(Tempest::Encoder< Tempest::CommandBuffer > &cmd, uint8_t frameId, uint8_t layer)
MeshObjects::Mesh addDecalView(const zenkit::VisualDecal &vob)
void setHiZ(const Tempest::Texture2d &hiZ)
void drawGBuffer(Tempest::Encoder< Tempest::CommandBuffer > &cmd, uint8_t frameId)
void drawTranslucent(Tempest::Encoder< Tempest::CommandBuffer > &cmd, uint8_t frameId)
MeshObjects::Mesh addView(std::string_view visual, int32_t headTex, int32_t teethTex, int32_t bodyColor)
MeshObjects::Mesh addAtachView(const ProtoMesh::Attach &visual, const int32_t version)
LightGroup::Light addLight(const zenkit::VLight &vob)
auto instanceSsbo() const -> const Tempest::StorageBuffer &
MeshObjects::Mesh addItmView(std::string_view visual, int32_t material)
const Tempest::Vec3 & ambientLight() const
Definition worldview.cpp:26
const DrawClusters & clusters() const
void postFrameupdate()
WorldView(const World &world, const PackedMesh &wmesh)
Definition worldview.cpp:11
void dbgLights(DbgPainter &p) const
void visibilityPass(Tempest::Encoder< Tempest::CommandBuffer > &cmd, int pass)
void drawHiZ(Tempest::Encoder< Tempest::CommandBuffer > &cmd)
void drawVsm(Tempest::Encoder< Tempest::CommandBuffer > &cmd)
void setGbuffer(const Tempest::Texture2d &diffuse, const Tempest::Texture2d &norm)
Definition worldview.cpp:79
bool isInPfxRange(const Tempest::Vec3 &pos) const
Definition worldview.cpp:34
void setSceneImages(const Tempest::Texture2d &clr, const Tempest::Texture2d &depthAux, const Tempest::ZBuffer &depthNative)
void visibilityVsm(Tempest::Encoder< Tempest::CommandBuffer > &cmd)
bool updateLights()
bool updateRtScene()
std::pair< Tempest::Vec3, Tempest::Vec3 > bbox() const
Definition worldview.cpp:30
const DrawCommands & drawCommands() const
void updateFrustrum(const Frustrum fr[])
void preFrameUpdate(const Camera &camera, uint64_t tickCount, uint8_t fId)
Definition worldview.cpp:47
void drawWater(Tempest::Encoder< Tempest::CommandBuffer > &cmd)
void setVirtualShadowMap(bool enabled, const Tempest::ZBuffer &pageData, const Tempest::StorageImage &pageTbl, const Tempest::StorageImage &pageHiZ, const Tempest::StorageBuffer &pageList)
Definition worldview.cpp:94
const LightSource & mainLight() const
Definition worldview.cpp:22
void dbgClusters(Tempest::Painter &p, Tempest::Vec2 wsz)
Definition world.h:31
uint64_t tickCount() const
Definition world.cpp:387
GameSession & gameSession() const
Definition world.h:85
gtime time() const
Definition world.cpp:405
gtime timeInDay() const
Definition gametime.h:18
int64_t toInt() const
Definition gametime.h:14