@@ -28,35 +28,49 @@ class CMitsubaMetadata : public asset::IAssetMetadata
28
28
class CID
29
29
{
30
30
public:
31
- const std::string id ;
31
+ std::string m_id ;
32
32
};
33
33
class CRenderpassIndependentPipeline : public asset ::IRenderpassIndependentPipelineMetadata
34
34
{
35
35
public:
36
- using IRenderpassIndependentPipelineMetadata::IRenderpassIndependentPipelineMetadata;
37
-
36
+ CRenderpassIndependentPipeline () : IRenderpassIndependentPipelineMetadata(), m_ds0() {}
38
37
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) )
40
39
{
41
40
}
42
41
43
42
inline CRenderpassIndependentPipeline& operator =(CRenderpassIndependentPipeline&& other)
44
43
{
45
44
IRenderpassIndependentPipelineMetadata::operator =(std::move (other));
46
- std::swap (m_hash , other.m_hash );
45
+ std::swap (m_ds0 , other.m_ds0 );
47
46
return *this ;
48
47
}
49
48
50
- uint32_t m_hash ;
49
+ core::smart_refctd_ptr<asset::ICPUDescriptorSet> m_ds0 ;
51
50
};
52
51
class CMesh : public asset ::IMeshMetadata, public CID
53
52
{
54
53
public:
55
- struct InstanceAuxilaryData
54
+ CMesh () : IMeshMetadata(), CID(), m_instanceAuxData(nullptr ,nullptr ), type(CElementShape::Type::INVALID) {}
55
+ ~CMesh () {}
56
+
57
+ struct SInstanceAuxilaryData
56
58
{
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;
59
70
};
71
+
72
+ core::SRange<const SInstanceAuxilaryData> m_instanceAuxData;
73
+
60
74
CElementShape::Type type;
61
75
};
62
76
struct SGlobal
@@ -77,16 +91,87 @@ class CMitsubaMetadata : public asset::IAssetMetadata
77
91
std::string m_materialCompilerGLSL_source;
78
92
} m_global;
79
93
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
+ }
86
115
87
116
private:
117
+ friend class CMitsubaLoader ;
118
+
88
119
meta_container_t <CRenderpassIndependentPipeline> m_metaPplnStorage;
120
+ core::smart_refctd_dynamic_array<asset::IRenderpassIndependentPipelineMetadata::ShaderInputSemantic> m_semanticStorage;
121
+ CRenderpassIndependentPipeline* m_metaPplnStorageIt;
122
+
89
123
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
+ }
90
175
};
91
176
92
177
}
0 commit comments