Skip to content

Commit dd2d011

Browse files
author
devsh
committed
add back old code
1 parent 7d00908 commit dd2d011

File tree

1 file changed

+131
-0
lines changed

1 file changed

+131
-0
lines changed

src/nbl/asset/utils/CPolygonGeometryManipulator.cpp

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,5 +149,136 @@ core::smart_refctd_ptr<ICPUPolygonGeometry> CPolygonGeometryManipulator::createS
149149
return CSmoothNormalGenerator::calculateNormals(inPolygon, enableWelding, epsilon, vxcmp);
150150
}
151151

152+
#if 0
153+
core::smart_refctd_ptr<ICPUMeshBuffer> CMeshManipulator::createMeshBufferFetchOptimized(const ICPUMeshBuffer* _inbuffer)
154+
{
155+
if (!_inbuffer)
156+
return nullptr;
157+
158+
const auto* pipeline = _inbuffer->getPipeline();
159+
const void* ind = _inbuffer->getIndices();
160+
if (!pipeline || !ind)
161+
return nullptr;
162+
163+
auto outbuffer = core::move_and_static_cast<ICPUMeshBuffer>(_inbuffer->clone(1u));
164+
outbuffer->setAttachedDescriptorSet(core::smart_refctd_ptr<ICPUDescriptorSet>(const_cast<ICPUDescriptorSet*>(_inbuffer->getAttachedDescriptorSet())));
165+
outbuffer->setSkin(
166+
SBufferBinding<ICPUBuffer>(reinterpret_cast<const SBufferBinding<ICPUBuffer>&>(_inbuffer->getInverseBindPoseBufferBinding())),
167+
SBufferBinding<ICPUBuffer>(reinterpret_cast<const SBufferBinding<ICPUBuffer>&>(_inbuffer->getJointAABBBufferBinding())),
168+
_inbuffer->getJointCount(),_inbuffer->getMaxJointsPerVertex()
169+
);
170+
171+
constexpr uint32_t MAX_ATTRIBS = asset::ICPUMeshBuffer::MAX_VERTEX_ATTRIB_COUNT;
172+
173+
// Find vertex count
174+
size_t vertexCount = IMeshManipulator::upperBoundVertexID(_inbuffer);
175+
176+
core::unordered_set<const ICPUBuffer*> buffers;
177+
for (size_t i = 0; i < MAX_ATTRIBS; ++i)
178+
if (auto* buf = _inbuffer->getAttribBoundBuffer(i).buffer.get())
179+
buffers.insert(buf);
180+
181+
size_t offsets[MAX_ATTRIBS];
182+
memset(offsets, -1, sizeof(offsets));
183+
E_FORMAT types[MAX_ATTRIBS];
184+
if (buffers.size() != 1)
185+
{
186+
size_t lastOffset = 0u;
187+
size_t lastSize = 0u;
188+
for (size_t i = 0; i < MAX_ATTRIBS; ++i)
189+
{
190+
if (_inbuffer->isAttributeEnabled(i))
191+
{
192+
types[i] = _inbuffer->getAttribFormat(i);
193+
194+
const uint32_t typeSz = getTexelOrBlockBytesize(types[i]);
195+
const size_t alignment = (typeSz/getFormatChannelCount(types[i]) == 8u) ? 8ull : 4ull; // if format 64bit per channel, then align to 8
196+
197+
offsets[i] = lastOffset + lastSize;
198+
const size_t mod = offsets[i] % alignment;
199+
offsets[i] += mod;
200+
201+
lastOffset = offsets[i];
202+
lastSize = typeSz;
203+
}
204+
}
205+
const size_t vertexSize = lastOffset + lastSize;
206+
207+
constexpr uint32_t NEW_VTX_BUF_BINDING = 0u;
208+
auto& vtxParams = outbuffer->getPipeline()->getCachedCreationParams().vertexInput;
209+
vtxParams = SVertexInputParams();
210+
vtxParams.enabledAttribFlags = _inbuffer->getPipeline()->getCachedCreationParams().vertexInput.enabledAttribFlags;
211+
vtxParams.enabledBindingFlags = 1u << NEW_VTX_BUF_BINDING;
212+
vtxParams.bindings[NEW_VTX_BUF_BINDING].stride = vertexSize;
213+
vtxParams.bindings[NEW_VTX_BUF_BINDING].inputRate = SVertexInputBindingParams::EVIR_PER_VERTEX;
214+
215+
auto newVertBuffer = ICPUBuffer::create({ vertexCount*vertexSize });
216+
outbuffer->setVertexBufferBinding({ 0u, core::smart_refctd_ptr(newVertBuffer) }, NEW_VTX_BUF_BINDING);
217+
for (size_t i = 0; i < MAX_ATTRIBS; ++i)
218+
{
219+
if (offsets[i] < 0xffffffff)
220+
{
221+
vtxParams.attributes[i].binding = NEW_VTX_BUF_BINDING;
222+
vtxParams.attributes[i].format = types[i];
223+
vtxParams.attributes[i].relativeOffset = offsets[i];
224+
}
225+
}
226+
}
227+
outbuffer->setBaseVertex(0);
228+
229+
core::vector<uint32_t> activeAttribs;
230+
for (size_t i = 0; i < MAX_ATTRIBS; ++i)
231+
if (outbuffer->isAttributeEnabled(i))
232+
activeAttribs.push_back(i);
233+
234+
uint32_t* remapBuffer = _NBL_NEW_ARRAY(uint32_t,vertexCount);
235+
memset(remapBuffer, 0xffffffffu, vertexCount*sizeof(uint32_t));
236+
237+
const E_INDEX_TYPE idxType = outbuffer->getIndexType();
238+
void* indices = outbuffer->getIndices();
239+
size_t nextVert = 0u;
240+
241+
for (size_t i = 0; i < outbuffer->getIndexCount(); ++i)
242+
{
243+
const uint32_t index = idxType == EIT_32BIT ? ((uint32_t*)indices)[i] : ((uint16_t*)indices)[i];
244+
245+
uint32_t& remap = remapBuffer[index];
246+
247+
if (remap == 0xffffffffu)
248+
{
249+
for (size_t j = 0; j < activeAttribs.size(); ++j)
250+
{
251+
E_FORMAT type = types[activeAttribs[j]];
252+
253+
if (!isNormalizedFormat(type) && (isIntegerFormat(type) || isScaledFormat(type)))
254+
{
255+
uint32_t dst[4];
256+
_inbuffer->getAttribute(dst, activeAttribs[j], index);
257+
outbuffer->setAttribute(dst, activeAttribs[j], nextVert);
258+
}
259+
else
260+
{
261+
core::vectorSIMDf dst;
262+
_inbuffer->getAttribute(dst, activeAttribs[j], index);
263+
outbuffer->setAttribute(dst, activeAttribs[j], nextVert);
264+
}
265+
}
266+
267+
remap = nextVert++;
268+
}
269+
270+
if (idxType == EIT_32BIT)
271+
((uint32_t*)indices)[i] = remap;
272+
else
273+
((uint16_t*)indices)[i] = remap;
274+
}
275+
276+
_NBL_DELETE_ARRAY(remapBuffer,vertexCount);
277+
278+
_NBL_DEBUG_BREAK_IF(nextVert > vertexCount)
279+
280+
return outbuffer;
281+
}
282+
#endif
152283
} // end namespace nbl::asset
153284

0 commit comments

Comments
 (0)