Skip to content

Commit d178fd5

Browse files
Example 18 compiles!
1 parent 6a1bc25 commit d178fd5

File tree

7 files changed

+267
-205
lines changed

7 files changed

+267
-205
lines changed

examples_tests/18.MitsubaLoader/main.cpp

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -419,15 +419,12 @@ int main()
419419
return 0.5f*core::length(differentialElementCrossProdcut).x;
420420
};
421421

422-
const auto* mesh_meta = static_cast<const ext::MitsubaLoader::CMitsubaMetadata::CMesh*>(globalMeta->getAssetSpecificMetadata(cpumesh.get()));
423-
const auto instances = mesh_meta->getInstances();
424-
for (size_t i=0u; i<instances.size(); i++)
422+
const auto* mesh_meta = globalMeta->getAssetSpecificMetadata(cpumesh.get());
423+
auto auxInstanceDataIt = mesh_meta->m_instanceAuxData.begin();
424+
for (const auto& inst : mesh_meta->m_instances)
425425
{
426-
const auto& inst = instances.begin()[i];
427-
for (const auto& inst : instances)
428-
sceneBound.addInternalBox(core::transformBoxEx(cpumesh->getBoundingBox(),inst.worldTform));
429-
const auto& aux = mesh_meta->m_instanceAuxData->operator[](i);
430-
if (aux.emitter.type==ext::MitsubaLoader::CElementEmitter::AREA)
426+
sceneBound.addInternalBox(core::transformBoxEx(cpumesh->getBoundingBox(),inst.worldTform));
427+
if (auxInstanceDataIt->frontEmitter.type==ext::MitsubaLoader::CElementEmitter::AREA)
431428
{
432429
core::vectorSIMDf pos;
433430
assert(cpumesh->getMeshBuffers().size()==1u);
@@ -436,11 +433,12 @@ int main()
436433
inst.worldTform.pseudoMulWith4x1(pos);
437434

438435
SLight l;
439-
l.intensity = aux.emitter.area.radiance*area*2.f*core::PI<float>();
436+
l.intensity = auxInstanceDataIt->frontEmitter.area.radiance*area*2.f*core::PI<float>();
440437
l.position = pos;
441438

442439
lights.push_back(l);
443440
}
441+
auxInstanceDataIt++;
444442
}
445443
}
446444

include/nbl/asset/metadata/IMeshMetadata.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ class IMeshMetadata : public core::Interface
2323
core::SRange<const SInstance> m_instances;
2424

2525
protected:
26-
IMeshMetadata() = default;
26+
IMeshMetadata() : m_instances(nullptr,nullptr) {}
27+
IMeshMetadata(core::SRange<const SInstance>&& _instances) : m_instances(std::move(_instances)) {}
2728
virtual ~IMeshMetadata() = default;
2829

2930
inline IMeshMetadata& operator=(IMeshMetadata&& other)

include/nbl/ext/MitsubaLoader/CMitsubaLoader.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ namespace MitsubaLoader
2626
class CElementBSDF;
2727
class CMitsubaMaterialCompilerFrontend;
2828

