Skip to content

Commit 88e2e2b

Browse files
committed
Asset restore impl and used where needed, fixed ex18, new class CDerivativeMapCreator
1 parent af1d472 commit 88e2e2b

File tree

16 files changed

+397
-222
lines changed

16 files changed

+397
-222
lines changed

examples_tests/18.MitsubaLoader/main.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,6 @@ int main()
213213

214214
auto serializedLoader = core::make_smart_refctd_ptr<nbl::ext::MitsubaLoader::CSerializedLoader>(am);
215215
auto mitsubaLoader = core::make_smart_refctd_ptr<nbl::ext::MitsubaLoader::CMitsubaLoader>(am,fs);
216-
serializedLoader->initialize();
217-
mitsubaLoader->initialize();
218216
am->addAssetLoader(std::move(serializedLoader));
219217
am->addAssetLoader(std::move(mitsubaLoader));
220218

@@ -324,6 +322,7 @@ int main()
324322

325323
video::IVideoDriver* driver = device->getVideoDriver();
326324
asset::IAssetManager* am = device->getAssetManager();
325+
io::IFileSystem* fs = device->getFileSystem();
327326

328327
// look out for this!!!
329328
// when added, CMitsubaLoader inserts its own include loader into GLSLCompiler

include/nbl/asset/IAsset.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ class IAsset : virtual public core::IReferenceCounted
177177
return false;
178178

179179
restoreFromDummy_impl(_other, _levelsBelow);
180+
isDummyObjectForCacheAliasing = false;
180181
return true;
181182
}
182183

