23 uboGlobalCpu.
sunDir=Tempest::Vec3::normalize({1,1,-1});
35 vsmDbg = device.image2d(Tempest::TextureFormat::R32U, 64, 64);
37 for(uint8_t lay=0; lay<
V_Count; ++lay) {
42 for(uint8_t lay=0; lay<
V_Count; ++lay) {
65void SceneGlobals::initSettings() {
70 windPeriod = uint64_t((period+periodV)*1000.f);
78 float zNear,
float zFar,
79 const Tempest::Matrix4x4* sh) {
86 uboGlobalCpu.
view = v;
96 uboGlobalCpu.
clipInfo.x = zNear*zFar;
97 uboGlobalCpu.
clipInfo.y = zNear-zFar;
101 uboGlobalCpu.
camPos = Tempest::Vec3(0);
102 auto viewInv = uboGlobalCpu.
view;
104 viewInv.project(uboGlobalCpu.
camPos);
106 Tempest::Vec3 min = {0,0.75,0}, max = {0, 0.75f, 0.9f};
107 auto inv = uboGlobalCpu.
viewShadow[0]; inv.inverse();
115 uboGlobalCpu.
pfxLeft = Tempest::Vec3::normalize({vp.at(0,0), vp.at(1,0), vp.at(2,0)});
116 uboGlobalCpu.
pfxTop = Tempest::Vec3::normalize({vp.at(0,1), vp.at(1,1), vp.at(2,1)});
117 uboGlobalCpu.
pfxDepth = Tempest::Vec3::normalize({vp.at(0,2), vp.at(1,2), vp.at(2,2)});
140 uboGlobalCpu.
vsmDdx = Tempest::Vec4(s.x, 0, 0,0);
141 uboGlobalCpu.
vsmDdy = Tempest::Vec4( 0, s.y, 0,0);
142 vsmMat.project(uboGlobalCpu.
vsmDdx);
143 vsmMat.project(uboGlobalCpu.
vsmDdy);
160 float minY = wview.
bbox().first.y;
161 Tempest::Vec3 plPos = Tempest::Vec3(0,0,0);
163 uboGlobalCpu.
plPosY = plPos.y/100.f;
165 uboGlobalCpu.
plPosY += (-minY)/100.f;
166 uboGlobalCpu.
plPosY = std::clamp(uboGlobalCpu.
plPosY, 0.f, 1000.f);
179 windDir = Tempest::Vec2(0.f,1.f)*1.f;
else
188 auto& ubo = perView[i];
194 std::memcpy(ubo.frustrum,
frustrum[i].
f,
sizeof(ubo.frustrum));
197 for(
size_t i=0; i<
V_Count; ++i) {
203 static_assert(
sizeof(
UboGlobal)%
sizeof(uint32_t)==0);
205 cmd.setDebugMarker(
"Update globals");
207 for(uint8_t lay=0; lay<
V_Count; ++lay) {
210 cmd.setPipeline(pso);
211 cmd.dispatchThreads(
sizeof(
UboGlobal)/
sizeof(uint32_t));
220 uboGlobalCpu.
screenResInv = Tempest::Vec2(1.f/
float(w), 1.f/
float(h));
221 uboGlobalCpu.
screenRes = Tempest::Point(
int(w),
int(h));
222 if(
hiZ!=
nullptr && !
hiZ->isEmpty()) {
229 uboGlobalCpu.
probeGridBias = 4 + std::max(std::log2(
float(w*h)/
float(1920*1080)), 0.f);
242 const Tempest::ZBuffer& pageData,
243 const Tempest::StorageImage& pageTbl,
244 const Tempest::StorageImage& pageHiZ,
245 const Tempest::StorageBuffer& pageList) {
248 vsmPageData = &Tempest::textureCast<const Tempest::Texture2d&>(pageData);
Tempest::Signal< void()> onSettingsChanged
static int settingsGetI(std::string_view sec, std::string_view name)
static float settingsGetF(std::string_view sec, std::string_view name)
Tempest::Vec3 dir() const
const Tempest::Vec3 & color() const
static Tempest::Device & device()
static const Tempest::Texture2d & fallbackBlack()
const Tempest::Matrix4x4 viewProjectLwcInv() const
const Tempest::Matrix4x4 & viewShadow(uint8_t view) const
const Tempest::StorageBuffer * vsmPageList
const Tempest::Texture2d * shadowMap[2]
void setUnderWater(bool w)
Tempest::StorageImage vsmDbg
const Tempest::Matrix4x4 & viewProject() const
Tempest::UniformBuffer< UboGlobal > uboGlobalPf[Resources::MaxFramesInFlight][V_Count]
void setVirtualShadowMap(bool enabled, const Tempest::ZBuffer &vsmPageData, const Tempest::StorageImage &pageTbl, const Tempest::StorageImage &pageHiZ, const Tempest::StorageBuffer &vsmPageList)
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)
Tempest::StorageBuffer uboGlobal[V_Count]
Frustrum frustrum[V_Count]
void setHiZ(const Tempest::Texture2d &hiZ)
const Tempest::Texture2d * hiZ
void commitUbo(uint8_t fId)
const Tempest::StorageImage * vsmPageTbl
void setShadowMap(const Tempest::Texture2d *tex[])
void setViewLwc(const Tempest::Matrix4x4 &view, const Tempest::Matrix4x4 &proj, const Tempest::Matrix4x4 *sh)
const Tempest::Texture2d * vsmPageData
Tempest::Matrix4x4 viewLwc
static bool isShadowView(VisCamera v)
const Tempest::Matrix4x4 & viewProjectInv() const
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)
const Tempest::StorageImage * vsmPageHiZ
const Tempest::Matrix4x4 viewProjectLwc() const
const Tempest::Vec3 clipInfo() const
void setTime(uint64_t time)
Tempest::ComputePipeline copyBuf
Tempest::Vec2 cloudsOffset(int layer) const
const Tempest::Vec3 & ambientLight() const
float sunIntensity() const
const LightSource & sunLight() const
std::pair< Tempest::Vec3, Tempest::Vec3 > bbox() const
static uint32_t nextPot(uint32_t x)
static uint32_t nextPot(uint32_t x)
Tempest::Matrix4x4 viewVirtualShadow
Tempest::Matrix4x4 viewShadowLwc[Resources::ShadowLayers]
Tempest::Matrix4x4 viewProjectInv
Tempest::Vec2 closeupShadowSlice
Tempest::Matrix4x4 viewShadow[Resources::ShadowLayers]
Tempest::Matrix4x4 viewProject2VirtualShadow
Tempest::Matrix4x4 projectInv
Tempest::Matrix4x4 viewVirtualShadowLwc
Tempest::Vec2 screenResInv
Tempest::Vec2 cloudsDir[2]
Tempest::Matrix4x4 project
Tempest::Matrix4x4 viewProject
Tempest::Matrix4x4 viewProjectLwcInv
Tempest::Point hiZTileSize