29-
class CMitsubaLoader : public asset::IAssetLoader
29+
class CMitsubaLoader : public asset::IRenderpassIndependentPipelineLoader
3030
{
3131
friend class CMitsubaMaterialCompilerFrontend;
3232
public:
@@ -36,7 +36,6 @@ class CMitsubaLoader : public asset::IAssetLoader
3636
void initialize() override;
3737

3838
protected:
39-
asset::IAssetManager* m_manager;
4039
io::IFileSystem* m_filesystem;
4140

4241
//! Destructor

include/nbl/ext/MitsubaLoader/CMitsubaMetadata.h

Lines changed: 100 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,35 +28,49 @@ class CMitsubaMetadata : public asset::IAssetMetadata
2828
class CID
2929
{
3030
public:
31-
const std::string id;
31+
std::string m_id;
3232
};
3333
class CRenderpassIndependentPipeline : public asset::IRenderpassIndependentPipelineMetadata
3434
{
3535
public:
36-
using IRenderpassIndependentPipelineMetadata::IRenderpassIndependentPipelineMetadata;
37-
36+
CRenderpassIndependentPipeline() : IRenderpassIndependentPipelineMetadata(), m_ds0() {}
3837
template<typename... Args>
39-
CRenderpassIndependentPipeline(uint32_t _hash, Args&&... args) : IRenderpassIndependentPipelineMetadata(std::forward<Args>(args)...), m_hash(_hash)
38+
CRenderpassIndependentPipeline(core::smart_refctd_ptr<asset::ICPUDescriptorSet>&& _ds0, Args&&... args) : IRenderpassIndependentPipelineMetadata(std::forward<Args>(args)...), m_ds0(std::move(_ds0))
4039
{
4140
}
4241

4342
inline CRenderpassIndependentPipeline& operator=(CRenderpassIndependentPipeline&& other)
4443
{
4544
IRenderpassIndependentPipelineMetadata::operator=(std::move(other));
46-
std::swap(m_hash, other.m_hash);
45+
std::swap(m_ds0, other.m_ds0);
4746
return *this;
4847
}
4948

50-
uint32_t m_hash;
49+
core::smart_refctd_ptr<asset::ICPUDescriptorSet> m_ds0;
5150
};
5251
class CMesh : public asset::IMeshMetadata, public CID
5352
{
5453
public:
55-
struct InstanceAuxilaryData
54+
CMesh() : IMeshMetadata(), CID(), m_instanceAuxData(nullptr,nullptr), type(CElementShape::Type::INVALID) {}
55+
~CMesh() {}
56+
57+
struct SInstanceAuxilaryData
5658
{
57-
CElementEmitter emitter; // type is invalid if not used
58-
SContext::bsdf_type bsdf;
59+
SInstanceAuxilaryData& operator=(SInstanceAuxilaryData&& other)
60+
{
61+
frontEmitter = std::move(other.frontEmitter);
62+
backEmitter = std::move(other.backEmitter);
63+
bsdf = std::move(other.bsdf);
64+
return *this;
65+
}
66+
67+
CElementEmitter frontEmitter; // type is invalid if not used
68+
CElementEmitter backEmitter; // type is invalid if not used
69+
CMitsubaMaterialCompilerFrontend::front_and_back_t bsdf;
5970
};
71+
72+
core::SRange<const SInstanceAuxilaryData> m_instanceAuxData;
73+
6074
CElementShape::Type type;
6175
};
6276
struct SGlobal
@@ -77,16 +91,87 @@ class CMitsubaMetadata : public asset::IAssetMetadata
7791
std::string m_materialCompilerGLSL_source;
7892
} m_global;
7993

80-
//! No idea how to make it work yet
81-
//CMitsubaMetadata(core::smart_refctd_ptr<CGlobalMitsubaMetadata> _mitsubaMetadata) : mitsubaMetadata(std::move(_mitsubaMetadata)) {}
82-
CMitsubaMetadata() {} // TODO
83-
84-
_NBL_STATIC_INLINE_CONSTEXPR const char* loaderName = "ext::MitsubaLoader::CMitsubaLoader";
85-
const char* getLoaderName() const override { return loaderName; }
94+
CMitsubaMetadata() :
95+
IAssetMetadata(), m_metaPplnStorage(), m_semanticStorage(), m_metaPplnStorageIt(nullptr),
96+
m_metaMeshStorage(), m_metaMeshInstanceStorage(), m_metaMeshInstanceAuxStorage(),
97+
m_meshStorageIt(nullptr), m_instanceStorageIt(nullptr), m_instanceAuxStorageIt(nullptr)
98+
{
99+
}
100+
101+
_NBL_STATIC_INLINE_CONSTEXPR const char* LoaderName = "ext::MitsubaLoader::CMitsubaLoader";
102+
const char* getLoaderName() const override { return LoaderName; }
103+
104+
//!
105+
inline const CRenderpassIndependentPipeline* getAssetSpecificMetadata(const asset::ICPURenderpassIndependentPipeline* asset) const
106+
{
107+
const auto found = IAssetMetadata::getAssetSpecificMetadata(asset);
108+
return static_cast<const CRenderpassIndependentPipeline*>(found);
109+
}
110+
inline const CMesh* getAssetSpecificMetadata(const asset::ICPUMesh* asset) const
111+
{
112+
const auto found = IAssetMetadata::getAssetSpecificMetadata(asset);
113+
return static_cast<const CMesh*>(found);
114+
}
86115

