shared_ptr<GLTF::GLTFPrimitiveRemapInfos> __BuildPrimitiveUniqueIndexes(shared_ptr<GLTF::GLTFPrimitive> primitive, std::vector< shared_ptr<GLTF::GLTFIndices> > allIndices, RemappedMeshIndexesHashmap& remappedMeshIndexesMap, unsigned int* indicesInRemapping, size_t startIndex, unsigned int meshAttributesCount, size_t &endIndex) { unsigned int generatedIndicesCount = 0; size_t allIndicesSize = allIndices.size(); size_t vertexIndicesCount = allIndices[0]->getCount(); size_t sizeOfRemappedIndex = (meshAttributesCount + 1) * sizeof(unsigned int); unsigned int* originalCountAndIndexes = (unsigned int*)calloc( vertexIndicesCount, sizeOfRemappedIndex); //this is useful for debugging. unsigned int *uniqueIndexes = (unsigned int*)calloc( vertexIndicesCount , sizeof(unsigned int)); unsigned int *generatedIndices = (unsigned int*) calloc (vertexIndicesCount , sizeof(unsigned int)); //owned by PrimitiveRemapInfos unsigned int currentIndex = startIndex; for (size_t k = 0 ; k < vertexIndicesCount ; k++) { unsigned int* remappedIndex = &originalCountAndIndexes[k * (meshAttributesCount + 1)]; remappedIndex[0] = meshAttributesCount; for (unsigned int i = 0 ; i < allIndicesSize ; i++) { unsigned int idx = indicesInRemapping[i]; unsigned int* indicesPtr = (unsigned int*)allIndices[i]->getBufferView()->getBufferDataByApplyingOffset(); remappedIndex[1 + idx] = indicesPtr[k]; } unsigned int index; if (remappedMeshIndexesMap.count(remappedIndex) == 0) { index = currentIndex++; generatedIndices[generatedIndicesCount++] = (unsigned int)k; remappedMeshIndexesMap[remappedIndex] = index; } else { index = remappedMeshIndexesMap[remappedIndex]; } uniqueIndexes[k] = index; } endIndex = currentIndex; shared_ptr <GLTF::GLTFPrimitiveRemapInfos> primitiveRemapInfos(new GLTF::GLTFPrimitiveRemapInfos(generatedIndices, generatedIndicesCount, originalCountAndIndexes)); shared_ptr <GLTF::GLTFBufferView> indicesBufferView = createBufferViewWithAllocatedBuffer(uniqueIndexes, 0, vertexIndicesCount * sizeof(unsigned int), true); shared_ptr <GLTF::GLTFIndices> indices = shared_ptr <GLTF::GLTFIndices> (new GLTF::GLTFIndices(indicesBufferView, vertexIndicesCount)); primitive->setIndices(indices); return primitiveRemapInfos; }
shared_ptr<JSONExport::JSONPrimitiveRemapInfos> JSONPrimitive::buildUniqueIndexes(RemappedMeshIndexesHashmap& remappedMeshIndexesMap, unsigned int startIndex, unsigned int &endIndex) { //get indices[0] presumably the VERTEX size_t indicesCount = this->indicesCount(); //we reserve vertexCount * slices of [_allIndices.size() + 1] (for count) unsigned int generatedIndicesCount = 0; unsigned int vertexAttributesCount = _allIndices.size(); size_t sizeOfRemappedIndex = (vertexAttributesCount + 1) * sizeof(unsigned int); this->_originalCountAndIndexes = (unsigned int*)malloc( indicesCount * sizeOfRemappedIndex); unsigned int *uniqueIndexes = (unsigned int*)malloc( indicesCount * sizeof(unsigned int)); unsigned int* generatedIndices = (unsigned int*) malloc (indicesCount * sizeof(unsigned int)); //owned by PrimitiveRemapInfos unsigned int currentIndex = startIndex; for (int k = 0 ; k < indicesCount ; k++) { unsigned int* remappedIndex = &this->_originalCountAndIndexes[k * (vertexAttributesCount + 1)]; remappedIndex[0] = vertexAttributesCount; for (int i = 0 ; i < vertexAttributesCount ; i++) { //FIXME: test indirection in ->getBuffer.. remappedIndex[1 + i] = ((unsigned int*)(static_pointer_cast <JSONDataBuffer> (_allIndices[i]->getBuffer())->getData()))[k]; } unsigned int index = remappedMeshIndexesMap[remappedIndex]; if (index == 0) { index = currentIndex++; generatedIndices[generatedIndicesCount++] = k; remappedMeshIndexesMap[remappedIndex] = index; } uniqueIndexes[k] = index - 1; } endIndex = currentIndex; shared_ptr <JSONExport::JSONPrimitiveRemapInfos> primitiveRemapInfos(new JSONExport::JSONPrimitiveRemapInfos(generatedIndices, generatedIndicesCount)); shared_ptr <JSONExport::JSONDataBuffer> indicesBuffer(new JSONExport::JSONDataBuffer(uniqueIndexes, indicesCount * sizeof(unsigned int), true)); this->_uniqueIndices = shared_ptr <JSONExport::JSONIndices> (new JSONExport::JSONIndices(indicesBuffer, indicesCount, JSONExport::VERTEX, 0)); return primitiveRemapInfos; }