inline Ref<Accessor> ExportData(Asset& a, std::string& meshName, Ref<Buffer>& buffer, unsigned int count, void* data, AttribType::Value typeIn, AttribType::Value typeOut, ComponentType compType, bool isIndices = false) { if (!count || !data) return Ref<Accessor>(); unsigned int numCompsIn = AttribType::GetNumComponents(typeIn); unsigned int numCompsOut = AttribType::GetNumComponents(typeOut); unsigned int bytesPerComp = ComponentTypeSize(compType); size_t offset = buffer->byteLength; size_t length = count * numCompsOut * bytesPerComp; buffer->Grow(length); // bufferView Ref<BufferView> bv = a.bufferViews.Create(a.FindUniqueID(meshName, "view")); bv->buffer = buffer; bv->byteOffset = 0; bv->byteLength = length; //! The target that the WebGL buffer should be bound to. bv->target = isIndices ? BufferViewTarget_ELEMENT_ARRAY_BUFFER : BufferViewTarget_ARRAY_BUFFER; // accessor Ref<Accessor> acc = a.accessors.Create(a.FindUniqueID(meshName, "accessor")); acc->bufferView = bv; acc->byteOffset = unsigned(offset); acc->byteStride = 0; acc->componentType = compType; acc->count = count; acc->type = typeOut; // copy the data acc->WriteData(count, data, numCompsIn*bytesPerComp); return acc; }
inline Ref<Accessor> ExportData(Asset& a, std::string& meshName, Ref<Buffer>& buffer, unsigned int count, void* data, AttribType::Value typeIn, AttribType::Value typeOut, ComponentType compType, bool isIndices = false) { if (!count || !data) return Ref<Accessor>(); unsigned int numCompsIn = AttribType::GetNumComponents(typeIn); unsigned int numCompsOut = AttribType::GetNumComponents(typeOut); unsigned int bytesPerComp = ComponentTypeSize(compType); size_t offset = buffer->byteLength; // make sure offset is correctly byte-aligned, as required by spec size_t padding = offset % bytesPerComp; offset += padding; size_t length = count * numCompsOut * bytesPerComp; buffer->Grow(length + padding); // bufferView Ref<BufferView> bv = a.bufferViews.Create(a.FindUniqueID(meshName, "view")); bv->buffer = buffer; bv->byteOffset = unsigned(offset); bv->byteLength = length; //! The target that the WebGL buffer should be bound to. bv->byteStride = 0; bv->target = isIndices ? BufferViewTarget_ELEMENT_ARRAY_BUFFER : BufferViewTarget_ARRAY_BUFFER; // accessor Ref<Accessor> acc = a.accessors.Create(a.FindUniqueID(meshName, "accessor")); acc->bufferView = bv; acc->byteOffset = 0; acc->componentType = compType; acc->count = count; acc->type = typeOut; // calculate min and max values { // Allocate and initialize with large values. float float_MAX = 10000000000000.0f; for (unsigned int i = 0 ; i < numCompsOut ; i++) { acc->min.push_back( float_MAX); acc->max.push_back(-float_MAX); } // Search and set extreme values. float valueTmp; for (unsigned int i = 0 ; i < count ; i++) { for (unsigned int j = 0 ; j < numCompsOut ; j++) { if (numCompsOut == 1) { valueTmp = static_cast<unsigned short*>(data)[i]; } else { valueTmp = static_cast<aiVector3D*>(data)[i][j]; } if (valueTmp < acc->min[j]) { acc->min[j] = valueTmp; } if (valueTmp > acc->max[j]) { acc->max[j] = valueTmp; } } } } // copy the data acc->WriteData(count, data, numCompsIn*bytesPerComp); return acc; }