87116
private:
117+
friend class CMitsubaLoader;
118+
88119
meta_container_t<CRenderpassIndependentPipeline> m_metaPplnStorage;
120+
core::smart_refctd_dynamic_array<asset::IRenderpassIndependentPipelineMetadata::ShaderInputSemantic> m_semanticStorage;
121+
CRenderpassIndependentPipeline* m_metaPplnStorageIt;
122+
89123
meta_container_t<CMesh> m_metaMeshStorage;
124+
core::smart_refctd_dynamic_array<CMesh::SInstance> m_metaMeshInstanceStorage;
125+
core::smart_refctd_dynamic_array<CMesh::SInstanceAuxilaryData> m_metaMeshInstanceAuxStorage;
126+
CMesh* m_meshStorageIt;
127+
CMesh::SInstance* m_instanceStorageIt;
128+
CMesh::SInstanceAuxilaryData* m_instanceAuxStorageIt;
129+
130+
inline void reservePplnStorage(uint32_t pplnCount, core::smart_refctd_dynamic_array<asset::IRenderpassIndependentPipelineMetadata::ShaderInputSemantic>&& _semanticStorage)
131+
{
132+
m_metaPplnStorage = IAssetMetadata::createContainer<CRenderpassIndependentPipeline>(pplnCount);
133+
m_semanticStorage = std::move(_semanticStorage);
134+
m_metaPplnStorageIt = m_metaPplnStorage->begin();
135+
}
136+
inline void reserveMeshStorage(uint32_t meshCount, uint32_t instanceCount)
137+
{
138+
m_metaMeshStorage = IAssetMetadata::createContainer<CMesh>(meshCount);
139+
m_metaMeshInstanceStorage = IAssetMetadata::createContainer<CMesh::SInstance>(instanceCount);
140+
m_metaMeshInstanceAuxStorage = IAssetMetadata::createContainer<CMesh::SInstanceAuxilaryData>(instanceCount);
141+
m_meshStorageIt = m_metaMeshStorage->begin();
142+
m_instanceStorageIt = m_metaMeshInstanceStorage->begin();
143+
m_instanceAuxStorageIt = m_metaMeshInstanceAuxStorage->begin();
144+
}
145+
inline void addPplnMeta(const asset::ICPURenderpassIndependentPipeline* ppln, core::smart_refctd_ptr<asset::ICPUDescriptorSet>&& _ds0)
146+
{
147+
*m_metaPplnStorageIt = CMitsubaMetadata::CRenderpassIndependentPipeline(std::move(_ds0),core::SRange<const asset::IRenderpassIndependentPipelineMetadata::ShaderInputSemantic>(m_semanticStorage->begin(),m_semanticStorage->end()));
148+
IAssetMetadata::insertAssetSpecificMetadata(ppln,m_metaPplnStorageIt);
149+
m_metaPplnStorageIt++;
150+
}
151+
template<typename InstanceIterator>
152+
inline uint32_t addMeshMeta(const asset::ICPUMesh* mesh, std::string&& id, const CElementShape::Type type, InstanceIterator instancesBegin, InstanceIterator instancesEnd)
153+
{
154+
auto instanceStorageBegin = m_instanceStorageIt;
155+
auto instanceAuxStorageBegin = m_instanceAuxStorageIt;
156+
157+
auto* meta = m_meshStorageIt++;
158+
meta->m_id = std::move(id);
159+
{
160+
// copy instance data
161+
for (auto it=instancesBegin; it!=instancesEnd; ++it)
162+
{
163+
auto& inst = it->second;
164+
(m_instanceStorageIt++)->worldTform = inst.tform;
165+
*(m_instanceAuxStorageIt++) = {inst.emitter.front,inst.emitter.back,inst.bsdf};
166+
}
167+
meta->m_instances = { instanceStorageBegin,m_instanceStorageIt };
168+
meta->m_instanceAuxData = { instanceAuxStorageBegin,m_instanceAuxStorageIt };
169+
}
170+
meta->type = type;
171+
IAssetMetadata::insertAssetSpecificMetadata(mesh,meta);
172+
173+
return meta->m_instances.size();
174+
}
90175
};
91176

92177
}