include/nbl/asset/IAssetManager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,7 @@ class IAssetManager : public core::IReferenceCounted, public core::QuitSignallin
574574
//! @returns 0xdeadbeefu on failure or 0-based index on success.
575575
uint32_t addAssetLoader(core::smart_refctd_ptr<IAssetLoader>&& _loader)
576576
{
577+
_loader->initialize();
577578
// there's no way it ever fails, so no 0xdeadbeef return
578579
const char** exts = _loader->getAssociatedFileExtensions();
579580
size_t extIx = 0u;

include/nbl/asset/interchange/IAssetLoader.h

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,42 @@ class IAssetLoader : public virtual core::IReferenceCounted
289289
SAssetBundle interm_getAssetInHierarchy(IAssetManager* _mgr, const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override);
290290
SAssetBundle interm_getAssetInHierarchy(IAssetManager* _mgr, io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel);
291291
SAssetBundle interm_getAssetInHierarchy(IAssetManager* _mgr, const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel);
292+
//! ECF_DUPLICATE_* flags are ignored (since there's no point in **restoring** if we're not even looking into the cache) -- only ECF_DONT_CACHE_* are honored
293+
//! `Args` ought to be same parameter types as interm_getAssetInHierarchy(...) overloads offer
294+
template <typename ...Args>
295+
SAssetBundle interm_getRestoredAssetInHierarchy(uint32_t _restoreLevels, Args&&... args)
296+
{
297+
if (_restoreLevels == 0u)
298+
return interm_getAssetInHierarchy(std::forward<Args>(args)...);
299+
300+
auto any_dummy = [](const SAssetBundle& b) {
301+
for (const auto& a : b.getContents())
302+
if (a->isADummyObjectForCache())
303+
return true;
304+
};
305+
306+
auto bundle = interm_getAssetInHierarchy_find(std::forward<Args>(args)...);
307+
308+
if (bundle.getContents().empty() || !any_dummy(bundle))
309+
return bundle;
310+
auto reloadedBundle = interm_getAssetInHierarchy_reload(_restoreLevels, std::forward<Args>(args)...);
311+
312+
assert(bundle.getContents().size() == reloadedBundle.getContents().size());
313+
314+
const uint32_t count = bundle.getContents().size();
315+
auto* dummies = bundle.getContents().begin();
316+
auto* reloaded = reloadedBundle.getContents().begin();
317+
for (uint32_t i = 0u; i < count; ++i)
318+
if (dummies[i]->isADummyObjectForCache() && !dummies[i]->canBeRestoredFrom(reloaded[i].get()))
319+
return {}; // return empty bundle
320+
321+
for (uint32_t i = 0u; i < count; ++i)
322+
if (dummies[i]->isADummyObjectForCache())
323+
dummies[i]->restoreFromDummy(reloaded[i].get(), _restoreLevels);
324+
325+
return bundle;
326+
}
327+
292328
void interm_setAssetMutability(const IAssetManager* _mgr, IAsset* _asset, IAsset::E_MUTABILITY _val);
293329
//void interm_restoreDummyAsset(IAssetManager* _mgr, SAssetBundle& _bundle);
294330
//void interm_restoreDummyAsset(IAssetManager* _mgr, IAsset* _asset, const std::string _path);
@@ -301,6 +337,50 @@ class IAssetLoader : public virtual core::IReferenceCounted
301337
{
302338
bundle.setAsset(offset,std::move(_asset));
303339
}
340+
341+
private:
342+
static IAssetLoader::SAssetLoadParams getFindParams(IAssetLoader::SAssetLoadParams _params)
343+
{
344+
_params.cacheFlags = static_cast<E_CACHING_FLAGS>(_params.cacheFlags & ECF_DONT_CACHE_REFERENCES);
345+
return _params;
346+
}
347+
SAssetBundle interm_getAssetInHierarchy_find(IAssetManager* _mgr, io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
348+
{
349+
return interm_getAssetInHierarchy(_mgr, _file, _supposedFilename, getFindParams(_params), _hierarchyLevel);
350+
}
351+
SAssetBundle interm_getAssetInHierarchy_find(IAssetManager* _mgr, const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
352+
{
353+
return interm_getAssetInHierarchy(_mgr, _filename, getFindParams(_params), _hierarchyLevel, _override);
354+
}
355+
SAssetBundle interm_getAssetInHierarchy_find(IAssetManager* _mgr, io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
356+
{
357+
return interm_getAssetInHierarchy(_mgr, _file, _supposedFilename, getFindParams(_params), _hierarchyLevel);
358+
}
359+
SAssetBundle interm_getAssetInHierarchy_find(IAssetManager* _mgr, const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
360+
{
361+
return interm_getAssetInHierarchy(_mgr, _filename, getFindParams(_params), _hierarchyLevel);
362+
}
363+
static IAssetLoader::SAssetLoadParams getReloadParams(IAssetLoader::SAssetLoadParams _params, uint32_t _restoreLevels, uint32_t _hierLevel)
364+
{
365+
_params.cacheFlags = ECF_DUPLICATE_UNTIL_LEVEL(_restoreLevels + _hierLevel);
366+
return _params;
367+
}
368+
SAssetBundle interm_getAssetInHierarchy_reload(uint32_t _restoreLevels, IAssetManager* _mgr, io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
369+
{
370+
return interm_getAssetInHierarchy(_mgr, _file, _supposedFilename, getReloadParams(_params, _restoreLevels, _hierarchyLevel), _hierarchyLevel);
371+
}
372+
SAssetBundle interm_getAssetInHierarchy_reload(uint32_t _restoreLevels, IAssetManager* _mgr, const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
373+
{
374+
return interm_getAssetInHierarchy(_mgr, _filename, getReloadParams(_params, _restoreLevels, _hierarchyLevel), _hierarchyLevel);
375+
}
376+
SAssetBundle interm_getAssetInHierarchy_reload(uint32_t _restoreLevels, IAssetManager* _mgr, io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
377+
{
378+
return interm_getAssetInHierarchy(_mgr, _file, _supposedFilename, getReloadParams(_params, _restoreLevels, _hierarchyLevel), _hierarchyLevel);
379+
}
380+
SAssetBundle interm_getAssetInHierarchy_reload(uint32_t _restoreLevels, IAssetManager* _mgr, const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
381+
{
382+
return interm_getAssetInHierarchy(_mgr, _filename, getReloadParams(_params, _restoreLevels, _hierarchyLevel), _hierarchyLevel);
383+
}
304384
};
305385

306386
}

include/nbl/asset/interchange/SAssetBundle.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ class SAssetBundle
6161
{
6262
return core::SRange<const core::smart_refctd_ptr<IAsset>>(m_contents->begin(),m_contents->end());
6363
}
64+
inline core::SRange<core::smart_refctd_ptr<IAsset>> getContents()
65+
{
66+
return core::SRange<core::smart_refctd_ptr<IAsset>>(m_contents->begin(), m_contents->end());
67+
}
6468

6569
//! Whether this asset bundle is in a cache and should be removed from cache to destroy
6670
inline bool isInAResourceCache() const { return m_isCached; }
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#ifndef __NBL_I_DERIVATIVE_MAP_CREATOR_H_INCLUDED__
2+
#define __NBL_I_DERIVATIVE_MAP_CREATOR_H_INCLUDED__
3+
4+
#include "nbl/asset/ICPUImage.h"
5+
#include "nbl/asset/ICPUImageView.h"
6+
7+
namespace nbl {
8+
namespace asset
9+
{
10+
11+
class CDerivativeMapCreator
12+
{
13+
public:
14+
CDerivativeMapCreator() = delete;
15+
~CDerivativeMapCreator() = delete;
16+
17+
static core::smart_refctd_ptr<asset::ICPUImage> createDerivativeMapFromHeightMap(asset::ICPUImage* _inImg, asset::ISampler::E_TEXTURE_CLAMP _uwrap, asset::ISampler::E_TEXTURE_CLAMP _vwrap, asset::ISampler::E_TEXTURE_BORDER_COLOR _borderColor);
18+
static core::smart_refctd_ptr<asset::ICPUImageView> createDerivativeMapViewFromHeightMap(asset::ICPUImage* _inImg, asset::ISampler::E_TEXTURE_CLAMP _uwrap, asset::ISampler::E_TEXTURE_CLAMP _vwrap, asset::ISampler::E_TEXTURE_BORDER_COLOR _borderColor);
19+
};
20+
21+
}
22+
}
23+
24+
#endif

include/nbl/builtin/glsl/format/decode.glsl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define _NBL_BUILTIN_GLSL_FORMAT_DECODE_INCLUDED_
33

44
#include <nbl/builtin/glsl/format/constants.glsl>
5+
#include <nbl/builtin/glsl/math/quaternions.glsl>
56

67
vec3 nbl_glsl_decodeRGB19E7(in uvec2 x)
78
{
@@ -32,7 +33,7 @@ vec4 nbl_glsl_decodeRGB10A2(in uint x)
3233
nbl_glsl_quaternion_t nbl_glsl_decode8888Quaternion(in uint x)
3334
{
3435
nbl_glsl_quaternion_t quat;
35-
quat.data = normalize(unpackSnorm4x8(compressedQuatUint));
36+
quat.data = normalize(unpackSnorm4x8(x));
3637
return quat;
3738
}
3839

include/nbl/builtin/glsl/math/quaternions.glsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ nbl_glsl_quaternion_t nbl_glsl_quaternion_t_flerp(in nbl_glsl_quaternion_t start
4949

5050
const float interpolantPrecalcTerm = fraction-0.5f;
5151
const float interpolantPrecalcTerm3 = fraction*interpolantPrecalcTerm*(fraction-1.f);
52-
const float adjFrac = nbl_glsl_quaternion_t_flerp_adjustedinterpolant(abs(pseudoAngle),fraction,interpolantPrecalcTerm*interpolantPrecalcTerm,interpolantPrecalcTerm3);
52+
const float adjFrac = nbl_glsl_quaternion_t_flerp_impl_adj_interpolant(abs(pseudoAngle),fraction,interpolantPrecalcTerm*interpolantPrecalcTerm,interpolantPrecalcTerm3);
5353
nbl_glsl_quaternion_t quat = nbl_glsl_quaternion_t_lerp(start,end,adjFrac,pseudoAngle);
5454
quat.data = normalize(quat.data);
5555
return quat;

include/nbl/builtin/shader/loader/mtl/fragment_impl.glsl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,10 +166,9 @@ vec3 nbl_computeLighting(out nbl_glsl_IsotropicViewSurfaceInteraction out_intera
166166
{
167167
interaction.N = normalize(interaction.N);
168168

169-
float h = nbl_sample_bump(UV, dUV).x;
169+
vec2 dh = nbl_sample_bump(UV, dUV).xy;
170170

171-
vec2 dHdScreen = vec2(dFdx(h), dFdy(h));
172-
interaction.N = nbl_glsl_perturbNormal_heightMap(interaction.N, interaction.V.dPosdScreen, dHdScreen);
171+
interaction.N = nbl_glsl_perturbNormal_derivativeMap(interaction.N, dh, interaction.V.dPosdScreen, dUV);
173172
}
174173
#endif
175174
const vec3 L = -ViewPos;

include/nbl/ext/MitsubaLoader/CMitsubaLoader.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class CMitsubaLoader : public asset::IRenderpassIndependentPipelineLoader
4848
core::vector<SContext::shape_ass_type> loadShapeGroup(SContext& ctx, uint32_t hierarchyLevel, const CElementShape::ShapeGroup* shapegroup, const core::matrix3x4SIMD& relTform);
4949
SContext::shape_ass_type loadBasicShape(SContext& ctx, uint32_t hierarchyLevel, CElementShape* shape, const core::matrix3x4SIMD& relTform);
5050

51-
SContext::tex_ass_type cacheTexture(SContext& ctx, uint32_t hierarchyLevel, const CElementTexture* texture);
51+
SContext::tex_ass_type cacheTexture(SContext& ctx, uint32_t hierarchyLevel, const CElementTexture* texture, bool _restore = false);
5252

5353
SContext::bsdf_type getBSDFtreeTraversal(SContext& ctx, const CElementBSDF* bsdf);
5454
SContext::bsdf_type genBSDFtreeTraversal(SContext& ctx, const CElementBSDF* bsdf);

0 commit comments

Comments
 (0)