Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
 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;
 }