include/nbl/ext/MitsubaLoader/CMitsubaSerializedMetadata.h

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,18 @@ class CMitsubaSerializedMetadata final : public asset::IAssetMetadata
2222
class CRenderpassIndependentPipeline : public asset::IRenderpassIndependentPipelineMetadata
2323
{
2424
public:
25-
using IRenderpassIndependentPipelineMetadata::IRenderpassIndependentPipelineMetadata;
25+
CRenderpassIndependentPipeline(CRenderpassIndependentPipeline&& _other) : CRenderpassIndependentPipeline()
26+
{
27+
CRenderpassIndependentPipeline::operator=(std::move(_other));
28+
}
29+
template<typename... Args>
30+
CRenderpassIndependentPipeline(Args&&... args) : IRenderpassIndependentPipelineMetadata(std::forward<Args>(args)...) {}
31+
32+
inline CRenderpassIndependentPipeline& operator=(CRenderpassIndependentPipeline&& other)
33+
{
34+
IRenderpassIndependentPipelineMetadata::operator=(std::move(other));
35+
return *this;
36+
}
2637
};
2738
class CMesh : public asset::IMeshMetadata
2839
{
@@ -35,22 +46,35 @@ class CMitsubaSerializedMetadata final : public asset::IAssetMetadata
3546
uint32_t m_id;
3647
};
3748

38-
CMitsubaSerializedMetadata(const uint32_t meshBound) :
39-
m_pipelineStorage(IAssetMetadata::createContainer<CRenderpassIndependentPipeline>(meshBound)), m_meshStorage(IAssetMetadata::createContainer<CMesh>(meshBound))
49+
CMitsubaSerializedMetadata(const uint32_t meshBound, core::smart_refctd_dynamic_array<asset::IRenderpassIndependentPipelineMetadata::ShaderInputSemantic>&& _semanticStorage) :
50+
m_pipelineStorage(asset::IAssetMetadata::createContainer<CRenderpassIndependentPipeline>(meshBound)), m_meshStorage(asset::IAssetMetadata::createContainer<CMesh>(meshBound)), m_semanticStorage(std::move(_semanticStorage))
4051
{
4152
}
4253

4354
_NBL_STATIC_INLINE_CONSTEXPR const char* LoaderName = "ext::MitsubaLoader::CSerializedLoader";
4455
const char* getLoaderName() const override { return LoaderName; }
4556

57+
//!
58+
inline const CRenderpassIndependentPipeline* getAssetSpecificMetadata(const asset::ICPURenderpassIndependentPipeline* asset) const
59+
{
60+
const auto found = IAssetMetadata::getAssetSpecificMetadata(asset);
61+
return static_cast<const CRenderpassIndependentPipeline*>(found);
62+
}
63+
inline const CMesh* getAssetSpecificMetadata(const asset::ICPUMesh* asset) const
64+
{
65+
const auto found = IAssetMetadata::getAssetSpecificMetadata(asset);
66+
return static_cast<const CMesh*>(found);
67+
}
68+
4669
private:
4770
meta_container_t<CRenderpassIndependentPipeline> m_pipelineStorage;
4871
meta_container_t<CMesh> m_meshStorage;
72+
core::smart_refctd_dynamic_array<asset::IRenderpassIndependentPipelineMetadata::ShaderInputSemantic> m_semanticStorage;
4973

5074
friend class CSerializedLoader;
51-
inline void placeMeta(uint32_t offset, const ICPURenderpassIndependentPipeline* ppln, CRenderpassIndependentPipeline&& pplnMeta, const ICPUMesh* mesh, CMesh&& meshMeta)
75+
inline void placeMeta(uint32_t offset, const asset::ICPURenderpassIndependentPipeline* ppln, const asset::ICPUMesh* mesh, CMesh&& meshMeta)
5276
{
53-
auto& pplnMetaRef = m_pipelineStorage->operator[](offset) = std::move(pplnMeta);
77+
auto& pplnMetaRef = m_pipelineStorage->operator[](offset) = CRenderpassIndependentPipeline(core::SRange<const asset::IRenderpassIndependentPipelineMetadata::ShaderInputSemantic>(m_semanticStorage->begin(),m_semanticStorage->end()));
5478
auto& meshMetaRef = m_meshStorage->operator[](offset) = std::move(meshMeta);
5579
IAssetMetadata::insertAssetSpecificMetadata(ppln,&pplnMetaRef);
5680
IAssetMetadata::insertAssetSpecificMetadata(mesh,&meshMetaRef);

0 commit comments

Comments
 (0)