From f6720271cb7f58084695e9cff2a9f3b3640b4525 Mon Sep 17 00:00:00 2001 From: Yingying Wang Date: Fri, 15 May 2020 12:20:31 -0700 Subject: [PATCH 001/129] sparce accessor exporter --- code/AssetLib/glTF2/glTF2Asset.h | 24 ++++ code/AssetLib/glTF2/glTF2Asset.inl | 130 ++++++++++++++++++- code/AssetLib/glTF2/glTF2AssetWriter.inl | 48 +++++-- code/AssetLib/glTF2/glTF2Exporter.cpp | 156 ++++++++++++++++++++++- 4 files changed, 346 insertions(+), 12 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Asset.h b/code/AssetLib/glTF2/glTF2Asset.h index 48dab24a7..a60ac98f3 100644 --- a/code/AssetLib/glTF2/glTF2Asset.h +++ b/code/AssetLib/glTF2/glTF2Asset.h @@ -367,6 +367,7 @@ struct Object { //! An accessor provides a typed view into a BufferView or a subset of a BufferView //! similar to how WebGL's vertexAttribPointer() defines an attribute in a buffer. struct Accessor : public Object { + struct Sparse; //wangyi 0506 Ref bufferView; //!< The ID of the bufferView. (required) size_t byteOffset; //!< The offset relative to the start of the bufferView in bytes. (required) ComponentType componentType; //!< The datatype of components in the attribute. (required) @@ -374,6 +375,7 @@ struct Accessor : public Object { AttribType::Value type; //!< Specifies if the attribute is a scalar, vector, or matrix. (required) std::vector max; //!< Maximum value of each component in this attribute. std::vector min; //!< Minimum value of each component in this attribute. + std::unique_ptr sparse; //wangyi 0506 unsigned int GetNumComponents(); unsigned int GetBytesPerComponent(); @@ -385,6 +387,10 @@ struct Accessor : public Object { void ExtractData(T *&outData); void WriteData(size_t count, const void *src_buffer, size_t src_stride); + //wangyi 0506 + void WriteSparseValues(size_t count, const void *src_data, size_t src_dataStride); + void WriteSparseIndices(size_t count, const void *src_idx, size_t src_idxStride); + //! Helper class to iterate the data class Indexer { @@ -423,6 +429,22 @@ struct Accessor : public Object { Accessor() {} void Read(Value &obj, Asset &r); + + //wangyi 0506 + //sparse + struct Sparse { + size_t count; + ComponentType indicesType; + Ref indices; + size_t indicesByteOffset; + Ref values; + size_t valuesByteOffset; + + std::vector data; //!< Actual data, which may be defaulted to an array of zeros or the original data, with the sparse buffer view applied on top of it. + + void PopulateData(size_t numBytes, uint8_t *bytes); + void PatchData(unsigned int elementSize); + }; }; //! A buffer points to binary geometry, animation, or skins. @@ -555,6 +577,8 @@ struct BufferView : public Object { BufferViewTarget target; //! The target that the WebGL buffer should be bound to. void Read(Value &obj, Asset &r); + //wangyi 0506 + uint8_t *GetPointer(size_t accOffset); }; struct Camera : public Object { diff --git a/code/AssetLib/glTF2/glTF2Asset.inl b/code/AssetLib/glTF2/glTF2Asset.inl index 881fd4efc..09fd48761 100644 --- a/code/AssetLib/glTF2/glTF2Asset.inl +++ b/code/AssetLib/glTF2/glTF2Asset.inl @@ -550,10 +550,67 @@ inline void BufferView::Read(Value &obj, Asset &r) { byteStride = MemberOrDefault(obj, "byteStride", 0u); } +//wangyi 0506 +inline uint8_t *BufferView::GetPointer(size_t accOffset) { + if (!buffer) return 0; + uint8_t *basePtr = buffer->GetPointer(); + if (!basePtr) return 0; + + size_t offset = accOffset + byteOffset; + if (buffer->EncodedRegion_Current != nullptr) { + const size_t begin = buffer->EncodedRegion_Current->Offset; + const size_t end = begin + buffer->EncodedRegion_Current->DecodedData_Length; + if ((offset >= begin) && (offset < end)) + return &buffer->EncodedRegion_Current->DecodedData[offset - begin]; + } + + return basePtr + offset; +} + // // struct Accessor // +//wangyi 0506 +inline void Accessor::Sparse::PopulateData(size_t numBytes, uint8_t *bytes) { + if (bytes) { + data.assign(bytes, bytes + numBytes); + } else { + data.resize(numBytes, 0x00); + } +} + +inline void Accessor::Sparse::PatchData(unsigned int elementSize) { + uint8_t *pIndices = indices->GetPointer(indicesByteOffset); + const unsigned int indexSize = int(ComponentTypeSize(indicesType)); + uint8_t *indicesEnd = pIndices + count * indexSize; + + uint8_t *pValues = values->GetPointer(valuesByteOffset); + while (pIndices != indicesEnd) { + size_t offset; + switch (indicesType) { + case ComponentType_UNSIGNED_BYTE: + offset = *pIndices; + break; + case ComponentType_UNSIGNED_SHORT: + offset = *reinterpret_cast(pIndices); + break; + case ComponentType_UNSIGNED_INT: + offset = *reinterpret_cast(pIndices); + break; + default: + // have fun with float and negative values from signed types as indices. + throw DeadlyImportError("Unsupported component type in index."); + } + + offset *= elementSize; + std::memcpy(data.data() + offset, pValues, elementSize); + + pValues += elementSize; + pIndices += indexSize; + } +} +// wangyi 0506 inline void Accessor::Read(Value &obj, Asset &r) { if (Value *bufferViewVal = FindUInt(obj, "bufferView")) { @@ -566,6 +623,43 @@ inline void Accessor::Read(Value &obj, Asset &r) { const char *typestr; type = ReadMember(obj, "type", typestr) ? AttribType::FromString(typestr) : AttribType::SCALAR; + + //wangyi 0506 + if (Value *sparseValue = FindObject(obj, "sparse")) { + sparse.reset(new Sparse); + // count + ReadMember(*sparseValue, "count", sparse->count); + + // indices + if (Value *indicesValue = FindObject(*sparseValue, "indices")) { + //indices bufferView + Value *indiceViewID = FindUInt(*indicesValue, "bufferView"); + sparse->indices = r.bufferViews.Retrieve(indiceViewID->GetUint()); + //indices byteOffset + sparse->indicesByteOffset = MemberOrDefault(*indicesValue, "byteOffset", size_t(0)); + //indices componentType + sparse->indicesType = MemberOrDefault(*indicesValue, "componentType", ComponentType_BYTE); + //sparse->indices->Read(*indicesValue, r); + } + + // value + if (Value *valuesValue = FindObject(*sparseValue, "values")) { + //value bufferView + Value *valueViewID = FindUInt(*valuesValue, "bufferView"); + sparse->values = r.bufferViews.Retrieve(valueViewID->GetUint()); + //value byteOffset + sparse->valuesByteOffset = MemberOrDefault(*valuesValue, "byteOffset", size_t(0)); + //sparse->values->Read(*valuesValue, r); + } + + // indicesType + sparse->indicesType = MemberOrDefault(*sparseValue, "componentType", ComponentType_UNSIGNED_SHORT); + + const unsigned int elementSize = GetElementSize(); + const size_t dataSize = count * elementSize; + sparse->PopulateData(dataSize, bufferView ? bufferView->GetPointer(byteOffset) : 0); + sparse->PatchData(elementSize); + } } inline unsigned int Accessor::GetNumComponents() { @@ -580,7 +674,11 @@ inline unsigned int Accessor::GetElementSize() { return GetNumComponents() * GetBytesPerComponent(); } +// wangyi 0506 inline uint8_t *Accessor::GetPointer() { + if (sparse) + return sparse->data.data(); + if (!bufferView || !bufferView->buffer) return 0; uint8_t *basePtr = bufferView->buffer->GetPointer(); if (!basePtr) return 0; @@ -635,7 +733,8 @@ void Accessor::ExtractData(T *&outData) const size_t targetElemSize = sizeof(T); ai_assert(elemSize <= targetElemSize); - ai_assert(count * stride <= bufferView->byteLength); + //wangyi 0506 + ai_assert(count * stride <= (bufferView ? bufferView->byteLength : sparse->data.size())); outData = new T[count]; if (stride == elemSize && targetElemSize == elemSize) { @@ -660,6 +759,35 @@ inline void Accessor::WriteData(size_t _count, const void *src_buffer, size_t sr CopyData(_count, src, src_stride, dst, dst_stride); } +//wangyi 0506 +inline void Accessor::WriteSparseValues(size_t _count, const void *src_data, size_t src_dataStride) { + if (!sparse) + return; + + // values + uint8_t *value_buffer_ptr = sparse->values->buffer->GetPointer(); + size_t value_offset = sparse->valuesByteOffset + sparse->values->byteOffset; + size_t value_dst_stride = GetNumComponents() * GetBytesPerComponent(); + const uint8_t *value_src = reinterpret_cast(src_data); + uint8_t *value_dst = reinterpret_cast(value_buffer_ptr + value_offset); + ai_assert(value_dst + _count * value_dst_stride <= value_buffer_ptr + sparse->values->buffer->byteLength); + CopyData(_count, value_src, src_dataStride, value_dst, value_dst_stride); +} + +//wangyi 0506 +inline void Accessor::WriteSparseIndices(size_t _count, const void *src_idx, size_t src_idxStride) { + if (!sparse) + return; + + // indices + uint8_t *indices_buffer_ptr = sparse->indices->buffer->GetPointer(); + size_t indices_offset = sparse->indicesByteOffset + sparse->indices->byteOffset; + size_t indices_dst_stride = 1 * sizeof(unsigned short); + const uint8_t *indices_src = reinterpret_cast(src_idx); + uint8_t *indices_dst = reinterpret_cast(indices_buffer_ptr + indices_offset); + ai_assert(indices_dst + _count * indices_dst_stride <= indices_buffer_ptr + sparse->indices->buffer->byteLength); + CopyData(_count, indices_src, src_idxStride, indices_dst, indices_dst_stride); +} inline Accessor::Indexer::Indexer(Accessor &acc) : accessor(acc), data(acc.GetPointer()), elemSize(acc.GetElementSize()), stride(acc.bufferView && acc.bufferView->byteStride ? acc.bufferView->byteStride : elemSize) { } diff --git a/code/AssetLib/glTF2/glTF2AssetWriter.inl b/code/AssetLib/glTF2/glTF2AssetWriter.inl index 798f38c1c..5e936384f 100644 --- a/code/AssetLib/glTF2/glTF2AssetWriter.inl +++ b/code/AssetLib/glTF2/glTF2AssetWriter.inl @@ -107,21 +107,49 @@ namespace glTF2 { inline void Write(Value& obj, Accessor& a, AssetWriter& w) { - obj.AddMember("bufferView", a.bufferView->index, w.mAl); - obj.AddMember("byteOffset", (unsigned int)a.byteOffset, w.mAl); + //wangyi 0506 + if (a.bufferView) { + obj.AddMember("bufferView", a.bufferView->index, w.mAl); + obj.AddMember("byteOffset", (unsigned int)a.byteOffset, w.mAl); + Value vTmpMax, vTmpMin; + if (a.componentType == ComponentType_FLOAT) { + obj.AddMember("max", MakeValue(vTmpMax, a.max, w.mAl), w.mAl); + obj.AddMember("min", MakeValue(vTmpMin, a.min, w.mAl), w.mAl); + } else { + obj.AddMember("max", MakeValueCast(vTmpMax, a.max, w.mAl), w.mAl); + obj.AddMember("min", MakeValueCast(vTmpMin, a.min, w.mAl), w.mAl); + } + } obj.AddMember("componentType", int(a.componentType), w.mAl); obj.AddMember("count", (unsigned int)a.count, w.mAl); obj.AddMember("type", StringRef(AttribType::ToString(a.type)), w.mAl); - Value vTmpMax, vTmpMin; - if (a.componentType == ComponentType_FLOAT) { - obj.AddMember("max", MakeValue(vTmpMax, a.max, w.mAl), w.mAl); - obj.AddMember("min", MakeValue(vTmpMin, a.min, w.mAl), w.mAl); - } else { - obj.AddMember("max", MakeValueCast(vTmpMax, a.max, w.mAl), w.mAl); - obj.AddMember("min", MakeValueCast(vTmpMin, a.min, w.mAl), w.mAl); - } + // wangyi 0506 + if (a.sparse) { + Value sparseValue; + sparseValue.SetObject(); + + //count + sparseValue.AddMember("count", (unsigned int)a.sparse->count, w.mAl); + + //indices + Value indices; + indices.SetObject(); + indices.AddMember("bufferView", a.sparse->indices->index, w.mAl); + indices.AddMember("byteOffset", (unsigned int)a.sparse->indicesByteOffset, w.mAl); + indices.AddMember("componentType", int(a.sparse->indicesType), w.mAl); + sparseValue.AddMember("indices", indices, w.mAl); + + //values + Value values; + values.SetObject(); + values.AddMember("bufferView", a.sparse->values->index, w.mAl); + values.AddMember("byteOffset", (unsigned int)a.sparse->valuesByteOffset, w.mAl); + sparseValue.AddMember("values", values, w.mAl); + + obj.AddMember("sparse", sparseValue, w.mAl); + } } inline void Write(Value& obj, Animation& a, AssetWriter& w) diff --git a/code/AssetLib/glTF2/glTF2Exporter.cpp b/code/AssetLib/glTF2/glTF2Exporter.cpp index da6d9ab2e..8d6471db2 100644 --- a/code/AssetLib/glTF2/glTF2Exporter.cpp +++ b/code/AssetLib/glTF2/glTF2Exporter.cpp @@ -207,6 +207,152 @@ inline void SetAccessorRange(ComponentType compType, Ref acc, void* da } } +// wangyi 0506 +// compute the (data-dataBase), store the non-zero data items +template +size_t NZDiff(void *data, void *dataBase, size_t count, unsigned int numCompsIn, unsigned int numCompsOut, void *&outputNZDiff, void *&outputNZIdx) { + std::vector vNZDiff; + std::vector vNZIdx; + size_t totalComps = count * numCompsIn; + T *bufferData_ptr = static_cast(data); + T *bufferData_end = bufferData_ptr + totalComps; + T *bufferBase_ptr = static_cast(dataBase); + + // Search and set extreme values. + for (short idx = 0; bufferData_ptr < bufferData_end; idx += 1, bufferData_ptr += numCompsIn) { + bool bNonZero = false; + + //for the data, check any component Non Zero + for (unsigned int j = 0; j < numCompsOut; j++) { + double valueData = bufferData_ptr[j]; + double valueBase = bufferBase_ptr ? bufferBase_ptr[j] : 0; + if ((valueData - valueBase) != 0) { + bNonZero = true; + break; + } + } + + //all zeros, continue + if (!bNonZero) + continue; + + //non zero, store the data + for (unsigned int j = 0; j < numCompsOut; j++) { + T valueData = bufferData_ptr[j]; + T valueBase = bufferBase_ptr ? bufferBase_ptr[j] : 0; + vNZDiff.push_back(valueData - valueBase); + } + vNZIdx.push_back(idx); + } + + //process data + outputNZDiff = new T[vNZDiff.size()]; + memcpy(outputNZDiff, vNZDiff.data(), vNZDiff.size() * sizeof(T)); + + outputNZIdx = new unsigned short[vNZIdx.size()]; + memcpy(outputNZIdx, vNZIdx.data(), vNZIdx.size() * sizeof(unsigned short)); + return vNZIdx.size(); +} + +inline size_t NZDiff(ComponentType compType, void *data, void *dataBase, size_t count, unsigned int numCompsIn, unsigned int numCompsOut, void *&nzDiff, void *&nzIdx) { + switch (compType) { + case ComponentType_SHORT: + return NZDiff(data, dataBase, count, numCompsIn, numCompsOut, nzDiff, nzIdx); + case ComponentType_UNSIGNED_SHORT: + return NZDiff(data, dataBase, count, numCompsIn, numCompsOut, nzDiff, nzIdx); + case ComponentType_UNSIGNED_INT: + return NZDiff(data, dataBase, count, numCompsIn, numCompsOut, nzDiff, nzIdx); + case ComponentType_FLOAT: + return NZDiff(data, dataBase, count, numCompsIn, numCompsOut, nzDiff, nzIdx); + case ComponentType_BYTE: + return NZDiff(data, dataBase, count, numCompsIn, numCompsOut, nzDiff, nzIdx); + case ComponentType_UNSIGNED_BYTE: + return NZDiff(data, dataBase, count, numCompsIn, numCompsOut, nzDiff, nzIdx); + } + return 0; +} +// wangyi 0506 +inline Ref ExportDataSparse(Asset &a, std::string &meshName, Ref &buffer, + size_t count, void *data, AttribType::Value typeIn, AttribType::Value typeOut, ComponentType compType, BufferViewTarget target = BufferViewTarget_NONE, void *dataBase = 0) { + if (!count || !data) { + return Ref(); + } + + unsigned int numCompsIn = AttribType::GetNumComponents(typeIn); + unsigned int numCompsOut = AttribType::GetNumComponents(typeOut); + unsigned int bytesPerComp = ComponentTypeSize(compType); + + // accessor + Ref acc = a.accessors.Create(a.FindUniqueID(meshName, "accessor")); + + // if there is a basic data vector + if (dataBase) { + size_t base_offset = buffer->byteLength; + size_t base_padding = base_offset % bytesPerComp; + base_offset += base_padding; + size_t base_length = count * numCompsOut * bytesPerComp; + buffer->Grow(base_length + base_padding); + + Ref bv = a.bufferViews.Create(a.FindUniqueID(meshName, "view")); + bv->buffer = buffer; + bv->byteOffset = base_offset; + bv->byteLength = base_length; //! The target that the WebGL buffer should be bound to. + bv->byteStride = 0; + bv->target = target; + acc->bufferView = bv; + acc->WriteData(count, dataBase, numCompsIn * bytesPerComp); + } + acc->byteOffset = 0; + acc->componentType = compType; + acc->count = count; + acc->type = typeOut; + + if (data) { + void *nzDiff = 0, *nzIdx = 0; + size_t nzCount = NZDiff(compType, data, dataBase, count, numCompsIn, numCompsOut, nzDiff, nzIdx); + acc->sparse.reset(new Accessor::Sparse); + acc->sparse->count = nzCount; + + //indices + unsigned int bytesPerIdx = sizeof(unsigned short); + size_t indices_offset = buffer->byteLength; + size_t indices_padding = indices_offset % bytesPerIdx; + indices_offset += indices_padding; + size_t indices_length = nzCount * 1 * bytesPerIdx; + buffer->Grow(indices_length + indices_padding); + + Ref indicesBV = a.bufferViews.Create(a.FindUniqueID(meshName, "view")); + indicesBV->buffer = buffer; + indicesBV->byteOffset = indices_offset; + indicesBV->byteLength = indices_length; + indicesBV->byteStride = 0; + acc->sparse->indices = indicesBV; + acc->sparse->indicesType = ComponentType_UNSIGNED_SHORT; + acc->sparse->indicesByteOffset = 0; + acc->WriteSparseIndices(nzCount, nzIdx, 1 * bytesPerIdx); + + //values + size_t values_offset = buffer->byteLength; + size_t values_padding = values_offset % bytesPerComp; + values_offset += values_padding; + size_t values_length = nzCount * numCompsOut * bytesPerComp; + buffer->Grow(values_length + values_padding); + + Ref valuesBV = a.bufferViews.Create(a.FindUniqueID(meshName, "view")); + valuesBV->buffer = buffer; + valuesBV->byteOffset = values_offset; + valuesBV->byteLength = values_length; + valuesBV->byteStride = 0; + acc->sparse->values = valuesBV; + acc->sparse->valuesByteOffset = 0; + acc->WriteSparseValues(nzCount, nzDiff, numCompsIn * bytesPerComp); + + //clear + delete[] nzDiff; + delete[] nzIdx; + } + return acc; +} inline Ref ExportData(Asset& a, std::string& meshName, Ref& buffer, size_t count, void* data, AttribType::Value typeIn, AttribType::Value typeOut, ComponentType compType, BufferViewTarget target = BufferViewTarget_NONE) { @@ -828,7 +974,11 @@ void glTF2Exporter::ExportMeshes() for (unsigned int vt = 0; vt < pAnimMesh->mNumVertices; ++vt) { pPositionDiff[vt] = pAnimMesh->mVertices[vt] - aim->mVertices[vt]; } - Ref vec = ExportData(*mAsset, meshId, b, + /*Ref vec = ExportData(*mAsset, meshId, b, + pAnimMesh->mNumVertices, pPositionDiff, + AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT);*/ + //wangyi 0506 + Ref vec = ExportDataSparse(*mAsset, meshId, b, pAnimMesh->mNumVertices, pPositionDiff, AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT); if (vec) { @@ -843,6 +993,10 @@ void glTF2Exporter::ExportMeshes() for (unsigned int vt = 0; vt < pAnimMesh->mNumVertices; ++vt) { pNormalDiff[vt] = pAnimMesh->mNormals[vt] - aim->mNormals[vt]; } + /*Ref vec = ExportData(*mAsset, meshId, b, + pAnimMesh->mNumVertices, pNormalDiff, + AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT);*/ + //wangyi 0506 Ref vec = ExportData(*mAsset, meshId, b, pAnimMesh->mNumVertices, pNormalDiff, AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT); From b8e39b58d1a5101b88032de00029c3b40d8bf750 Mon Sep 17 00:00:00 2001 From: Yingying Wang Date: Fri, 15 May 2020 12:32:58 -0700 Subject: [PATCH 002/129] clean up --- code/AssetLib/glTF2/glTF2Asset.h | 7 ++----- code/AssetLib/glTF2/glTF2Asset.inl | 10 +--------- code/AssetLib/glTF2/glTF2AssetWriter.inl | 2 -- code/AssetLib/glTF2/glTF2Exporter.cpp | 21 ++++++++++----------- 4 files changed, 13 insertions(+), 27 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Asset.h b/code/AssetLib/glTF2/glTF2Asset.h index a60ac98f3..b413f1fe7 100644 --- a/code/AssetLib/glTF2/glTF2Asset.h +++ b/code/AssetLib/glTF2/glTF2Asset.h @@ -367,7 +367,7 @@ struct Object { //! An accessor provides a typed view into a BufferView or a subset of a BufferView //! similar to how WebGL's vertexAttribPointer() defines an attribute in a buffer. struct Accessor : public Object { - struct Sparse; //wangyi 0506 + struct Sparse; Ref bufferView; //!< The ID of the bufferView. (required) size_t byteOffset; //!< The offset relative to the start of the bufferView in bytes. (required) ComponentType componentType; //!< The datatype of components in the attribute. (required) @@ -375,7 +375,7 @@ struct Accessor : public Object { AttribType::Value type; //!< Specifies if the attribute is a scalar, vector, or matrix. (required) std::vector max; //!< Maximum value of each component in this attribute. std::vector min; //!< Minimum value of each component in this attribute. - std::unique_ptr sparse; //wangyi 0506 + std::unique_ptr sparse; unsigned int GetNumComponents(); unsigned int GetBytesPerComponent(); @@ -387,7 +387,6 @@ struct Accessor : public Object { void ExtractData(T *&outData); void WriteData(size_t count, const void *src_buffer, size_t src_stride); - //wangyi 0506 void WriteSparseValues(size_t count, const void *src_data, size_t src_dataStride); void WriteSparseIndices(size_t count, const void *src_idx, size_t src_idxStride); @@ -430,7 +429,6 @@ struct Accessor : public Object { Accessor() {} void Read(Value &obj, Asset &r); - //wangyi 0506 //sparse struct Sparse { size_t count; @@ -577,7 +575,6 @@ struct BufferView : public Object { BufferViewTarget target; //! The target that the WebGL buffer should be bound to. void Read(Value &obj, Asset &r); - //wangyi 0506 uint8_t *GetPointer(size_t accOffset); }; diff --git a/code/AssetLib/glTF2/glTF2Asset.inl b/code/AssetLib/glTF2/glTF2Asset.inl index 09fd48761..b81d73eda 100644 --- a/code/AssetLib/glTF2/glTF2Asset.inl +++ b/code/AssetLib/glTF2/glTF2Asset.inl @@ -550,7 +550,6 @@ inline void BufferView::Read(Value &obj, Asset &r) { byteStride = MemberOrDefault(obj, "byteStride", 0u); } -//wangyi 0506 inline uint8_t *BufferView::GetPointer(size_t accOffset) { if (!buffer) return 0; uint8_t *basePtr = buffer->GetPointer(); @@ -571,7 +570,6 @@ inline uint8_t *BufferView::GetPointer(size_t accOffset) { // struct Accessor // -//wangyi 0506 inline void Accessor::Sparse::PopulateData(size_t numBytes, uint8_t *bytes) { if (bytes) { data.assign(bytes, bytes + numBytes); @@ -610,7 +608,7 @@ inline void Accessor::Sparse::PatchData(unsigned int elementSize) { pIndices += indexSize; } } -// wangyi 0506 + inline void Accessor::Read(Value &obj, Asset &r) { if (Value *bufferViewVal = FindUInt(obj, "bufferView")) { @@ -624,7 +622,6 @@ inline void Accessor::Read(Value &obj, Asset &r) { const char *typestr; type = ReadMember(obj, "type", typestr) ? AttribType::FromString(typestr) : AttribType::SCALAR; - //wangyi 0506 if (Value *sparseValue = FindObject(obj, "sparse")) { sparse.reset(new Sparse); // count @@ -674,7 +671,6 @@ inline unsigned int Accessor::GetElementSize() { return GetNumComponents() * GetBytesPerComponent(); } -// wangyi 0506 inline uint8_t *Accessor::GetPointer() { if (sparse) return sparse->data.data(); @@ -732,8 +728,6 @@ void Accessor::ExtractData(T *&outData) const size_t targetElemSize = sizeof(T); ai_assert(elemSize <= targetElemSize); - - //wangyi 0506 ai_assert(count * stride <= (bufferView ? bufferView->byteLength : sparse->data.size())); outData = new T[count]; @@ -759,7 +753,6 @@ inline void Accessor::WriteData(size_t _count, const void *src_buffer, size_t sr CopyData(_count, src, src_stride, dst, dst_stride); } -//wangyi 0506 inline void Accessor::WriteSparseValues(size_t _count, const void *src_data, size_t src_dataStride) { if (!sparse) return; @@ -774,7 +767,6 @@ inline void Accessor::WriteSparseValues(size_t _count, const void *src_data, siz CopyData(_count, value_src, src_dataStride, value_dst, value_dst_stride); } -//wangyi 0506 inline void Accessor::WriteSparseIndices(size_t _count, const void *src_idx, size_t src_idxStride) { if (!sparse) return; diff --git a/code/AssetLib/glTF2/glTF2AssetWriter.inl b/code/AssetLib/glTF2/glTF2AssetWriter.inl index 5e936384f..6d7e28738 100644 --- a/code/AssetLib/glTF2/glTF2AssetWriter.inl +++ b/code/AssetLib/glTF2/glTF2AssetWriter.inl @@ -107,7 +107,6 @@ namespace glTF2 { inline void Write(Value& obj, Accessor& a, AssetWriter& w) { - //wangyi 0506 if (a.bufferView) { obj.AddMember("bufferView", a.bufferView->index, w.mAl); obj.AddMember("byteOffset", (unsigned int)a.byteOffset, w.mAl); @@ -125,7 +124,6 @@ namespace glTF2 { obj.AddMember("count", (unsigned int)a.count, w.mAl); obj.AddMember("type", StringRef(AttribType::ToString(a.type)), w.mAl); - // wangyi 0506 if (a.sparse) { Value sparseValue; sparseValue.SetObject(); diff --git a/code/AssetLib/glTF2/glTF2Exporter.cpp b/code/AssetLib/glTF2/glTF2Exporter.cpp index 8d6471db2..41fe4c9c8 100644 --- a/code/AssetLib/glTF2/glTF2Exporter.cpp +++ b/code/AssetLib/glTF2/glTF2Exporter.cpp @@ -207,7 +207,6 @@ inline void SetAccessorRange(ComponentType compType, Ref acc, void* da } } -// wangyi 0506 // compute the (data-dataBase), store the non-zero data items template size_t NZDiff(void *data, void *dataBase, size_t count, unsigned int numCompsIn, unsigned int numCompsOut, void *&outputNZDiff, void *&outputNZIdx) { @@ -271,7 +270,7 @@ inline size_t NZDiff(ComponentType compType, void *data, void *dataBase, size_t } return 0; } -// wangyi 0506 + inline Ref ExportDataSparse(Asset &a, std::string &meshName, Ref &buffer, size_t count, void *data, AttribType::Value typeIn, AttribType::Value typeOut, ComponentType compType, BufferViewTarget target = BufferViewTarget_NONE, void *dataBase = 0) { if (!count || !data) { @@ -974,13 +973,13 @@ void glTF2Exporter::ExportMeshes() for (unsigned int vt = 0; vt < pAnimMesh->mNumVertices; ++vt) { pPositionDiff[vt] = pAnimMesh->mVertices[vt] - aim->mVertices[vt]; } - /*Ref vec = ExportData(*mAsset, meshId, b, - pAnimMesh->mNumVertices, pPositionDiff, - AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT);*/ - //wangyi 0506 - Ref vec = ExportDataSparse(*mAsset, meshId, b, + Ref vec = ExportData(*mAsset, meshId, b, pAnimMesh->mNumVertices, pPositionDiff, AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT); + /* sparse + Ref vec = ExportDataSparse(*mAsset, meshId, b, + pAnimMesh->mNumVertices, pPositionDiff, + AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT);*/ if (vec) { p.targets[am].position.push_back(vec); } @@ -993,13 +992,13 @@ void glTF2Exporter::ExportMeshes() for (unsigned int vt = 0; vt < pAnimMesh->mNumVertices; ++vt) { pNormalDiff[vt] = pAnimMesh->mNormals[vt] - aim->mNormals[vt]; } - /*Ref vec = ExportData(*mAsset, meshId, b, - pAnimMesh->mNumVertices, pNormalDiff, - AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT);*/ - //wangyi 0506 Ref vec = ExportData(*mAsset, meshId, b, pAnimMesh->mNumVertices, pNormalDiff, AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT); + /* sparse + Ref vec = ExportDataSparse(*mAsset, meshId, b, + pAnimMesh->mNumVertices, pNormalDiff, + AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT);*/ if (vec) { p.targets[am].normal.push_back(vec); } From 50f0a86798399d474495da22d045d4da543ed481 Mon Sep 17 00:00:00 2001 From: Yingying Wang Date: Tue, 19 May 2020 16:10:41 -0700 Subject: [PATCH 003/129] conditional export --- code/AssetLib/glTF2/glTF2Exporter.cpp | 45 +++++++++++++++++---------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Exporter.cpp b/code/AssetLib/glTF2/glTF2Exporter.cpp index 088503636..072809dc4 100644 --- a/code/AssetLib/glTF2/glTF2Exporter.cpp +++ b/code/AssetLib/glTF2/glTF2Exporter.cpp @@ -969,10 +969,15 @@ void glTF2Exporter::ExportMeshes() /*************** Targets for blendshapes ****************/ if (aim->mNumAnimMeshes > 0) { + //wangyi 0506 + bool bUseSparse = this->mProperties->HasPropertyBool("GLTF2_SPARSE_ACCESSOR_EXP") && + this->mProperties->GetPropertyBool("GLTF2_SPARSE_ACCESSOR_EXP"); + bool bIncludeNormal = this->mProperties->HasPropertyBool("GLTF2_TARGET_NORMAL_EXP") && + this->mProperties->GetPropertyBool("GLTF2_TARGET_NORMAL_EXP"); + p.targets.resize(aim->mNumAnimMeshes); for (unsigned int am = 0; am < aim->mNumAnimMeshes; ++am) { aiAnimMesh *pAnimMesh = aim->mAnimMeshes[am]; - // position if (pAnimMesh->HasPositions()) { // NOTE: in gltf it is the diff stored @@ -980,13 +985,17 @@ void glTF2Exporter::ExportMeshes() for (unsigned int vt = 0; vt < pAnimMesh->mNumVertices; ++vt) { pPositionDiff[vt] = pAnimMesh->mVertices[vt] - aim->mVertices[vt]; } - Ref vec = ExportData(*mAsset, meshId, b, - pAnimMesh->mNumVertices, pPositionDiff, - AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT); - /* sparse - Ref vec = ExportDataSparse(*mAsset, meshId, b, - pAnimMesh->mNumVertices, pPositionDiff, - AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT);*/ + //wangyi 0506 + Ref vec; + if (bUseSparse) { + vec = ExportDataSparse(*mAsset, meshId, b, + pAnimMesh->mNumVertices, pPositionDiff, + AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT); + } else { + vec = ExportData(*mAsset, meshId, b, + pAnimMesh->mNumVertices, pPositionDiff, + AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT); + } if (vec) { p.targets[am].position.push_back(vec); } @@ -994,18 +1003,22 @@ void glTF2Exporter::ExportMeshes() } // normal - if (pAnimMesh->HasNormals()) { + if (pAnimMesh->HasNormals() && bIncludeNormal) { aiVector3D *pNormalDiff = new aiVector3D[pAnimMesh->mNumVertices]; for (unsigned int vt = 0; vt < pAnimMesh->mNumVertices; ++vt) { pNormalDiff[vt] = pAnimMesh->mNormals[vt] - aim->mNormals[vt]; } - Ref vec = ExportData(*mAsset, meshId, b, - pAnimMesh->mNumVertices, pNormalDiff, - AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT); - /* sparse - Ref vec = ExportDataSparse(*mAsset, meshId, b, - pAnimMesh->mNumVertices, pNormalDiff, - AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT);*/ + //wangyi 0506 + Ref vec; + if (bUseSparse) { + vec = ExportDataSparse(*mAsset, meshId, b, + pAnimMesh->mNumVertices, pNormalDiff, + AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT); + } else { + vec = ExportData(*mAsset, meshId, b, + pAnimMesh->mNumVertices, pNormalDiff, + AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT); + } if (vec) { p.targets[am].normal.push_back(vec); } From 87584eb007df4dda029cbac5e328941742129d5d Mon Sep 17 00:00:00 2001 From: FRICOTEAUX Date: Thu, 28 May 2020 11:05:38 +0200 Subject: [PATCH 004/129] glTF2: fix "file size doesn't match" issue when importing GLB in Blender --- code/glTF2/glTF2AssetWriter.inl | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/code/glTF2/glTF2AssetWriter.inl b/code/glTF2/glTF2AssetWriter.inl index 02c14980d..f9bbb7ef7 100644 --- a/code/glTF2/glTF2AssetWriter.inl +++ b/code/glTF2/glTF2AssetWriter.inl @@ -672,10 +672,13 @@ namespace glTF2 { // Binary chunk // + int GLB_Chunk_count = 1; uint32_t binaryChunkLength = 0; if (bodyBuffer->byteLength > 0) { binaryChunkLength = (bodyBuffer->byteLength + 3) & ~3; // Round up to next multiple of 4 - auto paddingLength = binaryChunkLength - bodyBuffer->byteLength; + + auto curPaddingLength = binaryChunkLength - bodyBuffer->byteLength; + ++GLB_Chunk_count; GLB_Chunk binaryChunk; binaryChunk.chunkLength = binaryChunkLength; @@ -690,7 +693,7 @@ namespace glTF2 { if (outfile->Write(bodyBuffer->GetPointer(), 1, bodyBuffer->byteLength) != bodyBuffer->byteLength) { throw DeadlyExportError("Failed to write body data!"); } - if (paddingLength && outfile->Write(&padding, 1, paddingLength) != paddingLength) { + if (curPaddingLength && outfile->Write(&padding, 1, paddingLength) != paddingLength) { throw DeadlyExportError("Failed to write body data padding!"); } } @@ -705,7 +708,7 @@ namespace glTF2 { header.version = 2; AI_SWAP4(header.version); - header.length = uint32_t(sizeof(GLB_Header) + 2 * sizeof(GLB_Chunk) + jsonChunkLength + binaryChunkLength); + header.length = uint32_t(sizeof(GLB_Header) + GLB_Chunk_count * sizeof(GLB_Chunk) + jsonChunkLength + binaryChunkLength); AI_SWAP4(header.length); outfile->Seek(0, aiOrigin_SET); From 206551247050a02cf21bdf1b5cf45190af38492a Mon Sep 17 00:00:00 2001 From: Yingying Wang Date: Mon, 8 Jun 2020 14:41:53 -0700 Subject: [PATCH 005/129] remove comments --- code/AssetLib/glTF2/glTF2Exporter.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Exporter.cpp b/code/AssetLib/glTF2/glTF2Exporter.cpp index 072809dc4..def4268a1 100644 --- a/code/AssetLib/glTF2/glTF2Exporter.cpp +++ b/code/AssetLib/glTF2/glTF2Exporter.cpp @@ -969,7 +969,6 @@ void glTF2Exporter::ExportMeshes() /*************** Targets for blendshapes ****************/ if (aim->mNumAnimMeshes > 0) { - //wangyi 0506 bool bUseSparse = this->mProperties->HasPropertyBool("GLTF2_SPARSE_ACCESSOR_EXP") && this->mProperties->GetPropertyBool("GLTF2_SPARSE_ACCESSOR_EXP"); bool bIncludeNormal = this->mProperties->HasPropertyBool("GLTF2_TARGET_NORMAL_EXP") && @@ -985,7 +984,6 @@ void glTF2Exporter::ExportMeshes() for (unsigned int vt = 0; vt < pAnimMesh->mNumVertices; ++vt) { pPositionDiff[vt] = pAnimMesh->mVertices[vt] - aim->mVertices[vt]; } - //wangyi 0506 Ref vec; if (bUseSparse) { vec = ExportDataSparse(*mAsset, meshId, b, @@ -1008,7 +1006,6 @@ void glTF2Exporter::ExportMeshes() for (unsigned int vt = 0; vt < pAnimMesh->mNumVertices; ++vt) { pNormalDiff[vt] = pAnimMesh->mNormals[vt] - aim->mNormals[vt]; } - //wangyi 0506 Ref vec; if (bUseSparse) { vec = ExportDataSparse(*mAsset, meshId, b, From f18f1a35f6026ff14e1f60dc549bad8c69b5e4f0 Mon Sep 17 00:00:00 2001 From: Yingying Wang Date: Mon, 8 Jun 2020 14:49:50 -0700 Subject: [PATCH 006/129] accommodate linux build --- code/AssetLib/glTF2/glTF2Exporter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Exporter.cpp b/code/AssetLib/glTF2/glTF2Exporter.cpp index def4268a1..eb642ca08 100644 --- a/code/AssetLib/glTF2/glTF2Exporter.cpp +++ b/code/AssetLib/glTF2/glTF2Exporter.cpp @@ -354,8 +354,8 @@ inline Ref ExportDataSparse(Asset &a, std::string &meshName, RefWriteSparseValues(nzCount, nzDiff, numCompsIn * bytesPerComp); //clear - delete[] nzDiff; - delete[] nzIdx; + delete[] (char*)nzDiff; + delete[] (char*)nzIdx; } return acc; } From 8fed101432ae4f24b69db105971089791a98fee7 Mon Sep 17 00:00:00 2001 From: Yingying Wang Date: Mon, 8 Jun 2020 16:18:11 -0700 Subject: [PATCH 007/129] avoid all zero --- code/AssetLib/glTF2/glTF2Exporter.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/AssetLib/glTF2/glTF2Exporter.cpp b/code/AssetLib/glTF2/glTF2Exporter.cpp index eb642ca08..31cd1f1c6 100644 --- a/code/AssetLib/glTF2/glTF2Exporter.cpp +++ b/code/AssetLib/glTF2/glTF2Exporter.cpp @@ -251,6 +251,13 @@ size_t NZDiff(void *data, void *dataBase, size_t count, unsigned int numCompsIn, vNZIdx.push_back(idx); } + //avoid all-0, put 1 item + if (vNZDiff.size() == 0) { + for (unsigned int j = 0; j < numCompsOut; j++) + vNZDiff.push_back(0); + vNZIdx.push_back(0); + } + //process data outputNZDiff = new T[vNZDiff.size()]; memcpy(outputNZDiff, vNZDiff.data(), vNZDiff.size() * sizeof(T)); From 578a7ac5022f26facaef146390cedbd5229c347f Mon Sep 17 00:00:00 2001 From: Yingying Wang Date: Tue, 9 Jun 2020 11:20:48 -0700 Subject: [PATCH 008/129] add Callback API in ExporterProperties --- code/Common/Exporter.cpp | 16 ++++- include/assimp/Exporter.hpp | 135 +++++++++++++++++++----------------- 2 files changed, 87 insertions(+), 64 deletions(-) diff --git a/code/Common/Exporter.cpp b/code/Common/Exporter.cpp index c34457be5..e8ee188e6 100644 --- a/code/Common/Exporter.cpp +++ b/code/Common/Exporter.cpp @@ -580,10 +580,24 @@ ExportProperties::ExportProperties(const ExportProperties &other) : mIntProperties(other.mIntProperties) , mFloatProperties(other.mFloatProperties) , mStringProperties(other.mStringProperties) -, mMatrixProperties(other.mMatrixProperties) { +, mMatrixProperties(other.mMatrixProperties) +//wangyi 0608 +, mCallbackProperties(other.mCallbackProperties){ // empty } +//wangyi 0608 +bool ExportProperties::SetPropertyCallback(const char *szName, std::function &f) { + return SetGenericProperty>(mCallbackProperties, szName, f); +} +std::function ExportProperties::GetPropertyCallback(const char *szName) const { + return GetGenericProperty>(mCallbackProperties, szName, 0); +} +//wangyi 0608 +bool ExportProperties::HasPropertyCallback(const char *szName) const { + return HasGenericProperty>(mCallbackProperties, szName); +} + // ------------------------------------------------------------------------------------------------ // Set a configuration property bool ExportProperties::SetPropertyInteger(const char* szName, int iValue) { diff --git a/include/assimp/Exporter.hpp b/include/assimp/Exporter.hpp index dc6661c11..4abea6ad0 100644 --- a/include/assimp/Exporter.hpp +++ b/include/assimp/Exporter.hpp @@ -47,16 +47,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define AI_EXPORT_HPP_INC #ifdef __GNUC__ -# pragma GCC system_header +#pragma GCC system_header #endif #ifndef ASSIMP_BUILD_NO_EXPORT #include "cexport.h" #include +//wangyi 0608 +#include namespace Assimp { - + class ExporterPimpl; class IOSystem; class ProgressHandler; @@ -84,7 +86,7 @@ class ASSIMP_API ExportProperties; class ASSIMP_API Exporter { public: /** Function pointer type of a Export worker function */ - typedef void (*fpExportFunc)(const char*, IOSystem*, const aiScene*, const ExportProperties*); + typedef void (*fpExportFunc)(const char *, IOSystem *, const aiScene *, const ExportProperties *); /** Internal description of an Assimp export format option */ struct ExportFormatEntry { @@ -98,8 +100,7 @@ public: unsigned int mEnforcePP; // Constructor to fill all entries - ExportFormatEntry( const char* pId, const char* pDesc, const char* pExtension, fpExportFunc pFunction, unsigned int pEnforcePP = 0u) - { + ExportFormatEntry(const char *pId, const char *pDesc, const char *pExtension, fpExportFunc pFunction, unsigned int pEnforcePP = 0u) { mDescription.id = pId; mDescription.description = pDesc; mDescription.fileExtension = pExtension; @@ -108,9 +109,8 @@ public: } ExportFormatEntry() : - mExportFunction() - , mEnforcePP() - { + mExportFunction(), + mEnforcePP() { mDescription.id = NULL; mDescription.description = NULL; mDescription.fileExtension = NULL; @@ -142,7 +142,7 @@ public: * * @param pIOHandler The IO handler to be used in all file accesses * of the Importer. */ - void SetIOHandler( IOSystem* pIOHandler); + void SetIOHandler(IOSystem *pIOHandler); // ------------------------------------------------------------------- /** Retrieves the IO handler that is currently set. @@ -151,7 +151,7 @@ public: * handler is active as long the application doesn't supply its own * custom IO handler via #SetIOHandler(). * @return A valid IOSystem interface, never NULL. */ - IOSystem* GetIOHandler() const; + IOSystem *GetIOHandler() const; // ------------------------------------------------------------------- /** Checks whether a default IO handler is active @@ -171,7 +171,7 @@ public: * disable progress reporting. * @note Progress handlers can be used to abort the loading * at almost any time.*/ - void SetProgressHandler(ProgressHandler* pHandler); + void SetProgressHandler(ProgressHandler *pHandler); // ------------------------------------------------------------------- /** Exports the given scene to a chosen file format. Returns the exported @@ -191,10 +191,10 @@ public: * Any IO handlers set via #SetIOHandler are ignored here. * @note Use aiCopyScene() to get a modifiable copy of a previously * imported scene. */ - const aiExportDataBlob* ExportToBlob(const aiScene* pScene, const char* pFormatId, - unsigned int pPreprocessing = 0u, const ExportProperties* pProperties = nullptr); - const aiExportDataBlob* ExportToBlob( const aiScene* pScene, const std::string& pFormatId, - unsigned int pPreprocessing = 0u, const ExportProperties* pProperties = nullptr); + const aiExportDataBlob *ExportToBlob(const aiScene *pScene, const char *pFormatId, + unsigned int pPreprocessing = 0u, const ExportProperties *pProperties = nullptr); + const aiExportDataBlob *ExportToBlob(const aiScene *pScene, const std::string &pFormatId, + unsigned int pPreprocessing = 0u, const ExportProperties *pProperties = nullptr); // ------------------------------------------------------------------- /** Convenience function to export directly to a file. Use @@ -229,10 +229,10 @@ public: * @return AI_SUCCESS if everything was fine. * @note Use aiCopyScene() to get a modifiable copy of a previously * imported scene.*/ - aiReturn Export( const aiScene* pScene, const char* pFormatId, const char* pPath, - unsigned int pPreprocessing = 0u, const ExportProperties* pProperties = nullptr); - aiReturn Export( const aiScene* pScene, const std::string& pFormatId, const std::string& pPath, - unsigned int pPreprocessing = 0u, const ExportProperties* pProperties = nullptr); + aiReturn Export(const aiScene *pScene, const char *pFormatId, const char *pPath, + unsigned int pPreprocessing = 0u, const ExportProperties *pProperties = nullptr); + aiReturn Export(const aiScene *pScene, const std::string &pFormatId, const std::string &pPath, + unsigned int pPreprocessing = 0u, const ExportProperties *pProperties = nullptr); // ------------------------------------------------------------------- /** Returns an error description of an error that occurred in #Export @@ -244,17 +244,17 @@ public: * * @note The returned function remains valid until one of the * following methods is called: #Export, #ExportToBlob, #FreeBlob */ - const char* GetErrorString() const; + const char *GetErrorString() const; // ------------------------------------------------------------------- /** Return the blob obtained from the last call to #ExportToBlob */ - const aiExportDataBlob* GetBlob() const; + const aiExportDataBlob *GetBlob() const; // ------------------------------------------------------------------- /** Orphan the blob from the last call to #ExportToBlob. This means * the caller takes ownership and is thus responsible for calling * the C API function #aiReleaseExportBlob to release it. */ - const aiExportDataBlob* GetOrphanedBlob() const; + const aiExportDataBlob *GetOrphanedBlob() const; // ------------------------------------------------------------------- /** Frees the current blob. @@ -264,7 +264,7 @@ public: * automatically by the destructor. The only reason to call * it manually would be to reclaim as much storage as possible * without giving up the #Exporter instance yet. */ - void FreeBlob( ); + void FreeBlob(); // ------------------------------------------------------------------- /** Returns the number of export file formats available in the current @@ -290,7 +290,7 @@ public: * for. Valid range is 0 to #Exporter::GetExportFormatCount * @return A description of that specific export format. * NULL if pIndex is out of range. */ - const aiExportFormatDesc* GetExportFormatDescription( size_t pIndex ) const; + const aiExportFormatDesc *GetExportFormatDescription(size_t pIndex) const; // ------------------------------------------------------------------- /** Register a custom exporter. Custom export formats are limited to @@ -303,7 +303,7 @@ public: * registered. A common cause that would prevent an exporter * from being registered is that its format id is already * occupied by another format. */ - aiReturn RegisterExporter(const ExportFormatEntry& desc); + aiReturn RegisterExporter(const ExportFormatEntry &desc); // ------------------------------------------------------------------- /** Remove an export format previously registered with #RegisterExporter @@ -314,11 +314,11 @@ public: * 'id' field of #aiExportFormatDesc. * @note Calling this method on a format description not yet registered * has no effect.*/ - void UnregisterExporter(const char* id); + void UnregisterExporter(const char *id); protected: // Just because we don't want you to know how we're hacking around. - ExporterPimpl* pimpl; + ExporterPimpl *pimpl; }; class ASSIMP_API ExportProperties { @@ -332,6 +332,8 @@ public: typedef std::map FloatPropertyMap; typedef std::map StringPropertyMap; typedef std::map MatrixPropertyMap; + //wangyi 0608 + typedef std::map> CallbackPropertyMap; public: /** Standard constructor @@ -345,7 +347,7 @@ public: * This copies the configuration properties of another ExportProperties. * @see ExportProperties(const ExportProperties& other) */ - ExportProperties(const ExportProperties& other); + ExportProperties(const ExportProperties &other); // ------------------------------------------------------------------- /** Set an integer configuration property. @@ -360,7 +362,7 @@ public: * floating-point property has no effect - the loader will call * GetPropertyFloat() to read the property, but it won't be there. */ - bool SetPropertyInteger(const char* szName, int iValue); + bool SetPropertyInteger(const char *szName, int iValue); // ------------------------------------------------------------------- /** Set a boolean configuration property. Boolean properties @@ -369,27 +371,30 @@ public: * #GetPropertyBool and vice versa. * @see SetPropertyInteger() */ - bool SetPropertyBool(const char* szName, bool value) { - return SetPropertyInteger(szName,value); + bool SetPropertyBool(const char *szName, bool value) { + return SetPropertyInteger(szName, value); } // ------------------------------------------------------------------- /** Set a floating-point configuration property. * @see SetPropertyInteger() */ - bool SetPropertyFloat(const char* szName, ai_real fValue); + bool SetPropertyFloat(const char *szName, ai_real fValue); // ------------------------------------------------------------------- /** Set a string configuration property. * @see SetPropertyInteger() */ - bool SetPropertyString(const char* szName, const std::string& sValue); + bool SetPropertyString(const char *szName, const std::string &sValue); // ------------------------------------------------------------------- /** Set a matrix configuration property. * @see SetPropertyInteger() */ - bool SetPropertyMatrix(const char* szName, const aiMatrix4x4& sValue); + bool SetPropertyMatrix(const char *szName, const aiMatrix4x4 &sValue); + + //wangyi 0608 + bool SetPropertyCallback(const char *szName, std::function &f); // ------------------------------------------------------------------- /** Get a configuration property. @@ -404,8 +409,8 @@ public: * floating-point property has no effect - the loader will call * GetPropertyFloat() to read the property, but it won't be there. */ - int GetPropertyInteger(const char* szName, - int iErrorReturn = 0xffffffff) const; + int GetPropertyInteger(const char *szName, + int iErrorReturn = 0xffffffff) const; // ------------------------------------------------------------------- /** Get a boolean configuration property. Boolean properties @@ -414,16 +419,16 @@ public: * #GetPropertyBool and vice versa. * @see GetPropertyInteger() */ - bool GetPropertyBool(const char* szName, bool bErrorReturn = false) const { - return GetPropertyInteger(szName,bErrorReturn)!=0; + bool GetPropertyBool(const char *szName, bool bErrorReturn = false) const { + return GetPropertyInteger(szName, bErrorReturn) != 0; } // ------------------------------------------------------------------- /** Get a floating-point configuration property * @see GetPropertyInteger() */ - ai_real GetPropertyFloat(const char* szName, - ai_real fErrorReturn = 10e10f) const; + ai_real GetPropertyFloat(const char *szName, + ai_real fErrorReturn = 10e10f) const; // ------------------------------------------------------------------- /** Get a string configuration property @@ -431,8 +436,8 @@ public: * The return value remains valid until the property is modified. * @see GetPropertyInteger() */ - const std::string GetPropertyString(const char* szName, - const std::string& sErrorReturn = "") const; + const std::string GetPropertyString(const char *szName, + const std::string &sErrorReturn = "") const; // ------------------------------------------------------------------- /** Get a matrix configuration property @@ -440,37 +445,42 @@ public: * The return value remains valid until the property is modified. * @see GetPropertyInteger() */ - const aiMatrix4x4 GetPropertyMatrix(const char* szName, - const aiMatrix4x4& sErrorReturn = aiMatrix4x4()) const; + const aiMatrix4x4 GetPropertyMatrix(const char *szName, + const aiMatrix4x4 &sErrorReturn = aiMatrix4x4()) const; - // ------------------------------------------------------------------- - /** Determine a integer configuration property has been set. + //wangyi 0608 + std::function GetPropertyCallback(const char* szName) const; + + // ------------------------------------------------------------------- + /** Determine a integer configuration property has been set. * @see HasPropertyInteger() */ - bool HasPropertyInteger(const char* szName) const; + bool HasPropertyInteger(const char *szName) const; /** Determine a boolean configuration property has been set. * @see HasPropertyBool() */ - bool HasPropertyBool(const char* szName) const; + bool HasPropertyBool(const char *szName) const; /** Determine a boolean configuration property has been set. * @see HasPropertyFloat() */ - bool HasPropertyFloat(const char* szName) const; + bool HasPropertyFloat(const char *szName) const; /** Determine a String configuration property has been set. * @see HasPropertyString() */ - bool HasPropertyString(const char* szName) const; + bool HasPropertyString(const char *szName) const; /** Determine a Matrix configuration property has been set. * @see HasPropertyMatrix() */ - bool HasPropertyMatrix(const char* szName) const; + bool HasPropertyMatrix(const char *szName) const; + + //wangyi 0608 + bool HasPropertyCallback(const char *szName) const; protected: - /** List of integer properties */ IntPropertyMap mIntProperties; @@ -482,23 +492,22 @@ protected: /** List of Matrix properties */ MatrixPropertyMap mMatrixProperties; + + //wangyi 0608 + CallbackPropertyMap mCallbackProperties; }; // ---------------------------------------------------------------------------------- -inline -const aiExportDataBlob* Exporter::ExportToBlob( const aiScene* pScene, const std::string& pFormatId, - unsigned int pPreprocessing, const ExportProperties* pProperties) -{ - return ExportToBlob(pScene,pFormatId.c_str(),pPreprocessing, pProperties); +inline const aiExportDataBlob *Exporter::ExportToBlob(const aiScene *pScene, const std::string &pFormatId, + unsigned int pPreprocessing, const ExportProperties *pProperties) { + return ExportToBlob(pScene, pFormatId.c_str(), pPreprocessing, pProperties); } // ---------------------------------------------------------------------------------- -inline -aiReturn Exporter :: Export( const aiScene* pScene, const std::string& pFormatId, - const std::string& pPath, unsigned int pPreprocessing, - const ExportProperties* pProperties) -{ - return Export(pScene,pFormatId.c_str(),pPath.c_str(),pPreprocessing, pProperties); +inline aiReturn Exporter ::Export(const aiScene *pScene, const std::string &pFormatId, + const std::string &pPath, unsigned int pPreprocessing, + const ExportProperties *pProperties) { + return Export(pScene, pFormatId.c_str(), pPath.c_str(), pPreprocessing, pProperties); } } // namespace Assimp From f57e7221c07f385cebcc457d294e90c446995d41 Mon Sep 17 00:00:00 2001 From: ywang Date: Wed, 10 Jun 2020 13:23:29 -0700 Subject: [PATCH 009/129] temp --- code/AssetLib/glTF2/glTF2Exporter.cpp | 17 +++++++++++++++-- code/Common/Exporter.cpp | 2 +- include/assimp/Exporter.hpp | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Exporter.cpp b/code/AssetLib/glTF2/glTF2Exporter.cpp index 566f95e80..98eb79e57 100644 --- a/code/AssetLib/glTF2/glTF2Exporter.cpp +++ b/code/AssetLib/glTF2/glTF2Exporter.cpp @@ -1,4 +1,4 @@ -/* +/* Open Asset Import Library (assimp) ---------------------------------------------------------------------- @@ -115,7 +115,20 @@ glTF2Exporter::glTF2Exporter(const char* filename, IOSystem* pIOSystem, const ai ExportScene(); ExportAnimations(); - + + //wangyi 0608 + if(mProperties->HasPropertyCallback("extras")) + { + std::function ExportExtras = mProperties->GetPropertyCallback("extras"); + char* ret = (char*)ExportExtras((void*)mAsset.get()); + + Document extrasD; + extrasD.Parse(ret); + std::string strHello = extrasD["hello"].GetString(); + + printf("wangyi 0608 ret: %s\r\n", ret); + } + AssetWriter writer(*mAsset); if (isBinary) { diff --git a/code/Common/Exporter.cpp b/code/Common/Exporter.cpp index e8ee188e6..5fef455bb 100644 --- a/code/Common/Exporter.cpp +++ b/code/Common/Exporter.cpp @@ -587,7 +587,7 @@ ExportProperties::ExportProperties(const ExportProperties &other) } //wangyi 0608 -bool ExportProperties::SetPropertyCallback(const char *szName, std::function &f) { +bool ExportProperties::SetPropertyCallback(const char *szName, const std::function &f) { return SetGenericProperty>(mCallbackProperties, szName, f); } std::function ExportProperties::GetPropertyCallback(const char *szName) const { diff --git a/include/assimp/Exporter.hpp b/include/assimp/Exporter.hpp index 4abea6ad0..87c12f374 100644 --- a/include/assimp/Exporter.hpp +++ b/include/assimp/Exporter.hpp @@ -394,7 +394,7 @@ public: bool SetPropertyMatrix(const char *szName, const aiMatrix4x4 &sValue); //wangyi 0608 - bool SetPropertyCallback(const char *szName, std::function &f); + bool SetPropertyCallback(const char *szName, const std::function &f); // ------------------------------------------------------------------- /** Get a configuration property. From e65434bf8241a5408ff213dc315d5b8d3ed2f60e Mon Sep 17 00:00:00 2001 From: ywang Date: Thu, 11 Jun 2020 17:37:06 -0700 Subject: [PATCH 010/129] extra callback --- code/AssetLib/glTF2/glTF2Asset.h | 3 ++- code/AssetLib/glTF2/glTF2AssetWriter.inl | 6 +++++- code/AssetLib/glTF2/glTF2Exporter.cpp | 10 ++-------- code/Common/Exporter.cpp | 5 ++--- include/assimp/Exporter.hpp | 12 +++--------- 5 files changed, 14 insertions(+), 22 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Asset.h b/code/AssetLib/glTF2/glTF2Asset.h index fc0fe1544..de252b329 100644 --- a/code/AssetLib/glTF2/glTF2Asset.h +++ b/code/AssetLib/glTF2/glTF2Asset.h @@ -1,4 +1,4 @@ -/* +/* Open Asset Import Library (assimp) ---------------------------------------------------------------------- @@ -1006,6 +1006,7 @@ public: } extensionsRequired; AssetMetadata asset; + Value* extras = nullptr; // Dictionaries for each type of object diff --git a/code/AssetLib/glTF2/glTF2AssetWriter.inl b/code/AssetLib/glTF2/glTF2AssetWriter.inl index 361af40cd..0a4d0b2f4 100644 --- a/code/AssetLib/glTF2/glTF2AssetWriter.inl +++ b/code/AssetLib/glTF2/glTF2AssetWriter.inl @@ -1,4 +1,4 @@ -/* +/* Open Asset Import Library (assimp) ---------------------------------------------------------------------- @@ -600,6 +600,10 @@ namespace glTF2 { if (mAsset.scene) { mDoc.AddMember("scene", mAsset.scene->index, mAl); } + + if(mAsset.extras) { + mDoc.AddMember("extras", *mAsset.extras, mAl); + } } inline void AssetWriter::WriteFile(const char* path) diff --git a/code/AssetLib/glTF2/glTF2Exporter.cpp b/code/AssetLib/glTF2/glTF2Exporter.cpp index 98eb79e57..537787eb7 100644 --- a/code/AssetLib/glTF2/glTF2Exporter.cpp +++ b/code/AssetLib/glTF2/glTF2Exporter.cpp @@ -116,17 +116,11 @@ glTF2Exporter::glTF2Exporter(const char* filename, IOSystem* pIOSystem, const ai ExportAnimations(); - //wangyi 0608 + // export extras if(mProperties->HasPropertyCallback("extras")) { std::function ExportExtras = mProperties->GetPropertyCallback("extras"); - char* ret = (char*)ExportExtras((void*)mAsset.get()); - - Document extrasD; - extrasD.Parse(ret); - std::string strHello = extrasD["hello"].GetString(); - - printf("wangyi 0608 ret: %s\r\n", ret); + mAsset->extras = (rapidjson::Value*)ExportExtras(0); } AssetWriter writer(*mAsset); diff --git a/code/Common/Exporter.cpp b/code/Common/Exporter.cpp index 5fef455bb..30ab3a813 100644 --- a/code/Common/Exporter.cpp +++ b/code/Common/Exporter.cpp @@ -581,19 +581,18 @@ ExportProperties::ExportProperties(const ExportProperties &other) , mFloatProperties(other.mFloatProperties) , mStringProperties(other.mStringProperties) , mMatrixProperties(other.mMatrixProperties) -//wangyi 0608 , mCallbackProperties(other.mCallbackProperties){ // empty } -//wangyi 0608 bool ExportProperties::SetPropertyCallback(const char *szName, const std::function &f) { return SetGenericProperty>(mCallbackProperties, szName, f); } + std::function ExportProperties::GetPropertyCallback(const char *szName) const { return GetGenericProperty>(mCallbackProperties, szName, 0); } -//wangyi 0608 + bool ExportProperties::HasPropertyCallback(const char *szName) const { return HasGenericProperty>(mCallbackProperties, szName); } diff --git a/include/assimp/Exporter.hpp b/include/assimp/Exporter.hpp index 87c12f374..8e47e24db 100644 --- a/include/assimp/Exporter.hpp +++ b/include/assimp/Exporter.hpp @@ -54,7 +54,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "cexport.h" #include -//wangyi 0608 #include namespace Assimp { @@ -332,7 +331,6 @@ public: typedef std::map FloatPropertyMap; typedef std::map StringPropertyMap; typedef std::map MatrixPropertyMap; - //wangyi 0608 typedef std::map> CallbackPropertyMap; public: @@ -392,8 +390,7 @@ public: * @see SetPropertyInteger() */ bool SetPropertyMatrix(const char *szName, const aiMatrix4x4 &sValue); - - //wangyi 0608 + bool SetPropertyCallback(const char *szName, const std::function &f); // ------------------------------------------------------------------- @@ -448,7 +445,6 @@ public: const aiMatrix4x4 GetPropertyMatrix(const char *szName, const aiMatrix4x4 &sErrorReturn = aiMatrix4x4()) const; - //wangyi 0608 std::function GetPropertyCallback(const char* szName) const; // ------------------------------------------------------------------- @@ -476,8 +472,7 @@ public: * @see HasPropertyMatrix() */ bool HasPropertyMatrix(const char *szName) const; - - //wangyi 0608 + bool HasPropertyCallback(const char *szName) const; protected: @@ -492,8 +487,7 @@ protected: /** List of Matrix properties */ MatrixPropertyMap mMatrixProperties; - - //wangyi 0608 + CallbackPropertyMap mCallbackProperties; }; From ba09e1ef94176a97766203f36a850c6fe9c58c8c Mon Sep 17 00:00:00 2001 From: Filip Lundgren <45687559+ifiddynine@users.noreply.github.com> Date: Sun, 21 Jun 2020 23:56:11 +0200 Subject: [PATCH 011/129] Fix Blender .fbx metalness detection --- code/AssetLib/FBX/FBXConverter.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/code/AssetLib/FBX/FBXConverter.cpp b/code/AssetLib/FBX/FBXConverter.cpp index 261567e48..09711ee8d 100644 --- a/code/AssetLib/FBX/FBXConverter.cpp +++ b/code/AssetLib/FBX/FBXConverter.cpp @@ -1992,6 +1992,7 @@ void FBXConverter::SetTextureProperties(aiMaterial *out_mat, const TextureMap &_ TrySetTextureProperties(out_mat, _textures, "ShininessExponent", aiTextureType_SHININESS, mesh); TrySetTextureProperties(out_mat, _textures, "TransparencyFactor", aiTextureType_OPACITY, mesh); TrySetTextureProperties(out_mat, _textures, "EmissiveFactor", aiTextureType_EMISSIVE, mesh); + TrySetTextureProperties(out_mat, _textures, "ReflectionFactor", aiTextureType_METALNESS, mesh); //Maya counterparts TrySetTextureProperties(out_mat, _textures, "Maya|DiffuseTexture", aiTextureType_DIFFUSE, mesh); TrySetTextureProperties(out_mat, _textures, "Maya|NormalTexture", aiTextureType_NORMALS, mesh); From 0b18d27042b37429a3f82fd546500411fe1360c2 Mon Sep 17 00:00:00 2001 From: Hill Ma Date: Sun, 28 Jun 2020 15:58:20 -0700 Subject: [PATCH 012/129] Use strrchr() when finding the '.' that begins the file extension. Sometimes we encounter file paths like ../foo/bar.obj; searching from the end of the string would yield the correct result. --- samples/SimpleOpenGL/Sample_SimpleOpenGL.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/SimpleOpenGL/Sample_SimpleOpenGL.c b/samples/SimpleOpenGL/Sample_SimpleOpenGL.c index bcc964efe..01704a1e4 100644 --- a/samples/SimpleOpenGL/Sample_SimpleOpenGL.c +++ b/samples/SimpleOpenGL/Sample_SimpleOpenGL.c @@ -376,7 +376,7 @@ int main(int argc, char **argv) // Check and validate the specified model file extension. model_file = argv[1]; - const char* extension = strchr(model_file, '.'); + const char* extension = strrchr(model_file, '.'); if (!extension) { print_error("Please provide a file with a valid extension."); return EXIT_FAILURE; From 51150cb3dfa13afaf829b005b68fae00253a7c96 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Thu, 2 Jul 2020 14:53:29 +0100 Subject: [PATCH 013/129] Ensure asserts are defined where expected. --- code/PostProcessing/ArmaturePopulate.cpp | 1 - include/assimp/ai_assert.h | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/PostProcessing/ArmaturePopulate.cpp b/code/PostProcessing/ArmaturePopulate.cpp index 97feca31c..48dcecb15 100644 --- a/code/PostProcessing/ArmaturePopulate.cpp +++ b/code/PostProcessing/ArmaturePopulate.cpp @@ -168,7 +168,6 @@ void ArmaturePopulate::BuildBoneStack(aiNode *, const std::vector &bones, std::map &bone_stack, std::vector &node_stack) { - ai_assert(scene); ai_assert(root_node); ai_assert(!node_stack.empty()); diff --git a/include/assimp/ai_assert.h b/include/assimp/ai_assert.h index 8b2b396f4..195ebbfd0 100644 --- a/include/assimp/ai_assert.h +++ b/include/assimp/ai_assert.h @@ -42,12 +42,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_ASSERT_H_INC #define AI_ASSERT_H_INC +#include + #if defined(ASSIMP_BUILD_DEBUG) namespace Assimp { // Assert violation behavior can be customized: see AssertHandler.h. - void aiAssertViolation(const char* failedExpression, const char* file, int line); + ASSIMP_API void aiAssertViolation(const char* failedExpression, const char* file, int line); } # define ai_assert(expression) (void)((!!(expression)) || (Assimp::aiAssertViolation(#expression, __FILE__, __LINE__), 0)) From 3fb7747429c2f773fc40dd6e437a1da9cbbae9b7 Mon Sep 17 00:00:00 2001 From: Hill Ma Date: Fri, 3 Jul 2020 18:14:45 -0700 Subject: [PATCH 014/129] Improve ToBinary() for double precision. The constant 0x80000000 is specific to 32 bit types. Make the bit mask according to the size of types. --- code/Common/SpatialSort.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/Common/SpatialSort.cpp b/code/Common/SpatialSort.cpp index 3b8a64606..88f06b618 100644 --- a/code/Common/SpatialSort.cpp +++ b/code/Common/SpatialSort.cpp @@ -208,13 +208,14 @@ BinFloat ToBinary(const ai_real &pValue) { // floating-point numbers are of sign-magnitude format, so find out what signed number // representation we must convert negative values to. // See http://en.wikipedia.org/wiki/Signed_number_representations. + const BinFloat mask = BinFloat(1) << (CHAR_BIT * sizeof(BinFloat) - 1); // Two's complement? - const bool DefaultValue = ((-42 == (~42 + 1)) && (binValue & 0x80000000)); - const bool OneComplement = ((-42 == ~42) && (binValue & 0x80000000)); + const bool DefaultValue = ((-42 == (~42 + 1)) && (binValue & mask)); + const bool OneComplement = ((-42 == ~42) && (binValue & mask)); if (DefaultValue) - return BinFloat(BinFloat(1) << (CHAR_BIT * sizeof(BinFloat) - 1)) - binValue; + return mask - binValue; // One's complement? else if (OneComplement) return BinFloat(-0) - binValue; From abf43eaf74883a7cc763d42221af5eb4e750b138 Mon Sep 17 00:00:00 2001 From: Max Vollmer Date: Sun, 5 Jul 2020 19:22:31 +0100 Subject: [PATCH 015/129] * Added ASSIMP_BUILD_NO_GLTF1_IMPORTER, ASSIMP_BUILD_NO_GLTF2_IMPORTER, ASSIMP_BUILD_NO_GLTF1_EXPORTER, and ASSIMP_BUILD_NO_GLTF2_EXPORTER to allow disabling GLTF1 and GLTF2 independently. * ASSIMP_BUILD_NO_GLTF_IMPORTER and ASSIMP_BUILD_NO_GLTF_EXPORTER remain with same behavior as before --- code/AssetLib/glTF/glTFAsset.h | 4 ++-- code/AssetLib/glTF/glTFAssetWriter.h | 2 +- code/AssetLib/glTF/glTFExporter.h | 2 +- code/AssetLib/glTF/glTFImporter.cpp | 4 ++-- code/AssetLib/glTF2/glTF2Asset.h | 2 +- code/AssetLib/glTF2/glTF2AssetWriter.h | 2 +- code/AssetLib/glTF2/glTF2Exporter.h | 2 +- code/AssetLib/glTF2/glTF2Importer.cpp | 2 +- code/Common/Exporter.cpp | 5 ++++- code/Common/ImporterRegistry.cpp | 10 +++++++--- 10 files changed, 21 insertions(+), 14 deletions(-) diff --git a/code/AssetLib/glTF/glTFAsset.h b/code/AssetLib/glTF/glTFAsset.h index d6d1dd372..15947c8c6 100644 --- a/code/AssetLib/glTF/glTFAsset.h +++ b/code/AssetLib/glTF/glTFAsset.h @@ -1,4 +1,4 @@ -/* +/* Open Asset Import Library (assimp) ---------------------------------------------------------------------- @@ -49,7 +49,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef GLTFASSET_H_INC #define GLTFASSET_H_INC -#ifndef ASSIMP_BUILD_NO_GLTF_IMPORTER +#if !defined(ASSIMP_BUILD_NO_GLTF_IMPORTER) && !defined(ASSIMP_BUILD_NO_GLTF1_IMPORTER) #include diff --git a/code/AssetLib/glTF/glTFAssetWriter.h b/code/AssetLib/glTF/glTFAssetWriter.h index f166ee532..ed81d12cd 100644 --- a/code/AssetLib/glTF/glTFAssetWriter.h +++ b/code/AssetLib/glTF/glTFAssetWriter.h @@ -50,7 +50,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef GLTFASSETWRITER_H_INC #define GLTFASSETWRITER_H_INC -#ifndef ASSIMP_BUILD_NO_GLTF_IMPORTER +#if !defined(ASSIMP_BUILD_NO_GLTF_IMPORTER) && !defined(ASSIMP_BUILD_NO_GLTF1_IMPORTER) #include "glTFAsset.h" diff --git a/code/AssetLib/glTF/glTFExporter.h b/code/AssetLib/glTF/glTFExporter.h index 415992314..fe7592566 100644 --- a/code/AssetLib/glTF/glTFExporter.h +++ b/code/AssetLib/glTF/glTFExporter.h @@ -46,7 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_GLTFEXPORTER_H_INC #define AI_GLTFEXPORTER_H_INC -#ifndef ASSIMP_BUILD_NO_GLTF_EXPORTER +#if !defined(ASSIMP_BUILD_NO_GLTF_EXPORTER) && !defined(ASSIMP_BUILD_NO_GLTF1_EXPORTER) #include #include diff --git a/code/AssetLib/glTF/glTFImporter.cpp b/code/AssetLib/glTF/glTFImporter.cpp index b4ef9b06f..ef24592ae 100644 --- a/code/AssetLib/glTF/glTFImporter.cpp +++ b/code/AssetLib/glTF/glTFImporter.cpp @@ -1,4 +1,4 @@ -/* +/* Open Asset Import Library (assimp) ---------------------------------------------------------------------- @@ -39,7 +39,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ -#ifndef ASSIMP_BUILD_NO_GLTF_IMPORTER +#if !defined(ASSIMP_BUILD_NO_GLTF_IMPORTER) && !defined(ASSIMP_BUILD_NO_GLTF1_IMPORTER) #include "AssetLib/glTF/glTFImporter.h" #include "AssetLib/glTF/glTFAsset.h" diff --git a/code/AssetLib/glTF2/glTF2Asset.h b/code/AssetLib/glTF2/glTF2Asset.h index f79ddee87..2168c78e3 100644 --- a/code/AssetLib/glTF2/glTF2Asset.h +++ b/code/AssetLib/glTF2/glTF2Asset.h @@ -50,7 +50,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef GLTF2ASSET_H_INC #define GLTF2ASSET_H_INC -#ifndef ASSIMP_BUILD_NO_GLTF_IMPORTER +#if !defined(ASSIMP_BUILD_NO_GLTF_IMPORTER) && !defined(ASSIMP_BUILD_NO_GLTF2_IMPORTER) #include diff --git a/code/AssetLib/glTF2/glTF2AssetWriter.h b/code/AssetLib/glTF2/glTF2AssetWriter.h index 784ab2ea5..ce58717f3 100644 --- a/code/AssetLib/glTF2/glTF2AssetWriter.h +++ b/code/AssetLib/glTF2/glTF2AssetWriter.h @@ -50,7 +50,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef GLTF2ASSETWRITER_H_INC #define GLTF2ASSETWRITER_H_INC -#ifndef ASSIMP_BUILD_NO_GLTF_IMPORTER +#if !defined(ASSIMP_BUILD_NO_GLTF_IMPORTER) && !defined(ASSIMP_BUILD_NO_GLTF2_IMPORTER) #include "glTF2Asset.h" diff --git a/code/AssetLib/glTF2/glTF2Exporter.h b/code/AssetLib/glTF2/glTF2Exporter.h index 421a4806e..1d28ed459 100644 --- a/code/AssetLib/glTF2/glTF2Exporter.h +++ b/code/AssetLib/glTF2/glTF2Exporter.h @@ -46,7 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef AI_GLTF2EXPORTER_H_INC #define AI_GLTF2EXPORTER_H_INC -#ifndef ASSIMP_BUILD_NO_GLTF_IMPORTER +#if !defined(ASSIMP_BUILD_NO_GLTF_IMPORTER) && !defined(ASSIMP_BUILD_NO_GLTF2_IMPORTER) #include #include diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 4d740d8c1..323f29f8e 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -39,7 +39,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ -#ifndef ASSIMP_BUILD_NO_GLTF_IMPORTER +#if !defined(ASSIMP_BUILD_NO_GLTF_IMPORTER) && !defined(ASSIMP_BUILD_NO_GLTF2_IMPORTER) #include "AssetLib/glTF2/glTF2Importer.h" #include "PostProcessing/MakeVerboseFormat.h" diff --git a/code/Common/Exporter.cpp b/code/Common/Exporter.cpp index 58fc01d91..555a886af 100644 --- a/code/Common/Exporter.cpp +++ b/code/Common/Exporter.cpp @@ -179,11 +179,14 @@ static void setupExporterArray(std::vector &exporte aiProcess_Triangulate | aiProcess_SortByPType | aiProcess_JoinIdenticalVertices)); #endif -#ifndef ASSIMP_BUILD_NO_GLTF_EXPORTER +#if !defined(ASSIMP_BUILD_NO_GLTF_EXPORTER) && !defined(ASSIMP_BUILD_NO_GLTF2_EXPORTER) exporters.push_back(Exporter::ExportFormatEntry("gltf2", "GL Transmission Format v. 2", "gltf", &ExportSceneGLTF2, aiProcess_JoinIdenticalVertices | aiProcess_Triangulate | aiProcess_SortByPType)); exporters.push_back(Exporter::ExportFormatEntry("glb2", "GL Transmission Format v. 2 (binary)", "glb", &ExportSceneGLB2, aiProcess_JoinIdenticalVertices | aiProcess_Triangulate | aiProcess_SortByPType)); +#endif + +#if !defined(ASSIMP_BUILD_NO_GLTF_EXPORTER) && !defined(ASSIMP_BUILD_NO_GLTF1_EXPORTER) exporters.push_back(Exporter::ExportFormatEntry("gltf", "GL Transmission Format", "gltf", &ExportSceneGLTF, aiProcess_JoinIdenticalVertices | aiProcess_Triangulate | aiProcess_SortByPType)); exporters.push_back(Exporter::ExportFormatEntry("glb", "GL Transmission Format (binary)", "glb", &ExportSceneGLB, diff --git a/code/Common/ImporterRegistry.cpp b/code/Common/ImporterRegistry.cpp index da51696bc..c24f39a31 100644 --- a/code/Common/ImporterRegistry.cpp +++ b/code/Common/ImporterRegistry.cpp @@ -1,4 +1,4 @@ -/* +/* --------------------------------------------------------------------------- Open Asset Import Library (assimp) --------------------------------------------------------------------------- @@ -179,8 +179,10 @@ corresponding preprocessor flag to selectively disable formats. #ifndef ASSIMP_BUILD_NO_ASSBIN_IMPORTER #include "AssetLib/Assbin/AssbinLoader.h" #endif -#ifndef ASSIMP_BUILD_NO_GLTF_IMPORTER +#if !defined(ASSIMP_BUILD_NO_GLTF_IMPORTER) && !defined(ASSIMP_BUILD_NO_GLTF1_IMPORTER) #include "AssetLib/glTF/glTFImporter.h" +#endif +#if !defined(ASSIMP_BUILD_NO_GLTF_IMPORTER) && !defined(ASSIMP_BUILD_NO_GLTF2_IMPORTER) #include "AssetLib/glTF2/glTF2Importer.h" #endif #ifndef ASSIMP_BUILD_NO_C4D_IMPORTER @@ -339,8 +341,10 @@ void GetImporterInstanceList(std::vector &out) { #if (!defined ASSIMP_BUILD_NO_ASSBIN_IMPORTER) out.push_back(new AssbinImporter()); #endif -#if (!defined ASSIMP_BUILD_NO_GLTF_IMPORTER) +#if (!defined ASSIMP_BUILD_NO_GLTF_IMPORTER && !defined ASSIMP_BUILD_NO_GLTF1_IMPORTER) out.push_back(new glTFImporter()); +#endif +#if (!defined ASSIMP_BUILD_NO_GLTF_IMPORTER && !defined ASSIMP_BUILD_NO_GLTF2_IMPORTER) out.push_back(new glTF2Importer()); #endif #if (!defined ASSIMP_BUILD_NO_C4D_IMPORTER) From 6c29247180dc247fb9a1d9bc17cb55ce9a20bb14 Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Mon, 6 Jul 2020 17:41:14 -0400 Subject: [PATCH 016/129] add triangle strip support to AC file loader --- code/AssetLib/AC/ACLoader.cpp | 61 +++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/code/AssetLib/AC/ACLoader.cpp b/code/AssetLib/AC/ACLoader.cpp index ac1631a9b..6be720f02 100644 --- a/code/AssetLib/AC/ACLoader.cpp +++ b/code/AssetLib/AC/ACLoader.cpp @@ -484,6 +484,12 @@ aiNode *AC3DImporter::ConvertObjectSection(Object &object, needMat[idx].second += ((unsigned int)(*it).entries.size() - 1) << 1u; break; + // triangle strip + case 0x4: + needMat[idx].first += (unsigned int)(*it).entries.size() - 2; + needMat[idx].second += ((unsigned int)(*it).entries.size() - 2) * 3; + break; + // 0 == polygon, else unknown default: if ((*it).flags & 0xf) { @@ -570,6 +576,61 @@ aiNode *AC3DImporter::ConvertObjectSection(Object &object, } } } + } else if (type == 0x4) { + for (unsigned int i = 0; i < (unsigned int)src.entries.size() - 2; ++i) { + const Surface::SurfaceEntry &entry1 = src.entries[i]; + const Surface::SurfaceEntry &entry2 = src.entries[i + 1]; + const Surface::SurfaceEntry &entry3 = src.entries[i + 2]; + + // skip degenerate triangles + if (object.vertices[entry1.first] == object.vertices[entry2.first] || + object.vertices[entry1.first] == object.vertices[entry3.first] || + object.vertices[entry2.first] == object.vertices[entry3.first]) { + mesh->mNumFaces--; + mesh->mNumVertices -= 3; + continue; + } + + aiFace &face = *faces++; + face.mNumIndices = 3; + face.mIndices = new unsigned int[face.mNumIndices]; + face.mIndices[0] = cur++; + face.mIndices[1] = cur++; + face.mIndices[2] = cur++; + if (!(i & 1)) { + *vertices++ = object.vertices[entry1.first] + object.translation; + if (uv) { + uv->x = entry1.second.x; + uv->y = entry1.second.y; + ++uv; + } + *vertices++ = object.vertices[entry2.first] + object.translation; + if (uv) { + uv->x = entry2.second.x; + uv->y = entry2.second.y; + ++uv; + } + } else { + *vertices++ = object.vertices[entry2.first] + object.translation; + if (uv) { + uv->x = entry2.second.x; + uv->y = entry2.second.y; + ++uv; + } + *vertices++ = object.vertices[entry1.first] + object.translation; + if (uv) { + uv->x = entry1.second.x; + uv->y = entry1.second.y; + ++uv; + } + } + *vertices++ = object.vertices[entry3.first] + object.translation; + if (uv) { + uv->x = entry3.second.x; + uv->y = entry3.second.y; + ++uv; + } + } } else { it2 = (*it).entries.begin(); From f753a6e7ad1c351ffbbc0d3260c2202520e09beb Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Mon, 6 Jul 2020 20:14:03 -0400 Subject: [PATCH 017/129] add acc file test using existing ac file converted to acc format --- test/models/AC/Wuson.acc | 9528 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 9528 insertions(+) create mode 100644 test/models/AC/Wuson.acc diff --git a/test/models/AC/Wuson.acc b/test/models/AC/Wuson.acc new file mode 100644 index 000000000..6e6aee582 --- /dev/null +++ b/test/models/AC/Wuson.acc @@ -0,0 +1,9528 @@ +AC3Db +MATERIAL "DefaultWhite" rgb 1 1 1 amb 1 1 1 emis 0 0 0 spec 0.5 0.5 0.5 shi 0 trans 0 +OBJECT world +kids 1 +OBJECT poly +name "MESH" +numvert 3161 +-0.343303 -1.163795 -1.072610 -0.368130 -0.808416 -0.459286 +-0.361312 -1.160513 -1.063353 -0.921609 -0.357869 0.150225 +-0.355943 -1.129597 -1.088021 -0.345433 -0.217054 -0.912997 +-0.372936 -1.126281 -1.083700 -0.914896 0.346902 0.206458 +-0.357764 -1.155275 -1.061677 -0.283888 0.500285 0.817999 +-0.363313 -1.128177 -1.076717 -0.196322 0.115199 0.973749 +-0.348236 -1.105636 -1.066348 -0.439092 -0.108607 0.891854 +-0.351197 -1.098160 -1.069294 -0.778692 0.625695 -0.046313 +-0.332530 -1.106033 -1.077487 -0.129960 0.518644 -0.845055 +-0.329556 -1.172598 -1.035929 -0.354215 0.719343 0.597559 +-0.331995 -1.180665 -1.031806 -0.725050 -0.488759 0.485198 +-0.304381 -1.184538 -1.045494 -0.192502 -0.977040 -0.091296 +-0.305743 -1.176263 -1.011915 -0.526763 0.554871 0.643925 +-0.305398 -1.183834 -1.009541 -0.459568 -0.736064 0.496999 +-0.279853 -1.188245 -1.025279 -0.035887 -0.991930 0.121604 +-0.336214 -1.117070 -1.070677 -0.067295 -0.344926 0.936214 +-0.348472 -1.131245 -1.076251 -0.013622 0.085427 0.996251 +-0.275683 -1.171798 -0.990842 -0.565770 0.588340 0.577719 +-0.292839 -1.167308 -1.027903 -0.343933 0.883692 0.317487 +-0.269625 -1.163410 -0.996001 -0.627770 0.683018 0.373351 +-0.312037 -1.163003 -1.057184 -0.022911 0.847034 0.531045 +-0.338613 -1.146774 -1.069065 0.068005 0.526146 0.847671 +-0.265898 -1.184636 -1.016200 0.175160 -0.966731 0.186413 +-0.285302 -1.182847 -0.993891 -0.391605 -0.472438 0.789587 +-0.264614 -1.166326 -0.984473 -0.466393 0.081932 0.880775 +-0.245808 -1.173403 -0.979229 0.033385 -0.844246 0.534915 +-0.239201 -1.174720 -0.997346 0.243556 -0.956868 0.158380 +-0.159733 -1.351043 -0.960337 -0.239022 -0.260069 -0.935539 +-0.149381 -1.370119 -0.954521 -0.220660 -0.628737 -0.745654 +-0.173488 -1.358508 -0.942559 -0.566451 -0.505769 -0.650639 +-0.167375 -1.369772 -0.939125 -0.476905 -0.692115 -0.541791 +-0.141802 -1.384084 -0.938632 -0.071415 -0.903737 -0.422089 +-0.162901 -1.378017 -0.929744 -0.372041 -0.885358 -0.278795 +-0.139028 -1.389196 -0.916928 -0.019344 -0.999706 0.014590 +-0.161263 -1.381035 -0.916928 -0.343948 -0.937138 0.058924 +-0.141802 -1.384084 -0.895224 -0.078381 -0.890914 0.447357 +-0.162901 -1.378017 -0.904112 -0.400130 -0.833585 0.380831 +-0.149381 -1.370119 -0.879335 -0.232714 -0.606512 0.760255 +-0.167375 -1.369772 -0.894731 -0.525584 -0.602416 0.600713 +-0.159733 -1.351043 -0.873520 -0.369964 -0.223894 0.901664 +-0.173488 -1.358508 -0.891297 -0.566429 -0.505766 0.650660 +-0.135179 -1.337718 -0.965356 -0.196599 -0.007046 -0.980459 +-0.123630 -1.359001 -0.958868 0.042811 -0.448241 -0.892887 +-0.115175 -1.374581 -0.941142 0.229247 -0.791845 -0.566063 +-0.112080 -1.380283 -0.916928 0.312801 -0.945773 -0.087579 +-0.115175 -1.374581 -0.892714 0.271020 -0.868807 0.414394 +-0.123630 -1.359001 -0.874988 0.115139 -0.581556 0.805317 +-0.135179 -1.337718 -0.868500 -0.113082 -0.160991 0.980456 +-0.146729 -1.316436 -0.874988 -0.271926 0.142550 0.951701 +-0.170085 -1.331967 -0.879335 -0.271920 0.142548 0.951704 +-0.146729 -1.316436 -0.958868 -0.271926 0.142557 -0.951701 +-0.170085 -1.331967 -0.954521 -0.271922 0.142577 -0.951699 +-0.167375 -1.369772 -0.939125 -0.787254 -0.574453 -0.224132 +-0.179524 -1.361783 -0.916928 -0.878924 -0.476962 0.000000 +-0.173488 -1.358508 -0.942559 -0.832254 -0.383619 -0.400237 +-0.162901 -1.378017 -0.929744 -0.742078 -0.657706 -0.129398 +-0.161263 -1.381035 -0.916928 -0.725534 -0.688187 0.000000 +-0.162901 -1.378017 -0.904112 -0.742078 -0.657706 0.129398 +-0.167375 -1.369772 -0.894731 -0.787254 -0.574453 0.224132 +-0.173488 -1.358508 -0.891297 -0.815145 -0.340009 0.468970 +-0.179601 -1.347243 -0.894731 -0.891526 -0.157300 0.424780 +-0.184075 -1.338998 -0.904112 -0.974488 -0.004417 0.224398 +-0.185713 -1.335980 -0.916928 -0.998550 0.039917 -0.036121 +-0.184075 -1.338998 -0.929744 -0.957262 -0.036154 -0.286953 +-0.179601 -1.347243 -0.939125 -0.861690 -0.212288 -0.460896 +-0.159733 -1.351043 -0.873520 -0.732750 -0.199300 0.650658 +-0.170085 -1.331967 -0.879335 -0.712883 0.157143 0.683450 +-0.177663 -1.318002 -0.895224 -0.796647 0.432669 0.422081 +-0.180437 -1.312890 -0.916928 -0.848727 0.528630 -0.014588 +-0.177663 -1.318002 -0.938632 -0.789690 0.419839 -0.447353 +-0.170085 -1.331967 -0.954521 -0.784588 0.122559 -0.607783 +-0.159733 -1.351043 -0.960337 -0.732770 -0.199292 -0.650639 +-0.146729 -1.316436 -0.874988 -0.482612 0.530771 0.696684 +-0.155183 -1.300856 -0.892714 -0.538967 0.623774 0.566056 +-0.158278 -1.295154 -0.916928 -0.622490 0.777712 0.087578 +-0.155183 -1.300856 -0.941142 -0.580728 0.700739 -0.414391 +-0.146729 -1.316436 -0.958868 -0.482615 0.530772 -0.696681 +-0.007777 1.583781 -1.285707 -0.694618 -0.192257 0.693213 +-0.000345 1.583852 -1.280908 -0.513488 -0.157742 0.843474 +-0.013389 1.611106 -1.283752 -0.678659 -0.191051 0.709169 +-0.000428 1.612066 -1.276136 -0.493065 -0.146496 0.857570 +-0.020758 1.612066 -1.293944 -0.799698 -0.223856 0.557110 +-0.015212 1.583690 -1.297385 -0.812305 -0.215486 0.541965 +-0.012060 1.519814 -1.281023 -0.699437 -0.147215 0.699368 +-0.000351 1.519087 -1.274030 -0.481137 -0.142013 0.865066 +-0.018614 1.595557 -1.271634 -0.711099 -0.134462 0.690115 +-0.000373 1.597562 -1.262090 -0.447717 -0.134624 0.883983 +-0.027355 1.597562 -1.291280 -0.913149 -0.093619 0.396729 +-0.022072 1.519996 -1.297424 -0.881899 -0.115633 0.457036 +-0.015475 1.475798 -1.277939 -0.777520 -0.141381 0.612759 +-0.000349 1.475675 -1.269924 -0.441888 -0.140128 0.886058 +-0.023519 1.567919 -1.266891 -0.753911 -0.146545 0.640424 +-0.000372 1.570149 -1.255745 -0.419314 -0.134843 0.897771 +-0.034452 1.570149 -1.296174 -0.930455 -0.145408 0.336318 +-0.021517 1.476233 -1.300993 -0.947124 -0.129821 0.293433 +-0.036751 1.537030 -1.295993 -0.940385 -0.168274 0.295568 +-0.021517 1.443114 -1.300993 -0.949139 -0.158746 0.271908 +-0.025818 1.534800 -1.262478 -0.949139 -0.158746 0.271908 +-0.015475 1.442679 -1.277939 -0.957204 -0.149103 0.248051 +-0.015475 1.442679 -1.277939 -0.460301 -0.196964 0.865638 +-0.000349 1.442555 -1.269924 -0.439601 -0.192197 0.877389 +-0.025818 1.534800 -1.262478 -0.439601 -0.192197 0.877389 +-0.000372 1.537030 -1.250020 -0.418642 -0.187317 0.888623 +-0.039525 1.500012 -1.289692 -0.926847 -0.120357 0.355623 +-0.028506 1.392485 -1.297365 -0.912115 -0.132629 0.387885 +-0.027067 1.497572 -1.258049 -0.912115 -0.132629 0.387885 +-0.018579 1.392218 -1.276257 -0.896099 -0.144714 0.419601 +-0.018579 1.392218 -1.276257 -0.426589 -0.187293 0.884841 +-0.000351 1.392143 -1.267485 -0.412715 -0.184418 0.891996 +-0.027067 1.497572 -1.258049 -0.412715 -0.184418 0.891996 +-0.000403 1.500012 -1.245729 -0.398737 -0.181496 0.898926 +-0.043651 1.457243 -1.289771 -0.922057 -0.154920 0.354699 +-0.028506 1.349716 -1.297365 -0.907360 -0.166177 0.386114 +-0.031193 1.454802 -1.258452 -0.907360 -0.166177 0.386114 +-0.018579 1.349450 -1.276257 -0.891456 -0.177213 0.417015 +-0.018579 1.349450 -1.276257 -0.425544 -0.200104 0.882536 +-0.000351 1.349374 -1.267485 -0.399148 -0.193555 0.896224 +-0.031193 1.454802 -1.258452 -0.399148 -0.193555 0.896224 +-0.000403 1.457243 -1.245338 -0.372382 -0.186826 0.909081 +-0.046819 1.414506 -1.287978 -0.891662 -0.144440 0.429041 +-0.029357 1.278820 -1.297367 -0.898695 -0.140587 0.415431 +-0.032103 1.411768 -1.258316 -0.898695 -0.140587 0.415431 +-0.019341 1.278735 -1.274819 -0.905504 -0.136700 0.401717 +-0.019341 1.278735 -1.274819 -0.447698 -0.152254 0.881127 +-0.000345 1.279529 -1.265030 -0.402402 -0.142552 0.904296 +-0.032103 1.411768 -1.258316 -0.402402 -0.142552 0.904296 +-0.000345 1.414506 -1.245701 -0.356026 -0.132468 0.925039 +-0.043068 1.325265 -1.289129 -0.870751 -0.100438 0.481357 +-0.032032 1.188607 -1.297680 -0.892376 -0.089747 0.442279 +-0.028351 1.322527 -1.263078 -0.892376 -0.089747 0.442279 +-0.021388 1.189144 -1.273440 -0.912119 -0.078866 0.402267 +-0.021388 1.189144 -1.273440 -0.409418 -0.091889 0.907708 +-0.000345 1.188933 -1.263970 -0.359933 -0.081660 0.929398 +-0.028351 1.322527 -1.263078 -0.359933 -0.081660 0.929398 +-0.000345 1.325265 -1.253736 -0.309359 -0.071184 0.948277 +-0.014435 1.611458 -1.309839 -0.869412 -0.422036 -0.256921 +-0.002626 1.584369 -1.305302 -0.751840 -0.267439 -0.602671 +-0.017630 1.611106 -1.298449 -0.965614 -0.240434 -0.098898 +-0.015267 1.583688 -1.297604 -0.971576 -0.090476 -0.218757 +-0.007538 1.583853 -1.285870 -0.903892 -0.149778 0.400682 +-0.014435 1.612066 -1.284791 -0.941571 -0.239245 0.237077 +-0.000428 1.612066 -1.318737 -0.493111 -0.146522 -0.857539 +-0.000345 1.583852 -1.313964 -0.513472 -0.157733 -0.843485 +-0.013389 1.611106 -1.311120 -0.678646 -0.191041 -0.709185 +-0.007777 1.583781 -1.309166 -0.694588 -0.192228 -0.693250 +-0.015212 1.583690 -1.297488 -0.812295 -0.215477 -0.541984 +-0.020758 1.612066 -1.300929 -0.799672 -0.223856 -0.557147 +-0.000373 1.597562 -1.332783 -0.447776 -0.134619 -0.883954 +-0.000351 1.519087 -1.320843 -0.481166 -0.142001 -0.865052 +-0.018613 1.595557 -1.323238 -0.711100 -0.134451 -0.690115 +-0.012060 1.519814 -1.313850 -0.699438 -0.147197 -0.699370 +-0.022072 1.519996 -1.297449 -0.881886 -0.115625 -0.457064 +-0.027355 1.597562 -1.303593 -0.913125 -0.093622 -0.396784 +-0.022081 1.597562 -1.324929 -0.962630 -0.159597 -0.218798 +-0.011751 1.520020 -1.313816 -0.905427 -0.107635 -0.410629 +-0.027835 1.595557 -1.298151 -0.993500 -0.112701 -0.016025 +-0.023238 1.519814 -1.297900 -0.997698 -0.060653 -0.030337 +-0.012708 1.519996 -1.281267 -0.919986 -0.099463 0.379121 +-0.022081 1.597562 -1.270444 -0.966419 -0.146262 0.211284 +-0.000372 1.570149 -1.339127 -0.419283 -0.134836 -0.897787 +-0.000349 1.475675 -1.324949 -0.441896 -0.140130 -0.886054 +-0.023519 1.567919 -1.327982 -0.753918 -0.146544 -0.640416 +-0.015475 1.475798 -1.316933 -0.777534 -0.141386 -0.612740 +-0.021517 1.476234 -1.293880 -0.947128 -0.129819 -0.293422 +-0.034451 1.570149 -1.298699 -0.930466 -0.145400 -0.336291 +-0.027068 1.570149 -1.329074 -0.967620 -0.146678 -0.205421 +-0.015223 1.476312 -1.317866 -0.927524 -0.105642 -0.358523 +-0.033316 1.567919 -1.298051 -0.994028 -0.109005 -0.005130 +-0.026855 1.475798 -1.297816 -0.997387 -0.069998 -0.017869 +-0.015913 1.476233 -1.277305 -0.932470 -0.098339 0.347606 +-0.027068 1.570149 -1.268926 -0.966746 -0.134247 0.217669 +-0.015475 1.442679 -1.316933 -0.957201 -0.149107 -0.248061 +-0.021517 1.443114 -1.293880 -0.949138 -0.158748 -0.271913 +-0.025818 1.534800 -1.332395 -0.949138 -0.158748 -0.271913 +-0.036751 1.537030 -1.298880 -0.940385 -0.168274 -0.295568 +-0.000372 1.537030 -1.344853 -0.418642 -0.187317 -0.888623 +-0.000349 1.442555 -1.324949 -0.439623 -0.192202 -0.877377 +-0.025818 1.534800 -1.332395 -0.439623 -0.192202 -0.877377 +-0.015475 1.442679 -1.316933 -0.460344 -0.196974 -0.865612 +-0.029367 1.537029 -1.333645 -0.967483 -0.176324 -0.181345 +-0.015223 1.443193 -1.317866 -0.928580 -0.132019 -0.346858 +-0.035616 1.534799 -1.298138 -0.990634 -0.136435 -0.005446 +-0.026855 1.442678 -1.297816 -0.995344 -0.094723 -0.017856 +-0.015913 1.443114 -1.277305 -0.933855 -0.124500 0.335282 +-0.029367 1.537029 -1.264803 -0.967490 -0.164206 0.192351 +-0.032987 1.500012 -1.334286 -0.971131 -0.154903 -0.181408 +-0.018732 1.392114 -1.318464 -0.947302 -0.128622 -0.293385 +-0.039357 1.497572 -1.298102 -0.991493 -0.129558 -0.012494 +-0.027913 1.392711 -1.297786 -0.993594 -0.108531 -0.031485 +-0.020142 1.392485 -1.276685 -0.955806 -0.120075 0.268359 +-0.032987 1.500012 -1.264132 -0.971548 -0.138489 0.192131 +-0.018579 1.392219 -1.318616 -0.896096 -0.144712 -0.419607 +-0.028506 1.392485 -1.297508 -0.912112 -0.132628 -0.387893 +-0.027067 1.497572 -1.336823 -0.912112 -0.132628 -0.387893 +-0.039525 1.500012 -1.305181 -0.926844 -0.120357 -0.355633 +-0.000403 1.500012 -1.349143 -0.398738 -0.181488 -0.898927 +-0.000351 1.392143 -1.327388 -0.412720 -0.184410 -0.891995 +-0.027067 1.497572 -1.336823 -0.412720 -0.184410 -0.891995 +-0.018579 1.392219 -1.318616 -0.426598 -0.187287 -0.884838 +-0.037113 1.457243 -1.333909 -0.964164 -0.190659 -0.184490 +-0.018732 1.349345 -1.318464 -0.941715 -0.164327 -0.293545 +-0.043483 1.454802 -1.298096 -0.985875 -0.167038 -0.012229 +-0.027913 1.349942 -1.297786 -0.988664 -0.146892 -0.031070 +-0.020142 1.349716 -1.276685 -0.950360 -0.156266 0.269068 +-0.037113 1.457243 -1.264473 -0.965051 -0.174518 0.195502 +-0.018579 1.349450 -1.318616 -0.891457 -0.177208 -0.417015 +-0.028506 1.349716 -1.297508 -0.907357 -0.166175 -0.386121 +-0.031193 1.454803 -1.336420 -0.907357 -0.166175 -0.386121 +-0.043651 1.457243 -1.305102 -0.922051 -0.154921 -0.354713 +-0.000403 1.457243 -1.349535 -0.372411 -0.186832 -0.909067 +-0.000351 1.349374 -1.327387 -0.399143 -0.193552 -0.896227 +-0.031193 1.454803 -1.336420 -0.399143 -0.193552 -0.896227 +-0.018579 1.349450 -1.318616 -0.425506 -0.200093 -0.882557 +-0.031963 1.414506 -1.332496 -0.954880 -0.131496 -0.266294 +-0.016837 1.279816 -1.320225 -0.916973 -0.104483 -0.385025 +-0.041210 1.411768 -1.297986 -0.994133 -0.106553 -0.018579 +-0.029808 1.280044 -1.297729 -0.995162 -0.086233 -0.047081 +-0.019007 1.279646 -1.274121 -0.932637 -0.093796 0.348412 +-0.031963 1.414506 -1.265585 -0.953357 -0.109396 0.281325 +-0.019341 1.278736 -1.320054 -0.905502 -0.136694 -0.401722 +-0.029357 1.278820 -1.297506 -0.898688 -0.140585 -0.415446 +-0.032102 1.411768 -1.336557 -0.898688 -0.140585 -0.415446 +-0.046819 1.414506 -1.306895 -0.891650 -0.144440 -0.429065 +-0.000345 1.414506 -1.349172 -0.356035 -0.132474 -0.925035 +-0.000345 1.279529 -1.329842 -0.402391 -0.142553 -0.904301 +-0.032102 1.411768 -1.336557 -0.402391 -0.142553 -0.904301 +-0.019341 1.278736 -1.320054 -0.447668 -0.152251 -0.881143 +-0.028212 1.325265 -1.328228 -0.952886 -0.064003 -0.296499 +-0.021185 1.189232 -1.321447 -0.933902 -0.051572 -0.353791 +-0.037459 1.322527 -1.297919 -0.998128 -0.056463 0.023495 +-0.032060 1.188684 -1.297206 -0.998460 -0.040072 0.038376 +-0.019151 1.190492 -1.273409 -0.915769 -0.053065 0.398185 +-0.028212 1.325265 -1.269463 -0.946438 -0.072841 0.314561 +-0.021388 1.189144 -1.321433 -0.912125 -0.078865 -0.402253 +-0.032032 1.188607 -1.297192 -0.892380 -0.089748 -0.442272 +-0.028351 1.322527 -1.331795 -0.892380 -0.089748 -0.442272 +-0.043068 1.325265 -1.305744 -0.870751 -0.100442 -0.481357 +-0.000345 1.325265 -1.341137 -0.309359 -0.071184 -0.948277 +-0.000345 1.188933 -1.330903 -0.359933 -0.081660 -0.929398 +-0.028351 1.322527 -1.331795 -0.359933 -0.081660 -0.929398 +-0.021388 1.189144 -1.321433 -0.409418 -0.091889 -0.907708 +0.000000 -1.276195 -0.555204 -1.000000 0.000044 0.000106 +0.000014 -1.250245 -0.434445 -1.000000 0.000025 0.000099 +0.000000 -1.188162 -0.591492 -1.000000 0.000021 0.000096 +0.000014 -1.159240 -0.439762 -1.000000 0.000007 0.000088 +0.000000 -1.063840 -0.611120 -1.000000 -0.000003 0.000086 +0.000014 -1.050621 -0.441716 -1.000000 -0.000011 0.000086 +0.000000 -0.987748 -0.589001 -1.000000 -0.000030 0.000089 +0.000014 -0.986598 -0.434334 -1.000000 -0.000033 0.000095 +0.000000 -0.931298 -0.554330 -1.000000 -0.000055 0.000098 +0.000014 -0.932663 -0.417662 -1.000000 -0.000050 0.000108 +0.000000 -0.882034 -0.516288 -1.000000 -0.000065 0.000115 +0.000014 -0.880610 -0.399948 -1.000000 -0.000059 0.000125 +0.000000 -0.820980 -0.477658 -1.000000 -0.000074 0.000130 +0.000014 -0.822789 -0.374273 -1.000000 -0.000072 0.000142 +0.000000 -0.743088 -0.427930 -1.000000 -0.000070 0.000150 +0.000014 -0.744348 -0.339557 -1.000000 -0.000057 0.000160 +0.000000 -0.682874 -0.406746 -1.000000 -0.000033 0.000152 +0.000014 -0.681405 -0.321842 -1.000000 -0.000039 0.000166 +0.000000 -0.520932 -0.408895 -1.000000 0.000011 0.000119 +0.000014 -0.518173 -0.291564 -1.000000 0.000006 0.000133 +0.000000 -0.433288 -0.424155 -1.000000 0.000034 0.000124 +0.000014 -0.422456 -0.316589 -1.000000 0.000040 0.000125 +0.000014 -0.340680 -0.343339 -1.000000 0.000049 0.000115 +0.000000 -0.365253 -0.450508 -1.000000 0.000051 0.000121 +0.000000 -0.278299 -0.498183 -1.000000 0.000038 0.000111 +0.000014 -0.278986 -0.368215 -1.000000 0.000022 0.000109 +0.000014 -0.182662 -0.379905 -1.000000 0.000017 0.000125 +0.000000 -0.181285 -0.504868 -1.000000 0.000008 0.000111 +0.000000 -0.002516 -0.511473 -1.000000 0.000018 0.000131 +0.000014 -0.003255 -0.418132 -1.000000 0.000032 0.000150 +-0.090468 -0.527023 -0.448803 -0.915722 -0.132316 0.379403 +-0.038948 -0.523525 -0.323235 -0.906733 -0.041819 0.419626 +-0.122302 -0.438939 -0.494918 -0.897874 -0.062103 0.435850 +-0.043792 -0.422016 -0.343618 -0.870977 0.054486 0.488293 +-0.044009 -0.342730 -0.376249 -0.808265 0.106176 0.579166 +-0.144772 -0.369612 -0.521974 -0.848424 0.023093 0.528814 +-0.163313 -0.268690 -0.540612 -0.792544 -0.007641 0.609766 +-0.049406 -0.273320 -0.399098 -0.751218 0.043022 0.658650 +-0.044787 -0.177356 -0.408909 -0.675643 0.215521 0.705023 +-0.173070 -0.171995 -0.533485 -0.778539 0.281322 0.561012 +0.000000 -0.002516 -0.511473 -0.700250 0.713833 0.009658 +-0.007276 -0.010464 -0.451574 -0.735097 0.562851 0.377931 +0.000000 -1.276185 -0.555181 -0.953738 -0.293920 0.063200 +-0.000071 -1.253767 -0.451994 -0.968818 -0.228921 0.094801 +-0.028426 -1.191990 -0.592592 -0.977115 -0.187074 0.101237 +-0.017762 -1.166412 -0.476638 -0.985726 -0.114760 0.123181 +-0.044876 -1.066191 -0.622134 -0.989850 -0.071612 0.122757 +-0.028477 -1.049551 -0.487267 -0.989857 -0.105042 0.095653 +-0.045709 -0.984544 -0.606913 -0.989511 -0.129959 0.063078 +-0.040666 -0.987166 -0.466243 -0.989128 -0.138085 0.050589 +-0.054009 -0.924554 -0.576160 -0.981705 -0.177060 0.070039 +-0.043304 -0.921943 -0.452843 -0.978345 -0.163908 0.126390 +-0.066690 -0.876854 -0.541092 -0.954227 -0.251133 0.162427 +-0.044857 -0.874260 -0.433364 -0.948194 -0.167567 0.269908 +-0.080293 -0.814336 -0.503604 -0.923417 -0.182051 0.337874 +-0.040422 -0.812548 -0.413537 -0.909730 -0.134698 0.392743 +-0.075641 -0.735415 -0.462425 -0.911591 -0.150866 0.382415 +-0.039930 -0.738402 -0.375737 -0.919840 -0.144710 0.364627 +-0.072233 -0.668912 -0.433957 -0.926843 -0.111684 0.358454 +-0.040244 -0.668088 -0.348705 -0.928134 -0.093480 0.360318 +-0.090468 -0.527023 -0.448803 -0.928048 -0.070966 0.365637 +-0.038948 -0.523525 -0.323235 -0.922983 -0.058735 0.380332 +-0.081137 0.746770 -1.310106 0.445926 0.283467 -0.848997 +-0.083203 0.776489 -1.299486 0.411560 0.292010 -0.863336 +-0.049248 0.745544 -1.293766 0.123347 0.417871 -0.900094 +-0.031367 0.777065 -1.277087 0.381269 0.254053 -0.888871 +-0.078983 0.672760 -1.329372 -0.479434 0.535854 -0.694985 +-0.060854 0.725216 -1.324017 -0.938781 0.308866 0.152618 +-0.229770 -0.368127 -0.574212 -0.518484 0.117324 0.847000 +-0.186971 -0.445619 -0.537279 -0.535712 0.129421 0.834424 +-0.144773 -0.369613 -0.521976 -0.535712 0.129421 0.834424 +-0.122304 -0.438939 -0.494920 -0.552618 0.141441 0.821345 +-0.348796 -0.704774 -0.000013 -0.000597 0.002011 0.999998 +-0.332202 -0.734652 0.000057 0.000868 0.001874 0.999998 +-0.349110 -0.655147 -0.000113 0.000217 0.000179 1.000000 +-0.335244 -0.615850 -0.000015 0.001307 -0.002955 0.999995 +-0.278199 -0.590617 -0.000015 0.000255 -0.001293 0.999999 +-0.222624 -0.608680 -0.000015 0.000000 0.000000 1.000000 +-0.200394 -0.636211 -0.000015 -0.000316 -0.000123 1.000000 +-0.189201 -0.700580 -0.000015 0.000000 0.000000 1.000000 +-0.208629 -0.741017 -0.000015 -0.000205 0.000287 1.000000 +-0.248955 -0.755402 -0.000014 -0.000273 0.000835 1.000000 +-0.272467 -0.735551 -0.000037 0.000378 0.000951 0.999999 +-0.295178 -0.752239 0.000018 0.001591 0.001131 0.999998 +-0.281603 -0.495410 -0.271164 0.295101 0.640769 0.708753 +-0.246942 -0.515169 -0.267732 0.357069 0.656451 0.664510 +-0.284307 -0.461224 -0.300945 0.357069 0.656451 0.664510 +-0.237075 -0.487034 -0.304912 0.416879 0.668166 0.616251 +-0.320785 -0.569750 -0.245758 -0.985638 -0.164017 -0.040210 +-0.316683 -0.593278 -0.250336 -0.960675 -0.272203 -0.054854 +-0.318454 -0.607310 -0.149689 -0.960675 -0.272203 -0.054854 +-0.309583 -0.628690 -0.151638 -0.923664 -0.376974 -0.068810 +-0.337312 -0.487621 -0.305082 -0.575286 0.620671 0.532741 +-0.284307 -0.461224 -0.300945 -0.453752 0.690854 0.562876 +-0.336212 -0.447832 -0.375617 -0.593563 0.683031 0.425619 +-0.287657 -0.420008 -0.357903 -0.560305 0.655029 0.506947 +-0.355280 -0.513678 -0.307759 -0.805873 0.273567 0.525100 +-0.383499 -0.505994 -0.385173 -0.776811 0.539922 0.324113 +-0.348767 -0.549903 -0.311345 -0.881100 -0.218222 0.419574 +-0.333531 -0.536521 -0.271928 -0.908451 0.090079 0.408169 +-0.321012 -0.513381 -0.269870 -0.591340 0.625468 0.509025 +-0.281603 -0.495410 -0.271164 -0.355068 0.741130 0.569784 +-0.343097 -0.581915 -0.315867 -0.798783 -0.482113 0.359879 +-0.328640 -0.560920 -0.275564 -0.926180 -0.213048 0.311129 +-0.320785 -0.569750 -0.245758 -0.958602 -0.199829 0.202854 +-0.325592 -0.544287 -0.241358 -0.968760 -0.007153 0.247898 +-0.314774 -0.524596 -0.238126 -0.739007 0.574149 0.352451 +-0.281356 -0.506819 -0.237638 -0.414281 0.845209 0.337629 +-0.316683 -0.593278 -0.250336 -0.852119 -0.505094 0.137014 +-0.324506 -0.588902 -0.280399 -0.863885 -0.438113 0.248517 +-0.319099 -0.611475 -0.323902 -0.598339 -0.744404 0.296400 +-0.332847 -0.626788 -0.381643 -0.641025 -0.693271 0.329335 +-0.367801 -0.587543 -0.383197 -0.715004 -0.624371 0.314532 +-0.276524 -0.635578 -0.326774 -0.439099 -0.852981 0.282161 +-0.307727 -0.608932 -0.283631 -0.611847 -0.777269 0.146615 +-0.276764 -0.624107 -0.286603 -0.362134 -0.932125 0.001411 +-0.302528 -0.611687 -0.254364 -0.597898 -0.801508 -0.010131 +-0.276524 -0.661972 -0.379310 -0.470268 -0.801589 0.369192 +-0.256416 -0.624547 -0.286227 0.018971 -0.994581 -0.102220 +-0.276371 -0.627443 -0.261753 -0.172149 -0.979258 -0.106862 +-0.258925 -0.626401 -0.262389 0.056872 -0.995820 -0.071464 +-0.376532 -0.549829 -0.385658 -0.947026 -0.210055 0.242939 +-0.383499 -0.505994 -0.385173 -0.969946 -0.096563 0.223341 +-0.402735 -0.560380 -0.492227 -0.970770 -0.117150 0.209479 +-0.405876 -0.495740 -0.495396 -0.967191 0.187757 0.171140 +-0.427755 -0.497838 -0.650739 -0.978649 0.136076 0.154044 +-0.436833 -0.575138 -0.660827 -0.959727 -0.194453 0.202761 +-0.391453 -0.418047 -0.607499 -0.684687 0.721762 0.101306 +-0.357320 -0.417054 -0.465251 -0.657338 0.736667 0.158836 +-0.398648 -0.657788 -0.643241 -0.887419 -0.414011 0.202686 +-0.387067 -0.602420 -0.479440 -0.906068 -0.352375 0.234248 +-0.367801 -0.587543 -0.383197 -0.952881 -0.206072 0.222603 +-0.325815 -0.384064 -0.553484 -0.502136 0.860629 0.084718 +-0.323346 -0.382968 -0.595645 -0.459747 0.887942 0.013822 +-0.405733 -0.421712 -0.714452 -0.461967 0.886344 0.031308 +-0.306654 -0.389007 -0.449769 -0.511117 0.848861 0.134884 +-0.347038 -0.652398 -0.457320 -0.805044 -0.512765 0.298289 +-0.352869 -0.722752 -0.593997 -0.837809 -0.482078 0.256274 +-0.229238 -0.751868 -0.513438 -0.419650 -0.735264 0.532242 +-0.294151 -0.787640 -0.616429 -0.503019 -0.714902 0.485681 +-0.188531 -0.803520 -0.548481 -0.442631 -0.719849 0.534691 +-0.271029 -0.828348 -0.649493 -0.433916 -0.715775 0.547159 +-0.294651 -0.747369 -0.556845 -0.463743 -0.725788 0.508109 +-0.352869 -0.722752 -0.593997 -0.600462 -0.685632 0.411526 +-0.368785 -0.778217 -0.725018 -0.622602 -0.690616 0.367989 +-0.233252 -0.732483 -0.490942 -0.414997 -0.724538 0.550292 +-0.130932 -0.873717 -0.601270 -0.422412 -0.722173 0.547755 +-0.218263 -0.890110 -0.686509 -0.424088 -0.703853 0.569860 +-0.318454 -0.607310 -0.149689 -0.964270 -0.136838 -0.226844 +-0.321219 -0.579032 -0.146115 -0.964789 0.263024 0.000291 +-0.320785 -0.569750 -0.245758 -0.990154 -0.138918 -0.017253 +-0.325592 -0.544287 -0.241358 -0.985428 0.140157 0.096375 +-0.303818 -0.553183 -0.141994 -0.656425 0.753346 0.039695 +-0.314774 -0.524596 -0.238126 -0.678045 0.683061 0.271446 +-0.309583 -0.628690 -0.151638 -0.812067 -0.463212 -0.354939 +-0.327569 -0.625240 -0.112006 -0.933819 -0.178188 -0.310212 +-0.314822 -0.657923 -0.112631 -0.722698 -0.491822 -0.485611 +-0.308093 -0.551433 -0.092604 -0.709991 0.685607 0.160797 +-0.330532 -0.589047 -0.108363 -0.966499 0.233573 -0.106407 +-0.294872 -0.646012 -0.153510 -0.589705 -0.722708 -0.360473 +-0.291509 -0.674280 -0.113187 -0.338451 -0.751045 -0.566906 +-0.279028 -0.540377 -0.138857 0.059338 0.990442 0.124513 +-0.279132 -0.529526 -0.087386 -0.031389 0.965129 0.259885 +-0.281356 -0.506819 -0.237638 0.235864 0.920775 0.310711 +-0.302528 -0.611687 -0.254364 -0.573314 -0.792544 -0.207809 +-0.273842 -0.653064 -0.155062 -0.146201 -0.918243 -0.368042 +-0.316683 -0.593278 -0.250336 -0.780230 -0.606145 -0.154368 +-0.249190 -0.549680 -0.142483 0.732826 0.679290 0.039130 +-0.251681 -0.526464 -0.238647 0.622102 0.732776 0.275731 +-0.336374 -0.647740 -0.079227 -0.935600 -0.135775 -0.325911 +-0.321164 -0.686016 -0.079581 -0.649956 -0.532114 -0.542598 +-0.314000 -0.565151 -0.068947 -0.625749 0.690597 0.362647 +-0.335166 -0.602167 -0.075203 -0.965446 0.260574 0.003913 +-0.247016 -0.552736 -0.092951 0.727882 0.684580 0.039206 +-0.242148 -0.565654 -0.068614 0.661515 0.654606 0.365908 +-0.278717 -0.556303 -0.063563 -0.047022 0.776609 0.628226 +-0.273588 -0.679387 -0.111205 0.016764 -0.818112 -0.574814 +-0.291303 -0.704382 -0.077706 -0.246287 -0.752975 -0.610223 +-0.274078 -0.706588 -0.077441 -0.006409 -0.821230 -0.570562 +-0.219397 -0.607375 -0.110780 0.961197 0.230352 -0.151786 +-0.214653 -0.617621 -0.076848 0.949442 0.311316 -0.040516 +-0.257647 -0.677363 -0.108988 0.168451 -0.780358 -0.602217 +-0.255760 -0.710602 -0.077899 -0.044986 -0.774366 -0.631137 +-0.222420 -0.652138 -0.114268 0.854221 -0.287278 -0.433333 +-0.229231 -0.598010 -0.149052 0.983470 0.174776 -0.047327 +-0.256660 -0.650004 -0.154840 0.245569 -0.888502 -0.387635 +-0.241496 -0.644234 -0.153820 0.521793 -0.776407 -0.353448 +-0.233185 -0.667982 -0.111233 0.455689 -0.655526 -0.602190 +-0.232306 -0.634170 -0.151996 0.866820 -0.420581 -0.267833 +-0.227821 -0.552386 -0.242999 0.892245 0.356757 0.276808 +-0.246942 -0.515169 -0.267732 0.650622 0.639985 0.408791 +-0.218390 -0.549998 -0.270212 0.853557 0.224824 0.469994 +-0.281603 -0.495410 -0.271164 0.484415 0.810796 0.328560 +-0.229813 -0.597061 -0.252879 0.961024 -0.250394 0.117200 +-0.220666 -0.594124 -0.278731 0.844691 -0.369260 0.387484 +-0.258925 -0.626401 -0.262389 0.384944 -0.914144 -0.127115 +-0.276371 -0.627443 -0.261753 -0.260287 -0.940223 -0.219617 +-0.239402 -0.611725 -0.258518 0.745425 -0.666586 0.002202 +-0.237075 -0.487034 -0.304912 0.633209 0.529518 0.564498 +-0.196859 -0.533913 -0.303928 0.871448 0.187364 0.453292 +-0.232977 -0.612466 -0.284542 0.609948 -0.719608 0.331854 +-0.198140 -0.597121 -0.314314 0.822572 -0.361696 0.438807 +-0.215880 -0.635772 -0.327812 0.621168 -0.631279 0.464367 +-0.256416 -0.624547 -0.286227 0.352859 -0.873855 0.334467 +-0.249547 -0.643542 -0.327400 0.207234 -0.874705 0.438115 +-0.346166 -0.674416 -0.040982 -0.948766 -0.158373 -0.273425 +-0.326741 -0.712820 -0.044831 -0.633953 -0.611138 -0.473934 +-0.318030 -0.594901 -0.032404 -0.625223 0.719749 0.301757 +-0.342440 -0.630348 -0.037392 -0.956823 0.287874 -0.040238 +-0.236572 -0.595298 -0.032914 0.584769 0.761518 0.279527 +-0.278297 -0.578394 -0.034141 0.004610 0.887172 0.461416 +-0.209417 -0.666078 -0.081436 0.915704 -0.174794 -0.361848 +-0.197789 -0.683783 -0.037944 0.963394 -0.097384 -0.249775 +-0.210457 -0.628753 -0.037344 0.921174 0.388789 -0.016785 +-0.292682 -0.727566 -0.046478 -0.093443 -0.857946 -0.505171 +-0.273287 -0.721296 -0.043570 0.002470 -0.912941 -0.408084 +-0.227787 -0.702231 -0.078069 0.470799 -0.629120 -0.618512 +-0.253455 -0.733264 -0.046138 -0.186049 -0.855983 -0.482367 +-0.218227 -0.725212 -0.045825 0.574979 -0.666158 -0.475008 +-0.224163 -0.441915 -0.371038 0.754452 0.517976 0.403117 +-0.178825 -0.521027 -0.378250 0.934769 0.233918 0.267376 +-0.179266 -0.601335 -0.377465 0.924076 -0.232110 0.303659 +-0.200532 -0.651395 -0.376826 0.852737 -0.357389 0.380938 +-0.132622 0.539817 -0.555258 0.631186 -0.710502 0.311111 +-0.200296 0.489186 -0.533589 0.646521 -0.689651 0.326177 +-0.116679 0.512235 -0.650594 0.646521 -0.689651 0.326177 +-0.196093 0.452835 -0.612980 0.661276 -0.668182 0.340951 +-0.220027 0.731594 -0.542794 0.160079 0.930343 0.329905 +-0.172011 0.723263 -0.542599 0.168303 0.913627 0.370081 +-0.228561 0.777364 -0.667726 0.076430 0.927313 0.366400 +-0.174726 0.772485 -0.655484 0.222638 0.893524 0.389933 +-0.112848 0.705254 -0.556160 0.333427 0.864054 0.377144 +-0.098672 0.741881 -0.649914 0.319832 0.865129 0.386341 +-0.323680 0.530277 0.000566 0.017633 -0.002622 0.999841 +-0.320365 0.485449 0.000390 0.004583 -0.000007 0.999990 +-0.307234 0.573768 0.000390 0.002514 -0.001265 0.999996 +-0.254878 0.617560 0.000566 -0.000530 -0.003385 0.999994 +-0.222234 0.612449 0.000566 -0.000616 -0.001679 0.999998 +-0.187262 0.606974 0.000566 0.000000 0.000000 1.000000 +-0.153742 0.557811 0.000566 -0.000472 -0.000128 1.000000 +-0.146152 0.501367 0.000566 0.000000 0.000000 1.000000 +-0.167233 0.459170 0.000566 0.000000 0.000000 1.000000 +-0.220789 0.442452 0.000566 0.000000 0.000000 1.000000 +-0.242179 0.466927 0.000566 -0.000985 0.000723 0.999999 +-0.269638 0.446302 0.000566 -0.001711 0.002278 0.999996 +-0.290254 0.638585 -0.489197 -0.939061 0.255295 0.230195 +-0.265205 0.675793 -0.482234 -0.861442 0.435406 0.261418 +-0.311358 0.632463 -0.562152 -0.941826 0.213494 0.259586 +-0.290660 0.682530 -0.558843 -0.881893 0.343219 0.323211 +-0.298894 0.585936 -0.492080 -0.966864 0.147248 0.208549 +-0.318289 0.563922 -0.566455 -0.967701 0.104323 0.229503 +-0.343117 0.533016 -0.669788 -0.969464 0.049683 0.240146 +-0.346101 0.613384 -0.684474 -0.962424 0.013824 0.271200 +-0.204691 0.525197 -0.474041 -0.349932 -0.812810 0.465711 +-0.257957 0.539113 -0.489777 -0.489493 -0.758511 0.430183 +-0.200296 0.489186 -0.533589 -0.368387 -0.828300 0.422149 +-0.266554 0.508384 -0.555996 -0.545675 -0.731967 0.408000 +-0.298894 0.585936 -0.492080 -0.711511 -0.599201 0.367028 +-0.318289 0.563922 -0.566455 -0.732297 -0.566630 0.377719 +-0.196093 0.452835 -0.612980 -0.344621 -0.848693 0.401195 +-0.291123 0.470982 -0.647226 -0.617888 -0.669140 0.412876 +-0.343117 0.533016 -0.669788 -0.777430 -0.526405 0.344238 +-0.265205 0.675793 -0.482234 -0.851818 0.415093 0.319538 +-0.249918 0.703367 -0.477302 -0.714576 0.651282 0.255369 +-0.290660 0.682530 -0.558843 -0.842402 0.494610 0.213823 +-0.263180 0.713418 -0.550893 -0.634938 0.739909 0.222234 +-0.207105 0.724098 -0.466516 -0.438311 0.880652 0.179823 +-0.220027 0.731594 -0.542794 -0.426874 0.862032 0.273274 +-0.310846 0.688865 -0.685292 -0.847324 0.498279 0.183740 +-0.275723 0.755235 -0.676234 -0.605431 0.733184 0.309669 +-0.311358 0.632463 -0.562152 -0.909765 0.362764 0.201818 +-0.346101 0.613384 -0.684474 -0.902014 0.391092 0.182806 +-0.228561 0.777364 -0.667726 -0.449092 0.828611 0.334246 +-0.343043 0.675234 -1.105304 -0.938880 0.319155 -0.129015 +-0.362855 0.685884 -0.934781 -0.913680 0.398231 -0.081250 +-0.315812 0.762780 -1.086902 -0.869631 0.488062 -0.074413 +-0.310224 0.786234 -0.897805 -0.764913 0.643963 -0.014852 +-0.257483 0.826472 -0.861991 -0.626019 0.778367 0.047383 +-0.251929 0.841469 -1.034970 -0.694724 0.719255 -0.005620 +-0.261987 0.648849 -0.326739 -0.946754 0.321871 0.007470 +-0.270736 0.619210 -0.325093 -0.993302 -0.076628 -0.086480 +-0.277107 0.594368 -0.159115 -0.981739 0.189928 -0.010783 +-0.277643 0.564086 -0.163536 -0.877110 -0.451148 -0.164754 +-0.250399 0.586577 -0.324189 -0.730983 -0.647758 -0.214647 +-0.249859 0.543077 -0.169297 -0.617018 -0.758195 -0.210781 +-0.268234 0.627424 -0.156155 -0.940031 0.340985 0.008402 +-0.246793 0.681763 -0.328611 -0.907333 0.419960 0.019518 +-0.200959 0.732715 -0.338152 0.344317 0.888662 0.302861 +-0.178600 0.713752 -0.333697 0.707089 0.669979 0.226170 +-0.201002 0.752380 -0.409530 0.622245 0.756445 0.201501 +-0.175497 0.729689 -0.405860 0.636694 0.746755 0.192296 +-0.209338 0.666894 -0.151392 0.152521 0.983757 0.094657 +-0.191454 0.652899 -0.149048 0.724706 0.670027 0.160826 +-0.162211 0.681140 -0.329839 0.851311 0.489729 0.188245 +-0.166089 0.620852 -0.155459 0.955757 0.270962 0.114493 +-0.232782 0.708077 -0.332184 -0.606781 0.762968 0.222927 +-0.231067 0.660079 -0.153241 -0.563940 0.824753 0.041896 +-0.169900 0.585220 -0.162331 0.969582 -0.244134 -0.017570 +-0.142688 0.649372 -0.328296 0.984903 0.090463 0.147591 +-0.208967 0.676069 -0.095824 0.055528 0.969037 0.240589 +-0.232840 0.663758 -0.096986 -0.551264 0.802744 0.227398 +-0.163027 0.600441 -0.111351 0.967581 0.251607 -0.021942 +-0.190077 0.655760 -0.095630 0.759240 0.633512 0.149056 +-0.168712 0.566050 -0.116333 0.963247 -0.206105 -0.172268 +-0.268234 0.627424 -0.156155 -0.779247 0.626716 -0.000897 +-0.277154 0.615199 -0.111693 -0.881456 0.469913 -0.047097 +-0.182677 0.552369 -0.164101 0.733596 -0.659658 -0.163365 +-0.182943 0.532746 -0.120103 0.813599 -0.485663 -0.319670 +-0.277107 0.594368 -0.159115 -0.979744 0.164337 -0.114435 +-0.284402 0.576404 -0.112761 -0.981846 0.080977 -0.171527 +-0.148225 0.609419 -0.328049 0.907863 -0.418357 0.027601 +-0.176281 0.581040 -0.325084 0.388035 -0.920868 -0.037831 +-0.210195 0.534058 -0.169644 0.168253 -0.938514 -0.301466 +-0.246793 0.681763 -0.328611 -0.773461 0.616886 0.145635 +-0.282348 0.545361 -0.119478 -0.858267 -0.381324 -0.343467 +-0.291826 0.566355 -0.081698 -0.943022 0.066719 -0.325972 +-0.289658 0.521276 -0.087188 -0.794586 -0.339978 -0.503038 +-0.209317 0.654582 -0.075414 0.131693 0.798140 0.587903 +-0.188509 0.645758 -0.076114 0.646319 0.645050 0.407654 +-0.159072 0.588271 -0.082848 0.987454 0.156213 -0.023077 +-0.179070 0.506104 -0.086362 0.688299 -0.537697 -0.486957 +-0.214153 0.515186 -0.127241 0.298675 -0.823383 -0.482529 +-0.218592 0.488978 -0.091478 -0.066934 -0.815191 -0.575311 +-0.251436 0.524118 -0.128080 -0.330094 -0.794556 -0.509626 +-0.254084 0.492429 -0.091707 -0.134532 -0.781063 -0.609788 +-0.235307 0.654334 -0.079683 -0.412949 0.833299 0.367539 +-0.286406 0.610778 -0.079691 -0.862538 0.500875 -0.071781 +-0.217708 0.623680 -0.032393 0.131698 0.877330 0.461463 +-0.251605 0.623111 -0.036680 -0.312984 0.903742 0.292046 +-0.164135 0.553976 -0.084703 0.943223 -0.187405 -0.274243 +-0.171417 0.482939 -0.048275 0.655773 -0.618415 -0.433040 +-0.154307 0.520564 -0.045954 0.955808 -0.137070 -0.260084 +-0.214007 0.575025 -0.326258 -0.024474 -0.988320 -0.150418 +-0.210193 0.564010 -0.387937 0.212955 -0.965966 0.146829 +-0.167913 0.575845 -0.391086 0.275515 -0.954971 0.110096 +-0.229663 0.536460 -0.171279 -0.230602 -0.917616 -0.323735 +-0.236035 0.495774 -0.085419 -0.103317 -0.826566 -0.553275 +-0.232231 0.518961 -0.128260 -0.220660 -0.862413 -0.455580 +-0.239054 0.473485 -0.052529 -0.228490 -0.878628 -0.419292 +-0.223805 0.460757 -0.052471 -0.029678 -0.885961 -0.462808 +-0.155436 0.559053 -0.044730 0.973517 0.228114 0.015088 +-0.312485 0.544627 -0.044161 -0.954017 0.079391 -0.289048 +-0.306784 0.584437 -0.041477 -0.853713 0.518057 -0.052843 +-0.277643 0.564086 -0.163536 -0.939428 -0.256067 -0.227825 +-0.249859 0.543077 -0.169297 -0.468908 -0.810792 -0.350345 +-0.250399 0.586577 -0.324189 -0.314588 -0.913818 -0.256847 +-0.305828 0.503800 -0.050020 -0.806807 -0.390269 -0.443569 +-0.186751 0.612696 -0.034908 0.686088 0.684905 0.245333 +-0.260517 0.465220 -0.052600 -0.094624 -0.905016 -0.414720 +-0.196093 0.452835 -0.612980 -0.325392 -0.822011 0.467352 +-0.291123 0.470982 -0.647226 -0.335781 -0.828745 0.447697 +-0.193418 0.414036 -0.679360 -0.335781 -0.828745 0.447697 +-0.311188 0.429845 -0.743750 -0.345989 -0.835032 0.427800 +-0.172004 0.879637 -0.926179 0.368152 0.855541 0.364025 +-0.191441 0.840666 -0.814931 0.418558 0.867201 0.269763 +-0.087118 0.775469 -0.767209 0.418558 0.867201 0.269763 +-0.088868 0.769612 -0.732977 0.464125 0.868834 0.172382 +-0.298894 0.585936 -0.492080 -0.867895 -0.379133 0.320963 +-0.270736 0.608116 -0.391070 -0.972824 -0.110129 0.203679 +-0.290254 0.638585 -0.489197 -0.911075 0.324458 0.254301 +-0.260287 0.642322 -0.394408 -0.935795 0.340539 0.091223 +-0.257957 0.539113 -0.489777 -0.542537 -0.760777 0.356191 +-0.244685 0.577869 -0.386784 -0.577162 -0.783782 0.229282 +-0.270736 0.619210 -0.325093 -0.985754 -0.168190 0.001202 +-0.261987 0.648849 -0.326739 -0.941232 0.336102 -0.033426 +-0.210193 0.564010 -0.387937 -0.150059 -0.934180 0.323712 +-0.214007 0.575025 -0.326258 -0.330505 -0.935682 0.123553 +-0.250399 0.586577 -0.324189 -0.611077 -0.789721 0.054081 +-0.204691 0.525197 -0.474041 0.237215 -0.885861 0.398722 +-0.167913 0.575845 -0.391086 0.661453 -0.694204 0.283832 +-0.147059 0.559099 -0.487339 0.780024 -0.558246 0.282708 +-0.247846 0.680231 -0.398317 -0.944621 0.321992 0.063341 +-0.246793 0.681763 -0.328611 -0.919608 0.390427 0.043449 +-0.265205 0.675793 -0.482234 -0.900648 0.401839 0.165406 +-0.121016 0.612952 -0.489468 0.936852 -0.239404 0.254940 +-0.104151 0.602309 -0.560450 0.918303 -0.244381 0.311443 +-0.132622 0.539817 -0.555258 0.760375 -0.544014 0.354794 +-0.116559 0.653839 -0.489535 0.940656 0.180409 0.287436 +-0.095284 0.658244 -0.561410 0.953362 0.100333 0.284665 +-0.200296 0.489186 -0.533589 0.624292 -0.647209 0.437469 +-0.133645 0.691215 -0.483091 0.727684 0.652658 0.210983 +-0.112848 0.705254 -0.556160 0.811658 0.499399 0.303004 +-0.070740 0.591315 -0.644639 0.887658 -0.295146 0.353486 +-0.116679 0.512235 -0.650594 0.820442 -0.497786 0.281218 +-0.068726 0.667268 -0.647439 0.942332 0.070495 0.327170 +-0.098672 0.741881 -0.649914 0.896983 0.337925 0.285005 +-0.172382 0.715347 -0.474482 0.393029 0.915956 -0.080951 +-0.175497 0.729689 -0.405860 0.821381 0.568537 0.045802 +-0.161990 0.688799 -0.401702 0.896024 0.410572 0.169034 +-0.142612 0.617588 -0.398601 0.926191 -0.332450 0.177897 +-0.162211 0.681140 -0.329839 0.896746 0.435535 0.078462 +-0.178600 0.713752 -0.333697 0.878172 0.457748 0.138854 +-0.148225 0.609419 -0.328049 0.951952 -0.305447 0.022131 +-0.176281 0.581040 -0.325084 0.793080 -0.605957 0.061968 +-0.238095 0.715785 -0.403665 -0.795187 0.604607 0.046127 +-0.232782 0.708077 -0.332184 -0.747677 0.652022 0.125882 +-0.249918 0.703367 -0.477302 -0.683822 0.729529 -0.013233 +-0.201002 0.752380 -0.409530 -0.186917 0.961127 -0.203217 +-0.207105 0.724098 -0.466516 -0.207100 0.956100 -0.207322 +-0.200959 0.732715 -0.338152 -0.633555 0.756177 0.163718 +-0.141864 0.649581 -0.398320 0.979702 0.152465 0.130150 +-0.142688 0.649372 -0.328296 0.954874 0.295635 0.028557 +-0.220027 0.731594 -0.542794 0.212582 0.973587 0.083285 +-0.172011 0.723263 -0.542599 0.355089 0.920346 0.163935 +-0.315181 -0.764996 -1.175598 -0.815775 -0.424816 -0.392483 +-0.250557 -0.893329 -1.103714 -0.803406 -0.527391 -0.276402 +-0.378254 -0.754824 -1.055511 -0.821280 -0.444724 -0.357379 +-0.298690 -0.872468 -0.981866 -0.851079 -0.491762 -0.183944 +-0.352477 -0.606807 -1.199774 -0.878490 -0.167214 -0.447543 +-0.417389 -0.603646 -1.074460 -0.895260 -0.038631 -0.443866 +-0.335016 -0.477144 -1.219440 -0.893182 0.127510 -0.431238 +-0.412246 -0.462044 -1.047188 -0.879460 0.144002 -0.453667 +-0.241454 -0.975757 -1.025889 -0.890920 -0.417457 -0.178860 +-0.261458 -0.950653 -0.936834 -0.884755 -0.460950 -0.068800 +-0.317998 -0.316945 -1.171010 -0.869610 0.082195 -0.486849 +-0.397077 -0.294104 -1.040035 -0.871306 0.011498 -0.490605 +-0.333440 -0.148889 -1.169196 -0.889200 -0.028833 -0.456610 +-0.390117 -0.124181 -1.050900 -0.898057 -0.023551 -0.439248 +-0.334864 -0.008152 -1.173440 -0.891275 0.008762 -0.453379 +-0.392133 0.008478 -1.063792 -0.882833 0.053350 -0.466648 +-0.316565 0.155535 -1.170591 -0.872609 0.174304 -0.456259 +-0.372005 0.173291 -1.062321 -0.861339 0.188147 -0.471907 +-0.284178 0.314571 -1.157604 -0.888441 0.214082 -0.406006 +-0.328173 0.316278 -1.060432 -0.938331 0.145317 -0.313718 +-0.360061 0.306779 -0.937631 -0.966075 0.083456 -0.244407 +-0.332474 0.404321 -1.013368 -0.974994 -0.078659 -0.207845 +-0.341636 0.537693 -1.091500 -0.950636 -0.202863 -0.234814 +-0.346506 0.444275 -0.970240 -0.972649 -0.163481 -0.165008 +-0.314782 0.525202 -1.163291 -0.970901 -0.117034 -0.208936 +-0.110497 0.357001 -0.628471 -0.447278 0.593106 0.669453 +-0.042466 0.462186 -0.676207 -0.497101 0.610396 0.616691 +-0.219224 0.341114 -0.687039 -0.502465 0.686552 0.525524 +-0.193934 0.374098 -0.718043 -0.366712 0.334615 0.868076 +-0.073671 0.464847 -0.696580 -0.166169 0.018769 0.985919 +-0.194984 0.389910 -0.710710 0.207110 -0.398499 0.893479 +-0.091850 0.479491 -0.699313 0.268173 -0.319429 0.908872 +-0.193418 0.414036 -0.679360 0.528243 -0.542678 0.653039 +-0.103255 0.494590 -0.692424 0.572878 -0.511102 0.640770 +-0.196093 0.452835 -0.612980 0.651498 -0.621930 0.434458 +-0.116679 0.512235 -0.650594 0.661077 -0.591483 0.461655 +-0.390662 -0.263803 -0.714595 -0.797753 -0.165857 0.579726 +-0.348259 -0.357136 -0.682947 -0.719696 0.083717 0.689224 +-0.305341 -0.258291 -0.595609 -0.527067 -0.157949 0.835016 +-0.229770 -0.368127 -0.574212 -0.554491 0.095730 0.826665 +-0.163313 -0.268688 -0.540615 -0.419909 -0.038148 0.906764 +-0.144773 -0.369613 -0.521976 -0.521828 0.061276 0.850847 +-0.334028 -0.151073 -0.594810 -0.403515 -0.038496 0.914163 +-0.173069 -0.171989 -0.533491 -0.365032 -0.094207 0.926216 +-0.338005 -0.375625 -0.651199 -0.270600 0.744981 0.609737 +-0.186971 -0.445619 -0.537279 0.098541 0.893629 0.437855 +-0.181052 0.003963 -0.522829 -0.456972 0.118555 0.881545 +-0.337591 0.012575 -0.608417 -0.466021 0.166046 0.869053 +-0.157486 0.215574 -0.562074 -0.482482 0.411264 0.773352 +-0.317899 0.220593 -0.663393 -0.476817 0.333328 0.813350 +-0.210664 -0.440016 -0.501884 0.385861 0.915372 0.114913 +-0.323346 -0.382968 -0.595645 0.403543 0.913281 0.055409 +-0.210983 -0.443751 -0.483240 0.359252 0.913856 0.189222 +-0.325815 -0.384064 -0.553484 0.390282 0.912971 0.119016 +-0.110497 0.357001 -0.628471 -0.466506 0.498142 0.730908 +-0.219224 0.341114 -0.687039 -0.457127 0.504388 0.732549 +-0.115223 0.870956 -1.200244 0.179302 0.786878 -0.590486 +0.000000 0.842631 -1.203002 0.225651 0.750493 -0.621162 +-0.085151 0.801816 -1.283248 0.279787 0.639435 -0.716130 +0.000000 0.798667 -1.251145 0.354642 0.524684 -0.773909 +-0.083203 0.776489 -1.299486 0.332154 0.527060 -0.782228 +-0.031367 0.777065 -1.277087 0.399787 0.391974 -0.828569 +-0.049248 0.745544 -1.293766 -0.818083 0.109453 0.564589 +0.000000 0.777615 -1.259705 0.398388 0.409297 -0.820831 +0.000000 0.812923 -1.255352 -0.522462 -0.100835 0.846679 +-0.029112 0.812922 -1.273484 -0.877684 0.066770 0.474566 +-0.060854 0.725216 -1.324017 -0.831265 0.226921 -0.507450 +-0.039245 0.812922 -1.297518 -0.991059 0.117941 -0.062386 +-0.035195 0.911391 -1.297518 -0.999039 0.031398 0.030593 +-0.025062 0.911391 -1.323454 -0.931567 0.031723 -0.362183 +-0.027126 0.812922 -1.328997 -0.809499 0.173340 -0.560950 +-0.022481 0.911391 -1.271582 -0.908468 0.017601 0.417583 +-0.078983 0.672760 -1.329372 -0.157720 0.033444 -0.986917 +-0.038019 0.674176 -1.342370 -0.230371 0.013315 -0.973012 +-0.028482 0.725216 -1.340985 -0.251015 0.080787 -0.964606 +-0.093267 0.537123 -1.340819 0.004371 -0.013449 -0.999900 +0.000000 0.531584 -1.328178 -0.012186 -0.037851 -0.999209 +0.000000 0.675576 -1.343699 -0.028875 -0.009963 -0.999533 +0.000000 0.376398 -1.337871 -0.064365 -0.055625 -0.996375 +-0.108528 0.360089 -1.304915 -0.262863 -0.169957 -0.949746 +-0.033976 0.991295 -1.297518 -0.987457 0.005385 0.157797 +-0.023843 0.991295 -1.322813 -0.929756 0.015644 -0.367844 +-0.023843 0.991295 -1.272223 -0.928210 -0.012839 0.371835 +0.000000 0.725216 -1.341540 -0.019464 0.043444 -0.998866 +-0.335016 -0.477144 -1.219440 -0.819375 0.142017 -0.555388 +-0.219620 -0.509012 -1.385795 -0.808235 0.043899 -0.587221 +-0.352477 -0.606807 -1.199774 -0.808999 -0.100696 -0.579121 +-0.215624 -0.638821 -1.379687 -0.790148 -0.211487 -0.575274 +-0.317998 -0.316945 -1.171010 -0.865330 0.034616 -0.500006 +-0.236095 -0.336440 -1.315803 -0.841276 0.113538 -0.528549 +-0.333440 -0.148889 -1.169196 -0.858436 -0.032665 -0.511880 +-0.268996 -0.166749 -1.278754 -0.866841 -0.045564 -0.496498 +-0.315181 -0.764996 -1.175598 -0.777929 -0.288819 -0.558041 +-0.198746 -0.792401 -1.318974 -0.766625 -0.307155 -0.563863 +-0.334864 -0.008152 -1.173440 -0.846801 0.052789 -0.529283 +-0.276410 -0.024242 -1.265942 -0.849437 0.018228 -0.527375 +-0.316565 0.155535 -1.170591 -0.852650 0.104231 -0.511980 +-0.263580 0.140392 -1.261915 -0.844786 0.091364 -0.527246 +-0.121794 0.126862 -1.337687 -0.246268 0.158980 -0.956074 +-0.108528 0.360089 -1.304915 -0.276043 0.133725 -0.951797 +0.000000 0.123007 -1.369700 -0.255195 0.147876 -0.955515 +0.000000 0.376398 -1.337871 -0.304797 0.118702 -0.944991 +-0.126253 -0.069033 -1.371295 -0.220563 0.216683 -0.951000 +0.000000 -0.085812 -1.403213 -0.221652 0.287575 -0.931757 +0.000000 -0.212704 -1.457249 -0.247469 0.379611 -0.891434 +-0.121475 -0.199653 -1.417969 -0.219521 0.352173 -0.909827 +-0.337829 0.315369 -0.803507 -0.850165 0.515339 0.107916 +-0.360061 0.306779 -0.937631 -0.890382 0.448883 0.075663 +-0.372288 0.218413 -0.760127 -0.945523 0.285782 0.155933 +-0.409406 0.188720 -0.931537 -0.956010 0.276242 -0.098669 +-0.372005 0.173291 -1.062321 -0.941402 0.173709 -0.289116 +-0.437223 0.021572 -0.907435 -0.988816 0.111657 -0.098869 +-0.401509 0.019700 -0.719666 -0.966041 0.179835 0.185536 +-0.328173 0.316278 -1.060432 -0.911216 0.326521 -0.251138 +-0.392133 0.008478 -1.063792 -0.962224 0.006191 -0.272187 +-0.432499 -0.117936 -0.893081 -0.963614 -0.052087 -0.262174 +-0.303637 0.359237 -0.823789 -0.952544 0.269371 0.141769 +-0.332474 0.404321 -1.013368 -0.985989 -0.106311 0.128546 +-0.316694 0.395121 -0.826608 -0.949017 -0.302780 0.087693 +-0.346506 0.444275 -0.970240 -0.913033 -0.407720 0.011622 +-0.390117 -0.124181 -1.050900 -0.972651 -0.022315 -0.231197 +-0.423456 -0.279155 -0.891875 -0.979023 -0.028774 -0.201708 +-0.380000 0.479387 -0.850625 -0.897808 -0.421940 -0.126123 +-0.341636 0.537693 -1.091500 -0.964211 -0.153065 -0.216492 +-0.388560 0.573610 -0.906970 -0.992477 0.052210 -0.110745 +-0.311188 0.429845 -0.743750 -0.855672 -0.507549 0.101094 +-0.346101 0.613384 -0.684474 -0.927871 0.336971 0.159708 +-0.362855 0.685884 -0.934781 -0.931578 0.344951 0.114764 +-0.310846 0.688865 -0.685292 -0.885057 0.429536 0.179369 +-0.343043 0.675234 -1.105304 -0.979688 0.079572 -0.184064 +-0.397077 -0.294104 -1.040035 -0.989007 0.021149 -0.146348 +-0.414880 -0.360277 -0.913431 -0.988851 0.135698 -0.061317 +-0.275723 0.755235 -0.676234 -0.888209 0.419780 0.186733 +-0.310224 0.786234 -0.897805 -0.896302 0.398138 0.195266 +-0.412246 -0.462044 -1.047188 -0.969065 0.152795 -0.193820 +-0.445104 -0.474404 -0.928435 -0.986395 0.127519 -0.103751 +-0.396773 -0.408556 -0.803304 -0.943552 0.216978 0.250260 +-0.441108 -0.605236 -0.978452 -0.981078 -0.088849 -0.172025 +-0.449057 -0.493539 -0.787950 -0.995577 0.056793 -0.074842 +-0.421764 -0.731125 -0.935026 -0.884742 -0.461487 -0.065276 +-0.459976 -0.598947 -0.814650 -0.990811 -0.109190 -0.079816 +-0.430026 -0.707082 -0.805969 -0.894149 -0.447012 0.026035 +-0.378254 -0.754824 -1.055511 -0.893875 -0.384436 -0.230645 +-0.298690 -0.872468 -0.981866 -0.821463 -0.567337 -0.057680 +-0.327169 -0.847824 -0.782242 -0.806724 -0.590927 0.001551 +-0.417389 -0.603646 -1.074460 -0.968093 -0.042231 -0.247008 +-0.261458 -0.950653 -0.936834 -0.903943 -0.427626 0.004923 +-0.275470 -0.919913 -0.839500 -0.869645 -0.493164 -0.022512 +-0.368785 -0.778217 -0.725018 -0.807768 -0.585014 0.072594 +-0.075642 -0.735416 -0.462425 -0.416250 -0.370773 0.830219 +-0.080293 -0.814335 -0.503604 -0.337955 -0.491686 0.802516 +0.000000 -0.743096 -0.427930 -0.381979 -0.391794 0.837012 +0.000000 -0.820987 -0.477658 -0.302317 -0.511311 0.804466 +-0.066691 -0.876854 -0.541093 -0.330389 -0.537225 0.776036 +0.000000 -0.882034 -0.516286 -0.316538 -0.523597 0.790980 +-0.072233 -0.668912 -0.433957 -0.396984 -0.149820 0.905515 +0.000000 -0.682871 -0.406746 -0.373654 -0.148785 0.915558 +-0.090468 -0.527020 -0.448806 -0.405691 0.043407 0.912979 +0.000000 -0.520935 -0.408895 -0.378260 0.027933 0.925278 +0.000000 0.792848 -0.871132 0.565732 0.760235 0.319360 +0.000000 0.877127 -1.071758 0.490527 0.859384 0.144367 +-0.020074 0.802988 -0.859710 0.428814 0.834497 0.346025 +-0.055367 0.903845 -1.060557 0.364531 0.930132 0.044410 +0.000000 0.842631 -1.203002 0.302930 0.912640 -0.274450 +-0.115223 0.870956 -1.200244 0.219773 0.924376 -0.311815 +-0.059104 0.807325 -0.828836 0.239710 0.877346 0.415695 +-0.112552 0.899531 -1.004645 0.301415 0.876695 0.374906 +-0.172004 0.879637 -0.926179 0.174024 0.876340 0.449160 +-0.087118 0.775469 -0.767209 0.120160 0.858564 0.498427 +-0.401509 0.019700 -0.719666 -0.908055 0.121556 0.400824 +-0.437223 0.021572 -0.907435 -0.987194 0.018799 0.158414 +-0.408121 -0.129847 -0.708110 -0.938711 -0.021708 0.344021 +-0.432499 -0.117936 -0.893081 -0.986887 -0.069425 0.145720 +-0.337591 0.012575 -0.608417 -0.850899 0.134410 0.507843 +-0.372288 0.218413 -0.760127 -0.829738 0.301489 0.469722 +-0.317899 0.220593 -0.663393 -0.764895 0.434460 0.475583 +-0.390662 -0.263803 -0.714595 -0.926258 -0.182049 0.330007 +-0.334028 -0.151073 -0.594810 -0.825877 -0.108166 0.553378 +-0.337829 0.315369 -0.803507 -0.629975 0.631413 0.452160 +-0.219224 0.341114 -0.687039 -0.579738 0.686694 0.438583 +-0.423456 -0.279155 -0.891875 -0.955594 -0.193394 0.222347 +-0.193934 0.374098 -0.718043 -0.672829 0.416328 0.611532 +-0.303637 0.359237 -0.823789 -0.701341 0.041246 0.711631 +-0.194984 0.389910 -0.710710 -0.554804 -0.555641 0.619238 +-0.316694 0.395121 -0.826608 -0.584191 -0.559076 0.588350 +-0.348259 -0.357136 -0.682947 -0.958911 -0.049178 0.279411 +-0.414880 -0.360277 -0.913431 -0.959959 0.042531 0.276895 +-0.305341 -0.258291 -0.595609 -0.788843 -0.215351 0.575630 +-0.193418 0.414036 -0.679360 -0.407298 -0.713835 0.569691 +-0.311188 0.429845 -0.743750 -0.622061 -0.658307 0.423877 +-0.291123 0.470982 -0.647226 -0.772611 -0.510087 0.377998 +-0.343117 0.533016 -0.669788 -0.927233 -0.250812 0.278087 +-0.380000 0.479387 -0.850625 -0.936742 -0.233878 0.260414 +-0.338005 -0.375625 -0.651199 -0.800471 0.548383 0.241912 +-0.396773 -0.408556 -0.803304 -0.875754 0.459175 0.149045 +-0.346101 0.613384 -0.684474 -0.982202 -0.002148 0.187818 +-0.388560 0.573610 -0.906970 -0.981688 0.011891 0.190122 +-0.405733 -0.421712 -0.714452 -0.818859 0.561223 0.120410 +-0.323346 -0.382968 -0.595645 -0.702031 0.658062 0.272226 +-0.449057 -0.493539 -0.787950 -0.938921 0.329333 0.099838 +-0.445104 -0.474404 -0.928435 -0.846803 0.529708 0.048322 +-0.391453 -0.418047 -0.607499 -0.925918 0.360968 0.111256 +-0.427755 -0.497838 -0.650739 -0.948036 0.285030 0.141371 +-0.436833 -0.575138 -0.660827 -0.983238 -0.073300 0.166941 +-0.459976 -0.598947 -0.814650 -0.962050 -0.186536 0.199158 +-0.398648 -0.657788 -0.643241 -0.897694 -0.359380 0.254933 +-0.430026 -0.707082 -0.805969 -0.904548 -0.327091 0.273503 +-0.352869 -0.722752 -0.593997 -0.871680 -0.404266 0.277026 +-0.368785 -0.778217 -0.725018 -0.764334 -0.551206 0.334613 +-0.327169 -0.847824 -0.782242 -0.633309 -0.680950 0.367733 +-0.271029 -0.828348 -0.649493 -0.635327 -0.675748 0.373798 +-0.294151 -0.787640 -0.616429 -0.637302 -0.670499 0.379838 +0.000000 -0.365256 -0.450505 -0.446947 0.319956 0.835384 +0.000000 -0.278300 -0.498178 -0.305059 0.217029 0.927274 +-0.144773 -0.369613 -0.521976 -0.368333 0.261049 0.892292 +-0.163313 -0.268688 -0.540615 -0.219901 0.037023 0.974819 +0.000000 -0.181284 -0.504867 -0.192464 0.004644 0.981293 +-0.173069 -0.171989 -0.533491 -0.131365 -0.038782 0.990575 +0.000000 -0.002516 -0.511473 -0.106887 0.071547 0.991694 +-0.181052 0.003963 -0.522829 -0.060235 0.062843 0.996204 +0.000000 -0.433288 -0.424155 -0.463794 0.243990 0.851683 +-0.122304 -0.438939 -0.494920 -0.554788 0.176260 0.813107 +-0.186971 -0.445619 -0.537279 0.101080 0.481331 0.870691 +-0.131915 -0.528796 -0.497689 0.204651 0.359604 0.910386 +-0.090468 -0.527020 -0.448806 -0.617492 0.118765 0.777559 +-0.157486 0.215574 -0.562074 -0.112487 0.259472 0.959177 +0.000000 0.217662 -0.539160 -0.161664 0.334761 0.928332 +0.000000 -0.520935 -0.408895 -0.407447 0.156644 0.899694 +-0.210664 -0.440016 -0.501884 0.727881 0.627548 0.276355 +-0.148618 -0.528786 -0.462029 0.902718 0.316587 0.291330 +-0.153661 -0.526172 -0.447830 0.934071 0.297970 0.196789 +-0.210983 -0.443751 -0.483240 0.685123 0.726985 0.045823 +-0.130595 -0.640556 -0.478463 0.006278 0.005909 0.999963 +-0.152043 -0.627013 -0.461232 0.842566 -0.035257 0.537439 +-0.155519 -0.617108 -0.446525 0.934561 -0.123926 0.333524 +-0.325815 -0.384064 -0.553484 0.483472 0.874061 -0.047663 +-0.306654 -0.389007 -0.449769 0.229139 0.963390 0.139192 +-0.219295 -0.435004 -0.413224 0.640116 0.758326 0.123257 +-0.165710 -0.520333 -0.397867 0.887121 0.307598 0.344093 +-0.166063 -0.601729 -0.399052 0.898662 -0.166275 0.405906 +-0.166408 -0.689953 -0.448651 0.496847 -0.541910 0.677847 +-0.185062 -0.653566 -0.409151 0.657777 -0.579303 0.481391 +-0.233252 -0.732483 -0.490942 -0.086198 -0.834667 0.543968 +-0.236832 -0.696120 -0.429808 0.003363 -0.861538 0.507683 +-0.072233 -0.668912 -0.433957 -0.537361 -0.121704 0.834525 +-0.139670 -0.729077 -0.486843 -0.173515 -0.439191 0.881478 +-0.075642 -0.735416 -0.462425 -0.362020 -0.383035 0.849839 +-0.080293 -0.814335 -0.503604 -0.426080 -0.527517 0.734970 +-0.188531 -0.803520 -0.548481 -0.268564 -0.597053 0.755911 +0.000000 0.362368 -0.606042 -0.200478 0.411030 0.889305 +-0.110497 0.357001 -0.628471 -0.167369 0.434512 0.884978 +-0.066691 -0.876854 -0.541093 -0.584302 -0.554331 0.592712 +-0.130932 -0.873717 -0.601270 -0.506028 -0.610256 0.609527 +-0.054281 -0.924635 -0.576374 -0.576327 -0.577005 0.578716 +-0.106031 -0.926096 -0.629367 -0.573605 -0.579521 0.578906 +-0.357320 -0.417054 -0.465251 -0.691627 0.636928 0.340551 +-0.287657 -0.420008 -0.357903 0.086053 0.901619 0.423885 +-0.178825 -0.521027 -0.378250 0.829992 0.127880 0.542918 +-0.224163 -0.441915 -0.371038 0.612860 0.686851 0.390691 +-0.245371 -0.672412 -0.378741 0.067894 -0.899852 0.430878 +-0.276524 -0.661972 -0.379310 -0.351352 -0.855161 0.381119 +-0.286957 -0.682616 -0.438026 -0.407820 -0.813382 0.414840 +-0.332847 -0.626788 -0.381643 -0.578235 -0.732991 0.358284 +-0.347038 -0.652398 -0.457320 -0.627715 -0.689744 0.360869 +-0.367801 -0.587543 -0.383197 -0.856477 -0.398490 0.328106 +-0.387067 -0.602420 -0.479440 -0.806748 -0.537875 0.244639 +-0.294651 -0.747369 -0.556845 -0.462801 -0.770504 0.438337 +-0.352869 -0.722752 -0.593997 -0.560842 -0.726144 0.397707 +-0.336212 -0.447832 -0.375617 -0.661431 0.647690 0.378161 +-0.383499 -0.505994 -0.385173 -0.898800 0.299309 0.320271 +-0.405876 -0.495740 -0.495396 -0.865675 0.450800 0.217683 +-0.156180 -0.709903 -0.464735 0.464990 -0.387697 0.795911 +-0.200532 -0.651395 -0.376826 0.557172 -0.710295 0.430163 +-0.179266 -0.601335 -0.377465 0.839398 -0.169291 0.516481 +-0.376532 -0.549829 -0.385658 -0.923955 -0.180530 0.337220 +-0.355280 -0.513678 -0.307759 -0.926048 -0.175534 0.334100 +-0.249547 -0.643542 -0.327400 0.006909 -0.912306 0.409451 +-0.276524 -0.635578 -0.326774 -0.268915 -0.882415 0.386041 +-0.284307 -0.461224 -0.300945 0.445628 0.737497 0.507459 +-0.237075 -0.487034 -0.304912 0.408707 0.735574 0.540268 +-0.348767 -0.549903 -0.311345 -0.916553 -0.200258 0.346161 +-0.343097 -0.581915 -0.315867 -0.911775 -0.211246 0.352196 +-0.229238 -0.751868 -0.513438 -0.035081 -0.696553 0.716647 +-0.215880 -0.635772 -0.327812 0.214213 -0.909251 0.356897 +-0.256416 -0.624547 -0.286227 -0.027333 -0.909413 0.414994 +-0.276764 -0.624107 -0.286603 -0.148954 -0.927623 0.342532 +0.000428 1.612066 -1.276136 0.493065 -0.146496 0.857570 +0.000345 1.583852 -1.280908 0.513488 -0.157742 0.843474 +0.013389 1.611106 -1.283752 0.678651 -0.191055 0.709176 +0.007777 1.583781 -1.285707 0.694618 -0.192257 0.693213 +0.015212 1.583690 -1.297385 0.812292 -0.215496 0.541982 +0.020758 1.612066 -1.293943 0.799670 -0.223874 0.557143 +0.000373 1.597562 -1.262090 0.447737 -0.134622 0.883973 +0.000351 1.519087 -1.274030 0.481147 -0.142008 0.865061 +0.018613 1.595557 -1.271634 0.711096 -0.134457 0.690119 +0.012060 1.519814 -1.281023 0.699438 -0.147206 0.699369 +0.022072 1.519996 -1.297424 0.881890 -0.115628 0.457056 +0.027355 1.597562 -1.291280 0.913132 -0.093621 0.396767 +0.000372 1.570149 -1.255745 0.419314 -0.134843 0.897771 +0.000349 1.475675 -1.269924 0.441888 -0.140128 0.886058 +0.023519 1.567919 -1.266891 0.753916 -0.146542 0.640418 +0.015475 1.475798 -1.277939 0.777520 -0.141381 0.612759 +0.021517 1.476233 -1.300993 0.947129 -0.129816 0.293419 +0.034451 1.570149 -1.296174 0.930466 -0.145398 0.336291 +0.000372 1.537030 -1.250020 0.418642 -0.187317 0.888623 +0.000349 1.442555 -1.269924 0.439601 -0.192197 0.877389 +0.025818 1.534800 -1.262478 0.756189 -0.191097 0.625828 +0.015475 1.442679 -1.277939 0.772235 -0.188532 0.606720 +0.021517 1.443114 -1.300993 0.949139 -0.158746 0.271908 +0.036751 1.537030 -1.295993 0.940385 -0.168274 0.295568 +0.000403 1.500012 -1.245729 0.398737 -0.181496 0.898926 +0.000351 1.392143 -1.267485 0.412715 -0.184418 0.891996 +0.027067 1.497572 -1.258049 0.708700 -0.169626 0.684814 +0.018579 1.392218 -1.276257 0.700889 -0.175932 0.691233 +0.028506 1.392485 -1.297364 0.912112 -0.132628 0.387894 +0.039525 1.500012 -1.289692 0.926848 -0.120354 0.355624 +0.000403 1.457243 -1.245338 0.372382 -0.186826 0.909081 +0.000351 1.349374 -1.267485 0.399128 -0.193550 0.896234 +0.031193 1.454802 -1.258452 0.700251 -0.192814 0.687366 +0.018579 1.349450 -1.276256 0.697437 -0.199813 0.688227 +0.028506 1.349716 -1.297364 0.907360 -0.166174 0.386114 +0.043651 1.457243 -1.289771 0.922057 -0.154917 0.354699 +0.000345 1.414506 -1.245701 0.356010 -0.132468 0.925045 +0.000345 1.279529 -1.265030 0.402397 -0.142555 0.904298 +0.032102 1.411768 -1.258315 0.694165 -0.151028 0.703793 +0.019341 1.278736 -1.274819 0.717162 -0.153139 0.679873 +0.029357 1.278820 -1.297367 0.898691 -0.140586 0.415440 +0.046819 1.414506 -1.287978 0.891656 -0.144440 0.429054 +0.000345 1.325265 -1.253736 0.309360 -0.071177 0.948278 +0.000345 1.188933 -1.263969 0.359951 -0.081657 0.929391 +0.028351 1.322527 -1.263078 0.671463 -0.091894 0.735319 +0.021388 1.189144 -1.273440 0.707249 -0.091381 0.701034 +0.032032 1.188607 -1.297680 0.892376 -0.089747 0.442279 +0.043068 1.325265 -1.289129 0.870751 -0.100438 0.481357 +0.015267 1.583688 -1.297604 0.971576 -0.090469 -0.218758 +0.002626 1.584369 -1.305302 0.751851 -0.267424 -0.602665 +0.017630 1.611106 -1.298448 0.965615 -0.240432 -0.098892 +0.014435 1.611458 -1.309839 0.869418 -0.422035 -0.256900 +0.014435 1.612066 -1.284790 0.941569 -0.239253 0.237077 +0.007538 1.583853 -1.285870 0.903890 -0.149792 0.400681 +0.007777 1.583781 -1.309166 0.694602 -0.192230 -0.693236 +0.000345 1.583852 -1.313964 0.513472 -0.157733 -0.843485 +0.013389 1.611106 -1.311120 0.678652 -0.191047 -0.709177 +0.000428 1.612066 -1.318737 0.493111 -0.146522 -0.857539 +0.020758 1.612066 -1.300929 0.799670 -0.223874 -0.557143 +0.015212 1.583690 -1.297487 0.812304 -0.215487 -0.541967 +0.012060 1.519814 -1.313850 0.699438 -0.147197 -0.699370 +0.000351 1.519087 -1.320843 0.481166 -0.142001 -0.865052 +0.018613 1.595557 -1.323238 0.711100 -0.134451 -0.690115 +0.000373 1.597562 -1.332783 0.447776 -0.134619 -0.883954 +0.027355 1.597562 -1.303593 0.913125 -0.093622 -0.396784 +0.022072 1.519996 -1.297449 0.881886 -0.115625 -0.457064 +0.023238 1.519814 -1.297899 0.997699 -0.060653 -0.030308 +0.011751 1.520020 -1.313816 0.905433 -0.107639 -0.410615 +0.027835 1.595557 -1.298151 0.993500 -0.112701 -0.016012 +0.022081 1.597562 -1.324929 0.962630 -0.159597 -0.218798 +0.022081 1.597562 -1.270444 0.966419 -0.146262 0.211284 +0.012708 1.519996 -1.281267 0.919981 -0.099460 0.379134 +0.015475 1.475798 -1.316933 0.777534 -0.141386 -0.612740 +0.000349 1.475675 -1.324949 0.441896 -0.140130 -0.886054 +0.023519 1.567919 -1.327982 0.753918 -0.146544 -0.640416 +0.000372 1.570149 -1.339127 0.419283 -0.134836 -0.897787 +0.034451 1.570149 -1.298699 0.930466 -0.145400 -0.336291 +0.021517 1.476234 -1.293880 0.947128 -0.129819 -0.293422 +0.027068 1.570149 -1.268926 0.966746 -0.134247 0.217669 +0.015913 1.476233 -1.277305 0.932466 -0.098336 0.347616 +0.033316 1.567919 -1.298051 0.932466 -0.098336 0.347616 +0.026855 1.475798 -1.297815 0.880142 -0.060523 0.470836 +0.026855 1.475798 -1.297815 0.862645 -0.061789 -0.502022 +0.015223 1.476312 -1.317866 0.927527 -0.105644 -0.358516 +0.033316 1.567919 -1.298051 0.927527 -0.105644 -0.358516 +0.027068 1.570149 -1.329073 0.967619 -0.146676 -0.205427 +0.015475 1.442679 -1.316933 0.772246 -0.188537 -0.606704 +0.000349 1.442555 -1.324949 0.439623 -0.192202 -0.877377 +0.025818 1.534800 -1.332395 0.756195 -0.191099 -0.625820 +0.000372 1.537030 -1.344853 0.418642 -0.187317 -0.888623 +0.036751 1.537030 -1.298880 0.940385 -0.168274 -0.295568 +0.021517 1.443114 -1.293880 0.949138 -0.158748 -0.271913 +0.029367 1.537029 -1.264803 0.967490 -0.164206 0.192351 +0.015913 1.443114 -1.277305 0.933852 -0.124498 0.335291 +0.035616 1.534799 -1.298138 0.933852 -0.124498 0.335291 +0.026855 1.442678 -1.297815 0.878605 -0.081908 0.470473 +0.026855 1.442678 -1.297815 0.861021 -0.083645 -0.501644 +0.015223 1.443193 -1.317866 0.928583 -0.132021 -0.346850 +0.035616 1.534799 -1.298138 0.928583 -0.132021 -0.346850 +0.029367 1.537029 -1.333644 0.967483 -0.176323 -0.181350 +0.032987 1.500012 -1.264132 0.971548 -0.138489 0.192131 +0.020142 1.392485 -1.276685 0.955806 -0.120075 0.268359 +0.039357 1.497572 -1.298102 0.955806 -0.120075 0.268359 +0.027913 1.392711 -1.297786 0.933949 -0.100893 0.342871 +0.027913 1.392711 -1.297786 0.910403 -0.100566 -0.401314 +0.018732 1.392114 -1.318464 0.947302 -0.128622 -0.293385 +0.039357 1.497572 -1.298102 0.947302 -0.128622 -0.293385 +0.032987 1.500012 -1.334286 0.971131 -0.154903 -0.181408 +0.018579 1.392219 -1.318616 0.700881 -0.175928 -0.691241 +0.000351 1.392143 -1.327387 0.412700 -0.184414 -0.892004 +0.027067 1.497572 -1.336823 0.708700 -0.169623 -0.684816 +0.000403 1.500012 -1.349143 0.398737 -0.181496 -0.898926 +0.039524 1.500012 -1.305181 0.926854 -0.120348 -0.355609 +0.028506 1.392485 -1.297508 0.912118 -0.132623 -0.387881 +0.037113 1.457243 -1.264473 0.965049 -0.174518 0.195508 +0.020142 1.349716 -1.276685 0.950359 -0.156267 0.269071 +0.043483 1.454802 -1.298095 0.950359 -0.156267 0.269071 +0.027913 1.349942 -1.297786 0.930003 -0.137085 0.341030 +0.027913 1.349942 -1.297786 0.906940 -0.135841 -0.398758 +0.018732 1.349345 -1.318464 0.941716 -0.164325 -0.293543 +0.043483 1.454802 -1.298095 0.941716 -0.164325 -0.293543 +0.037113 1.457243 -1.333909 0.964165 -0.190659 -0.184485 +0.018579 1.349450 -1.318616 0.697437 -0.199811 -0.688228 +0.000351 1.349374 -1.327387 0.399143 -0.193552 -0.896227 +0.031193 1.454803 -1.336420 0.700258 -0.192812 -0.687358 +0.000403 1.457243 -1.349535 0.372411 -0.186832 -0.909067 +0.043650 1.457243 -1.305102 0.922062 -0.154912 -0.354689 +0.028506 1.349716 -1.297508 0.907363 -0.166170 -0.386109 +0.031963 1.414506 -1.265585 0.953354 -0.109396 0.281333 +0.019007 1.279646 -1.274121 0.932635 -0.093797 0.348416 +0.041210 1.411768 -1.297985 0.932635 -0.093797 0.348416 +0.029808 1.280044 -1.297729 0.907092 -0.077714 0.413697 +0.029808 1.280044 -1.297729 0.864135 -0.075766 -0.497523 +0.016836 1.279816 -1.320225 0.916967 -0.104484 -0.385037 +0.041210 1.411768 -1.297985 0.916967 -0.104484 -0.385037 +0.031963 1.414506 -1.332496 0.954881 -0.131503 -0.266287 +0.019341 1.278736 -1.320054 0.717148 -0.153134 -0.679888 +0.000345 1.279529 -1.329842 0.402391 -0.142553 -0.904301 +0.032102 1.411768 -1.336557 0.694161 -0.151026 -0.703798 +0.000345 1.414506 -1.349172 0.356035 -0.132474 -0.925035 +0.046819 1.414506 -1.306895 0.891650 -0.144440 -0.429065 +0.029357 1.278820 -1.297506 0.898688 -0.140585 -0.415446 +0.028212 1.325265 -1.269463 0.946438 -0.072841 0.314561 +0.019151 1.190492 -1.273409 0.915769 -0.053065 0.398185 +0.037459 1.322527 -1.297919 0.915769 -0.053065 0.398185 +0.032060 1.188684 -1.297206 0.877476 -0.032847 0.478494 +0.032060 1.188684 -1.297206 0.911371 -0.038946 -0.409740 +0.021185 1.189232 -1.321447 0.933902 -0.051572 -0.353791 +0.037459 1.322527 -1.297919 0.933902 -0.051572 -0.353791 +0.028212 1.325265 -1.328228 0.952886 -0.064003 -0.296499 +0.021388 1.189144 -1.321433 0.707241 -0.091381 -0.701042 +0.000345 1.188933 -1.330903 0.359933 -0.081660 -0.929398 +0.028351 1.322527 -1.331795 0.671458 -0.091897 -0.735323 +0.000345 1.325265 -1.341137 0.309359 -0.071184 -0.948277 +0.043068 1.325265 -1.305744 0.870751 -0.100442 -0.481357 +0.032032 1.188607 -1.297192 0.892380 -0.089748 -0.442272 +-0.000014 -1.159240 -0.439762 1.000000 0.000007 0.000088 +-0.000014 -1.250245 -0.434445 1.000000 0.000025 0.000099 +0.000000 -1.276195 -0.555204 1.000000 0.000044 0.000106 +-0.000014 -1.050621 -0.441716 1.000000 -0.000011 0.000086 +0.000000 -1.063839 -0.611120 1.000000 -0.000003 0.000086 +-0.000014 -0.986598 -0.434334 1.000000 -0.000033 0.000095 +0.000000 -0.987748 -0.589001 1.000000 -0.000030 0.000089 +-0.000014 -0.932663 -0.417662 1.000000 -0.000050 0.000108 +0.000000 -0.931298 -0.554330 1.000000 -0.000055 0.000098 +-0.000014 -0.880610 -0.399948 1.000000 -0.000059 0.000125 +-0.000014 -0.822789 -0.374273 1.000000 -0.000072 0.000142 +-0.000014 -0.744347 -0.339557 1.000000 -0.000057 0.000160 +0.000000 -0.743088 -0.427930 1.000000 -0.000070 0.000150 +-0.000014 -0.681405 -0.321841 1.000000 -0.000039 0.000166 +-0.000014 -0.518173 -0.291564 1.000000 0.000006 0.000133 +0.000000 -0.520932 -0.408895 1.000000 0.000011 0.000119 +-0.000014 -0.422456 -0.316589 1.000000 0.000040 0.000125 +-0.000014 -0.340680 -0.343338 1.000000 0.000049 0.000115 +-0.000014 -0.278986 -0.368215 1.000000 0.000022 0.000109 +0.000000 -0.278299 -0.498183 1.000000 0.000038 0.000111 +0.000000 -0.181284 -0.504868 1.000000 0.000008 0.000111 +-0.000014 -0.182662 -0.379905 1.000000 0.000019 0.000128 +-0.000015 -0.003255 -0.418132 1.000000 0.000040 0.000161 +0.044857 -0.874260 -0.433364 0.948194 -0.167564 0.269906 +0.043304 -0.921943 -0.452842 0.965449 -0.216312 0.145320 +0.066690 -0.876853 -0.541092 0.954229 -0.251129 0.162426 +0.054009 -0.924554 -0.576160 0.944508 -0.316291 0.088688 +0.040422 -0.812548 -0.413537 0.909731 -0.134698 0.392743 +0.080293 -0.814335 -0.503604 0.923417 -0.182051 0.337873 +0.039930 -0.738402 -0.375737 0.919840 -0.144710 0.364627 +0.075641 -0.735415 -0.462425 0.911591 -0.150867 0.382414 +0.040244 -0.668088 -0.348705 0.928134 -0.093480 0.360318 +0.072233 -0.668912 -0.433957 0.926843 -0.111684 0.358454 +0.038948 -0.523525 -0.323235 0.912381 -0.047487 0.406579 +0.090468 -0.527023 -0.448803 0.924361 -0.091460 0.370395 +0.043792 -0.422016 -0.343618 0.870977 0.054486 0.488293 +0.122302 -0.438939 -0.494918 0.897874 -0.062103 0.435850 +0.144772 -0.369612 -0.521974 0.848424 0.023093 0.528814 +0.044009 -0.342730 -0.376249 0.808265 0.106176 0.579166 +0.049406 -0.273320 -0.399098 0.751218 0.043022 0.658650 +0.163313 -0.268690 -0.540612 0.792544 -0.007641 0.609766 +0.173070 -0.171995 -0.533485 0.778539 0.281322 0.561012 +0.044787 -0.177356 -0.408909 0.675643 0.215521 0.705023 +0.007276 -0.010464 -0.451574 0.735097 0.562851 0.377931 +0.000000 -0.002516 -0.511473 0.700250 0.713833 0.009658 +0.017762 -1.166412 -0.476638 0.985727 -0.114764 0.123176 +0.000071 -1.253767 -0.451994 0.968819 -0.228917 0.094796 +0.028425 -1.191990 -0.592592 0.977116 -0.187075 0.101231 +0.000000 -1.276185 -0.555181 0.953741 -0.293911 0.063198 +0.028477 -1.049551 -0.487267 0.989857 -0.105042 0.095653 +0.044876 -1.066191 -0.622134 0.989850 -0.071615 0.122754 +0.040666 -0.987166 -0.466243 0.989127 -0.138086 0.050589 +0.045709 -0.984544 -0.606913 0.989511 -0.129959 0.063078 +0.043304 -0.921943 -0.452842 0.994457 -0.058212 0.087559 +0.054009 -0.924554 -0.576160 0.992553 -0.105932 0.060145 +-0.178546 -1.354269 -0.860294 -0.867690 -0.459636 0.189335 +-0.154545 -1.402559 -0.867532 -0.882287 -0.428250 0.195375 +-0.131543 -1.409096 -0.777987 -0.882287 -0.428250 0.195375 +-0.111758 -1.457935 -0.786106 -0.895794 -0.396335 0.201175 +-0.085409 -1.291375 -1.217723 0.056625 -0.109374 -0.992386 +-0.082624 -1.177560 -1.230108 0.046793 -0.063930 -0.996857 +-0.000017 -1.287914 -1.213232 0.052002 -0.112815 -0.992254 +-0.000017 -1.171195 -1.226909 -0.002241 -0.047014 -0.998892 +-0.063693 -1.084658 -1.226234 -0.049267 -0.129632 -0.990337 +0.000000 -1.086145 -1.231919 -0.135462 -0.291080 -0.947060 +-0.063837 -1.006457 -1.256372 -0.177770 -0.475488 -0.861574 +0.000000 -1.014367 -1.268361 -0.192482 -0.537709 -0.820866 +0.000000 -0.946150 -1.314178 -0.132503 -0.611708 -0.779908 +-0.077967 -0.944955 -1.301869 -0.170017 -0.616850 -0.768499 +0.000000 -0.850805 -1.401005 -0.166715 -0.586793 -0.792389 +-0.113353 -0.829547 -1.389298 -0.215967 -0.489613 -0.844771 +-0.117833 -0.677125 -1.452666 -0.283429 -0.242821 -0.927742 +0.000000 -0.694820 -1.481308 -0.237083 -0.344148 -0.908490 +-0.114572 -0.524305 -1.478219 -0.306719 0.040080 -0.950956 +0.000000 -0.533029 -1.515251 -0.293088 -0.072777 -0.953312 +0.000000 -0.361320 -1.491224 -0.297235 0.160851 -0.941158 +-0.108530 -0.355331 -1.455653 -0.292423 0.184591 -0.938304 +0.000000 -0.212704 -1.457249 -0.287521 0.208324 -0.934843 +-0.121475 -0.199653 -1.417969 -0.281357 0.203601 -0.937755 +-0.107905 -1.323799 -0.578042 -0.769640 0.004185 0.638464 +-0.096499 -1.343108 -0.564166 -0.738631 0.072852 0.670162 +-0.084009 -1.293200 -0.566737 -0.637960 0.197992 0.744182 +-0.079885 -1.324992 -0.553916 -0.665125 0.203467 0.718477 +-0.101609 -1.353245 -0.577932 -0.869459 -0.184191 0.458382 +-0.044418 -1.529981 -0.878195 -0.330139 -0.836287 -0.437758 +-0.032348 -1.573539 -0.787490 -0.491571 -0.802664 -0.337771 +-0.082070 -1.492716 -0.881297 -0.660635 -0.708678 -0.247662 +-0.062210 -1.548939 -0.790061 -0.710617 -0.665123 -0.229423 +-0.095632 -1.475422 -0.916070 -0.645849 -0.750170 -0.141858 +-0.043559 -1.502736 -0.920470 -0.298206 -0.855224 -0.423870 +-0.000017 -1.583737 -0.779092 -0.121621 -0.894308 -0.430606 +-0.000017 -1.537104 -0.870659 -0.056208 -0.858897 -0.509055 +-0.045074 -1.490148 -0.950779 -0.254260 -0.941268 -0.222187 +-0.000017 -1.507587 -0.917663 -0.067777 -0.897285 -0.436218 +-0.000017 -1.493131 -0.951213 -0.067606 -0.989312 -0.129191 +-0.048005 -1.490109 -0.980232 -0.263580 -0.960743 -0.086598 +-0.000017 -1.493460 -0.986184 -0.087438 -0.975216 -0.203245 +-0.091205 -1.508123 -0.790433 -0.874673 -0.484092 -0.024557 +-0.119248 -1.452959 -0.879041 -0.811978 -0.576072 -0.093985 +-0.130164 -1.431816 -0.909236 -0.798578 -0.590799 -0.115021 +-0.138662 -1.415715 -0.925182 -0.859668 -0.497242 -0.117140 +-0.108982 -1.462815 -0.939119 -0.648173 -0.761275 0.018214 +-0.147928 -1.405185 -0.938309 -0.797560 -0.577029 0.175886 +-0.115110 -1.457540 -0.963420 -0.645634 -0.763330 -0.021998 +-0.154545 -1.402559 -0.867532 -0.824668 -0.563234 -0.051862 +-0.111758 -1.457935 -0.786106 -0.874177 -0.483559 0.044562 +-0.112016 -1.455975 -0.988007 -0.607255 -0.779260 -0.154902 +-0.052771 -1.482106 -1.004878 -0.250142 -0.919604 -0.302915 +-0.145103 -1.397383 -0.918884 -0.770096 0.111358 -0.628134 +-0.161762 -1.386568 -0.896266 -0.881296 -0.274275 -0.384825 +-0.000017 -1.486275 -1.007160 -0.089176 -0.921451 -0.378122 +-0.068456 -1.451326 -1.066913 -0.180804 -0.889212 -0.420252 +-0.000017 -1.458554 -1.064723 -0.079705 -0.873026 -0.481116 +-0.122840 -1.432474 -1.061670 -0.546898 -0.817520 -0.180456 +-0.162523 -1.393819 -0.950832 -0.786727 -0.614684 0.056786 +-0.163461 -1.392704 -1.039889 -0.752078 -0.656759 -0.055186 +-0.144263 -1.389823 -0.917095 -0.903571 0.365726 -0.223167 +-0.156965 -1.380106 -0.899919 -0.641695 0.182320 -0.744974 +-0.125457 -1.349364 -0.914963 -0.870710 0.257242 -0.419156 +-0.174107 -1.349980 -0.894637 -0.384262 -0.057090 -0.921457 +-0.169497 -1.373555 -0.931681 -0.421288 0.148677 0.894657 +-0.082855 -1.405828 -1.147955 0.048645 -0.675449 -0.735800 +-0.000017 -1.402693 -1.142934 0.022659 -0.769241 -0.638556 +-0.085424 -1.351693 -1.181174 0.027622 -0.499785 -0.865709 +-0.000017 -1.351366 -1.180527 0.029415 -0.524705 -0.850776 +-0.085409 -1.291375 -1.217723 0.065841 -0.517113 -0.853381 +-0.000017 -1.287914 -1.213232 0.037201 -0.488114 -0.871987 +-0.082624 -1.177560 -1.230108 -0.180493 -0.011863 -0.983505 +-0.085409 -1.291375 -1.217723 -0.200059 -0.246003 -0.948398 +-0.149071 -1.182005 -1.217860 -0.229970 0.023361 -0.972917 +-0.147357 -1.283632 -1.206186 -0.203759 -0.374892 -0.904399 +-0.085424 -1.351693 -1.181174 -0.202893 -0.514604 -0.833077 +-0.148332 -1.343492 -1.172147 -0.187265 -0.517288 -0.835072 +-0.140970 -1.081044 -1.195292 -0.372095 -0.009922 -0.928141 +-0.063693 -1.084658 -1.226234 -0.343579 -0.069006 -0.936585 +-0.144250 -1.389224 -1.142150 -0.235064 -0.670845 -0.703358 +-0.082855 -1.405828 -1.147955 -0.285195 -0.773233 -0.566369 +-0.063837 -1.006457 -1.256372 -0.387685 -0.473576 -0.790839 +-0.155712 -1.010450 -1.208942 -0.456264 -0.366003 -0.811089 +-0.163891 -0.925097 -1.230911 -0.650326 -0.247203 -0.718308 +-0.077967 -0.944955 -1.301869 -0.511268 -0.440302 -0.738064 +-0.122840 -1.432474 -1.061670 -0.304072 -0.861373 -0.406912 +-0.068456 -1.451326 -1.066913 -0.333398 -0.846142 -0.415799 +-0.261846 -0.969024 -0.862849 -0.977584 -0.210522 0.003317 +-0.261458 -0.950653 -0.936834 -0.992233 -0.118960 -0.036354 +-0.241371 -1.101547 -0.904321 -0.990728 -0.135562 -0.008942 +-0.247114 -1.089240 -0.947537 -0.984172 -0.113856 0.135801 +-0.244854 -1.124264 -0.861905 -0.990560 -0.127662 -0.049939 +-0.255188 -0.984125 -0.812184 -0.979388 -0.165099 0.116371 +-0.240435 -1.032634 -0.777716 -0.949671 -0.015489 0.312866 +-0.250630 -1.151253 -0.812148 -0.974700 -0.221714 -0.028319 +-0.220599 -1.216669 -0.913999 -0.960564 -0.266809 0.078289 +-0.224201 -1.213435 -0.939482 -0.952355 -0.278603 0.124096 +-0.216420 -1.224037 -0.880489 -0.949111 -0.314905 0.004820 +-0.203675 -1.233119 -0.795930 -0.915994 -0.400457 -0.024277 +-0.231512 -1.201274 -0.999141 -0.967195 -0.248457 0.052952 +-0.216845 -1.256261 -1.004349 -0.920937 -0.258032 0.292051 +-0.204236 -1.276883 -0.942053 -0.953780 -0.214325 0.210638 +-0.217272 -1.235284 -0.685585 -0.907936 -0.215499 0.359461 +-0.244292 -1.167176 -0.753451 -0.976471 -0.188002 0.105638 +-0.201506 -1.208949 -0.656278 -0.569535 0.077234 0.818331 +-0.232620 -1.119921 -0.714247 -0.871979 0.123251 0.473774 +-0.171399 -1.036528 -0.683604 -0.584696 0.043687 0.810075 +-0.134118 -1.124052 -0.661652 -0.232562 0.244191 0.941427 +-0.161583 -1.276360 -0.634034 -0.487381 -0.000512 0.873189 +-0.164444 -1.289065 -0.635710 -0.661596 -0.068800 0.746698 +-0.198140 -1.282808 -0.684246 -0.924553 -0.301088 0.233554 +-0.163789 -1.303910 -0.634987 -0.798069 -0.119928 0.590511 +-0.181060 -1.327258 -0.684930 -0.939052 -0.336954 0.068144 +-0.160709 -1.327495 -0.631884 -0.896761 -0.116955 0.426780 +-0.154531 -1.380270 -0.678829 -0.914094 -0.403836 -0.036733 +-0.158370 -1.364142 -0.622466 -0.951998 -0.212476 0.220349 +-0.198039 -0.974045 -0.698088 -0.716782 -0.193601 0.669883 +-0.106031 -0.926096 -0.629367 -0.495336 -0.287782 0.819648 +-0.093126 -0.998740 -0.644095 -0.340258 -0.244532 0.907980 +-0.200161 -1.310606 -1.001052 -0.957672 -0.275651 0.082955 +-0.215271 -1.295989 -1.027565 -0.606594 -0.412564 0.679584 +-0.229336 -1.271132 -1.029667 -0.734767 -0.018310 0.678072 +-0.245808 -1.173403 -0.979229 -0.908634 -0.270341 0.318276 +-0.239201 -1.174720 -0.997346 -0.288648 -0.845641 -0.448970 +-0.249225 -1.146517 -0.975926 -0.660128 0.067145 0.748146 +-0.239283 -1.257875 -1.047984 -0.835930 0.338784 0.431795 +-0.239547 -1.236328 -1.048406 -0.959853 -0.051510 0.275735 +-0.244916 -1.193270 -1.045580 -0.968097 -0.117801 0.221159 +-0.236921 -1.166535 -1.012875 -0.665131 -0.731753 -0.148787 +-0.253992 -1.187852 -1.077022 -0.966157 -0.148761 0.210741 +-0.241466 -1.230007 -1.081590 -0.989961 -0.051495 0.131628 +-0.245983 -1.253788 -1.075521 -0.898110 0.436689 0.051965 +-0.246879 -1.260431 -1.101758 -0.882723 0.302516 -0.359560 +-0.248839 -1.231756 -1.114913 -0.978359 -0.205942 -0.020048 +-0.228445 -1.270773 -1.165832 -0.792560 -0.336179 -0.508756 +-0.236955 -1.282762 -1.116675 -0.676454 -0.124614 -0.725866 +-0.250852 -1.070818 -0.986752 -0.998474 -0.040943 -0.037068 +-0.241454 -0.975757 -1.025889 -0.966859 -0.000582 -0.255311 +-0.249772 -1.082750 -1.018378 -0.993759 -0.082886 -0.074647 +-0.233541 -1.041313 -1.070262 -0.932411 0.212150 -0.292577 +-0.246537 -1.119261 -0.985145 -0.827349 0.256709 0.499594 +-0.252712 -1.118911 -1.071416 -0.993537 0.092377 0.065965 +-0.243274 -1.109294 -1.101869 -0.894963 0.301347 -0.328985 +-0.238407 -1.125403 -1.004741 0.348237 0.935240 -0.063696 +-0.262511 -1.180367 -1.120451 -0.975502 0.051451 -0.213888 +-0.248637 -1.153758 -1.051702 -0.950077 0.052440 0.307576 +-0.234143 -1.139745 -1.016009 -0.915805 0.316765 0.246903 +-0.234969 -1.155538 -1.017211 0.975664 0.027166 -0.217580 +-0.275470 -0.919913 -0.839500 -0.922553 -0.363928 0.128270 +-0.194389 -1.019275 -1.135778 -0.866415 0.041205 -0.497621 +-0.212075 -1.089059 -1.151285 -0.698728 0.303937 -0.647612 +-0.250557 -0.893329 -1.103714 -0.843327 -0.350433 -0.407425 +-0.255500 -0.909942 -0.759849 -0.814856 -0.426005 0.393101 +-0.155712 -1.010450 -1.208942 -0.837623 -0.244515 -0.488466 +-0.140970 -1.081044 -1.195292 -0.669532 0.094537 -0.736742 +-0.163891 -0.925097 -1.230911 -0.734426 -0.467055 -0.492421 +-0.218263 -0.890110 -0.686509 -0.615625 -0.471258 0.631602 +-0.327169 -0.847824 -0.782242 -0.675776 -0.665229 0.317488 +-0.271029 -0.828348 -0.649493 -0.598535 -0.682106 0.420105 +-0.130932 -0.873717 -0.601270 -0.509345 -0.582123 0.633798 +-0.242521 -1.305722 -1.114672 0.077351 -0.116276 -0.990200 +-0.258017 -1.289274 -1.110665 -0.224347 0.416686 -0.880932 +-0.230654 -1.322045 -1.104962 0.240337 -0.640326 -0.729534 +-0.222890 -1.307619 -1.114574 -0.481846 -0.581925 -0.655124 +-0.226949 -1.332009 -1.085243 0.284837 -0.930449 -0.230506 +-0.210056 -1.325508 -1.096257 -0.415292 -0.858716 -0.300231 +-0.232821 -1.331807 -1.063047 0.189155 -0.920451 0.342039 +-0.203355 -1.329595 -1.068720 -0.520253 -0.847267 0.107126 +-0.242675 -1.323309 -1.050723 -0.101892 -0.611520 0.784641 +-0.205347 -1.318320 -1.042482 -0.520962 -0.723995 0.452139 +-0.254444 -1.304698 -1.046883 -0.440110 -0.146878 0.885850 +-0.266311 -1.288375 -1.056594 -0.681797 0.347352 0.643816 +-0.270016 -1.278411 -1.076313 -0.711866 0.683517 0.161403 +-0.267872 -1.280775 -1.098341 -0.565719 0.720670 -0.400745 +-0.256785 -1.119221 -0.988089 -0.575288 0.193387 0.794761 +-0.267289 -1.108005 -0.996575 -0.651366 -0.072583 0.755284 +-0.269348 -1.094962 -1.000723 0.117353 0.805793 0.580453 +-0.250012 -1.105224 -1.022424 0.751447 0.624333 -0.213392 +-0.258528 -1.145483 -0.981235 -0.854151 0.184101 0.486348 +-0.264614 -1.166326 -0.984473 -0.636881 0.204205 0.743427 +-0.265898 -1.184636 -1.016200 0.427101 -0.853580 -0.298305 +-0.248887 -1.170372 -1.033533 0.614129 -0.658716 -0.434670 +-0.241348 -1.130242 -1.036225 0.885540 0.201576 -0.418552 +-0.241888 -1.154453 -1.038826 0.822104 -0.195850 -0.534591 +-0.288607 -1.098594 -1.015810 -0.685822 -0.196972 0.700607 +-0.285797 -1.111916 -1.028553 -0.764529 -0.362401 0.533068 +-0.262797 -1.123355 -0.998651 -0.887227 -0.151528 0.435737 +-0.258653 -1.146065 -0.997343 -0.890717 0.173522 0.420135 +-0.269625 -1.163410 -0.996001 -0.795294 0.498973 0.344287 +-0.275683 -1.171798 -0.990842 -0.586428 0.687228 0.428743 +-0.232968 -1.184636 -1.172981 -0.651188 0.061298 -0.756437 +-0.155502 -1.236804 -0.630819 -0.403984 0.156546 0.901271 +-0.156683 -1.356212 -0.761539 -0.922868 -0.384271 -0.025511 +-0.190161 -1.294682 -0.840066 -0.941135 -0.308571 0.138017 +-0.131543 -1.409096 -0.777987 -0.911732 -0.367224 0.184094 +-0.178546 -1.354269 -0.860294 -0.937708 -0.340063 0.071141 +-0.190512 -1.297658 -0.930004 -0.885442 -0.293470 0.360371 +-0.208784 -1.327152 -0.949713 -0.948052 -0.216224 0.233333 +-0.198518 -1.333706 -0.937192 -0.549280 -0.175477 0.817006 +-0.135328 -1.430873 -0.717779 -0.948600 -0.309649 -0.065387 +-0.191302 -1.311910 -0.896540 -0.859385 -0.473499 -0.193020 +-0.179296 -1.351104 -0.883960 -0.870071 -0.332443 -0.363949 +-0.161762 -1.386568 -0.896266 -0.860235 -0.348552 -0.372167 +-0.154545 -1.402559 -0.867532 -0.896548 -0.442446 -0.021047 +-0.149071 -1.182005 -1.217860 -0.493224 0.138026 -0.858883 +-0.147357 -1.283632 -1.206186 -0.465484 -0.216427 -0.858187 +-0.207014 -1.323399 -1.147182 -0.743962 -0.554045 -0.373571 +-0.148332 -1.343492 -1.172147 -0.500834 -0.497080 -0.708574 +-0.156965 -1.380106 -0.899919 -0.487846 -0.126145 -0.863767 +-0.174107 -1.349980 -0.894637 -0.684042 -0.211820 -0.698011 +-0.175729 -1.319335 -0.902466 -0.616269 -0.555600 -0.558141 +-0.175126 -1.314950 -0.923527 -0.609416 -0.658318 0.441848 +-0.182817 -1.335078 -0.932330 -0.315557 -0.182188 0.931253 +-0.125457 -1.349364 -0.914963 -0.692898 -0.634970 0.341623 +-0.185049 -1.368596 -1.120970 -0.745293 -0.627753 -0.224642 +-0.144250 -1.389224 -1.142150 -0.581523 -0.655628 -0.481646 +-0.184522 -1.353751 -1.012516 -0.913976 -0.404285 -0.034674 +-0.187929 -1.370655 -0.952735 -0.829033 -0.557353 -0.045423 +-0.183277 -1.375734 -0.941167 -0.728546 -0.485107 0.483624 +-0.169497 -1.373555 -0.931681 -0.424879 -0.141100 0.894186 +-0.163461 -1.392704 -1.039889 -0.815191 -0.579138 -0.007937 +-0.198746 -0.792401 -1.318974 -0.666829 -0.457870 -0.587957 +-0.315181 -0.764996 -1.175598 -0.727208 -0.541407 -0.421956 +-0.113353 -0.829547 -1.389298 -0.676960 -0.441889 -0.588608 +-0.077967 -0.944955 -1.301869 -0.630963 -0.559770 -0.537162 +-0.117833 -0.677125 -1.452666 -0.653326 -0.253417 -0.713404 +-0.215624 -0.638821 -1.379687 -0.649244 -0.172433 -0.740776 +-0.114572 -0.524305 -1.478219 -0.647567 -0.016038 -0.761840 +-0.219620 -0.509012 -1.385795 -0.677497 0.092011 -0.729748 +-0.254991 -1.321908 -1.115359 0.500202 -0.179081 -0.847189 +-0.268611 -1.308589 -1.120257 0.180868 0.343192 -0.921687 +-0.249913 -1.335757 -1.102068 0.606897 -0.629945 -0.484609 +-0.254575 -1.344734 -1.085416 0.503019 -0.864083 0.018240 +-0.268398 -1.346147 -1.071792 0.171787 -0.838312 0.517419 +-0.286584 -1.340647 -1.068407 -0.292466 -0.522459 0.800937 +-0.303199 -1.329213 -1.075418 -0.692350 -0.058220 0.719209 +-0.308545 -1.316096 -1.089215 -0.854070 0.413327 0.315795 +-0.301231 -1.305795 -1.104480 -0.688543 0.693637 -0.211603 +-0.285179 -1.302507 -1.116210 -0.282780 0.672992 -0.683460 +-0.269323 -1.342471 -1.125993 0.805580 -0.152774 -0.572452 +-0.279711 -1.332219 -1.133962 0.465688 0.298278 -0.833166 +-0.267450 -1.352851 -1.113072 0.795677 -0.576539 -0.185743 +-0.274699 -1.359736 -1.099968 0.524113 -0.820676 0.227589 +-0.288424 -1.360377 -1.091233 0.052878 -0.820119 0.569744 +-0.303655 -1.354242 -1.090079 -0.500848 -0.564802 0.655859 +-0.314641 -1.343556 -1.097327 -0.902755 -0.145720 0.404721 +-0.316908 -1.332587 -1.110568 -0.959478 0.277776 -0.047358 +-0.309341 -1.325785 -1.124591 -0.662531 0.549546 -0.508972 +-0.294992 -1.325751 -1.133573 -0.113776 0.563562 -0.818201 +-0.279442 -1.091644 -1.009008 -0.084789 0.934854 0.344760 +-0.261838 -1.101313 -1.030667 0.495924 0.794786 -0.349820 +-0.251003 -1.153046 -1.047842 0.682825 -0.212684 -0.698939 +-0.259299 -1.170908 -1.043556 0.534564 -0.671114 -0.513662 +-0.279853 -1.188245 -1.025279 0.350512 -0.858430 -0.374485 +-0.248231 -1.128193 -1.043317 0.708641 0.312637 -0.632524 +-0.285725 -1.140543 -1.030960 -0.799910 0.113121 0.589363 +-0.292839 -1.167308 -1.027903 -0.754320 0.348148 0.556592 +-0.307133 -1.138480 -1.061830 -0.506829 0.093034 0.857012 +-0.305048 -1.109485 -1.057337 -0.569048 -0.419977 0.706968 +-0.336214 -1.117070 -1.070677 -0.316364 -0.249330 0.915286 +-0.348472 -1.131245 -1.076251 -0.314014 0.089737 0.945168 +-0.312037 -1.163003 -1.057184 -0.644673 0.268029 0.715931 +-0.338613 -1.146774 -1.069065 -0.277388 0.241700 0.929859 +-0.269799 -1.171450 -1.053666 0.360509 -0.692729 -0.624628 +-0.304381 -1.184538 -1.045494 0.134016 -0.802193 -0.581830 +-0.263265 -1.151909 -1.060025 0.524796 -0.206634 -0.825767 +-0.260030 -1.124678 -1.055475 0.600320 0.334951 -0.726240 +-0.287615 -1.097294 -1.050728 0.349335 0.781344 -0.517172 +-0.310452 -1.086322 -1.035124 -0.468085 0.798203 0.379168 +-0.311671 -1.094821 -1.038957 -0.596044 -0.455791 0.661049 +-0.348236 -1.105636 -1.066348 -0.375412 -0.467302 0.800434 +-0.147928 -1.405185 -0.938309 -0.727859 -0.640782 0.244171 +-0.162523 -1.393819 -0.950832 -0.662721 -0.748865 -0.001284 +-0.138662 -1.415715 -0.925182 -0.868009 -0.404107 0.288544 +-0.145103 -1.397383 -0.918884 -0.725954 -0.440852 0.527865 +-0.122840 -1.432474 -1.061670 -0.633108 -0.758758 -0.153170 +-0.144263 -1.389823 -0.917095 -0.552942 -0.123192 0.824062 +-0.108530 -0.355331 -1.455653 -0.695608 0.144731 -0.703692 +-0.236095 -0.336440 -1.315803 -0.708825 0.112503 -0.696355 +-0.121475 -0.199653 -1.417969 -0.686186 0.123558 -0.716856 +-0.268996 -0.166749 -1.278754 -0.632808 0.104040 -0.767287 +-0.126253 -0.069033 -1.371295 -0.582573 0.146614 -0.799445 +-0.276410 -0.024242 -1.265942 -0.523653 0.085940 -0.847586 +-0.277886 -1.362630 -1.135619 0.948442 -0.153751 -0.277160 +-0.283686 -1.359002 -1.147220 0.709430 0.216599 -0.670667 +-0.280020 -1.368770 -1.123823 0.865928 -0.482114 0.133172 +-0.289273 -1.375075 -1.116339 0.527157 -0.686181 0.501259 +-0.302110 -1.379138 -1.116024 -0.038247 -0.729403 0.683014 +-0.313628 -1.379406 -1.122999 -0.628958 -0.574123 0.524208 +-0.319427 -1.375778 -1.134601 -0.960593 -0.264440 0.085630 +-0.317293 -1.369638 -1.146396 -0.903671 0.087393 -0.419215 +-0.308040 -1.363333 -1.153881 -0.490767 0.361613 -0.792707 +-0.295204 -1.359270 -1.154196 0.141296 0.429705 -0.891846 +-0.351197 -1.098160 -1.069294 -0.630088 0.406194 0.661812 +-0.310089 -1.161948 -1.072658 0.128746 -0.566795 -0.813737 +-0.343303 -1.163795 -1.072610 0.032180 -0.599473 -0.799748 +-0.311104 -1.142927 -1.084190 0.251806 -0.114717 -0.960955 +-0.302553 -1.120087 -1.073390 0.342573 0.330694 -0.879366 +-0.332530 -1.106033 -1.077487 0.224317 0.663148 -0.714084 +-0.121794 0.126862 -1.337687 -0.465797 0.117416 -0.877067 +-0.263580 0.140392 -1.261915 -0.609194 0.112356 -0.785022 +-0.229655 0.334608 -1.256244 -0.687405 0.026545 -0.725789 +-0.108528 0.360089 -1.304915 -0.319163 -0.087919 -0.943613 +-0.208275 0.514568 -1.309593 -0.528967 -0.076611 -0.845177 +-0.276877 0.518283 -1.223775 -0.824384 -0.099048 -0.557298 +-0.284178 0.314571 -1.157604 -0.880721 -0.049919 -0.470998 +-0.201975 0.676339 -1.300758 -0.381373 0.175413 -0.907626 +-0.093267 0.537123 -1.340819 -0.242363 -0.002218 -0.970183 +-0.078983 0.672760 -1.329372 -0.218391 0.173171 -0.960373 +-0.314782 0.525202 -1.163291 -0.882557 -0.089556 -0.461599 +-0.284059 0.669572 -1.231316 -0.770204 0.143261 -0.621499 +-0.328173 0.316278 -1.060432 -0.902669 -0.142122 -0.406190 +-0.316567 0.674269 -1.177092 -0.899695 0.158234 -0.406830 +-0.279601 0.779780 -1.158522 -0.750713 0.560713 -0.349330 +-0.234621 0.787648 -1.231194 -0.615072 0.617987 -0.489672 +-0.115223 0.870956 -1.200244 -0.349666 0.840396 -0.414088 +-0.203523 0.850704 -1.130556 -0.439897 0.872048 -0.214529 +-0.112552 0.899531 -1.004645 -0.332031 0.936783 -0.110418 +-0.055367 0.903845 -1.060557 -0.274261 0.951171 -0.141614 +-0.251929 0.841469 -1.034970 -0.519001 0.848369 -0.104442 +-0.172004 0.879637 -0.926179 -0.417151 0.904650 0.087135 +-0.341636 0.537693 -1.091500 -0.937843 -0.043632 -0.344306 +-0.343043 0.675234 -1.105304 -0.926620 0.152259 -0.343792 +-0.315812 0.762780 -1.086902 -0.829182 0.474899 -0.294835 +-0.081137 0.746770 -1.310106 -0.220055 0.277155 -0.935287 +-0.187521 0.788019 -1.271414 -0.371622 0.474332 -0.798064 +-0.083203 0.776489 -1.299486 -0.191787 0.422061 -0.886049 +-0.280601 -1.383995 -1.147629 0.986606 0.163103 -0.002431 +-0.284070 -1.382217 -1.157102 0.781413 0.363876 -0.506940 +-0.282084 -1.390649 -1.140100 0.864782 -0.136750 0.483168 +-0.287731 -1.399218 -1.137627 0.452203 -0.447922 0.771284 +-0.294990 -1.406136 -1.140857 -0.117278 -0.670052 0.732992 +-0.301114 -1.408959 -1.148293 -0.614005 -0.701550 0.361699 +-0.304027 -1.406916 -1.157166 -0.838267 -0.513041 -0.184654 +-0.302810 -1.400832 -1.164291 -0.708467 -0.165392 -0.686090 +-0.297857 -1.392846 -1.167120 -0.266187 0.193741 -0.944250 +-0.290769 -1.385752 -1.164499 0.312846 0.392806 -0.864772 +-0.258485 -1.431602 -1.170118 0.908561 0.304684 0.285806 +-0.258912 -1.430779 -1.174341 0.829774 0.486206 -0.274006 +-0.259865 -1.434206 -1.166871 0.705983 -0.041278 0.707025 +-0.262486 -1.437617 -1.165891 0.296132 -0.441259 0.847111 +-0.265684 -1.440051 -1.167361 -0.187472 -0.755468 0.627791 +-0.268306 -1.440624 -1.170797 -0.535974 -0.834506 0.127795 +-0.269087 -1.439328 -1.175026 -0.614819 -0.652616 -0.442820 +-0.267857 -1.436418 -1.178335 -0.402921 -0.283501 -0.870219 +-0.264932 -1.433226 -1.179409 0.023461 0.129749 -0.991269 +-0.261355 -1.431329 -1.177856 0.495003 0.422800 -0.759087 +-0.355943 -1.129597 -1.088021 0.095520 -0.098053 -0.990586 +-0.316565 0.155535 -1.170591 -0.858188 0.188038 -0.477656 +-0.085151 0.801816 -1.283248 -0.172412 0.629211 -0.757870 +-0.257483 0.826472 -0.861991 -0.481527 0.849066 0.217299 +-0.191441 0.840666 -0.814931 -0.019656 0.941005 0.337820 +-0.174726 0.772485 -0.655484 0.163875 0.913129 0.373283 +-0.228561 0.777364 -0.667726 -0.287121 0.901021 0.325150 +-0.098672 0.741881 -0.649914 0.335570 0.879375 0.337775 +-0.088868 0.769612 -0.732977 0.341962 0.878487 0.333649 +-0.275723 0.755235 -0.676234 -0.568824 0.785055 0.245211 +-0.310224 0.786234 -0.897805 -0.677690 0.706383 0.204351 +-0.249671 -1.449145 -1.176748 0.686375 -0.678472 -0.261849 +0.173635 -1.358508 -0.942559 0.737418 -0.441260 -0.511374 +0.179672 -1.361783 -0.916928 0.878918 -0.476973 0.000000 +0.167523 -1.369772 -0.939125 0.617776 -0.661748 -0.424785 +0.163048 -1.378017 -0.929743 0.534807 -0.814638 -0.224379 +0.161410 -1.381035 -0.916928 0.510749 -0.858971 0.036119 +0.163048 -1.378017 -0.904112 0.552022 -0.782900 0.286948 +0.167523 -1.369772 -0.894731 0.647615 -0.606761 0.460908 +0.173635 -1.358508 -0.891297 0.771878 -0.377782 0.511357 +0.179748 -1.347244 -0.894731 0.891512 -0.157325 0.424799 +0.184223 -1.338998 -0.904112 0.974483 -0.004425 0.224418 +0.185861 -1.335980 -0.916928 0.998550 0.039918 -0.036122 +0.184223 -1.338998 -0.929743 0.957259 -0.036174 -0.286960 +0.179748 -1.347244 -0.939125 0.861673 -0.212316 -0.460914 +0.149528 -1.370119 -0.954521 0.220660 -0.628718 -0.745669 +0.159880 -1.351043 -0.960336 0.427069 -0.248369 -0.869439 +0.141950 -1.384084 -0.938632 0.071421 -0.903742 -0.422078 +0.139176 -1.389196 -0.916928 0.019353 -0.999706 0.014589 +0.141950 -1.384084 -0.895224 0.078388 -0.890914 0.447356 +0.149528 -1.370119 -0.879335 0.232699 -0.606528 0.760246 +0.159880 -1.351043 -0.873519 0.440998 -0.222714 0.869436 +0.170233 -1.331967 -0.879335 0.647415 0.157644 0.745656 +0.177811 -1.318002 -0.895224 0.796651 0.432662 0.422078 +0.180585 -1.312891 -0.916928 0.848725 0.528633 -0.014584 +0.177811 -1.318002 -0.938632 0.789692 0.419839 -0.447351 +0.170233 -1.331967 -0.954521 0.635357 0.135426 -0.760251 +0.123777 -1.359001 -0.958868 -0.042796 -0.448237 -0.892890 +0.135327 -1.337718 -0.965356 0.196612 -0.007070 -0.980456 +0.115323 -1.374581 -0.941142 -0.229249 -0.791848 -0.566058 +0.112228 -1.380283 -0.916928 -0.312801 -0.945773 -0.087579 +0.115323 -1.374581 -0.892714 -0.271021 -0.868808 0.414392 +0.123777 -1.359001 -0.874988 -0.115146 -0.581569 0.805307 +0.135327 -1.337718 -0.868499 0.113081 -0.161004 0.980454 +0.146876 -1.316436 -0.874988 0.352498 0.280196 0.892880 +0.155331 -1.300856 -0.892714 0.538963 0.623778 0.566056 +0.158425 -1.295154 -0.916928 0.622493 0.777711 0.087567 +0.155331 -1.300856 -0.941142 0.580732 0.700743 -0.414379 +0.146876 -1.316436 -0.958868 0.424839 0.413499 -0.805314 +0.007202 1.584741 -1.309190 0.724131 0.195871 -0.661263 +0.000000 1.622242 -1.297518 0.893076 0.449905 0.000013 +0.015217 1.584564 -1.297518 0.967707 0.219246 0.124396 +0.000000 1.584920 -1.313976 0.525223 0.180011 -0.831707 +0.007202 1.584740 -1.285847 0.663513 0.198677 0.721303 +0.000000 1.584920 -1.281061 0.543125 0.225448 0.808819 +0.012210 1.519316 -1.313955 0.707247 0.074854 -0.702993 +0.022343 1.519310 -1.297518 0.996623 0.079873 -0.019066 +0.000000 1.519330 -1.320764 0.478038 0.062782 -0.876092 +0.012210 1.519316 -1.281081 0.704261 0.074666 0.706004 +0.000000 1.519330 -1.272790 0.557861 0.079860 0.826083 +0.015294 1.442862 -1.316786 0.712363 0.043590 -0.700456 +0.025428 1.442862 -1.297518 0.998992 0.041707 -0.016593 +0.000000 1.442863 -1.324767 0.449794 0.033100 -0.892519 +0.015294 1.442862 -1.278250 0.705576 0.041854 0.707398 +0.000000 1.442863 -1.269792 0.510001 0.038442 0.859314 +0.018443 1.349348 -1.318398 0.710581 0.023158 -0.703234 +0.028576 1.349348 -1.297518 0.999671 0.023577 -0.010091 +0.000000 1.349349 -1.327047 0.406618 0.015636 -0.913464 +0.018443 1.349348 -1.276638 0.722135 0.026809 0.691233 +0.000000 1.349350 -1.266484 0.482665 0.027711 0.875367 +0.019217 1.253847 -1.320011 0.700674 0.017142 -0.713276 +0.029351 1.253847 -1.297518 0.999854 0.015151 -0.007878 +0.000000 1.253848 -1.327673 0.381797 0.017721 -0.924076 +0.019217 1.253847 -1.275025 0.739203 0.020009 0.673186 +0.000000 1.253848 -1.264209 0.487623 0.023695 0.872733 +0.020764 1.166052 -1.321185 0.709045 0.026112 -0.704680 +0.030897 1.166052 -1.297518 0.999700 0.023652 -0.006371 +0.000000 1.166052 -1.330374 0.410524 0.027014 -0.911449 +0.020764 1.166052 -1.273851 0.754056 0.023757 0.656380 +0.000000 1.166052 -1.261031 0.513665 0.024852 0.857631 +0.023085 1.075631 -1.322514 0.723051 0.019230 -0.690527 +0.033219 1.075631 -1.297518 0.999820 0.018543 -0.003890 +0.000000 1.075632 -1.333278 0.430236 0.017001 -0.902556 +0.023085 1.075631 -1.272521 0.758384 0.018586 0.651543 +0.000000 1.075632 -1.258652 0.518354 0.019262 0.854949 +0.023843 0.991295 -1.322813 0.782440 0.013451 -0.622581 +0.033976 0.991295 -1.297518 0.999904 0.007463 0.011634 +0.000000 0.991296 -1.334681 0.445557 0.014891 -0.895130 +0.023843 0.991295 -1.272223 0.756034 -0.001749 0.654530 +0.000000 0.991296 -1.257709 0.518310 -0.001552 0.855191 +0.025062 0.911391 -1.323454 0.931299 0.017127 -0.363852 +0.035195 0.911391 -1.297518 0.992876 0.029245 0.115510 +0.022481 0.911391 -1.271582 0.733825 0.019430 0.679061 +0.000000 0.911391 -1.259761 0.483798 0.005617 0.875162 +0.029112 0.812922 -1.273484 0.751529 0.003117 0.659693 +0.000000 0.812923 -1.255352 0.510971 -0.035810 0.858852 +0.039245 0.812922 -1.297518 0.920790 0.037872 0.388215 +0.049248 0.745544 -1.293766 0.565651 -0.014801 0.824512 +0.000000 0.777615 -1.259705 -0.398388 0.409297 -0.820831 +0.000000 0.798667 -1.251145 -0.452011 0.335990 -0.826315 +0.031367 0.777065 -1.277087 -0.464232 0.262140 -0.846033 +0.295178 -0.752238 0.000018 -0.001573 0.001095 0.999998 +0.332202 -0.734652 0.000057 -0.000857 0.001861 0.999998 +0.272467 -0.735551 -0.000036 -0.000377 0.000938 0.999999 +0.248955 -0.755401 -0.000014 0.000260 0.000800 1.000000 +0.208629 -0.741017 -0.000015 0.000196 0.000275 1.000000 +0.189201 -0.700580 -0.000015 0.000000 0.000000 1.000000 +0.200394 -0.636211 -0.000015 0.000313 -0.000121 1.000000 +0.222624 -0.608680 -0.000015 0.000000 0.000000 1.000000 +0.278199 -0.590617 -0.000015 -0.000255 -0.001293 0.999999 +0.335244 -0.615850 -0.000015 -0.001307 -0.002955 0.999995 +0.349110 -0.655147 -0.000113 -0.000213 0.000181 1.000000 +0.348796 -0.704774 -0.000013 0.000597 0.002011 0.999998 +0.326741 -0.712820 -0.044831 0.825396 -0.375178 -0.421856 +0.321164 -0.686016 -0.079581 0.653239 -0.529408 -0.541301 +0.346165 -0.674416 -0.040981 0.909116 -0.208547 -0.360578 +0.336374 -0.647740 -0.079227 0.960867 -0.065165 -0.269235 +0.342440 -0.630348 -0.037392 0.982827 0.068937 -0.171167 +0.335166 -0.602167 -0.075203 0.961086 0.272371 -0.046122 +0.330532 -0.589047 -0.108363 0.870018 0.488175 0.068950 +0.314000 -0.565151 -0.068947 0.870018 0.488175 0.068950 +0.308093 -0.551433 -0.092603 0.749115 0.662410 -0.006349 +0.291303 -0.704382 -0.077706 0.211492 -0.751068 -0.625434 +0.291509 -0.674280 -0.113187 0.300594 -0.753200 -0.585093 +0.314822 -0.657923 -0.112631 0.458263 -0.631898 -0.625060 +0.273587 -0.679387 -0.111205 0.017027 -0.825329 -0.564395 +0.273842 -0.653064 -0.155061 0.112784 -0.843691 -0.524848 +0.294872 -0.646012 -0.153510 0.304537 -0.791690 -0.529607 +0.303818 -0.553183 -0.141994 0.514962 0.846675 -0.133999 +0.279132 -0.529526 -0.087386 0.181074 0.968761 -0.169452 +0.279028 -0.540377 -0.138857 -0.158540 0.980583 -0.115421 +0.257647 -0.677363 -0.108988 -0.177272 -0.846821 -0.501466 +0.256660 -0.650004 -0.154840 -0.167282 -0.846628 -0.505211 +0.274078 -0.706588 -0.077441 0.089624 -0.774958 -0.625626 +0.247016 -0.552736 -0.092951 -0.437248 0.897105 -0.063387 +0.249190 -0.549680 -0.142482 -0.302375 0.952104 0.045472 +0.210457 -0.628753 -0.037344 -0.926518 0.346041 -0.147713 +0.197789 -0.683783 -0.037943 -0.940195 -0.193249 -0.280513 +0.236572 -0.595297 -0.032913 -0.777848 0.623313 -0.080210 +0.218227 -0.725211 -0.045824 -0.501421 -0.765373 -0.403461 +0.253455 -0.733264 -0.046138 -0.203873 -0.874700 -0.439699 +0.200532 -0.651394 -0.376826 -0.852736 -0.357396 0.380933 +0.215880 -0.635772 -0.327812 -0.844791 -0.419827 0.331774 +0.179266 -0.601335 -0.377465 -0.924076 -0.232112 0.303658 +0.198140 -0.597121 -0.314314 -0.914560 -0.279842 0.292009 +0.178825 -0.521027 -0.378250 -0.971917 -0.003037 0.235306 +0.196859 -0.533913 -0.303928 -0.964214 -0.035035 0.262801 +0.391453 -0.418047 -0.607499 0.533801 0.836727 0.122247 +0.325815 -0.384064 -0.553484 0.213570 0.973673 0.079680 +0.357320 -0.417054 -0.465251 0.686982 0.693526 0.216974 +0.306654 -0.389007 -0.449769 -0.172370 0.984942 0.013354 +0.405876 -0.495740 -0.495396 0.865675 0.450800 0.217683 +0.383499 -0.505994 -0.385173 0.812760 0.503354 0.293352 +0.336212 -0.447832 -0.375617 0.750671 0.550226 0.365710 +0.219295 -0.435004 -0.413224 -0.482210 0.874511 -0.052005 +0.210983 -0.443751 -0.483240 -0.482843 0.874288 -0.049834 +0.347038 -0.652398 -0.457320 0.660694 -0.663023 0.351971 +0.332847 -0.626788 -0.381643 0.578235 -0.732991 0.358284 +0.286957 -0.682616 -0.438026 0.429080 -0.797441 0.424239 +0.276524 -0.661972 -0.379310 0.504116 -0.782807 0.364802 +0.387067 -0.602420 -0.479440 0.827830 -0.500935 0.252509 +0.367801 -0.587543 -0.383197 0.760023 -0.579513 0.294159 +0.294651 -0.747369 -0.556844 0.462801 -0.770503 0.438339 +0.233252 -0.732483 -0.490942 0.302703 -0.827602 0.472700 +0.236832 -0.696120 -0.429808 0.300677 -0.827318 0.474488 +0.352869 -0.722752 -0.593997 0.758671 -0.573589 0.308892 +0.398648 -0.657788 -0.643241 0.867407 -0.449569 0.213290 +0.286957 -0.682616 -0.438026 0.297427 -0.882930 0.363279 +0.276524 -0.661972 -0.379310 0.299928 -0.882899 0.361292 +0.236832 -0.696120 -0.429808 -0.068169 -0.858321 0.508564 +0.245371 -0.672412 -0.378741 -0.200268 -0.905636 0.373787 +0.200532 -0.651394 -0.376826 -0.715413 -0.564188 0.412160 +0.185062 -0.653566 -0.409151 -0.657777 -0.579300 0.481395 +0.166063 -0.601729 -0.399052 -0.833938 -0.367101 0.412048 +0.155519 -0.617108 -0.446525 -0.865152 -0.263850 0.426492 +0.166408 -0.689952 -0.448651 -0.272905 -0.667343 0.692947 +0.233252 -0.732483 -0.490942 -0.136242 -0.797944 0.587131 +0.179266 -0.601335 -0.377465 -0.801345 -0.334092 0.496215 +0.156180 -0.709903 -0.464735 -0.346460 -0.461496 0.816693 +0.229238 -0.751868 -0.513438 0.035083 -0.696549 0.716651 +0.152043 -0.627012 -0.461232 -0.600298 -0.063652 0.797239 +0.130595 -0.640555 -0.478463 -0.669680 -0.101433 0.735691 +0.139670 -0.729077 -0.486843 -0.242721 -0.560623 0.791700 +0.188531 -0.803520 -0.548481 0.082147 -0.603057 0.793457 +0.405876 -0.495740 -0.495396 0.967191 0.187757 0.171140 +0.383499 -0.505994 -0.385173 0.969946 -0.096563 0.223341 +0.402735 -0.560380 -0.492227 0.970770 -0.117150 0.209479 +0.376532 -0.549829 -0.385658 0.947026 -0.210055 0.242939 +0.436833 -0.575138 -0.660827 0.973473 -0.134263 0.185265 +0.427755 -0.497838 -0.650739 0.966122 0.211346 0.148122 +0.357320 -0.417054 -0.465251 0.866101 0.456060 0.204641 +0.391453 -0.418047 -0.607499 0.908437 0.391109 0.147569 +0.387067 -0.602420 -0.479440 0.932754 -0.284597 0.221302 +0.398648 -0.657788 -0.643241 0.899648 -0.363186 0.242340 +0.367801 -0.587543 -0.383197 0.952881 -0.206072 0.222603 +0.449056 -0.493539 -0.787950 0.970811 0.186562 0.150734 +0.405733 -0.421712 -0.714452 0.917133 0.375999 0.132253 +0.459976 -0.598947 -0.814650 0.962051 -0.186533 0.199158 +0.430026 -0.707082 -0.805969 0.904548 -0.327091 0.273503 +0.368785 -0.778217 -0.725018 0.867592 -0.408093 0.284155 +0.352869 -0.722752 -0.593997 0.871680 -0.404266 0.277026 +0.148618 -0.528786 -0.462029 -0.755813 0.620372 0.209490 +0.210664 -0.440016 -0.501884 -0.727881 0.627548 0.276355 +0.131915 -0.528796 -0.497689 -0.694152 0.632003 0.344566 +0.186971 -0.445619 -0.537279 0.170012 0.394526 0.903020 +0.210983 -0.443751 -0.483240 -0.792969 0.599631 0.107901 +0.153661 -0.526172 -0.447830 -0.808346 0.578673 0.108236 +0.165710 -0.520333 -0.397867 -0.816383 0.501904 0.285676 +0.219295 -0.435004 -0.413224 -0.822177 0.557476 0.115086 +0.122304 -0.438939 -0.494920 0.552618 0.141441 0.821345 +0.144773 -0.369613 -0.521976 0.535712 0.129421 0.834424 +0.229770 -0.368127 -0.574212 0.518484 0.117324 0.847000 +0.224163 -0.441915 -0.371037 -0.802960 0.475628 0.359210 +0.178825 -0.521027 -0.378250 -0.759840 0.387887 0.521716 +0.227821 -0.552386 -0.242999 -0.892245 0.356757 0.276808 +0.229231 -0.598010 -0.149052 -0.983470 0.174776 -0.047327 +0.251681 -0.526464 -0.238647 -0.690594 0.664226 0.286152 +0.249190 -0.549680 -0.142482 -0.912229 0.408758 -0.027482 +0.229813 -0.597061 -0.252879 -0.961022 -0.250403 0.117198 +0.232306 -0.634170 -0.151996 -0.866818 -0.420584 -0.267836 +0.219397 -0.607375 -0.110780 -0.961196 0.230353 -0.151785 +0.222420 -0.652138 -0.114268 -0.854221 -0.287278 -0.433333 +0.247016 -0.552736 -0.092951 -0.835980 0.541525 0.088818 +0.233185 -0.667982 -0.111233 -0.455689 -0.655526 -0.602190 +0.241496 -0.644234 -0.153820 -0.521797 -0.776403 -0.353449 +0.218390 -0.549998 -0.270212 -0.853557 0.224824 0.469994 +0.246942 -0.515169 -0.267732 -0.561310 0.656767 0.503575 +0.281603 -0.495410 -0.271164 -0.431338 0.772183 0.466563 +0.281356 -0.506818 -0.237638 -0.538157 0.799117 0.267953 +0.220666 -0.594124 -0.278731 -0.844689 -0.369256 0.387492 +0.239402 -0.611724 -0.258518 -0.745427 -0.666583 0.002216 +0.232976 -0.612466 -0.284542 -0.609951 -0.719599 0.331870 +0.258925 -0.626401 -0.262389 -0.339126 -0.933082 -0.119796 +0.276371 -0.627443 -0.261753 0.115841 -0.983273 -0.140550 +0.273842 -0.653064 -0.155061 -0.111909 -0.967933 -0.224905 +0.256660 -0.650004 -0.154840 -0.295440 -0.905891 -0.303442 +0.196859 -0.533913 -0.303928 -0.806942 0.276959 0.521668 +0.237075 -0.487034 -0.304912 -0.528071 0.628260 0.571341 +0.284307 -0.461223 -0.300945 -0.388347 0.686507 0.614731 +0.215880 -0.635772 -0.327812 -0.376298 -0.788135 0.487076 +0.198140 -0.597121 -0.314314 -0.744275 -0.409019 0.527975 +0.249547 -0.643542 -0.327400 -0.041428 -0.908593 0.415623 +0.256416 -0.624547 -0.286227 -0.182454 -0.960841 0.208554 +0.242148 -0.565654 -0.068614 -0.661519 0.654608 0.365898 +0.279132 -0.529526 -0.087386 -0.125342 0.760870 0.636684 +0.214653 -0.617621 -0.076847 -0.949442 0.311317 -0.040514 +0.209417 -0.666078 -0.081436 -0.915706 -0.174796 -0.361841 +0.278717 -0.556303 -0.063563 0.047024 0.776610 0.628224 +0.308093 -0.551433 -0.092603 0.418683 0.726184 0.545308 +0.227787 -0.702231 -0.078069 -0.470808 -0.629122 -0.618503 +0.255760 -0.710602 -0.077899 0.044986 -0.774366 -0.631137 +0.257647 -0.677363 -0.108988 -0.166346 -0.765348 -0.621748 +0.274078 -0.706588 -0.077441 -0.010844 -0.829579 -0.558285 +0.273587 -0.679387 -0.111205 -0.182935 -0.766886 -0.615159 +0.276764 -0.624107 -0.286603 0.295377 -0.947934 0.119051 +0.307727 -0.608932 -0.283631 0.443418 -0.884600 0.144444 +0.302528 -0.611687 -0.254364 0.488921 -0.870571 -0.055339 +0.178825 -0.521027 -0.378250 -0.842886 0.457172 0.283789 +0.224163 -0.441915 -0.371037 -0.582539 0.701935 0.409800 +0.245371 -0.672412 -0.378741 0.062836 -0.876098 0.478022 +0.276524 -0.635578 -0.326774 0.355798 -0.872141 0.335823 +0.276524 -0.661972 -0.379310 0.413191 -0.822524 0.390803 +0.319099 -0.611475 -0.323902 0.473491 -0.824421 0.310058 +0.287657 -0.420008 -0.357903 -0.086054 0.901619 0.423883 +0.200532 -0.651394 -0.376826 -0.286514 -0.860688 0.420863 +0.278297 -0.578394 -0.034141 -0.004600 0.887169 0.461423 +0.236572 -0.595297 -0.032913 -0.441510 0.778132 0.446743 +0.210457 -0.628753 -0.037344 -0.898310 0.424168 0.114550 +0.197789 -0.683783 -0.037943 -0.976256 -0.001163 -0.216619 +0.273287 -0.721296 -0.043570 -0.002460 -0.912943 -0.408081 +0.292682 -0.727566 -0.046477 0.093442 -0.857950 -0.505163 +0.291303 -0.704382 -0.077706 0.280725 -0.753801 -0.594120 +0.326741 -0.712820 -0.044831 0.586150 -0.653319 -0.479169 +0.321164 -0.686016 -0.079581 0.391162 -0.697303 -0.600634 +0.318030 -0.594901 -0.032404 0.625223 0.719749 0.301757 +0.314000 -0.565151 -0.068947 0.450200 0.746021 0.490685 +0.218227 -0.725211 -0.045824 -0.636342 -0.554428 -0.536356 +0.253455 -0.733264 -0.046138 0.267319 -0.834484 -0.481848 +0.306654 -0.389007 -0.449769 0.087698 0.938219 0.334745 +0.357320 -0.417054 -0.465251 0.547318 0.747830 0.375758 +0.336212 -0.447832 -0.375617 0.560539 0.733743 0.383950 +0.219295 -0.435004 -0.413224 -0.367072 0.906678 0.207828 +0.332847 -0.626788 -0.381643 0.509630 -0.793816 0.331863 +0.332202 -0.734652 0.000057 0.549319 -0.721702 -0.421182 +0.348796 -0.704774 -0.000013 0.920403 -0.296492 -0.254854 +0.346165 -0.674416 -0.040981 0.977328 -0.106354 -0.183082 +0.335244 -0.615850 -0.000015 0.766257 0.630850 0.121975 +0.342440 -0.630348 -0.037392 0.918952 0.393354 0.028279 +0.278199 -0.590617 -0.000015 0.153638 0.925027 0.347449 +0.222624 -0.608680 -0.000015 -0.327561 0.905627 0.269340 +0.272467 -0.735551 -0.000036 0.225850 -0.919491 -0.321759 +0.295178 -0.752238 0.000018 -0.191296 -0.887975 -0.418218 +0.349110 -0.655147 -0.000113 0.988956 0.141399 -0.044404 +0.248955 -0.755401 -0.000014 0.617067 -0.731228 -0.290747 +0.335166 -0.602167 -0.075203 0.836380 0.486658 0.252253 +0.325592 -0.544287 -0.241357 0.980676 0.051672 0.188691 +0.321219 -0.579031 -0.146115 0.964788 0.263029 0.000295 +0.320785 -0.569750 -0.245758 0.980517 -0.174798 0.089618 +0.318454 -0.607310 -0.149689 0.968249 -0.183239 -0.170052 +0.314774 -0.524596 -0.238125 0.706083 0.638125 0.306989 +0.303818 -0.553183 -0.141994 0.731572 0.663152 0.158213 +0.309583 -0.628689 -0.151638 0.841672 -0.449423 -0.299346 +0.316683 -0.593278 -0.250336 0.879243 -0.476366 -0.002558 +0.314822 -0.657923 -0.112631 0.767139 -0.456582 -0.450589 +0.327569 -0.625240 -0.112006 0.933818 -0.178190 -0.310215 +0.330532 -0.589047 -0.108363 0.976877 0.091608 -0.193181 +0.308093 -0.551433 -0.092603 0.832015 0.549085 -0.079097 +0.291509 -0.674280 -0.113187 0.516696 -0.720718 -0.462158 +0.294872 -0.646012 -0.153510 0.640399 -0.698083 -0.320263 +0.333531 -0.536520 -0.271928 0.908451 0.090084 0.408169 +0.328640 -0.560919 -0.275564 0.926178 -0.213059 0.311127 +0.321012 -0.513381 -0.269870 0.591341 0.625473 0.509017 +0.281356 -0.506818 -0.237638 0.204055 0.918315 0.339204 +0.324505 -0.588902 -0.280399 0.863889 -0.438109 0.248509 +0.307727 -0.608932 -0.283631 0.755434 -0.639440 0.142955 +0.302528 -0.611687 -0.254364 0.636149 -0.759471 -0.136078 +0.279028 -0.540377 -0.138857 0.018450 0.953555 0.300654 +0.273842 -0.653064 -0.155061 0.437815 -0.867780 -0.235109 +0.276371 -0.627443 -0.261753 0.544748 -0.818258 -0.183584 +0.251681 -0.526464 -0.238647 -0.430483 0.870296 0.239311 +0.249190 -0.549680 -0.142482 -0.314405 0.924604 0.215072 +0.355280 -0.513678 -0.307759 0.872571 0.122265 0.472939 +0.348767 -0.549903 -0.311345 0.899610 -0.209424 0.383202 +0.337312 -0.487621 -0.305082 0.575289 0.620668 0.532742 +0.281603 -0.495410 -0.271164 0.355072 0.741131 0.569780 +0.343097 -0.581914 -0.315867 0.823114 -0.438544 0.360780 +0.319099 -0.611475 -0.323902 0.709509 -0.648285 0.276268 +0.321164 -0.686016 -0.079581 0.836167 -0.328209 -0.439436 +0.336374 -0.647740 -0.079227 0.902314 -0.204747 -0.379352 +0.335166 -0.602167 -0.075203 0.980426 -0.009097 -0.196679 +0.383499 -0.505994 -0.385173 0.879673 0.328093 0.344284 +0.376532 -0.549829 -0.385658 0.923955 -0.180530 0.337220 +0.336212 -0.447832 -0.375617 0.593567 0.683030 0.425615 +0.284307 -0.461223 -0.300945 0.453759 0.690851 0.562875 +0.367801 -0.587543 -0.383197 0.870472 -0.350768 0.345311 +0.332847 -0.626788 -0.381643 0.700170 -0.635872 0.324699 +0.287657 -0.420008 -0.357903 0.560305 0.655035 0.506940 +0.172004 0.879637 -0.926179 0.374912 0.925746 -0.049352 +0.251929 0.841469 -1.034970 0.370078 0.926176 -0.072390 +0.112552 0.899531 -1.004645 0.370078 0.926176 -0.072390 +0.203523 0.850704 -1.130556 0.365040 0.926092 -0.095387 +0.115223 0.870956 -1.200244 0.294909 0.950545 -0.097435 +0.055367 0.903845 -1.060557 0.274261 0.951171 -0.141614 +0.203523 0.850704 -1.130556 0.274261 0.951171 -0.141614 +0.112552 0.899531 -1.004645 0.252960 0.949535 -0.185456 +0.279601 0.779780 -1.158522 0.636892 0.733151 -0.238450 +0.234621 0.787648 -1.231194 0.533583 0.781026 -0.324480 +0.203523 0.850704 -1.130556 0.561353 0.772771 -0.296153 +0.115223 0.870956 -1.200244 0.469204 0.806289 -0.360202 +0.315812 0.762780 -1.086902 0.697746 0.691030 -0.188754 +0.251929 0.841469 -1.034970 0.656948 0.722974 -0.213841 +0.282348 0.545361 -0.119478 0.991695 -0.039105 -0.122524 +0.277643 0.564086 -0.163536 0.991272 -0.000510 -0.131831 +0.284402 0.576404 -0.112761 0.991272 -0.000510 -0.131831 +0.277107 0.594368 -0.159115 0.989287 0.038086 -0.140930 +0.269638 0.446302 0.000566 0.001711 0.002278 0.999996 +0.320365 0.485449 0.000390 -0.004583 -0.000007 0.999990 +0.242179 0.466927 0.000566 0.000985 0.000723 0.999999 +0.220789 0.442452 0.000566 0.000000 0.000000 1.000000 +0.167233 0.459170 0.000566 0.000000 0.000000 1.000000 +0.146152 0.501367 0.000566 0.000000 0.000000 1.000000 +0.153742 0.557811 0.000566 0.000472 -0.000128 1.000000 +0.187262 0.606974 0.000566 0.000000 0.000000 1.000000 +0.222234 0.612449 0.000566 0.000616 -0.001679 0.999998 +0.254878 0.617560 0.000566 0.000530 -0.003385 0.999994 +0.307234 0.573768 0.000390 -0.002514 -0.001265 0.999996 +0.323680 0.530277 0.000566 -0.017633 -0.002622 0.999841 +0.310224 0.786234 -0.897804 0.677688 0.706385 0.204351 +0.257483 0.826472 -0.861991 0.568823 0.785056 0.245211 +0.275723 0.755235 -0.676234 0.568823 0.785056 0.245211 +0.228561 0.777364 -0.667726 0.448746 0.848253 0.281238 +0.289658 0.521276 -0.087188 0.753525 -0.436024 -0.492020 +0.282348 0.545361 -0.119478 0.808482 -0.446612 -0.383268 +0.291826 0.566355 -0.081698 0.971848 -0.015706 -0.235083 +0.284402 0.576404 -0.112761 0.983191 0.086734 -0.160661 +0.254084 0.492429 -0.091707 0.561240 -0.603370 -0.566529 +0.251436 0.524118 -0.128080 0.578239 -0.643993 -0.500911 +0.249859 0.543077 -0.169297 0.601604 -0.713259 -0.359631 +0.277643 0.564086 -0.163536 0.608546 -0.704826 -0.364544 +0.277107 0.594368 -0.159115 0.968817 0.226499 -0.100454 +0.277154 0.615199 -0.111693 0.921051 0.385228 -0.057133 +0.268234 0.627424 -0.156155 0.811748 0.581601 -0.052969 +0.232840 0.663758 -0.096986 0.701629 0.712322 -0.017713 +0.231067 0.660080 -0.153241 0.655341 0.752099 -0.069827 +0.186751 0.612696 -0.034908 -0.755114 0.639320 0.145168 +0.217708 0.623680 -0.032393 -0.245774 0.937080 0.247945 +0.155436 0.559053 -0.044730 -0.973518 0.228114 0.015088 +0.188509 0.645758 -0.076114 -0.860442 0.428189 0.276214 +0.159072 0.588271 -0.082848 -0.987841 0.153674 0.023565 +0.164135 0.553976 -0.084703 -0.950462 -0.118846 -0.287222 +0.154307 0.520563 -0.045954 -0.955807 -0.137073 -0.260085 +0.179070 0.506104 -0.086362 -0.856303 -0.308085 -0.414523 +0.171417 0.482939 -0.048275 -0.771964 -0.518095 -0.368307 +0.223805 0.460757 -0.052471 -0.332387 -0.863041 -0.380366 +0.310224 0.786234 -0.897804 0.896303 0.398136 0.195266 +0.275723 0.755235 -0.676234 0.888210 0.419779 0.186733 +0.362855 0.685884 -0.934781 0.888210 0.419779 0.186733 +0.310846 0.688865 -0.685292 0.879577 0.441167 0.178087 +0.175497 0.729689 -0.405860 -0.843965 0.521374 0.126062 +0.178600 0.713752 -0.333697 -0.720376 0.668763 0.183888 +0.201002 0.752380 -0.409529 -0.622247 0.756443 0.201502 +0.200959 0.732715 -0.338152 -0.607554 0.765842 0.210630 +0.162211 0.681141 -0.329839 -0.896742 0.435541 0.078468 +0.161989 0.688799 -0.401702 -0.899699 0.435035 0.035857 +0.142688 0.649372 -0.328296 -0.954878 0.295623 0.028558 +0.141864 0.649581 -0.398320 -0.994152 0.102355 0.034423 +0.148225 0.609419 -0.328049 -0.951952 -0.305447 0.022131 +0.142612 0.617588 -0.398601 -0.900598 -0.428996 0.069892 +0.167913 0.575845 -0.391086 -0.610215 -0.779990 0.138758 +0.176281 0.581040 -0.325084 -0.534249 -0.837955 0.111398 +0.210193 0.564010 -0.387937 -0.212955 -0.965966 0.146829 +0.214007 0.575025 -0.326258 -0.149249 -0.971761 0.182772 +0.261987 0.648849 -0.326739 0.944217 0.329067 -0.012986 +0.270736 0.619210 -0.325093 0.991042 -0.128205 -0.037407 +0.260287 0.642322 -0.394408 0.955256 0.291357 -0.050961 +0.270736 0.608116 -0.391070 0.979016 -0.200961 0.033791 +0.250399 0.586577 -0.324189 0.568013 -0.809663 -0.147673 +0.244685 0.577869 -0.386784 0.595910 -0.797758 0.092051 +0.277643 0.564086 -0.163536 0.877110 -0.451148 -0.164754 +0.277107 0.594368 -0.159115 0.981739 0.189928 -0.010783 +0.249859 0.543077 -0.169297 0.426813 -0.854864 -0.295023 +0.229663 0.536460 -0.171279 0.230602 -0.917616 -0.323735 +0.214007 0.575025 -0.326258 0.187646 -0.976400 -0.106923 +0.176281 0.581040 -0.325084 -0.493609 -0.854166 -0.163557 +0.210195 0.534058 -0.169644 -0.168253 -0.938514 -0.301466 +0.246793 0.681763 -0.328611 0.877041 0.474690 0.073949 +0.268234 0.627424 -0.156155 0.871328 0.487326 0.057448 +0.247846 0.680231 -0.398317 0.943393 0.331405 -0.013441 +0.214153 0.515186 -0.127241 -0.298675 -0.823383 -0.482529 +0.232231 0.518961 -0.128260 0.220660 -0.862413 -0.455580 +0.182943 0.532746 -0.120103 -0.813599 -0.485663 -0.319670 +0.182677 0.552369 -0.164101 -0.733596 -0.659658 -0.163365 +0.251436 0.524118 -0.128080 0.117990 -0.865499 -0.486817 +0.168712 0.566050 -0.116333 -0.963247 -0.206105 -0.172268 +0.169900 0.585220 -0.162331 -0.969582 -0.244134 -0.017570 +0.210193 0.564010 -0.387937 0.364984 -0.920158 0.141758 +0.148225 0.609419 -0.328049 -0.907863 -0.418357 0.027601 +0.232782 0.708077 -0.332184 0.667286 0.721591 0.184486 +0.231067 0.660080 -0.153241 0.542769 0.837337 0.065331 +0.238095 0.715785 -0.403665 0.803124 0.584191 0.117100 +0.218592 0.488978 -0.091478 0.066934 -0.815191 -0.575311 +0.179070 0.506104 -0.086362 -0.576627 -0.639670 -0.508255 +0.254084 0.492429 -0.091707 0.035198 -0.797983 -0.601651 +0.236035 0.495774 -0.085419 0.103317 -0.826566 -0.553275 +0.200959 0.732715 -0.338152 0.167168 0.943057 0.287572 +0.201002 0.752380 -0.409529 0.672606 0.713316 0.196930 +0.209338 0.666894 -0.151392 -0.152536 0.983755 0.094656 +0.142688 0.649372 -0.328296 -0.984903 0.090459 0.147590 +0.164135 0.553976 -0.084703 -0.931463 -0.254468 -0.260043 +0.223805 0.460757 -0.052471 0.300321 -0.822569 -0.482895 +0.239054 0.473485 -0.052529 0.228486 -0.878628 -0.419293 +0.220789 0.442452 0.000566 0.688562 -0.703863 -0.174525 +0.242179 0.466927 0.000566 -0.083766 -0.982788 -0.164654 +0.162211 0.681141 -0.329839 -0.851310 0.489728 0.188248 +0.166089 0.620852 -0.155459 -0.955757 0.270962 0.114494 +0.163027 0.600441 -0.111351 -0.967581 0.251607 -0.021942 +0.159072 0.588271 -0.082848 -0.986468 0.157341 -0.046097 +0.232840 0.663758 -0.096986 0.449259 0.821419 0.351335 +0.208967 0.676069 -0.095824 -0.055538 0.969036 0.240591 +0.190077 0.655760 -0.095630 -0.759240 0.633512 0.149056 +0.191454 0.652899 -0.149048 -0.724706 0.670027 0.160826 +0.178600 0.713752 -0.333697 -0.758421 0.605604 0.240920 +0.269638 0.446302 0.000566 -0.013509 -0.942777 -0.333150 +0.260516 0.465220 -0.052600 0.094616 -0.905017 -0.414719 +0.320365 0.485449 0.000390 0.755898 -0.529569 -0.384934 +0.305828 0.503800 -0.050020 0.806806 -0.390272 -0.443568 +0.289658 0.521276 -0.087188 0.826338 -0.242158 -0.508454 +0.312485 0.544627 -0.044161 0.954017 0.079391 -0.289048 +0.291826 0.566355 -0.081698 0.922825 0.107861 -0.369810 +0.171417 0.482939 -0.048275 -0.381488 -0.762129 -0.523093 +0.188509 0.645758 -0.076114 -0.504124 0.731401 0.459251 +0.209317 0.654582 -0.075414 -0.131693 0.798140 0.587903 +0.235307 0.654334 -0.079683 0.412952 0.833297 0.367541 +0.277154 0.615199 -0.111693 0.832503 0.552830 -0.036302 +0.251605 0.623111 -0.036680 0.312986 0.903743 0.292043 +0.217708 0.623680 -0.032393 -0.082813 0.837345 0.540366 +0.254878 0.617560 0.000566 0.378865 0.913388 0.148945 +0.222234 0.612449 0.000566 -0.048900 0.969776 0.239046 +0.306784 0.584437 -0.041477 0.853710 0.518060 -0.052846 +0.307234 0.573768 0.000390 0.898226 0.438380 0.031828 +0.323680 0.530277 0.000566 0.969627 0.056639 -0.237940 +0.286405 0.610778 -0.079691 0.862536 0.500878 -0.071776 +0.284402 0.576404 -0.112761 0.962806 0.156083 -0.220553 +0.186751 0.612696 -0.034908 -0.312783 0.747304 0.586262 +0.380000 0.479387 -0.850625 0.823111 -0.476358 0.309148 +0.343117 0.533016 -0.669788 0.798703 -0.493743 0.343936 +0.311188 0.429845 -0.743750 0.798703 -0.493743 0.343936 +0.291123 0.470982 -0.647226 0.772611 -0.510087 0.377998 +0.257483 0.826472 -0.861991 0.388084 0.878137 0.279761 +0.191441 0.840666 -0.814931 0.201232 0.917264 0.343704 +0.228561 0.777364 -0.667726 0.201232 0.917264 0.343704 +0.174726 0.772485 -0.655484 0.006223 0.919211 0.393716 +0.257957 0.539113 -0.489777 0.356363 -0.833619 0.422001 +0.244685 0.577869 -0.386784 0.335682 -0.866587 0.369249 +0.204691 0.525197 -0.474041 -0.149790 -0.895576 0.418935 +0.210193 0.564010 -0.387937 0.032443 -0.911954 0.409007 +0.147059 0.559099 -0.487339 -0.534122 -0.792202 0.295179 +0.167913 0.575845 -0.391086 -0.408578 -0.848313 0.336793 +0.266554 0.508384 -0.555996 0.382278 -0.818249 0.429339 +0.200296 0.489186 -0.533589 -0.273814 -0.845326 0.458748 +0.132622 0.539817 -0.555258 -0.598820 -0.714263 0.362276 +0.196093 0.452835 -0.612980 -0.661276 -0.668182 0.340951 +0.116679 0.512235 -0.650594 -0.646521 -0.689651 0.326177 +0.175497 0.729689 -0.405860 -0.732136 0.681003 0.014575 +0.201002 0.752380 -0.409529 -0.036848 0.939147 -0.341533 +0.172382 0.715347 -0.474482 -0.393029 0.915956 -0.080950 +0.207105 0.724098 -0.466516 0.297162 0.952233 -0.070332 +0.161989 0.688799 -0.401702 -0.889609 0.326371 0.319497 +0.133645 0.691215 -0.483091 -0.607069 0.781718 0.142772 +0.249918 0.703367 -0.477302 0.616795 0.784687 0.061884 +0.238095 0.715785 -0.403665 0.782446 0.622127 -0.027137 +0.172011 0.723263 -0.542599 -0.264026 0.925984 0.269895 +0.220027 0.731594 -0.542794 -0.045993 0.984282 0.170512 +0.112848 0.705254 -0.556160 -0.334904 0.878136 0.341637 +0.263180 0.713418 -0.550893 0.438311 0.880652 0.179823 +0.174726 0.772485 -0.655484 -0.222638 0.893524 0.389933 +0.228561 0.777364 -0.667726 -0.076430 0.927313 0.366400 +0.098672 0.741881 -0.649914 -0.319832 0.865129 0.386341 +0.265205 0.675793 -0.482234 0.900649 0.401836 0.165405 +0.247846 0.680231 -0.398317 0.935890 0.304307 0.177504 +0.260287 0.642322 -0.394408 0.883245 0.419577 0.209362 +0.290254 0.638584 -0.489197 0.825408 0.510599 0.240813 +0.260287 0.642322 -0.394408 0.911347 0.305333 0.276076 +0.270736 0.608116 -0.391070 0.949998 -0.049979 0.308230 +0.290254 0.638584 -0.489197 0.939471 0.243450 0.241096 +0.298894 0.585936 -0.492080 0.864486 -0.378927 0.330271 +0.244685 0.577869 -0.386784 0.728663 -0.600608 0.329120 +0.257957 0.539113 -0.489777 0.714362 -0.607476 0.347361 +0.318289 0.563922 -0.566455 0.944303 -0.132381 0.301275 +0.266554 0.508384 -0.555996 0.711511 -0.599201 0.367028 +0.311358 0.632463 -0.562152 0.908058 0.321332 0.268657 +0.265205 0.675793 -0.482234 0.858593 0.428787 0.280999 +0.290660 0.682530 -0.558843 0.837753 0.462414 0.290418 +0.249918 0.703367 -0.477302 0.810056 0.519444 0.272006 +0.263180 0.713418 -0.550893 0.756230 0.616060 0.220423 +0.222856 -1.307619 -1.114574 -0.215118 -0.619053 -0.755313 +0.230621 -1.322045 -1.104962 -0.132676 -0.772335 -0.621205 +0.210022 -1.325508 -1.096257 -0.132676 -0.772335 -0.621205 +0.226916 -1.332009 -1.085243 -0.043829 -0.888331 -0.457108 +0.295170 -1.359270 -1.154195 -0.470966 0.387270 -0.792599 +0.290735 -1.385752 -1.164499 -0.537034 0.404276 -0.740375 +0.283652 -1.359002 -1.147220 -0.555573 0.342339 -0.757722 +0.284036 -1.382217 -1.157102 -0.676948 0.479403 -0.558493 +0.258878 -1.430779 -1.174340 -0.824018 0.503086 -0.260573 +0.280568 -1.383995 -1.147628 -0.912896 0.404233 0.056711 +0.258451 -1.431602 -1.170118 -0.914976 0.275932 0.294416 +0.282051 -1.390649 -1.140099 -0.818206 0.071551 0.570456 +0.259831 -1.434206 -1.166870 -0.701196 -0.081901 0.708248 +0.287698 -1.399218 -1.137627 -0.451423 -0.315511 0.834668 +0.262452 -1.437617 -1.165891 -0.266627 -0.457263 0.848422 +0.294956 -1.406136 -1.140856 0.051491 -0.639953 0.766687 +0.265650 -1.440051 -1.167361 0.247797 -0.728118 0.639094 +0.301081 -1.408959 -1.148293 0.391259 -0.762168 0.515767 +0.268273 -1.440624 -1.170797 0.432938 -0.775339 0.459798 +0.261322 -1.431329 -1.177856 -0.577685 0.529642 -0.621095 +0.308007 -1.363333 -1.153881 0.138136 0.365292 -0.920587 +0.297823 -1.392846 -1.167120 0.184178 0.204161 -0.961456 +0.295170 -1.359270 -1.154195 0.077060 0.363478 -0.928410 +0.290735 -1.385752 -1.164499 -0.068942 0.355658 -0.932070 +0.302777 -1.400832 -1.164291 0.624254 -0.328461 -0.708817 +0.267823 -1.436418 -1.178335 0.498845 -0.163351 -0.851158 +0.264899 -1.433226 -1.179409 0.043575 0.244648 -0.968632 +0.261322 -1.431329 -1.177856 -0.187589 0.385789 -0.903314 +0.303994 -1.406916 -1.157166 0.721852 -0.664243 -0.194195 +0.269053 -1.439328 -1.175026 0.718240 -0.551662 -0.424030 +0.301081 -1.408959 -1.148293 0.674810 -0.736154 0.052041 +0.268273 -1.440624 -1.170797 0.689791 -0.723789 -0.017793 +0.317259 -1.369638 -1.146396 0.669543 0.110523 -0.734505 +0.302777 -1.400832 -1.164291 0.652209 0.116954 -0.748963 +0.308007 -1.363333 -1.153881 0.652209 0.116954 -0.748963 +0.297823 -1.392846 -1.167120 0.634516 0.123321 -0.763009 +0.283652 -1.359002 -1.147220 -0.776198 0.147292 -0.613043 +0.284036 -1.382217 -1.157102 -0.923219 0.111806 -0.367649 +0.277853 -1.362630 -1.135619 -0.948446 -0.153790 -0.277125 +0.280568 -1.383995 -1.147628 -0.994497 -0.085504 -0.060541 +0.279987 -1.368770 -1.123823 -0.954536 -0.298051 0.005133 +0.282051 -1.390649 -1.140099 -0.987337 -0.143483 0.067670 +0.279678 -1.332219 -1.133962 -0.521755 0.265453 -0.810745 +0.269289 -1.342471 -1.125993 -0.805577 -0.152788 -0.572452 +0.267416 -1.352851 -1.113071 -0.846495 -0.425452 -0.320056 +0.294958 -1.325751 -1.133573 -0.195856 0.512956 -0.835773 +0.295170 -1.359270 -1.154195 -0.344707 0.427621 -0.835654 +0.268578 -1.308589 -1.120256 -0.310961 0.163334 -0.936283 +0.254957 -1.321908 -1.115359 -0.559739 -0.042249 -0.827591 +0.249879 -1.335757 -1.102068 -0.771434 -0.359638 -0.524929 +0.257984 -1.289274 -1.110665 0.166751 0.262420 -0.950437 +0.242488 -1.305722 -1.114672 -0.037667 0.077559 -0.996276 +0.246845 -1.260431 -1.101758 0.363742 0.400226 -0.841136 +0.236921 -1.282762 -1.116675 0.324543 0.195655 -0.925414 +0.259831 -1.434206 -1.166870 -0.710934 0.020308 0.702965 +0.258451 -1.431602 -1.170118 -0.824134 0.216217 0.523502 +0.249637 -1.449145 -1.176748 -0.427277 -0.861461 -0.274443 +0.262452 -1.437617 -1.165891 -0.340083 -0.416163 0.843298 +0.265650 -1.440051 -1.167361 0.094129 -0.790470 0.605225 +0.268273 -1.440624 -1.170797 0.388331 -0.916486 0.096193 +0.269053 -1.439328 -1.175026 0.433870 -0.778573 -0.453410 +0.267823 -1.436418 -1.178335 0.240674 -0.451072 -0.859424 +0.264899 -1.433226 -1.179409 -0.123365 -0.047419 -0.991228 +0.261322 -1.431329 -1.177856 -0.541230 0.306275 -0.783113 +0.258878 -1.430779 -1.174340 -0.708479 0.429862 -0.559712 +0.258451 -1.431602 -1.170118 -0.893153 0.449746 -0.002661 +0.258878 -1.430779 -1.174340 -0.893153 0.449746 -0.002661 +0.249637 -1.449145 -1.176748 -0.893153 0.449746 -0.002661 +-0.000017 -1.403685 -0.532843 -0.000002 -0.966061 0.258313 +0.013712 -1.402167 -0.533006 0.097451 -0.673701 0.732551 +-0.000017 -1.370935 -0.522635 -0.032841 -0.105281 0.993900 +0.018619 -1.370303 -0.523921 0.075592 -0.284155 0.955794 +-0.000017 -1.401655 -0.547689 -0.061154 -0.887961 -0.455835 +0.013895 -1.398495 -0.548833 0.157213 -0.971303 -0.178481 +-0.018653 -1.370303 -0.523921 -0.159617 -0.057901 0.985479 +-0.013745 -1.402167 -0.533006 -0.190507 -0.744010 0.640435 +-0.013929 -1.398495 -0.548833 -0.162019 -0.913315 -0.373639 +-0.019046 -1.364328 -0.580399 -0.142713 -0.647691 -0.748418 +-0.000017 -1.366282 -0.582045 -0.123537 -0.644757 -0.754338 +-0.025466 -1.305227 -0.627061 -0.201774 -0.599173 -0.774777 +-0.000017 -1.308295 -0.628125 -0.090353 -0.579347 -0.810058 +-0.023282 -1.315241 -0.541154 -0.131109 0.327981 0.935542 +-0.000017 -1.312755 -0.538588 -0.138689 0.336526 0.931405 +-0.050546 -1.365189 -0.530957 -0.319704 -0.009109 0.947474 +-0.055160 -1.320242 -0.544940 -0.270335 0.321038 0.907664 +-0.078031 -1.352136 -0.542918 -0.559650 0.052269 0.827079 +-0.079885 -1.324992 -0.553916 -0.485806 0.292212 0.823775 +-0.062022 -1.284424 -0.560729 -0.267470 0.367239 0.890840 +-0.084009 -1.293200 -0.566737 -0.461943 0.300769 0.834354 +-0.106325 -1.214490 -0.609168 -0.469728 0.263478 0.842576 +-0.072717 -1.196973 -0.602534 -0.280764 0.350688 0.893415 +-0.084098 -1.085169 -0.641995 -0.404074 0.165496 0.899631 +-0.134118 -1.124052 -0.661652 -0.470607 0.157508 0.868171 +-0.171399 -1.036528 -0.683604 -0.460562 0.026352 0.887236 +-0.093126 -0.998740 -0.644095 -0.475011 -0.083425 0.876017 +-0.042277 -1.393100 -0.536856 -0.399716 -0.816626 0.416351 +-0.072746 -1.377240 -0.548504 -0.672758 -0.532609 0.513540 +-0.043746 -0.981986 -0.606547 -0.509136 -0.305320 0.804711 +-0.106031 -0.926096 -0.629367 -0.586436 -0.356586 0.727282 +0.000000 -0.987806 -0.588966 -0.346456 -0.356176 0.867817 +-0.054281 -0.924635 -0.576374 -0.443428 -0.512629 0.735243 +0.000000 -0.931320 -0.554331 -0.355603 -0.559518 0.748656 +-0.066691 -0.876854 -0.541093 -0.342435 -0.595854 0.726427 +-0.096499 -1.343108 -0.564166 -0.780040 -0.126364 0.612838 +-0.044949 -1.066321 -0.622270 -0.401935 -0.048329 0.914392 +-0.054498 -1.294657 -0.623404 -0.155322 -0.625340 -0.764738 +-0.036736 -1.235823 -0.673595 0.031175 -0.873304 -0.486177 +-0.070108 -1.244802 -0.663809 0.255978 -0.932714 -0.254008 +-0.039668 -1.391853 -0.554379 -0.132593 -0.774687 -0.618287 +-0.088928 -1.370848 -0.574027 -0.441640 -0.806382 -0.393322 +-0.071663 -1.379708 -0.565028 -0.249851 -0.888289 -0.385380 +-0.101609 -1.353245 -0.577932 -0.867413 -0.471572 0.158789 +-0.026294 -1.280054 -0.556299 -0.146347 0.383536 0.911857 +-0.044926 -1.348548 -0.584637 -0.157698 -0.589008 -0.792591 +-0.111650 -1.327029 -0.608226 -0.321265 -0.688702 -0.649983 +-0.074089 -1.339260 -0.590221 0.111138 -0.538403 -0.835326 +-0.127044 -1.303758 -0.615782 -0.848693 -0.526879 0.046027 +-0.139436 -1.274319 -0.619443 -0.682362 -0.100214 0.724113 +-0.107905 -1.323799 -0.578042 -0.865736 -0.113026 0.487572 +-0.028693 -1.192433 -0.593276 -0.237018 0.259857 0.936107 +-0.129518 -1.292252 -0.638544 0.246747 -0.928808 -0.276461 +-0.081699 -1.289704 -0.623371 0.089856 -0.589103 -0.803046 +-0.141188 -1.289671 -0.632284 -0.284500 -0.687507 0.668128 +-0.155502 -1.236804 -0.630819 -0.499570 0.140885 0.854740 +0.000000 -1.276184 -0.555177 -0.111435 0.391591 0.913367 +-0.000017 -1.231392 -0.679250 0.076679 -0.967442 -0.241196 +0.000000 -1.188148 -0.591409 -0.100355 0.307913 0.946107 +0.000000 -1.063857 -0.611077 -0.188931 0.023938 0.981699 +-0.036826 -1.238117 -0.697304 0.252580 -0.793215 0.554089 +-0.000017 -1.233837 -0.701840 0.177759 -0.515775 0.838080 +-0.071025 -1.247380 -0.686623 0.429352 -0.649909 0.627117 +-0.103259 -1.263748 -0.674458 0.635154 -0.752880 0.172486 +-0.100422 -1.255747 -0.653954 0.329040 -0.825654 -0.458289 +-0.069705 -1.278198 -0.690989 0.250671 0.192115 0.948818 +-0.118153 -1.278789 -0.677453 0.729450 -0.125032 0.672510 +-0.161583 -1.276360 -0.634034 -0.344855 -0.269254 0.899209 +-0.143928 -1.296556 -0.636116 0.178977 -0.012768 0.983770 +-0.164444 -1.289065 -0.635710 -0.069988 0.164136 0.983952 +-0.163789 -1.303910 -0.634987 -0.447533 0.149294 0.881717 +-0.146164 -1.308268 -0.627509 0.351579 0.353231 0.866960 +-0.145479 -1.326647 -0.619138 -0.191647 0.257680 0.947033 +-0.160709 -1.327495 -0.631884 -0.642251 0.085113 0.761754 +-0.139410 -1.362009 -0.611108 -0.173098 0.140187 0.974877 +-0.139116 -1.326727 -0.623711 0.626279 0.349113 0.697061 +-0.132678 -1.361377 -0.611443 0.498879 0.310687 0.809070 +-0.122719 -1.405695 -0.604309 0.214590 0.354505 0.910097 +-0.129609 -1.405361 -0.603754 -0.377846 0.080828 0.922334 +0.000000 -0.882034 -0.516286 -0.323522 -0.578187 0.749022 +-0.138671 -1.308886 -0.637077 0.805129 0.170672 0.568013 +-0.119228 -1.324339 -0.660955 0.522903 0.398759 0.753368 +-0.068073 -1.327512 -0.667823 0.125703 0.438650 0.889823 +-0.037389 -1.272798 -0.701558 0.209312 0.128835 0.969324 +-0.134693 -1.297916 -0.641700 0.740369 -0.405580 0.536059 +-0.158370 -1.364142 -0.622466 -0.812731 -0.112071 0.571758 +-0.144608 -1.406805 -0.621260 -0.862875 -0.272558 0.425628 +-0.118995 -1.437387 -0.596255 -0.699944 -0.139714 0.700399 +-0.128478 -1.442977 -0.627141 -0.914997 -0.287826 0.282732 +-0.103442 -1.413538 -0.607254 0.387582 0.586059 0.711558 +-0.091602 -1.447681 -0.580916 -0.045693 0.346880 0.936796 +-0.000017 -1.270105 -0.707808 0.112788 0.293520 0.949276 +-0.035521 -1.329960 -0.670332 0.073285 0.474690 0.877097 +-0.000017 -1.339257 -0.666214 0.034043 0.466884 0.883663 +-0.132973 -1.443241 -0.645172 -0.969701 -0.220545 0.105073 +-0.143399 -1.414398 -0.669677 -0.950202 -0.311574 -0.006072 +-0.133724 -1.465766 -0.673240 -0.986415 -0.156154 -0.051006 +-0.125978 -1.491134 -0.642916 -0.948998 -0.244911 0.198549 +-0.114850 -1.528464 -0.668639 -0.879759 -0.462876 0.108491 +-0.120598 -1.513026 -0.684932 -0.958525 -0.284342 0.019494 +-0.101414 -1.557837 -0.680852 -0.762311 -0.494106 0.418022 +-0.107676 -1.558038 -0.689610 -0.827833 -0.485508 0.281026 +-0.077735 -1.575456 -0.670632 -0.609785 -0.530027 0.589266 +-0.082763 -1.589562 -0.687034 -0.679620 -0.720564 0.137494 +-0.048244 -1.589749 -0.652445 -0.470857 -0.568856 0.674311 +-0.042597 -1.569583 -0.636975 -0.369132 -0.622112 0.690447 +-0.070579 -1.562914 -0.651884 -0.440875 -0.751341 0.491035 +-0.085528 -1.544567 -0.622349 -0.485636 -0.671105 0.560157 +-0.057607 -1.545277 -0.610821 -0.214965 -0.717837 0.662193 +-0.068996 -1.417705 -0.624797 0.226569 0.598008 0.768800 +-0.062730 -1.462112 -0.576113 -0.056728 0.311910 0.948417 +-0.089700 -1.497634 -0.594454 -0.501505 -0.323118 0.802551 +-0.060933 -1.501117 -0.582180 -0.207365 -0.386829 0.898534 +-0.049631 -1.607373 -0.680832 -0.408683 -0.871533 0.270941 +-0.049236 -1.606319 -0.712284 -0.471617 -0.868228 -0.154134 +-0.078194 -1.582310 -0.717670 -0.677902 -0.687495 -0.260384 +-0.053302 -1.597447 -0.738356 -0.527744 -0.754999 -0.389182 +-0.022231 -1.613117 -0.731314 -0.231045 -0.896421 -0.378217 +-0.020617 -1.618934 -0.702387 -0.243201 -0.969435 -0.032392 +-0.086410 -1.560745 -0.743683 -0.722071 -0.553186 -0.415450 +-0.107128 -1.521984 -0.746441 -0.894076 -0.308559 -0.324684 +-0.108797 -1.541432 -0.725267 -0.869414 -0.423587 -0.254350 +-0.120703 -1.476615 -0.732980 -0.951795 -0.255760 -0.169332 +-0.119379 -1.495462 -0.712270 -0.963477 -0.200926 -0.177036 +-0.135328 -1.430873 -0.717779 -0.947176 -0.302854 -0.105533 +-0.132311 -1.445773 -0.698382 -0.974043 -0.211142 -0.081604 +-0.154531 -1.380270 -0.678829 -0.949577 -0.313260 -0.013137 +-0.000017 -1.419349 -0.627442 0.106198 0.594731 0.796880 +-0.034491 -1.418122 -0.626023 0.067138 0.564120 0.822959 +-0.018495 -1.572862 -0.630150 -0.267418 -0.510440 0.817275 +-0.019229 -1.594895 -0.641123 -0.278157 -0.641106 0.715270 +-0.091737 -1.556855 -0.667292 -0.629615 -0.686797 0.363173 +-0.115473 -1.495687 -0.619527 -0.778841 -0.363015 0.511494 +-0.032758 -1.470149 -0.575474 0.073613 0.302042 0.950448 +-0.024074 -1.503406 -0.579481 0.014771 -0.309214 0.950878 +-0.107077 -1.541398 -0.649263 -0.793207 -0.559108 0.241292 +-0.017253 -1.546269 -0.609926 -0.094801 -0.597710 0.796088 +-0.062210 -1.548939 -0.790061 -0.612687 -0.604155 -0.509520 +-0.032348 -1.573539 -0.787490 -0.308010 -0.778247 -0.547231 +-0.111758 -1.457935 -0.786106 -0.908480 -0.285658 -0.305062 +-0.091205 -1.508123 -0.790433 -0.786773 -0.426099 -0.446574 +-0.131543 -1.409096 -0.777987 -0.926024 -0.317585 -0.204006 +-0.156683 -1.356212 -0.761539 -0.908179 -0.372112 -0.191685 +-0.021106 -1.614909 -0.670898 -0.260959 -0.877575 0.402198 +-0.000017 -1.596067 -0.638937 -0.172956 -0.707462 0.685262 +-0.000017 -1.574039 -0.625376 -0.097000 -0.508685 0.855471 +-0.000017 -1.547150 -0.608158 -0.023033 -0.564196 0.825320 +-0.000017 -1.507004 -0.582671 0.008703 -0.415148 0.909712 +-0.000017 -1.476035 -0.579618 0.155065 0.158287 0.975141 +-0.000017 -1.583737 -0.779092 -0.090095 -0.829132 -0.551745 +-0.000017 -1.616928 -0.728156 -0.112830 -0.944493 -0.308550 +-0.000017 -1.618749 -0.666344 -0.223222 -0.930500 0.290415 +-0.000017 -1.622242 -0.698873 -0.152394 -0.987650 -0.036376 +0.018462 -1.572862 -0.630150 0.178652 -0.562234 0.807451 +0.017220 -1.546269 -0.609926 0.111962 -0.598212 0.793478 +-0.000017 -1.312755 -0.538588 0.143088 0.408791 0.901341 +0.023249 -1.315241 -0.541154 0.119668 0.397824 0.909624 +0.000000 -1.276184 -0.555177 0.111512 0.391548 0.913376 +0.026260 -1.280054 -0.556299 0.093739 0.381057 0.919787 +0.000000 -1.188148 -0.591409 0.083042 0.306054 0.948385 +0.028430 -1.191998 -0.592604 0.133403 0.243692 0.960634 +0.000000 -1.063857 -0.611077 0.179299 0.025575 0.983462 +0.044879 -1.066202 -0.622145 0.283750 -0.087011 0.954942 +0.000000 -0.987806 -0.588966 0.334088 -0.353327 0.873811 +0.045699 -0.984531 -0.606911 0.365856 -0.323411 0.872671 +0.054010 -0.924554 -0.576161 0.365890 -0.474506 0.800605 +0.000000 -0.931320 -0.554331 0.379394 -0.483640 0.788766 +-0.000017 -1.458554 -1.064723 0.079705 -0.873026 -0.481116 +-0.000017 -1.402693 -1.142934 -0.022658 -0.769241 -0.638557 +0.068422 -1.451326 -1.066913 0.028741 -0.863516 -0.503502 +0.082822 -1.405828 -1.147955 -0.048644 -0.675449 -0.735800 +-0.000017 -1.486275 -1.007160 0.089176 -0.921451 -0.378122 +0.052737 -1.482106 -1.004878 0.090678 -0.925200 -0.368487 +-0.000017 -1.351366 -1.180527 -0.029415 -0.524705 -0.850776 +0.085390 -1.351693 -1.181174 -0.027622 -0.499785 -0.865709 +-0.000017 -1.287914 -1.213232 -0.045499 -0.306387 -0.950819 +0.085375 -1.291375 -1.217723 -0.062705 -0.320776 -0.945077 +-0.000017 -1.493460 -0.986184 0.087438 -0.975216 -0.203245 +0.047971 -1.490109 -0.980232 0.079763 -0.992514 -0.092487 +-0.000017 -1.493131 -0.951213 0.067606 -0.989312 -0.129191 +0.045040 -1.490148 -0.950779 0.070867 -0.962756 -0.260919 +-0.000017 -1.171195 -1.226909 0.002248 -0.047023 -0.998891 +0.082590 -1.177560 -1.230108 -0.046793 -0.063928 -0.996857 +-0.000017 -1.507587 -0.917663 0.071388 -0.919318 -0.386987 +0.043526 -1.502736 -0.920470 0.078289 -0.922062 -0.379042 +0.000000 -1.086145 -1.231919 0.135480 -0.291094 -0.947053 +0.063677 -1.084658 -1.226234 0.049283 -0.129646 -0.990335 +0.000000 -1.014367 -1.268361 0.218178 -0.441795 -0.870181 +0.063836 -1.006456 -1.256372 0.155265 -0.401364 -0.902663 +0.261829 -0.969024 -0.862849 0.971189 -0.230942 0.058792 +0.255171 -0.984125 -0.812184 0.980803 -0.168422 0.098283 +0.241338 -1.101547 -0.904321 0.994154 -0.107229 -0.012602 +0.244821 -1.124264 -0.861905 0.995812 -0.078310 -0.047186 +0.255500 -0.909942 -0.759849 0.847182 -0.457756 0.269708 +0.275470 -0.919913 -0.839500 0.894568 -0.402967 0.193303 +0.250596 -1.151253 -0.812148 0.974733 -0.210827 -0.073812 +0.240419 -1.032634 -0.777716 0.996870 -0.021906 0.075965 +0.203642 -1.233119 -0.795930 0.916260 -0.388827 0.096340 +0.216387 -1.224037 -0.880489 0.944553 -0.327916 0.017064 +0.327169 -0.847824 -0.782242 0.677570 -0.689399 0.256181 +0.191269 -1.311910 -0.896540 0.950463 -0.291432 0.108107 +0.190128 -1.294682 -0.840066 0.950575 -0.290292 0.110171 +0.250557 -0.893329 -1.103714 0.905844 -0.339468 -0.253394 +0.241437 -0.975757 -1.025889 0.926929 -0.072401 -0.368184 +0.194389 -1.019275 -1.135778 0.926929 -0.072401 -0.368184 +0.233524 -1.041313 -1.070262 0.869276 0.200816 -0.451699 +0.178512 -1.354269 -0.860294 0.901656 -0.285913 0.324454 +0.190128 -1.294682 -0.840066 0.911730 -0.367236 0.184084 +0.131509 -1.409096 -0.777987 0.911730 -0.367236 0.184084 +0.156650 -1.356212 -0.761539 0.897717 -0.438857 0.038851 +0.181027 -1.327258 -0.684930 0.928179 -0.354912 -0.111894 +0.203642 -1.233119 -0.795930 0.899593 -0.425457 -0.098586 +0.198106 -1.282808 -0.684246 0.923990 -0.364309 -0.116283 +0.217239 -1.235284 -0.685585 0.960557 -0.233754 0.150627 +0.250596 -1.151253 -0.812148 0.970584 -0.237350 0.040398 +0.244259 -1.167176 -0.753451 0.976461 -0.188046 0.105655 +0.232586 -1.119921 -0.714247 0.871959 0.123217 0.473819 +0.201473 -1.208949 -0.656278 0.611909 0.147642 0.777025 +0.134085 -1.124052 -0.661652 0.149462 0.180178 0.972212 +0.171366 -1.036528 -0.683604 0.634792 0.147134 0.758545 +0.198022 -0.974045 -0.698088 0.810359 -0.218358 0.543725 +0.240419 -1.032634 -0.777716 0.920786 -0.013236 0.389843 +0.255171 -0.984125 -0.812184 0.967450 -0.148732 0.204740 +0.255500 -0.909942 -0.759849 0.797797 -0.411239 0.440911 +0.218263 -0.890110 -0.686509 0.614622 -0.586434 0.527576 +0.271029 -0.828348 -0.649493 0.542405 -0.699851 0.464763 +0.327169 -0.847824 -0.782242 0.652450 -0.659835 0.372730 +0.294151 -0.787640 -0.616429 0.526664 -0.709009 0.468968 +0.368785 -0.778217 -0.725018 0.631114 -0.680735 0.371879 +0.130931 -0.873717 -0.601270 0.422409 -0.722174 0.547755 +0.188531 -0.803520 -0.548481 0.442630 -0.719850 0.534691 +0.229238 -0.751868 -0.513438 0.419644 -0.735267 0.532241 +0.352869 -0.722752 -0.593997 0.600464 -0.685633 0.411523 +0.294651 -0.747369 -0.556844 0.463739 -0.725792 0.508107 +0.233252 -0.732483 -0.490942 0.414991 -0.724540 0.550295 +0.070074 -1.244802 -0.663809 0.053225 -0.638746 -0.767574 +0.054464 -1.294657 -0.623404 0.223195 -0.602575 -0.766216 +0.036703 -1.235823 -0.673595 0.130588 -0.583820 -0.801312 +0.025433 -1.305227 -0.627061 0.201777 -0.599173 -0.774776 +0.019013 -1.364328 -0.580399 0.142714 -0.647691 -0.748418 +0.044892 -1.348548 -0.584637 0.262046 -0.595092 -0.759735 +-0.000017 -1.231392 -0.679250 0.061328 -0.552581 -0.831200 +-0.000017 -1.308295 -0.628125 0.090350 -0.579347 -0.810058 +-0.000017 -1.366282 -0.582045 0.123532 -0.644758 -0.754339 +-0.000017 -1.401655 -0.547689 0.114050 -0.687016 -0.717636 +0.013895 -1.398495 -0.548833 0.056612 -0.682070 -0.729093 +0.039635 -1.391853 -0.554379 0.120943 -0.632566 -0.765006 +0.190128 -1.294682 -0.840066 0.936754 -0.314995 0.152546 +0.203642 -1.233119 -0.795930 0.934664 -0.355502 0.004707 +0.156650 -1.356212 -0.761539 0.934664 -0.355502 0.004707 +0.181027 -1.327258 -0.684930 0.910607 -0.387654 -0.143243 +0.091171 -1.508123 -0.790433 0.874673 -0.484092 -0.024548 +0.119215 -1.452959 -0.879041 0.828218 -0.556458 -0.066399 +0.111725 -1.457935 -0.786106 0.884629 -0.456020 0.097345 +0.154512 -1.402559 -0.867532 0.864915 -0.481222 0.142643 +0.131509 -1.409096 -0.777987 0.882291 -0.428236 0.195387 +0.178512 -1.354269 -0.860294 0.867695 -0.459623 0.189347 +0.082036 -1.492716 -0.881297 0.714616 -0.654227 -0.247611 +0.062177 -1.548939 -0.790061 0.766043 -0.618266 -0.175855 +0.062177 -1.548939 -0.790061 0.582972 -0.742236 -0.330500 +0.032314 -1.573539 -0.787490 0.491570 -0.802664 -0.337771 +0.082036 -1.492716 -0.881297 0.651097 -0.717495 -0.247533 +0.044385 -1.529981 -0.878195 0.330144 -0.836286 -0.437756 +0.043526 -1.502736 -0.920470 0.309241 -0.833947 -0.457059 +0.095598 -1.475422 -0.916070 0.642586 -0.755896 -0.125319 +-0.000017 -1.537104 -0.870659 0.056206 -0.858897 -0.509055 +-0.000017 -1.583737 -0.779092 0.121620 -0.894309 -0.430605 +-0.000017 -1.507587 -0.917663 0.059956 -0.845343 -0.530848 +0.130130 -1.431816 -0.909236 0.756876 -0.645283 -0.103675 +0.119215 -1.452959 -0.879041 0.720858 -0.662575 -0.203367 +0.232935 -1.184636 -1.172981 0.863226 0.104196 -0.493948 +0.262478 -1.180367 -1.120451 0.912544 0.070354 -0.402881 +0.228412 -1.270773 -1.165832 0.925217 -0.181320 -0.333312 +0.248806 -1.231756 -1.114913 0.947205 -0.270546 -0.172066 +0.212058 -1.089059 -1.151285 0.839213 0.313317 -0.444469 +0.243257 -1.109294 -1.101869 0.852521 0.335375 -0.400913 +0.019196 -1.594895 -0.641123 0.393888 -0.399213 0.827938 +0.048210 -1.589749 -0.652445 0.346680 -0.464872 0.814682 +0.018462 -1.572862 -0.630150 0.329917 -0.500776 0.800236 +0.042564 -1.569583 -0.636975 0.211180 -0.621257 0.754614 +0.017220 -1.546269 -0.609926 0.091910 -0.597608 0.796503 +0.057574 -1.545277 -0.610821 0.032811 -0.648945 0.760128 +0.060899 -1.501117 -0.582180 0.069607 -0.366628 0.927760 +0.024041 -1.503406 -0.579481 -0.014768 -0.309214 0.950878 +-0.000017 -1.507004 -0.582671 -0.008703 -0.415148 0.909712 +-0.000017 -1.547150 -0.608158 0.113254 -0.532522 0.838805 +-0.000017 -1.476035 -0.579618 -0.155060 0.158287 0.975142 +0.032725 -1.470149 -0.575474 -0.073611 0.302041 0.950449 +0.062696 -1.462112 -0.576113 -0.052045 0.474222 0.878866 +0.034457 -1.418122 -0.626023 -0.067139 0.564120 0.822959 +0.068962 -1.417705 -0.624797 -0.035698 0.596507 0.801814 +-0.000017 -1.419349 -0.627442 -0.106195 0.594731 0.796880 +0.035488 -1.329960 -0.670332 -0.058123 0.448845 0.891718 +-0.000017 -1.339257 -0.666214 -0.033247 0.442230 0.896285 +0.068040 -1.327512 -0.667823 -0.069733 0.439068 0.895744 +0.247080 -1.089240 -0.947536 0.982932 -0.155588 0.098164 +0.261441 -0.950653 -0.936834 0.986501 -0.163747 -0.001462 +0.241338 -1.101547 -0.904321 0.988692 -0.149787 -0.007156 +0.261829 -0.969024 -0.862849 0.980441 -0.189750 -0.052258 +0.275470 -0.919913 -0.839500 0.968994 -0.238567 -0.064319 +0.224168 -1.213435 -0.939482 0.965402 -0.238144 0.106236 +0.220566 -1.216669 -0.913999 0.960564 -0.266812 0.078283 +0.216387 -1.224037 -0.880489 0.954627 -0.297589 -0.011327 +0.244821 -1.124264 -0.861905 0.972957 -0.224317 -0.055113 +0.190478 -1.297658 -0.930004 0.885447 -0.293468 0.360361 +0.204202 -1.276883 -0.942053 0.880893 -0.257214 0.397327 +0.198484 -1.333706 -0.937192 0.549279 -0.175471 0.817008 +0.208750 -1.327152 -0.949713 0.916620 -0.270542 0.294304 +0.191269 -1.311910 -0.896540 0.830252 -0.500275 -0.245778 +0.190128 -1.294682 -0.840066 0.971939 -0.218796 0.086383 +0.178512 -1.354269 -0.860294 0.936711 -0.350039 0.006659 +0.179262 -1.351104 -0.883960 0.870083 -0.332445 -0.363918 +0.154512 -1.402559 -0.867532 0.852436 -0.518052 -0.070526 +0.161729 -1.386568 -0.896266 0.871447 -0.311587 -0.378805 +0.145069 -1.397383 -0.918884 0.975045 -0.204700 -0.085936 +0.156931 -1.380106 -0.899919 0.616919 0.120555 -0.777739 +0.144229 -1.389823 -0.917095 0.912502 0.150549 0.380361 +0.174074 -1.349980 -0.894637 0.630083 -0.182015 -0.754894 +0.175696 -1.319335 -0.902466 0.616281 -0.555601 -0.558127 +0.175093 -1.314950 -0.923527 0.609423 -0.658316 0.441840 +0.182783 -1.335078 -0.932330 0.315560 -0.182195 0.931250 +0.183244 -1.375734 -0.941167 0.728543 -0.485095 0.483640 +0.169463 -1.373555 -0.931681 0.427045 -0.083163 0.900398 +0.125424 -1.349364 -0.914963 0.949422 -0.313338 0.020439 +0.187896 -1.370655 -0.952735 0.829040 -0.557342 -0.045425 +0.184488 -1.353751 -1.012516 0.913977 -0.404281 -0.034678 +0.200128 -1.310606 -1.001052 0.916991 -0.396056 0.047620 +0.205313 -1.318320 -1.042482 0.883094 -0.438534 0.166834 +0.203321 -1.329595 -1.068720 0.620192 -0.783307 0.042324 +0.163428 -1.392704 -1.039889 0.797970 -0.602309 -0.021611 +0.215237 -1.295989 -1.027565 0.839186 -0.506033 0.199245 +0.210022 -1.325508 -1.096257 0.366051 -0.929312 -0.048850 +0.185016 -1.368596 -1.120970 0.754149 -0.656150 -0.026947 +0.162490 -1.393819 -0.950832 0.727543 -0.685505 0.027635 +0.147895 -1.405185 -0.938309 0.764402 -0.609578 0.210010 +0.130130 -1.431816 -0.909236 0.817884 -0.562628 -0.120479 +0.138628 -1.415715 -0.925182 0.872071 -0.487121 -0.046966 +0.119215 -1.452959 -0.879041 0.825370 -0.557091 -0.091726 +0.144216 -1.389224 -1.142150 0.323626 -0.721749 -0.611837 +0.122807 -1.432474 -1.061670 0.502365 -0.827056 -0.252203 +0.111983 -1.455975 -0.988007 0.607251 -0.779265 -0.154894 +0.115076 -1.457540 -0.963420 0.645628 -0.763335 -0.021992 +0.108948 -1.462815 -0.939119 0.648169 -0.761278 0.018221 +0.095598 -1.475422 -0.916070 0.647435 -0.747161 -0.150261 +0.082822 -1.405828 -1.147955 0.285196 -0.773232 -0.566370 +0.085390 -1.351693 -1.181174 0.203423 -0.534268 -0.820474 +0.148298 -1.343492 -1.172147 0.188463 -0.550347 -0.813387 +0.226916 -1.332009 -1.085243 -0.160133 -0.983429 -0.084994 +0.232787 -1.331807 -1.063047 -0.080643 -0.996279 0.030397 +0.068422 -1.451326 -1.066913 0.377519 -0.868762 -0.320520 +0.047971 -1.490109 -0.980232 0.437361 -0.895919 -0.077744 +0.052737 -1.482106 -1.004878 0.451365 -0.869342 -0.201281 +0.043526 -1.502736 -0.920470 0.461100 -0.827405 -0.320607 +0.045040 -1.490148 -0.950779 0.427742 -0.886638 -0.175810 +0.000000 0.690640 -0.766550 0.083511 0.531548 0.842901 +0.000000 0.583122 -0.715693 -0.130451 0.390084 0.911492 +0.008274 0.689589 -0.762612 0.125130 0.391939 0.911442 +0.009831 0.582357 -0.722762 0.573132 0.292757 0.765384 +0.000000 0.792848 -0.871132 0.429239 0.637745 0.639558 +-0.008275 0.689589 -0.762612 0.350114 0.531118 0.771578 +-0.020074 0.802988 -0.859710 0.575518 0.565618 0.590640 +-0.009831 0.582357 -0.722762 -0.078415 0.345235 0.935235 +0.000000 0.473072 -0.669559 -0.360995 0.408163 0.838502 +-0.042466 0.462186 -0.676207 -0.203483 0.426921 0.881098 +0.000000 0.362368 -0.606042 -0.224976 0.494455 0.839583 +-0.025789 0.687817 -0.748559 0.579702 0.419644 0.698458 +-0.059104 0.807325 -0.828836 0.546257 0.570138 0.613633 +-0.022530 0.582900 -0.720376 0.372846 0.219888 0.901463 +-0.073671 0.464847 -0.696580 0.054131 0.154441 0.986518 +-0.087118 0.775469 -0.767209 0.721483 0.558864 0.408820 +-0.037486 0.686148 -0.731377 0.793309 0.319706 0.518121 +-0.030152 0.581907 -0.713972 0.574630 -0.041534 0.817359 +-0.091850 0.479491 -0.699313 0.195414 0.022613 0.980460 +-0.110497 0.357001 -0.628471 -0.195038 0.507138 0.839507 +-0.047675 0.582939 -0.689279 0.845393 -0.123815 0.519596 +-0.103255 0.494590 -0.692424 0.681233 -0.400258 0.612957 +-0.116679 0.512235 -0.650594 0.759798 -0.474825 0.444127 +-0.070740 0.591315 -0.644639 0.873777 -0.227008 0.430095 +-0.051595 0.678974 -0.703427 0.887107 0.247807 0.389400 +-0.068726 0.667268 -0.647439 0.930431 0.175935 0.321474 +-0.088868 0.769612 -0.732977 0.826241 0.480255 0.294415 +-0.098672 0.741881 -0.649914 0.868274 0.398897 0.294926 +0.298690 -0.872468 -0.981866 0.861232 -0.493985 -0.119409 +0.250557 -0.893329 -1.103714 0.803384 -0.527433 -0.276386 +0.378254 -0.754824 -1.055511 0.821280 -0.444724 -0.357379 +0.315181 -0.764996 -1.175598 0.815775 -0.424816 -0.392483 +0.417389 -0.603646 -1.074460 0.895260 -0.038631 -0.443866 +0.352477 -0.606807 -1.199774 0.878490 -0.167214 -0.447543 +0.412246 -0.462044 -1.047188 0.879460 0.144002 -0.453667 +0.335016 -0.477144 -1.219440 0.893182 0.127510 -0.431238 +0.261441 -0.950653 -0.936834 0.965166 -0.254281 -0.061605 +0.241437 -0.975757 -1.025889 0.972289 -0.143433 -0.184610 +0.250818 -1.070818 -0.986752 0.998471 -0.041018 -0.037047 +0.247080 -1.089240 -0.947536 0.983391 -0.088145 0.158657 +0.233524 -1.041313 -1.070262 0.964188 0.178859 -0.195833 +0.249739 -1.082750 -1.018378 0.993758 -0.082950 -0.074588 +0.246504 -1.119261 -0.985145 0.827348 0.256706 0.499597 +0.249192 -1.146517 -0.975926 0.660126 0.067135 0.748149 +0.243257 -1.109294 -1.101869 0.940610 0.270076 -0.205699 +0.252678 -1.118911 -1.071416 0.993537 0.092280 0.066093 +0.238374 -1.125403 -1.004741 -0.348228 0.935244 -0.063683 +0.262478 -1.180367 -1.120451 0.998435 0.022897 0.051017 +0.253958 -1.187852 -1.077022 0.966160 -0.148754 0.210732 +0.244883 -1.193270 -1.045580 0.968097 -0.117796 0.221161 +0.248604 -1.153758 -1.051702 0.950081 0.052432 0.307567 +0.234110 -1.139745 -1.016009 0.915809 0.316766 0.246888 +0.234936 -1.155538 -1.017211 -0.975665 0.027170 -0.217578 +0.236887 -1.166535 -1.012875 0.665138 -0.731748 -0.148784 +0.327169 -0.847824 -0.782242 0.829935 -0.555632 -0.049807 +0.275470 -0.919913 -0.839500 0.869590 -0.493259 -0.022553 +0.397077 -0.294104 -1.040035 0.871306 0.011498 -0.490605 +0.317998 -0.316945 -1.171010 0.869610 0.082195 -0.486849 +0.390117 -0.124181 -1.050900 0.898058 -0.023549 -0.439246 +0.333440 -0.148889 -1.169196 0.889200 -0.028833 -0.456610 +0.392132 0.008478 -1.063792 0.882835 0.053351 -0.466643 +0.334864 -0.008152 -1.173440 0.891277 0.008764 -0.453375 +0.372005 0.173291 -1.062321 0.861340 0.188144 -0.471905 +0.316565 0.155536 -1.170591 0.872610 0.174303 -0.456256 +0.328173 0.316278 -1.060432 0.938331 0.145317 -0.313717 +0.284178 0.314571 -1.157604 0.888441 0.214083 -0.406006 +0.231478 -1.201274 -0.999141 0.967196 -0.248450 0.052955 +0.239514 -1.236328 -1.048406 0.959851 -0.051524 0.275738 +0.224168 -1.213435 -0.939482 0.944972 -0.298879 0.133038 +0.216812 -1.256261 -1.004349 0.920939 -0.258035 0.292044 +0.229302 -1.271132 -1.029667 0.734770 -0.018327 0.678069 +0.215237 -1.295989 -1.027565 0.533326 -0.376692 0.757408 +0.200128 -1.310606 -1.001052 0.981875 -0.148916 0.117238 +0.269315 -1.094963 -1.000722 -0.117342 0.805782 0.580471 +0.267256 -1.108005 -0.996575 0.651377 -0.072590 0.755274 +0.256752 -1.119221 -0.988089 0.575285 0.193383 0.794764 +0.249978 -1.105225 -1.022424 -0.751452 0.624332 -0.213376 +0.245774 -1.173403 -0.979229 0.676432 -0.566488 0.470670 +0.264580 -1.166326 -0.984473 0.581478 0.162648 0.797138 +0.258494 -1.145483 -0.981235 0.854153 0.184090 0.486347 +0.239167 -1.174720 -0.997346 0.142423 -0.945968 -0.291307 +0.265864 -1.184636 -1.016200 -0.313535 -0.947793 -0.058180 +0.285269 -1.182847 -0.993891 0.391598 -0.472427 0.789598 +0.248854 -1.170372 -1.033533 -0.614132 -0.658712 -0.434673 +0.241315 -1.130242 -1.036225 -0.885553 0.201567 -0.418529 +0.241855 -1.154453 -1.038826 -0.822110 -0.195842 -0.534585 +0.262764 -1.123355 -0.998650 0.887225 -0.151539 0.435738 +0.285763 -1.111916 -1.028553 0.764528 -0.362403 0.533068 +0.288573 -1.098594 -1.015810 0.685830 -0.196995 0.700593 +0.258619 -1.146066 -0.997343 0.890722 0.173522 0.420125 +0.269591 -1.163410 -0.996000 0.764519 0.539919 0.352133 +0.275650 -1.171798 -0.990842 0.571684 0.610951 0.547646 +0.292806 -1.167308 -1.027903 0.557452 0.697656 0.450025 +0.305709 -1.176263 -1.011915 0.526764 0.554880 0.643916 +0.312003 -1.163003 -1.057184 0.369826 0.619867 0.692094 +0.329523 -1.172598 -1.035929 0.354239 0.719317 0.597577 +0.338580 -1.146774 -1.069065 0.072299 0.422737 0.903364 +0.357730 -1.155275 -1.061677 0.283889 0.500282 0.818001 +0.348439 -1.131245 -1.076251 0.170741 0.088665 0.981318 +0.363280 -1.128177 -1.076717 0.196331 0.115188 0.973748 +0.248806 -1.231756 -1.114913 0.965488 -0.171123 0.196340 +0.241433 -1.230007 -1.081590 0.989962 -0.051495 0.131619 +0.239249 -1.257875 -1.047984 0.835927 0.338767 0.431813 +0.245950 -1.253788 -1.075520 0.898114 0.436682 0.051963 +0.246845 -1.260431 -1.101758 0.904770 0.380324 -0.191690 +0.332474 0.404321 -1.013368 0.993343 -0.091324 -0.070207 +0.360061 0.306779 -0.937631 0.914547 0.403588 0.026854 +0.303637 0.359237 -0.823789 0.952544 0.269371 0.141769 +0.337829 0.315369 -0.803507 0.766073 0.636948 0.086189 +0.346506 0.444275 -0.970240 0.932693 -0.359786 -0.025269 +0.316694 0.395121 -0.826608 0.949017 -0.302780 0.087693 +0.341636 0.537693 -1.091500 0.956131 -0.136411 -0.259242 +0.343043 0.675234 -1.105304 0.970776 0.109985 -0.213303 +0.316567 0.674269 -1.177092 0.937843 -0.043632 -0.344306 +0.314782 0.525202 -1.163291 0.962549 -0.092400 -0.254876 +0.204202 -1.276883 -0.942053 0.986262 -0.163929 0.020375 +0.208750 -1.327152 -0.949713 0.985454 0.109022 -0.130363 +0.205313 -1.318320 -1.042482 -0.010924 -0.795052 0.606443 +0.242641 -1.323309 -1.050722 0.101886 -0.611524 0.784639 +0.254410 -1.304698 -1.046883 0.440101 -0.146872 0.885856 +0.266277 -1.288375 -1.056593 0.681786 0.347347 0.643830 +0.269983 -1.278411 -1.076312 0.711865 0.683517 0.161411 +0.267838 -1.280775 -1.098341 0.565714 0.720670 -0.400752 +0.257984 -1.289274 -1.110665 0.274181 0.555918 -0.784717 +0.305364 -1.183834 -1.009540 0.459578 -0.736047 0.497014 +0.279820 -1.188245 -1.025279 -0.166661 -0.976836 -0.134223 +0.307100 -1.138480 -1.061830 0.506826 0.093010 0.857016 +0.285691 -1.140543 -1.030960 0.799903 0.113121 0.589372 +0.261805 -1.101313 -1.030666 -0.495932 0.794792 -0.349795 +0.279409 -1.091644 -1.009008 0.084789 0.934848 0.344776 +0.259265 -1.170908 -1.043556 -0.534575 -0.671104 -0.513662 +0.250970 -1.153046 -1.047842 -0.682829 -0.212688 -0.698934 +0.248197 -1.128193 -1.043317 -0.708654 0.312636 -0.632510 +0.372903 -1.126281 -1.083700 0.914892 0.346913 0.206458 +0.361278 -1.160513 -1.063353 0.921601 -0.357889 0.150226 +0.305015 -1.109486 -1.057336 0.569036 -0.419974 0.706979 +0.351163 -1.098161 -1.069294 0.736071 0.523862 0.428682 +0.348203 -1.105637 -1.066348 0.415283 -0.289559 0.862378 +0.332497 -1.106033 -1.077487 -0.102710 0.624481 -0.774257 +0.355910 -1.129597 -1.088021 0.088969 -0.151206 -0.984490 +0.302519 -1.120087 -1.073390 -0.342571 0.330690 -0.879369 +0.311070 -1.142928 -1.084190 -0.251800 -0.114754 -0.960952 +0.311638 -1.094821 -1.038957 0.596041 -0.455771 0.661066 +0.310419 -1.086322 -1.035124 0.468103 0.798186 0.379181 +0.336180 -1.117070 -1.070676 0.217165 -0.290676 0.931851 +0.331961 -1.180666 -1.031806 0.725049 -0.488773 0.485185 +0.343269 -1.163795 -1.072610 0.214611 -0.753495 -0.621440 +0.304348 -1.184538 -1.045493 0.030342 -0.934656 -0.354257 +0.310055 -1.161948 -1.072657 -0.128742 -0.566808 -0.813728 +0.269765 -1.171450 -1.053666 -0.360501 -0.692727 -0.624634 +0.263232 -1.151909 -1.060025 -0.524795 -0.206638 -0.825767 +0.259996 -1.124678 -1.055475 -0.600324 0.334949 -0.726237 +0.287581 -1.097294 -1.050728 -0.349338 0.781348 -0.517164 +0.388560 0.573610 -0.906970 0.999205 0.038918 -0.008631 +0.380000 0.479387 -0.850625 0.948167 -0.314655 -0.044401 +0.311188 0.429845 -0.743750 0.855672 -0.507549 0.101094 +0.343117 0.533016 -0.669788 0.981688 0.011891 0.190122 +0.346101 0.613384 -0.684474 0.958784 0.226629 0.171383 +0.315812 0.762780 -1.086902 0.869631 0.488062 -0.074413 +0.362855 0.685884 -0.934781 0.941817 0.336066 0.006341 +0.251929 0.841469 -1.034970 0.632483 0.774405 0.016214 +0.310224 0.786234 -0.897804 0.764913 0.643963 -0.014852 +0.257483 0.826472 -0.861991 0.502394 0.856290 0.119866 +0.310846 0.688865 -0.685292 0.890389 0.417832 0.180620 +0.232787 -1.331807 -1.063047 -0.208906 -0.891673 0.401594 +0.268365 -1.346147 -1.071792 -0.171803 -0.838318 0.517404 +0.286550 -1.340647 -1.068406 0.292461 -0.522466 0.800934 +0.303166 -1.329213 -1.075417 0.692345 -0.058235 0.719212 +0.308512 -1.316096 -1.089215 0.854075 0.413328 0.315779 +0.301198 -1.305795 -1.104480 0.688544 0.693634 -0.211611 +0.285145 -1.302507 -1.116210 0.282760 0.672985 -0.683475 +0.268578 -1.308589 -1.120256 -0.046225 0.501322 -0.864025 +0.203321 -1.329595 -1.068720 -0.144933 -0.905023 0.399910 +0.254542 -1.344734 -1.085416 -0.503013 -0.864086 0.018250 +0.274666 -1.359736 -1.099968 -0.524116 -0.820674 0.227590 +0.288390 -1.360377 -1.091232 -0.052882 -0.820122 0.569740 +0.303621 -1.354242 -1.090079 0.500846 -0.564815 0.655849 +0.314608 -1.343556 -1.097327 0.902759 -0.145731 0.404708 +0.316874 -1.332587 -1.110568 0.959480 0.277766 -0.047366 +0.309308 -1.325785 -1.124591 0.662541 0.549540 -0.508966 +0.294958 -1.325751 -1.133573 0.176502 0.567114 -0.804505 +0.279678 -1.332219 -1.133962 -0.162407 0.436880 -0.884737 +0.191441 0.840666 -0.814931 0.369792 0.895137 0.248964 +0.172004 0.879637 -0.926179 0.435123 0.886904 0.155143 +0.267416 -1.352851 -1.113071 -0.711624 -0.701098 -0.045296 +0.279987 -1.368770 -1.123823 -0.726580 -0.638507 0.253754 +0.289240 -1.375075 -1.116338 -0.527158 -0.686185 0.501253 +0.302076 -1.379138 -1.116024 0.038248 -0.729401 0.683017 +0.313594 -1.379406 -1.122999 0.628951 -0.574125 0.524214 +0.319393 -1.375778 -1.134600 0.960594 -0.264435 0.085635 +0.317259 -1.369638 -1.146396 0.935311 0.080790 -0.344480 +0.308007 -1.363333 -1.153881 0.467976 0.504713 -0.725440 +0.295170 -1.359270 -1.154195 0.183759 0.515924 -0.836693 +0.226916 -1.332009 -1.085243 -0.439995 -0.865074 -0.240937 +0.249879 -1.335757 -1.102068 -0.544320 -0.771618 -0.329121 +0.282051 -1.390649 -1.140099 -0.757970 -0.416288 0.502181 +0.287698 -1.399218 -1.137627 -0.443013 -0.572202 0.690162 +0.294956 -1.406136 -1.140856 0.183325 -0.696257 0.693988 +0.301081 -1.408959 -1.148293 0.714398 -0.609838 0.343123 +0.303994 -1.406916 -1.157166 0.923949 -0.343429 -0.168447 +0.302777 -1.400832 -1.164291 0.910826 -0.223920 -0.346780 +0.230621 -1.322045 -1.104962 -0.465113 -0.751862 -0.467305 +0.144773 -0.369613 -0.521976 0.521828 0.061276 0.850847 +0.229770 -0.368127 -0.574212 0.445918 -0.004395 0.895063 +0.163313 -0.268688 -0.540615 0.445918 -0.004395 0.895063 +0.305341 -0.258291 -0.595608 0.364643 -0.070014 0.928511 +0.263580 0.140392 -1.261915 0.463632 0.082094 -0.882216 +0.276410 -0.024242 -1.265942 0.523653 0.085940 -0.847586 +0.121794 0.126862 -1.337687 0.465797 0.117416 -0.877067 +0.126253 -0.069033 -1.371295 0.582573 0.146614 -0.799445 +0.108528 0.360089 -1.304915 0.395611 0.149826 -0.906115 +0.229655 0.334608 -1.256244 0.428548 0.128128 -0.894388 +0.268996 -0.166749 -1.278754 0.632808 0.104040 -0.767287 +0.121475 -0.199653 -1.417969 0.686186 0.123558 -0.716856 +0.236095 -0.336440 -1.315803 0.706301 0.065363 -0.704887 +0.108530 -0.355331 -1.455653 0.727833 0.103571 -0.677888 +0.236095 -0.336440 -1.315803 0.708978 0.205884 -0.674509 +0.219620 -0.509012 -1.385795 0.678572 0.165171 -0.715723 +0.108530 -0.355331 -1.455653 0.678572 0.165171 -0.715723 +0.114572 -0.524305 -1.478219 0.645261 0.123750 -0.753873 +0.093267 0.537123 -1.340819 -0.138003 0.068851 -0.988036 +0.000000 0.531584 -1.328178 0.063134 -0.071490 -0.995441 +0.078983 0.672760 -1.329372 0.157706 0.033446 -0.986920 +0.038019 0.674176 -1.342369 0.230372 0.013309 -0.973012 +0.000000 0.675576 -1.343699 0.028893 -0.009968 -0.999533 +0.000000 0.725216 -1.341540 0.004020 0.071121 -0.997460 +0.028482 0.725216 -1.340985 0.136871 0.082440 -0.987153 +0.060854 0.725216 -1.324017 0.383738 0.155604 -0.910238 +-0.028482 0.725216 -1.340985 -0.019302 0.135692 -0.990563 +-0.027126 0.812922 -1.328997 -0.314978 0.062121 -0.947064 +0.000000 0.812923 -1.340139 0.000000 0.026585 -0.999647 +-0.025062 0.911391 -1.323454 -0.455667 0.031140 -0.889605 +0.000000 0.911391 -1.336474 0.000000 0.042160 -0.999111 +0.027126 0.812922 -1.328997 0.314978 0.062121 -0.947064 +0.000000 0.991296 -1.334681 -0.099392 0.018440 -0.994877 +0.025062 0.911391 -1.323454 0.455667 0.031140 -0.889605 +0.023843 0.991295 -1.322813 0.445563 0.013978 -0.895142 +-0.023843 0.991295 -1.322813 -0.589910 0.011979 -0.807380 +0.000000 1.075632 -1.333278 -0.430226 0.017000 -0.902561 +-0.023086 1.075631 -1.322514 -0.723055 0.019230 -0.690523 +0.000000 1.166052 -1.330374 -0.410519 0.027016 -0.911452 +-0.020764 1.166052 -1.321185 -0.709049 0.026115 -0.704676 +0.000000 1.253848 -1.327673 -0.381797 0.017721 -0.924076 +-0.033219 1.075631 -1.297518 -0.999821 0.018543 -0.003890 +-0.033976 0.991295 -1.297518 -0.990970 0.009364 -0.133759 +-0.023086 1.075631 -1.272521 -0.758387 0.018586 0.651539 +-0.023843 0.991295 -1.272223 -0.709153 0.000612 0.705055 +-0.019217 1.253847 -1.320011 -0.700674 0.017142 -0.713276 +0.000000 1.349349 -1.327047 -0.406618 0.015636 -0.913464 +-0.030897 1.166052 -1.297518 -0.999700 0.023654 -0.006377 +0.000000 1.075632 -1.258652 -0.518343 0.019264 0.854956 +-0.020764 1.166052 -1.273851 -0.754054 0.023760 0.656382 +0.000000 0.991296 -1.257709 -0.518305 -0.001554 0.855195 +0.000000 0.911391 -1.259761 -0.483798 0.005617 0.875162 +-0.022481 0.911391 -1.271582 -0.486695 0.019337 0.873358 +0.000000 0.812923 -1.255352 -0.497166 0.029422 0.867156 +-0.029112 0.812922 -1.273484 -0.528580 0.019203 0.848666 +-0.029351 1.253847 -1.297518 -0.999854 0.015151 -0.007878 +0.000000 1.166052 -1.261031 -0.513665 0.024852 0.857631 +-0.019217 1.253847 -1.275025 -0.739203 0.020009 0.673186 +-0.018443 1.349348 -1.318398 -0.710578 0.023155 -0.703238 +0.000000 1.442863 -1.324767 -0.449778 0.033099 -0.892527 +-0.028576 1.349348 -1.297518 -0.999671 0.023575 -0.010084 +0.000000 1.253848 -1.264209 -0.487623 0.023695 0.872733 +-0.018443 1.349348 -1.276638 -0.722139 0.026806 0.691228 +-0.015295 1.442862 -1.316786 -0.712366 0.043591 -0.700453 +0.000000 1.519330 -1.320764 -0.478030 0.062784 -0.876097 +-0.025428 1.442862 -1.297518 -0.998992 0.041707 -0.016593 +0.000000 1.349350 -1.266484 -0.482657 0.027709 0.875371 +-0.015295 1.442862 -1.278250 -0.705578 0.041854 0.707395 +-0.012210 1.519316 -1.313955 -0.707251 0.074857 -0.702988 +0.000000 1.584920 -1.313976 -0.525223 0.180011 -0.831707 +-0.007202 1.584741 -1.309190 -0.724131 0.195871 -0.661263 +0.000000 1.622242 -1.297518 -0.893076 0.449905 0.000013 +0.000000 1.584920 -1.281061 -0.543125 0.225448 0.808819 +-0.007202 1.584740 -1.285847 -0.663513 0.198677 0.721303 +-0.015217 1.584564 -1.297518 -0.967707 0.219246 0.124396 +-0.022343 1.519310 -1.297518 -0.996622 0.079875 -0.019073 +0.000000 1.442863 -1.269792 -0.509986 0.038444 0.859323 +-0.012210 1.519316 -1.281081 -0.704258 0.074669 0.706007 +0.000000 1.519330 -1.272790 -0.557861 0.079860 0.826083 +0.229770 -0.368127 -0.574212 0.625354 0.168151 0.762009 +0.348259 -0.357136 -0.682947 0.719697 0.083714 0.689223 +0.305341 -0.258291 -0.595608 0.616566 -0.188544 0.764393 +0.390662 -0.263803 -0.714595 0.809996 -0.172247 0.560569 +0.408121 -0.129847 -0.708110 0.849486 -0.010222 0.527513 +0.334028 -0.151073 -0.594810 0.640147 -0.076359 0.764448 +0.163313 -0.268688 -0.540615 0.365756 -0.105031 0.924765 +0.173069 -0.171989 -0.533491 0.365030 -0.094204 0.926217 +0.401509 0.019700 -0.719666 0.852924 0.151007 0.499718 +0.337591 0.012575 -0.608417 0.746279 0.149665 0.648589 +0.186971 -0.445619 -0.537279 -0.098541 0.893629 0.437855 +0.338005 -0.375625 -0.651199 0.471654 0.774706 0.421157 +0.317899 0.220593 -0.663392 0.636941 0.394015 0.662615 +0.372288 0.218413 -0.760127 0.829740 0.301488 0.469720 +0.181052 0.003963 -0.522829 0.456971 0.118554 0.881546 +0.219224 0.341114 -0.687039 0.527205 0.605559 0.596116 +0.337829 0.315369 -0.803507 0.629976 0.631413 0.452159 +0.157486 0.215574 -0.562074 0.482479 0.411265 0.773353 +0.303637 0.359237 -0.823789 0.701341 0.041246 0.711631 +0.193934 0.374098 -0.718043 0.672829 0.416328 0.611532 +0.316694 0.395121 -0.826608 0.584191 -0.559076 0.588350 +0.194984 0.389910 -0.710710 0.554804 -0.555641 0.619238 +0.323346 -0.382968 -0.595644 0.079091 0.992845 0.089462 +0.405733 -0.421712 -0.714452 0.596425 0.793285 0.122380 +0.396773 -0.408556 -0.803304 0.598110 0.799310 0.058036 +0.210664 -0.440016 -0.501884 -0.385861 0.915372 0.114913 +0.325815 -0.384064 -0.553484 -0.117163 0.989441 0.085318 +0.210983 -0.443751 -0.483240 -0.359252 0.913856 0.189222 +0.391453 -0.418047 -0.607499 0.459747 0.887942 0.013822 +0.110497 0.357001 -0.628471 0.466506 0.498142 0.730908 +0.311188 0.429845 -0.743750 0.384860 -0.799763 0.460719 +0.193418 0.414036 -0.679360 0.360958 -0.793368 0.490181 +0.291123 0.470982 -0.647226 0.509474 -0.743804 0.432657 +0.196093 0.452835 -0.612980 0.338413 -0.840304 0.423517 +0.266554 0.508384 -0.555996 0.474387 -0.774569 0.418329 +0.200296 0.489186 -0.533589 0.371833 -0.851326 0.370114 +0.343117 0.533016 -0.669788 0.946207 -0.148915 0.287257 +0.318289 0.563922 -0.566455 0.867262 -0.358627 0.345316 +0.346101 0.613384 -0.684474 0.938336 0.269938 0.216007 +0.311358 0.632463 -0.562152 0.960617 0.155920 0.230010 +0.310846 0.688865 -0.685292 0.847324 0.498279 0.183740 +0.290660 0.682530 -0.558843 0.861641 0.476629 0.174355 +0.275723 0.755235 -0.676234 0.605431 0.733184 0.309669 +0.263180 0.713418 -0.550893 0.708539 0.661757 0.245052 +0.228561 0.777364 -0.667726 0.449092 0.828611 0.334246 +0.220027 0.731594 -0.542794 0.433750 0.838582 0.329609 +0.000000 -0.820987 -0.477658 0.302497 -0.509654 0.805449 +0.000000 -0.882034 -0.516286 0.319041 -0.542087 0.777402 +0.080293 -0.814335 -0.503604 0.389750 -0.527089 0.755163 +0.066691 -0.876853 -0.541093 0.466128 -0.571736 0.675161 +0.188531 -0.803520 -0.548481 0.359673 -0.585726 0.726334 +0.130931 -0.873717 -0.601270 0.506900 -0.603293 0.615703 +0.106014 -0.926096 -0.629367 0.548687 -0.380569 0.744386 +0.054010 -0.924554 -0.576161 0.533009 -0.542973 0.648908 +0.000000 -0.931320 -0.554331 0.342424 -0.595835 0.726448 +0.093092 -0.998740 -0.644095 0.459926 -0.113140 0.880720 +0.171366 -1.036528 -0.683604 0.465137 -0.093144 0.880325 +0.198022 -0.974045 -0.698088 0.541430 -0.147373 0.827728 +0.084065 -1.085169 -0.641995 0.407211 0.165371 0.898238 +0.134085 -1.124052 -0.661652 0.440368 0.188158 0.877880 +0.139670 -0.729077 -0.486843 0.437952 -0.307618 0.844730 +0.075642 -0.735415 -0.462425 0.362015 -0.383036 0.849840 +0.218263 -0.890110 -0.686509 0.514962 -0.417311 0.748776 +0.045699 -0.984531 -0.606911 0.596053 -0.279819 0.752610 +0.155468 -1.236804 -0.630819 0.462097 0.147331 0.874506 +0.201473 -1.208949 -0.656278 0.535988 0.026057 0.843823 +0.044879 -1.066202 -0.622145 0.512264 -0.014685 0.858702 +0.139402 -1.274319 -0.619443 0.682363 -0.100216 0.724111 +0.106292 -1.214490 -0.609168 0.469728 0.263475 0.842577 +0.028430 -1.191998 -0.592604 0.331738 0.270534 0.903748 +0.072683 -1.196973 -0.602534 0.285708 0.348718 0.892618 +0.107871 -1.323799 -0.578042 0.831398 -0.065902 0.551756 +0.127010 -1.303758 -0.615782 0.848695 -0.526875 0.046037 +0.101575 -1.353245 -0.577932 0.878926 -0.425859 0.214786 +0.141154 -1.289671 -0.632284 0.284496 -0.687509 0.668127 +0.217239 -1.235284 -0.685585 0.778468 -0.177402 0.602093 +0.164410 -1.289065 -0.635710 0.398839 0.046729 0.915830 +0.161549 -1.276360 -0.634034 0.398166 -0.178562 0.899766 +0.163755 -1.303910 -0.634987 0.646679 0.014569 0.762623 +0.198106 -1.282808 -0.684246 0.859140 -0.236890 0.453609 +0.160675 -1.327495 -0.631884 0.815560 -0.036226 0.577537 +0.181027 -1.327258 -0.684930 0.934363 -0.313721 0.168949 +0.158337 -1.364142 -0.622466 0.869381 -0.145043 0.472377 +0.154497 -1.380270 -0.678829 0.929443 -0.367955 -0.027304 +0.061988 -1.284424 -0.560729 0.267470 0.367239 0.890840 +0.083975 -1.293200 -0.566737 0.508683 0.276170 0.815458 +0.143365 -1.414398 -0.669677 0.950203 -0.311571 -0.006078 +0.135294 -1.430873 -0.717779 0.947524 -0.304022 -0.098835 +0.144574 -1.406805 -0.621260 0.862880 -0.272552 0.425621 +0.129576 -1.405361 -0.603754 0.377867 0.080825 0.922325 +0.139376 -1.362009 -0.611108 0.173088 0.140189 0.974878 +0.072233 -0.668912 -0.433957 0.537359 -0.121704 0.834526 +0.130595 -0.640555 -0.478463 0.402414 0.070315 0.912754 +0.143894 -1.296556 -0.636116 -0.178994 -0.012784 0.983767 +0.146131 -1.308268 -0.627509 -0.351591 0.353222 0.866959 +0.145445 -1.326647 -0.619138 0.191628 0.257689 0.947035 +0.132645 -1.361377 -0.611443 -0.498868 0.310691 0.809075 +0.139083 -1.326727 -0.623711 -0.626290 0.349117 0.697050 +0.122685 -1.405695 -0.604309 -0.214586 0.354508 0.910097 +0.118962 -1.437387 -0.596255 0.699948 -0.139712 0.700395 +0.128445 -1.442977 -0.627141 0.914997 -0.287825 0.282732 +0.125944 -1.491134 -0.642916 0.948998 -0.244915 0.198541 +0.115440 -1.495687 -0.619527 0.778850 -0.363011 0.511484 +0.119194 -1.324339 -0.660955 -0.522894 0.398764 0.753372 +0.118120 -1.278789 -0.677453 -0.729447 -0.125026 0.672515 +0.138638 -1.308886 -0.637077 -0.805129 0.170672 0.568013 +0.134660 -1.297916 -0.641700 -0.740374 -0.405585 0.536047 +0.129485 -1.292252 -0.638544 -0.246744 -0.928812 -0.276453 +0.089667 -1.497634 -0.594454 0.501498 -0.323117 0.802555 +0.091568 -1.447681 -0.580916 0.045685 0.346884 0.936795 +0.096465 -1.343108 -0.564166 0.763581 -0.026697 0.645160 +0.072713 -1.377240 -0.548504 0.672760 -0.532612 0.513535 +0.088895 -1.370848 -0.574027 0.441650 -0.806378 -0.393318 +0.079852 -1.324992 -0.553916 0.533730 0.271093 0.801025 +0.026260 -1.280054 -0.556299 0.182762 0.381391 0.906167 +0.055126 -1.320242 -0.544940 0.270332 0.321042 0.907663 +0.071629 -1.379708 -0.565028 0.249842 -0.888289 -0.385386 +0.074056 -1.339260 -0.590221 -0.111140 -0.538403 -0.835327 +0.111616 -1.327029 -0.608226 0.321276 -0.688704 -0.649976 +0.107044 -1.541398 -0.649263 0.793218 -0.559099 0.241275 +0.114816 -1.528464 -0.668639 0.879766 -0.462867 0.108473 +0.085495 -1.544567 -0.622349 0.485634 -0.671105 0.560159 +0.156650 -1.356212 -0.761539 0.916740 -0.380221 -0.122554 +0.131509 -1.409096 -0.777987 0.926027 -0.317579 -0.204004 +0.120670 -1.476615 -0.732980 0.951799 -0.255756 -0.169316 +0.103226 -1.263748 -0.674458 -0.635152 -0.752882 0.172483 +0.132940 -1.443241 -0.645172 0.969703 -0.220537 0.105069 +0.132277 -1.445773 -0.698382 0.974045 -0.211133 -0.081608 +0.103408 -1.413538 -0.607254 -0.387582 0.586059 0.711558 +0.081666 -1.289704 -0.623371 -0.089859 -0.589101 -0.803047 +0.107095 -1.521984 -0.746441 0.894077 -0.308566 -0.324673 +0.111725 -1.457935 -0.786106 0.908479 -0.285657 -0.305067 +0.091704 -1.556855 -0.667292 0.629621 -0.686802 0.363153 +0.101380 -1.557837 -0.680852 0.762316 -0.494111 0.418006 +0.070546 -1.562914 -0.651884 0.440872 -0.751348 0.491028 +0.023249 -1.315241 -0.541154 0.135504 0.299456 0.944439 +0.050513 -1.365189 -0.530957 0.319701 -0.009112 0.947475 +0.018619 -1.370303 -0.523921 0.180053 0.001879 0.983655 +0.133691 -1.465766 -0.673240 0.986414 -0.156159 -0.051013 +0.120564 -1.513026 -0.684932 0.958523 -0.284348 0.019494 +0.107642 -1.558038 -0.689610 0.827835 -0.485500 0.281032 +0.082730 -1.589562 -0.687034 0.679627 -0.720555 0.137504 +0.077701 -1.575456 -0.670632 0.609785 -0.530034 0.589259 +0.042564 -1.569583 -0.636975 0.517554 -0.604675 0.605397 +0.048210 -1.589749 -0.652445 0.526037 -0.611964 0.590581 +0.077998 -1.352136 -0.542918 0.559656 0.052270 0.827075 +0.100389 -1.255747 -0.653954 -0.329039 -0.825654 -0.458288 +0.070074 -1.244802 -0.663809 -0.323171 -0.942167 -0.088776 +0.070992 -1.247380 -0.686623 -0.429352 -0.649910 0.627116 +0.042243 -1.393100 -0.536856 0.399713 -0.816629 0.416349 +0.039635 -1.391853 -0.554379 0.136670 -0.839556 -0.525802 +0.057574 -1.545277 -0.610821 0.332911 -0.745233 0.577752 +0.062696 -1.462112 -0.576113 0.170326 0.123501 0.977618 +0.068962 -1.417705 -0.624797 -0.318850 0.590360 0.741491 +0.044892 -1.348548 -0.584637 0.051457 -0.575851 -0.815934 +0.054464 -1.294657 -0.623404 0.086984 -0.644814 -0.759374 +0.060899 -1.501117 -0.582180 0.382779 -0.401480 0.832042 +0.068040 -1.327512 -0.667823 -0.153558 0.437919 0.885803 +0.069671 -1.278198 -0.690989 -0.250673 0.192119 0.948817 +0.078161 -1.582310 -0.717670 0.677907 -0.687491 -0.260381 +0.049203 -1.606319 -0.712284 0.471614 -0.868230 -0.154133 +0.049598 -1.607373 -0.680832 0.408683 -0.871532 0.270943 +0.020583 -1.618934 -0.702387 0.243196 -0.969436 -0.032392 +0.022198 -1.613117 -0.731314 0.231042 -0.896422 -0.378216 +0.053269 -1.597447 -0.738356 0.527741 -0.755000 -0.389184 +0.086377 -1.560745 -0.743683 0.722076 -0.553183 -0.415446 +0.108763 -1.541432 -0.725267 0.869420 -0.423583 -0.254337 +0.119345 -1.495462 -0.712270 0.963477 -0.200933 -0.177025 +0.152043 -0.627012 -0.461232 -0.879135 -0.028876 0.475698 +0.131915 -0.528796 -0.497689 0.149555 0.090672 0.984587 +0.155519 -0.617108 -0.446525 -0.957518 -0.053155 0.283434 +0.148618 -0.528786 -0.462029 -0.940818 -0.024817 0.338002 +0.166063 -0.601729 -0.399052 -0.921102 -0.009043 0.389216 +0.153661 -0.526172 -0.447830 -0.964127 -0.012943 0.265126 +0.090467 -0.527020 -0.448806 0.713601 0.056573 0.698265 +0.122304 -0.438939 -0.494920 0.663049 0.047898 0.747042 +0.186971 -0.445619 -0.537279 0.550035 0.033116 0.834484 +0.036703 -1.235823 -0.673595 -0.235733 -0.967222 0.094405 +0.036792 -1.238117 -0.697304 -0.252575 -0.793214 0.554091 +0.013712 -1.402167 -0.533006 0.324194 -0.819410 0.472721 +0.037356 -1.272798 -0.701558 -0.209313 0.128834 0.969325 +0.035488 -1.329960 -0.670332 -0.083344 0.491624 0.866810 +0.013895 -1.398495 -0.548833 0.249013 -0.955351 -0.159047 +0.032314 -1.573539 -0.787490 0.308004 -0.778247 -0.547234 +0.062177 -1.548939 -0.790061 0.612686 -0.604154 -0.509524 +0.091171 -1.508123 -0.790433 0.786768 -0.426097 -0.446585 +0.021073 -1.614909 -0.670898 0.260953 -0.877577 0.402196 +-0.000017 -1.270105 -0.707808 -0.112785 0.293520 0.949276 +-0.000017 -1.233837 -0.701840 -0.177757 -0.515776 0.838080 +-0.000017 -1.616928 -0.728156 0.112827 -0.944493 -0.308549 +-0.000017 -1.583737 -0.779092 0.090094 -0.829132 -0.551746 +-0.000017 -1.339257 -0.666214 -0.035554 0.515106 0.856389 +-0.000017 -1.231392 -0.679250 -0.130735 -0.986276 0.100836 +-0.000017 -1.622242 -0.698873 0.152394 -0.987650 -0.036376 +-0.000017 -1.618749 -0.666344 0.223215 -0.930502 0.290414 +-0.000017 -1.312755 -0.538588 0.133416 0.262076 0.955781 +-0.000017 -1.370935 -0.522635 0.094730 0.278252 0.955825 +0.019196 -1.594895 -0.641123 0.251325 -0.684342 0.684479 +-0.000017 -1.596067 -0.638937 0.172948 -0.707463 0.685263 +0.166408 -0.689952 -0.448651 -0.880088 -0.108466 0.462256 +0.156180 -0.709903 -0.464735 -0.803508 -0.065109 0.591722 +0.165710 -0.520333 -0.397867 -0.915783 -0.009818 0.401552 +0.178825 -0.521027 -0.378250 -0.842461 -0.005640 0.538728 +0.179266 -0.601335 -0.377465 -0.853093 0.000415 0.521759 +0.018462 -1.572862 -0.630150 0.251718 -0.424713 0.869630 +-0.000017 -1.574039 -0.625376 0.190362 -0.473816 0.859803 +0.201975 0.676339 -1.300758 0.644574 0.170370 -0.745318 +0.187521 0.788019 -1.271414 0.631059 0.267877 -0.728016 +0.284059 0.669572 -1.231316 0.681880 0.135437 -0.718816 +0.234621 0.787648 -1.231194 0.627624 0.263541 -0.732554 +0.276877 0.518284 -1.223774 0.780730 -0.068029 -0.621154 +0.208275 0.514568 -1.309593 0.719129 -0.000681 -0.694876 +0.000000 0.376398 -1.337871 0.147506 0.003599 -0.989055 +0.108528 0.360089 -1.304915 0.275882 -0.063229 -0.959109 +0.000000 0.123007 -1.369700 0.276043 0.133725 -0.951797 +0.121794 0.126862 -1.337687 0.246986 0.148600 -0.957557 +0.229655 0.334608 -1.256244 0.319654 -0.234204 -0.918134 +0.208275 0.514568 -1.309593 0.275389 -0.116415 -0.954258 +0.093267 0.537123 -1.340819 0.172735 -0.023427 -0.984690 +0.000000 0.531584 -1.328178 -0.137651 0.061746 -0.988554 +0.078983 0.672760 -1.329372 0.316351 0.305148 -0.898224 +0.201975 0.676339 -1.300758 0.236351 0.171688 -0.956379 +0.060854 0.725216 -1.324017 0.961962 0.251319 -0.107089 +0.049248 0.745544 -1.293766 0.231847 0.505786 -0.830920 +0.081137 0.746770 -1.310106 -0.048970 0.296172 -0.953879 +0.083203 0.776490 -1.299485 -0.162608 0.409927 -0.897507 +0.187521 0.788019 -1.271414 0.250929 0.544439 -0.800388 +0.085151 0.801816 -1.283248 -0.131644 0.651141 -0.747453 +0.234621 0.787648 -1.231194 0.415295 0.773236 -0.479203 +0.115223 0.870956 -1.200244 0.141682 0.788102 -0.599017 +0.031367 0.777065 -1.277087 -0.348189 0.430559 -0.832697 +0.039245 0.812922 -1.297518 0.974353 0.135026 -0.180012 +0.027126 0.812922 -1.328997 0.809499 0.173340 -0.560950 +0.028482 0.725216 -1.340985 0.460477 0.127198 -0.878511 +0.029112 0.812922 -1.273484 0.938439 0.164670 0.303670 +0.025062 0.911391 -1.323454 0.931626 0.039018 -0.361319 +0.035195 0.911391 -1.297518 0.930753 0.038282 -0.363638 +0.000000 0.798667 -1.251145 -0.299097 0.610391 -0.733460 +0.000000 0.842631 -1.203002 -0.225651 0.750493 -0.621162 +0.250557 -0.893329 -1.103714 0.737084 -0.572401 -0.359254 +0.163891 -0.925097 -1.230911 0.727208 -0.541407 -0.421956 +0.315181 -0.764996 -1.175598 0.760713 -0.419445 -0.495360 +0.198746 -0.792401 -1.318974 0.744800 -0.409984 -0.526484 +0.215624 -0.638821 -1.379687 0.790148 -0.211487 -0.575274 +0.352477 -0.606807 -1.199774 0.808999 -0.100696 -0.579121 +0.219620 -0.509012 -1.385795 0.808235 0.043899 -0.587221 +0.335016 -0.477144 -1.219440 0.819375 0.142017 -0.555388 +0.236095 -0.336440 -1.315803 0.841276 0.113538 -0.528549 +0.317998 -0.316945 -1.171010 0.865330 0.034616 -0.500006 +0.268996 -0.166749 -1.278754 0.866841 -0.045564 -0.496498 +0.333440 -0.148889 -1.169196 0.858436 -0.032665 -0.511880 +0.276410 -0.024242 -1.265942 0.849437 0.018228 -0.527375 +0.334864 -0.008152 -1.173440 0.846801 0.052788 -0.529284 +0.263580 0.140392 -1.261915 0.844216 0.114997 -0.523522 +0.316565 0.155536 -1.170591 0.857125 0.160227 -0.489555 +0.229655 0.334608 -1.256244 0.849671 0.038792 -0.525885 +0.284178 0.314571 -1.157604 0.880720 -0.049918 -0.471000 +0.276877 0.518284 -1.223774 0.834422 -0.106711 -0.540697 +0.208275 0.514568 -1.309593 0.779783 -0.090980 -0.619404 +0.284059 0.669572 -1.231316 0.845794 0.148636 -0.512387 +0.314782 0.525202 -1.163291 0.865963 -0.100943 -0.489815 +0.316567 0.674269 -1.177092 0.864274 0.258473 -0.431534 +0.328173 0.316278 -1.060432 0.902669 -0.142122 -0.406190 +0.234621 0.787648 -1.231194 0.815203 0.341806 -0.467560 +0.279601 0.779780 -1.158522 0.823280 0.357340 -0.441041 +0.343043 0.675234 -1.105304 0.879853 0.342854 -0.329106 +0.315812 0.762780 -1.086902 0.871621 0.353479 -0.339602 +0.113353 -0.829547 -1.389298 0.532833 -0.522432 -0.665698 +0.077967 -0.944955 -1.301869 0.380628 -0.575787 -0.723596 +0.000000 -0.850805 -1.401005 0.161013 -0.649310 -0.743284 +0.000000 -0.946150 -1.314178 0.132503 -0.611708 -0.779908 +0.163891 -0.925097 -1.230911 0.709708 -0.341212 -0.616352 +0.198746 -0.792401 -1.318974 0.653318 -0.444131 -0.613125 +0.215624 -0.638821 -1.379687 0.644376 -0.341333 -0.684303 +0.117833 -0.677125 -1.452666 0.662838 -0.319893 -0.676990 +0.063836 -1.006456 -1.256372 0.332632 -0.523102 -0.784679 +0.155712 -1.010450 -1.208942 0.642905 -0.324041 -0.694025 +0.000000 -1.014367 -1.268361 0.178733 -0.583271 -0.792369 +0.194389 -1.019275 -1.135778 0.833571 0.086931 -0.545529 +0.140954 -1.081044 -1.195292 0.557744 0.052802 -0.828332 +0.250557 -0.893329 -1.103714 0.837069 -0.233218 -0.494898 +0.063677 -1.084658 -1.226234 0.343575 -0.069069 -0.936582 +0.212058 -1.089059 -1.151285 0.610014 0.291725 -0.736736 +0.243257 -1.109294 -1.101869 0.857182 0.310578 -0.410829 +0.233524 -1.041313 -1.070262 0.858121 0.312333 -0.407524 +0.082590 -1.177560 -1.230108 0.180492 -0.011882 -0.983505 +0.149037 -1.182005 -1.217860 0.346676 0.073243 -0.935121 +0.232935 -1.184636 -1.172981 0.468361 0.028736 -0.883070 +0.147323 -1.283632 -1.206186 0.339010 -0.299074 -0.891979 +0.228412 -1.270773 -1.165832 0.731633 -0.385408 -0.562293 +0.148298 -1.343492 -1.172147 0.441873 -0.499209 -0.745345 +0.206980 -1.323399 -1.147182 0.743963 -0.554044 -0.373570 +0.144216 -1.389224 -1.142150 0.583097 -0.481328 -0.654462 +0.185016 -1.368596 -1.120970 0.684383 -0.547695 -0.481300 +0.222856 -1.307619 -1.114574 0.616177 -0.530083 -0.582528 +0.210022 -1.325508 -1.096257 0.830781 -0.551860 -0.072481 +0.236921 -1.282762 -1.116675 0.798409 -0.293597 -0.525684 +0.246845 -1.260431 -1.101758 0.928308 -0.205605 -0.309792 +0.248806 -1.231756 -1.114913 0.941395 -0.210244 -0.263767 +0.085375 -1.291375 -1.217723 0.200059 -0.246003 -0.948398 +0.085390 -1.351693 -1.181174 0.202253 -0.494658 -0.845226 +0.242488 -1.305722 -1.114672 -0.113639 -0.303684 -0.945972 +0.230621 -1.322045 -1.104962 -0.221549 -0.476650 -0.850718 +0.254957 -1.321908 -1.115359 -0.352154 -0.432576 -0.829979 +0.249879 -1.335757 -1.102068 -0.312788 -0.595476 -0.739981 +0.000000 -0.820987 -0.477658 0.302135 -0.512966 0.803480 +0.000000 -0.743096 -0.427930 0.381981 -0.391794 0.837011 +0.075642 -0.735415 -0.462425 0.416254 -0.370772 0.830218 +0.000000 -0.682871 -0.406746 0.373654 -0.148785 0.915558 +0.000000 -0.520935 -0.408895 0.388776 0.070997 0.918593 +0.090467 -0.527020 -0.448806 0.437648 0.153182 0.886002 +0.122304 -0.438939 -0.494920 0.473333 0.257953 0.842268 +0.000000 -0.433288 -0.424155 0.463796 0.243988 0.851683 +0.144773 -0.369613 -0.521976 0.438573 0.199812 0.876201 +0.000000 -0.365256 -0.450505 0.463460 0.258350 0.847620 +0.020074 0.802989 -0.859710 -0.468616 0.735648 0.489102 +0.000000 0.792848 -0.871132 -0.429261 0.637739 0.639550 +0.008274 0.689589 -0.762612 -0.470719 0.608497 0.638870 +0.000000 0.690640 -0.766550 -0.235042 0.695142 0.679362 +0.055367 0.903845 -1.060557 -0.308741 0.870649 0.382947 +0.112552 0.899531 -1.004645 -0.301408 0.876697 0.374907 +0.059104 0.807325 -0.828836 -0.357493 0.777283 0.517716 +0.025789 0.687817 -0.748559 -0.474214 0.578186 0.663944 +0.087118 0.775469 -0.767209 -0.323846 0.878246 0.351863 +0.172004 0.879637 -0.926179 -0.240069 0.873814 0.422867 +0.088868 0.769612 -0.732977 -0.464125 0.868834 0.172382 +0.191441 0.840666 -0.814931 -0.418558 0.867201 0.269763 +0.055367 0.903845 -1.060557 -0.373691 0.924481 -0.075434 +0.000000 0.877127 -1.071758 -0.490537 0.859379 0.144364 +0.020074 0.802989 -0.859710 -0.515598 0.792443 0.325871 +0.000000 0.792848 -0.871132 -0.565758 0.760218 0.319353 +0.115223 0.870956 -1.200244 -0.219773 0.924376 -0.311815 +0.000000 0.842631 -1.203002 -0.302930 0.912640 -0.274450 +0.432499 -0.117936 -0.893081 0.996289 -0.062059 -0.059641 +0.437223 0.021572 -0.907435 0.996072 0.085228 -0.023996 +0.408121 -0.129847 -0.708110 0.988708 -0.032280 0.146335 +0.401509 0.019700 -0.719666 0.975183 0.119050 0.186668 +0.409405 0.188720 -0.931537 0.956010 0.276241 -0.098669 +0.372005 0.173291 -1.062321 0.941402 0.173709 -0.289114 +0.392132 0.008478 -1.063792 0.962223 0.006191 -0.272191 +0.423456 -0.279155 -0.891875 0.993456 -0.113791 0.009849 +0.390117 -0.124181 -1.050900 0.972651 -0.022312 -0.231197 +0.397077 -0.294104 -1.040035 0.989007 0.021149 -0.146348 +0.372288 0.218413 -0.760127 0.945523 0.285782 0.155930 +0.360061 0.306779 -0.937631 0.923030 0.384346 0.017108 +0.328173 0.316278 -1.060432 0.911217 0.326518 -0.251135 +0.390662 -0.263803 -0.714595 0.968738 -0.180295 0.170413 +0.337829 0.315369 -0.803507 0.915270 0.382221 0.127233 +0.414880 -0.360277 -0.913431 0.992981 0.106055 0.052362 +0.412246 -0.462044 -1.047188 0.969065 0.152795 -0.193820 +0.348259 -0.357136 -0.682947 0.958911 -0.049178 0.279411 +0.445104 -0.474404 -0.928435 0.976834 0.198878 -0.079009 +0.417389 -0.603646 -1.074460 0.968093 -0.042231 -0.247008 +0.441108 -0.605236 -0.978452 0.981078 -0.088848 -0.172024 +0.396773 -0.408556 -0.803304 0.926122 0.328728 0.185031 +0.338005 -0.375625 -0.651199 0.935522 0.074226 0.345383 +0.449056 -0.493539 -0.787950 0.952996 0.301660 -0.028288 +0.459976 -0.598947 -0.814650 0.990812 -0.109187 -0.079816 +0.405733 -0.421712 -0.714452 0.852379 0.522855 -0.008538 +0.430026 -0.707082 -0.805969 0.894149 -0.447012 0.026035 +0.421764 -0.731125 -0.935026 0.884742 -0.461487 -0.065276 +0.327169 -0.847824 -0.782242 0.793739 -0.607645 0.027308 +0.298690 -0.872468 -0.981866 0.765891 -0.636311 -0.092295 +0.378254 -0.754824 -1.055511 0.893875 -0.384436 -0.230645 +0.368785 -0.778217 -0.725018 0.807768 -0.585014 0.072594 +0.108530 -0.355331 -1.455653 0.292423 0.184591 -0.938304 +0.114572 -0.524305 -1.478219 0.451389 -0.010769 -0.892263 +0.000000 -0.361320 -1.491224 0.297235 0.160851 -0.941158 +0.000000 -0.533029 -1.515251 0.293088 -0.072777 -0.953312 +0.000000 -0.694820 -1.481308 0.237083 -0.344148 -0.908490 +0.117833 -0.677125 -1.452666 0.374118 -0.214150 -0.902317 +0.121475 -0.199653 -1.417969 0.240861 0.303519 -0.921880 +0.000000 -0.212704 -1.457249 0.275176 0.266395 -0.923749 +0.126253 -0.069033 -1.371295 0.220563 0.216683 -0.951000 +0.000000 -0.085812 -1.403213 0.221652 0.287575 -0.931757 +0.000000 -0.850805 -1.401005 0.174925 -0.450661 -0.875389 +0.113353 -0.829547 -1.389298 0.223785 -0.414227 -0.882234 +0.219620 -0.509012 -1.385795 0.664080 -0.055526 -0.745597 +0.215624 -0.638821 -1.379687 0.643959 -0.085867 -0.760226 +0.000000 0.123007 -1.369700 0.234190 0.161925 -0.958611 +0.121794 0.126862 -1.337687 0.245522 0.169341 -0.954485 +0.163313 -0.268688 -0.540615 0.219901 0.037023 0.974819 +0.000000 -0.278300 -0.498178 0.305059 0.217029 0.927274 +0.144773 -0.369613 -0.521976 0.331283 0.291349 0.897423 +0.000000 -0.365256 -0.450505 0.408356 0.438826 0.800423 +0.173069 -0.171989 -0.533491 0.131365 -0.038782 0.990575 +0.000000 -0.181284 -0.504867 0.192464 0.004644 0.981293 +0.181052 0.003963 -0.522829 0.060235 0.062843 0.996204 +0.000000 -0.002516 -0.511473 0.106887 0.071547 0.991694 +0.000000 0.217662 -0.539160 0.161664 0.334761 0.928332 +0.157486 0.215574 -0.562074 0.112487 0.259472 0.959177 +0.110497 0.357001 -0.628471 0.247536 0.498871 0.830574 +0.000000 0.362368 -0.606042 0.217049 0.467158 0.857119 +0.219224 0.341114 -0.687039 0.502465 0.686552 0.525524 +0.042466 0.462186 -0.676207 0.321037 0.507282 0.799750 +0.000000 0.473072 -0.669559 0.360995 0.408163 0.838502 +0.009831 0.582357 -0.722762 -0.032884 0.344141 0.938342 +0.022530 0.582900 -0.720376 -0.372847 0.219888 0.901462 +0.073671 0.464847 -0.696580 0.059356 0.085577 0.994562 +0.193934 0.374098 -0.718043 0.366712 0.334615 0.868076 +0.030152 0.581907 -0.713972 -0.574628 -0.041532 0.817360 +0.037486 0.686149 -0.731377 -0.793310 0.319707 0.518119 +0.025789 0.687817 -0.748559 -0.599119 0.384319 0.702393 +0.091849 0.479491 -0.699313 -0.241330 -0.178301 0.953923 +0.194984 0.389910 -0.710710 -0.207107 -0.398498 0.893480 +0.000000 0.583122 -0.715693 0.569719 0.317734 0.757935 +0.103255 0.494590 -0.692424 -0.637342 -0.448487 0.626621 +0.047675 0.582939 -0.689279 -0.845393 -0.123815 0.519597 +0.070740 0.591315 -0.644639 -0.880952 -0.256879 0.397413 +0.116679 0.512235 -0.650594 -0.752185 -0.524909 0.398357 +0.051595 0.678974 -0.703427 -0.887106 0.247808 0.389402 +0.068726 0.667268 -0.647439 -0.938830 0.112970 0.325325 +0.193418 0.414036 -0.679360 -0.528239 -0.542676 0.653043 +0.196093 0.452835 -0.612980 -0.651498 -0.621930 0.434458 +0.087118 0.775469 -0.767209 -0.721486 0.558866 0.408812 +0.088868 0.769612 -0.732977 -0.731718 0.603754 0.316338 +0.098672 0.741881 -0.649914 -0.748836 0.576357 0.327197 +0.132622 0.539817 -0.555258 -0.853161 -0.411324 0.320824 +0.104151 0.602309 -0.560450 -0.918303 -0.244381 0.311443 +0.095284 0.658244 -0.561410 -0.953362 0.100333 0.284665 +0.112848 0.705254 -0.556160 -0.901424 0.322681 0.288638 +0.008274 0.689589 -0.762612 -0.584561 0.275160 0.763266 +0.059104 0.807325 -0.828836 -0.615244 0.550537 0.564255 +0.191441 0.840666 -0.814931 -0.335570 0.879375 0.337775 +0.174726 0.772485 -0.655484 -0.329157 0.880212 0.341881 +0.147059 0.559099 -0.487339 -0.869477 -0.417298 0.264332 +0.121016 0.612952 -0.489468 -0.936852 -0.239404 0.254940 +0.116559 0.653839 -0.489535 -0.940657 0.180407 0.287434 +0.133645 0.691215 -0.483091 -0.881879 0.348367 0.317693 +0.167913 0.575845 -0.391086 -0.845178 -0.464751 0.263972 +0.142612 0.617588 -0.398601 -0.932227 -0.257840 0.253913 +0.141864 0.649581 -0.398320 -0.936399 0.223905 0.270229 +0.161989 0.688799 -0.401702 -0.868051 0.404387 0.288026 +numsurf 345 +SURF 0x24 +mat 0 +refs 4 +2092 0.18417 0.47203 +2090 0.17447 0.47611 +2092 0.18417 0.47203 +2091 0.17409 0.47332 +SURF 0x24 +mat 0 +refs 44 +3153 0.82063 0.33963 +3157 0.88744 0.34868 +3153 0.82063 0.33963 +3158 0.87040 0.37083 +3154 0.80637 0.36412 +3158 0.87040 0.37083 +3155 0.80410 0.36840 +3159 0.87019 0.37164 +3155 0.80410 0.36840 +3160 0.87826 0.35118 +3155 0.80410 0.36840 +3156 0.81642 0.35386 +3155 0.80410 0.36840 +3148 0.76321 0.35178 +3147 0.75136 0.36714 +3144 0.70120 0.33703 +3139 0.68769 0.36669 +3138 0.64633 0.36625 +3136 0.69033 0.36560 +3135 0.65266 0.37432 +3134 0.67859 0.31971 +3128 0.62943 0.38375 +3131 0.66885 0.32864 +3126 0.66137 0.34701 +3132 0.71371 0.22562 +3126 0.66137 0.34701 +3127 0.70889 0.22441 +3122 0.65771 0.38331 +3121 0.73969 0.20940 +3122 0.65771 0.38331 +3119 0.60332 0.30002 +3120 0.56124 0.41349 +3119 0.60332 0.30002 +3117 0.60042 0.43377 +3118 0.66570 0.27480 +3116 0.61664 0.44217 +3115 0.70047 0.26395 +3116 0.61664 0.44217 +3113 0.69023 0.26842 +3114 0.62052 0.44417 +3109 0.68118 0.27568 +3110 0.62443 0.44620 +3111 0.68284 0.29923 +3112 0.65237 0.46066 +SURF 0x24 +mat 0 +refs 5 +3120 0.56124 0.41349 +3122 0.65771 0.38331 +3123 0.64039 0.42633 +3124 0.61413 0.40070 +3133 0.61336 0.41234 +SURF 0x24 +mat 0 +refs 16 +3131 0.66885 0.32864 +3132 0.71371 0.22562 +3131 0.66885 0.32864 +3140 0.73129 0.23664 +3134 0.67859 0.31971 +3141 0.77152 0.25419 +3134 0.67859 0.31971 +3137 0.70980 0.31944 +3136 0.69033 0.36560 +3145 0.77362 0.33296 +3146 0.75635 0.35888 +3153 0.82063 0.33963 +3146 0.75635 0.35888 +3154 0.80637 0.36412 +3147 0.75136 0.36714 +3155 0.80410 0.36840 +SURF 0x24 +mat 0 +refs 4 +3147 0.75136 0.36714 +3139 0.68769 0.36669 +3146 0.75635 0.35888 +3136 0.69033 0.36560 +SURF 0x24 +mat 0 +refs 17 +3152 0.73594 0.26192 +3151 0.65088 0.19743 +3144 0.70120 0.33703 +3143 0.64764 0.32131 +3138 0.64633 0.36625 +3129 0.62290 0.37139 +3135 0.65266 0.37432 +3129 0.62290 0.37139 +3128 0.62943 0.38375 +3125 0.62187 0.38917 +3126 0.66137 0.34701 +3125 0.62187 0.38917 +3122 0.65771 0.38331 +3125 0.62187 0.38917 +3124 0.61413 0.40070 +3130 0.60699 0.37747 +3149 0.59000 0.39012 +SURF 0x24 +mat 0 +refs 5 +3125 0.62187 0.38917 +3129 0.62290 0.37139 +3130 0.60699 0.37747 +3142 0.62671 0.31261 +3150 0.57660 0.32097 +SURF 0x24 +mat 0 +refs 4 +3143 0.64764 0.32131 +3142 0.62671 0.31261 +3143 0.64764 0.32131 +3129 0.62290 0.37139 +SURF 0x24 +mat 0 +refs 15 +3107 0.40370 0.17426 +3108 0.53610 0.19538 +3107 0.40370 0.17426 +3101 0.54094 0.17321 +3102 0.40370 0.15215 +3099 0.53575 0.14242 +3100 0.40370 0.11650 +3093 0.52168 0.11756 +3095 0.40370 0.09409 +3094 0.52824 0.10267 +3096 0.40370 0.07824 +3098 0.53179 0.11953 +3097 0.40370 0.10063 +3104 0.52692 0.16133 +3103 0.40370 0.15361 +SURF 0x24 +mat 0 +refs 4 +3098 0.53179 0.11953 +3094 0.52824 0.10267 +3106 0.63809 0.16767 +3105 0.64243 0.16364 +SURF 0x24 +mat 0 +refs 36 +3082 0.48979 0.45981 +3086 0.43162 0.44767 +3082 0.48979 0.45981 +3084 0.48201 0.40261 +3079 0.57443 0.41072 +3084 0.48201 0.40261 +3081 0.60722 0.41642 +3085 0.50010 0.39147 +3088 0.57773 0.43625 +3087 0.49303 0.42377 +3088 0.57773 0.43625 +3092 0.43694 0.48808 +3088 0.57773 0.43625 +3089 0.47279 0.53483 +3088 0.57773 0.43625 +3090 0.60310 0.57119 +3088 0.57773 0.43625 +3091 0.65520 0.48677 +3081 0.60722 0.41642 +3080 0.66944 0.44478 +3079 0.57443 0.41072 +3077 0.65124 0.44963 +3076 0.56319 0.44313 +3070 0.64584 0.46591 +3068 0.54936 0.43324 +3069 0.65270 0.47376 +3061 0.55056 0.42345 +3067 0.66128 0.47192 +3062 0.56024 0.41871 +3066 0.65941 0.49374 +3065 0.57488 0.44957 +3073 0.65621 0.54130 +3065 0.57488 0.44957 +3072 0.57669 0.50333 +3071 0.46023 0.48523 +3075 0.48729 0.52384 +SURF 0x24 +mat 0 +refs 13 +3065 0.57488 0.44957 +3071 0.46023 0.48523 +3062 0.56024 0.41871 +3064 0.43487 0.45240 +3062 0.56024 0.41871 +3063 0.42755 0.44490 +3061 0.55056 0.42345 +3074 0.43104 0.46404 +3068 0.54936 0.43324 +3078 0.40828 0.50923 +3076 0.56319 0.44313 +3082 0.48979 0.45981 +3079 0.57443 0.41072 +SURF 0x24 +mat 0 +refs 4 +3078 0.40828 0.50923 +3083 0.38690 0.51951 +3078 0.40828 0.50923 +3082 0.48979 0.45981 +SURF 0x24 +mat 0 +refs 6 +3059 0.32880 0.46158 +3060 0.39435 0.35484 +3055 0.44147 0.45599 +3056 0.46746 0.40121 +3057 0.57391 0.49456 +3058 0.57923 0.47210 +SURF 0x24 +mat 0 +refs 8 +3053 0.61164 0.32195 +3054 0.62110 0.44551 +3051 0.59117 0.33169 +3052 0.54706 0.46422 +3049 0.65707 0.35796 +3048 0.58614 0.46657 +3043 0.61810 0.33157 +3047 0.52297 0.43145 +SURF 0x24 +mat 0 +refs 7 +3050 0.68458 0.30000 +3049 0.65707 0.35796 +3045 0.66698 0.28822 +3043 0.61810 0.33157 +3045 0.66698 0.28822 +3044 0.60060 0.31651 +3046 0.66021 0.28176 +SURF 0x24 +mat 0 +refs 14 +3041 0.58855 0.22901 +3042 0.55808 0.39044 +3039 0.59317 0.25891 +3040 0.57351 0.39843 +3038 0.60428 0.30363 +3037 0.58245 0.40306 +1119 0.60387 0.32573 +3036 0.58371 0.40372 +1119 0.60387 0.32573 +3034 0.57130 0.39729 +3035 0.58889 0.31381 +3034 0.57130 0.39729 +1115 0.56709 0.29683 +3033 0.54217 0.38221 +SURF 0x24 +mat 0 +refs 11 +3031 0.17719 0.51234 +3032 0.18245 0.52127 +3031 0.17719 0.51234 +3030 0.20343 0.51998 +3029 0.19072 0.51319 +3022 0.21205 0.51389 +3024 0.19681 0.51205 +3017 0.20702 0.47991 +3024 0.19681 0.51205 +3026 0.18386 0.51283 +3025 0.18574 0.52157 +SURF 0x24 +mat 0 +refs 33 +3020 0.29804 0.49825 +3018 0.29419 0.47833 +3021 0.25329 0.51089 +3019 0.22994 0.49290 +3023 0.22564 0.52638 +3019 0.22994 0.49290 +3022 0.21205 0.51389 +3019 0.22994 0.49290 +3017 0.20702 0.47991 +3018 0.29419 0.47833 +3016 0.29592 0.45592 +3028 0.36272 0.47441 +3016 0.29592 0.45592 +3027 0.36345 0.45031 +3014 0.29428 0.44816 +3013 0.36672 0.44223 +3014 0.29428 0.44816 +3009 0.38719 0.44540 +3007 0.30262 0.46331 +3009 0.38719 0.44540 +3004 0.28686 0.45383 +3003 0.38761 0.42552 +2996 0.37315 0.39506 +3005 0.45721 0.41967 +2996 0.37315 0.39506 +2998 0.45810 0.38946 +2996 0.37315 0.39506 +2997 0.45981 0.33221 +2996 0.37315 0.39506 +2995 0.33641 0.33627 +3000 0.24225 0.37988 +3002 0.33279 0.29434 +3001 0.22510 0.33930 +SURF 0x24 +mat 0 +refs 14 +2996 0.37315 0.39506 +3000 0.24225 0.37988 +2996 0.37315 0.39506 +2999 0.27840 0.43908 +3004 0.28686 0.45383 +3008 0.18174 0.52016 +3004 0.28686 0.45383 +3006 0.24340 0.50083 +3007 0.30262 0.46331 +3010 0.22451 0.49003 +3014 0.29428 0.44816 +3015 0.20225 0.47505 +3016 0.29592 0.45592 +3017 0.20702 0.47991 +SURF 0x24 +mat 0 +refs 4 +3010 0.22451 0.49003 +3006 0.24340 0.50083 +3011 0.18964 0.52161 +3012 0.19959 0.54277 +SURF 0x24 +mat 0 +refs 7 +2994 0.41758 0.52791 +2993 0.41170 0.55935 +2994 0.41758 0.52791 +2989 0.35949 0.54078 +2992 0.36333 0.49894 +2987 0.31729 0.51343 +2991 0.30647 0.46079 +SURF 0x24 +mat 0 +refs 8 +2987 0.31729 0.51343 +2989 0.35949 0.54078 +2987 0.31729 0.51343 +2988 0.36801 0.53703 +2985 0.32058 0.50477 +2988 0.36801 0.53703 +2984 0.36493 0.50369 +2990 0.43741 0.53752 +SURF 0x24 +mat 0 +refs 22 +2986 0.25002 0.44323 +2985 0.32058 0.50477 +2983 0.28919 0.45885 +2984 0.36493 0.50369 +2983 0.28919 0.45885 +2982 0.36368 0.53990 +2981 0.29301 0.49572 +2980 0.36588 0.55976 +2979 0.29324 0.50992 +2978 0.36830 0.55768 +2977 0.28332 0.50374 +2976 0.36373 0.54149 +2975 0.25214 0.47368 +2974 0.33619 0.56608 +2973 0.20329 0.46550 +2972 0.35275 0.58203 +2971 0.20636 0.46043 +2969 0.36014 0.53910 +2970 0.24186 0.43435 +2969 0.36014 0.53910 +2968 0.29106 0.38546 +2967 0.39234 0.46070 +SURF 0x24 +mat 0 +refs 7 +2963 0.43106 0.38254 +2964 0.41954 0.39931 +2963 0.43106 0.38254 +2959 0.41514 0.39918 +2960 0.42892 0.37881 +2950 0.39218 0.38101 +2961 0.42768 0.37086 +SURF 0x24 +mat 0 +refs 22 +2959 0.41514 0.39918 +2962 0.42568 0.41536 +2950 0.39218 0.38101 +2951 0.40419 0.40133 +2948 0.37258 0.37689 +2952 0.36987 0.38953 +2949 0.23839 0.39179 +2952 0.36987 0.38953 +2954 0.25352 0.41161 +2952 0.36987 0.38953 +2953 0.36741 0.39646 +2951 0.40419 0.40133 +2953 0.36741 0.39646 +2958 0.42330 0.41291 +2955 0.36498 0.40711 +2965 0.45687 0.43103 +2955 0.36498 0.40711 +2966 0.45593 0.46277 +2955 0.36498 0.40711 +2957 0.33068 0.46087 +2954 0.25352 0.41161 +2956 0.20156 0.43661 +SURF 0x24 +mat 0 +refs 4 +2953 0.36741 0.39646 +2955 0.36498 0.40711 +2953 0.36741 0.39646 +2954 0.25352 0.41161 +SURF 0x24 +mat 0 +refs 6 +2948 0.37258 0.37689 +2949 0.23839 0.39179 +2946 0.35729 0.36888 +2945 0.23172 0.38576 +2941 0.34000 0.39207 +2944 0.20744 0.42025 +SURF 0x24 +mat 0 +refs 6 +2947 0.45838 0.38023 +2946 0.35729 0.36888 +2940 0.45857 0.37384 +2941 0.34000 0.39207 +2942 0.45919 0.35285 +2943 0.32623 0.37003 +SURF 0x24 +mat 0 +refs 7 +2938 0.28008 0.46937 +2939 0.28822 0.37610 +2936 0.27115 0.47181 +2934 0.29713 0.37494 +2936 0.27115 0.47181 +2935 0.32203 0.37630 +2937 0.30730 0.43205 +SURF 0x24 +mat 0 +refs 54 +2932 0.67270 0.42046 +2933 0.66626 0.43974 +2925 0.66664 0.41642 +2926 0.65832 0.43563 +2914 0.65013 0.40558 +2922 0.64226 0.42732 +2890 0.63144 0.39650 +2921 0.62320 0.41745 +2890 0.63144 0.39650 +2917 0.60605 0.40857 +2891 0.61530 0.38617 +2918 0.57621 0.39312 +2891 0.61530 0.38617 +2911 0.58744 0.35937 +2892 0.62670 0.35404 +2912 0.60086 0.32976 +2893 0.64012 0.32046 +2913 0.61513 0.30166 +2858 0.64886 0.29963 +2859 0.62793 0.28313 +2852 0.66353 0.29060 +2851 0.64258 0.26649 +2815 0.67974 0.28110 +2850 0.66478 0.24721 +2811 0.71216 0.27437 +2809 0.72184 0.24691 +2810 0.74710 0.28776 +2809 0.72184 0.24691 +2808 0.74275 0.28264 +2807 0.73077 0.23063 +2806 0.74247 0.27873 +2803 0.73955 0.21176 +2804 0.74237 0.27788 +2793 0.74884 0.23586 +2805 0.74193 0.28115 +2793 0.74884 0.23586 +2792 0.74077 0.28799 +2787 0.71202 0.29929 +2796 0.61252 0.30993 +2786 0.69854 0.35353 +2798 0.59961 0.34439 +2797 0.58332 0.39012 +2798 0.59961 0.34439 +2842 0.60351 0.40323 +2812 0.61876 0.36739 +2842 0.60351 0.40323 +2843 0.62458 0.37881 +2863 0.61087 0.41073 +2864 0.63047 0.38750 +2863 0.61087 0.41073 +2865 0.61866 0.42042 +2863 0.61087 0.41073 +2924 0.61010 0.43880 +2923 0.60075 0.43396 +SURF 0x24 +mat 0 +refs 13 +2797 0.58332 0.39012 +2786 0.69854 0.35353 +2794 0.69059 0.39738 +2783 0.70182 0.34418 +2791 0.69993 0.40121 +2780 0.60055 0.30408 +2781 0.60574 0.37041 +2777 0.63262 0.36881 +2782 0.59154 0.42917 +2777 0.63262 0.36881 +2775 0.61383 0.44071 +2776 0.66138 0.36705 +2774 0.63646 0.45243 +SURF 0x24 +mat 0 +refs 24 +2786 0.69854 0.35353 +2787 0.71202 0.29929 +2783 0.70182 0.34418 +2784 0.71779 0.25664 +2780 0.60055 0.30408 +2785 0.72262 0.22651 +2780 0.60055 0.30408 +2790 0.73952 0.21049 +2780 0.60055 0.30408 +2779 0.62946 0.28854 +2777 0.63262 0.36881 +2779 0.62946 0.28854 +2776 0.66138 0.36705 +2778 0.68917 0.24895 +2776 0.66138 0.36705 +2788 0.70087 0.31481 +2789 0.68318 0.38403 +2788 0.70087 0.31481 +2819 0.69815 0.39595 +2820 0.70124 0.32611 +2902 0.69857 0.37384 +2897 0.69064 0.31901 +2903 0.68746 0.32912 +2904 0.69496 0.25385 +SURF 0x24 +mat 0 +refs 12 +2897 0.69064 0.31901 +2820 0.70124 0.32611 +2897 0.69064 0.31901 +2896 0.83841 0.34273 +2899 0.83624 0.34580 +2898 0.84877 0.34384 +2901 0.84707 0.34523 +2900 0.88185 0.34806 +2929 0.88237 0.34876 +2900 0.88185 0.34806 +2930 0.90042 0.34204 +2931 0.90109 0.34186 +SURF 0x24 +mat 0 +refs 4 +2898 0.84877 0.34384 +2896 0.83841 0.34273 +2927 0.85296 0.33268 +2928 0.83843 0.33768 +SURF 0x24 +mat 0 +refs 48 +2919 0.64234 0.42736 +2909 0.65767 0.39183 +2915 0.61797 0.41474 +2908 0.64030 0.38056 +2916 0.62147 0.41655 +2906 0.64252 0.38239 +2920 0.63470 0.42340 +2906 0.64252 0.38239 +2905 0.65636 0.38967 +2876 0.66586 0.35262 +2875 0.67877 0.36042 +2853 0.68910 0.32519 +2875 0.67877 0.36042 +2874 0.69969 0.33415 +2883 0.69464 0.38775 +2857 0.70825 0.36150 +2882 0.59621 0.37664 +2845 0.60751 0.34680 +2878 0.61131 0.39090 +2844 0.62106 0.35678 +2878 0.61131 0.39090 +2877 0.62288 0.39369 +2910 0.60170 0.41743 +2877 0.62288 0.39369 +2907 0.61088 0.42240 +2877 0.62288 0.39369 +2865 0.61866 0.42042 +2877 0.62288 0.39369 +2864 0.63047 0.38750 +2877 0.62288 0.39369 +2839 0.63129 0.36075 +2844 0.62106 0.35678 +2840 0.62442 0.33738 +2845 0.60751 0.34680 +2846 0.61574 0.30508 +2857 0.70825 0.36150 +2835 0.72326 0.31073 +2874 0.69969 0.33415 +2835 0.72326 0.31073 +2853 0.68910 0.32519 +2834 0.72400 0.30478 +2853 0.68910 0.32519 +2832 0.69478 0.30991 +2876 0.66586 0.35262 +2886 0.66265 0.35257 +2876 0.66586 0.35262 +2908 0.64030 0.38056 +2906 0.64252 0.38239 +SURF 0x24 +mat 0 +refs 58 +2908 0.64030 0.38056 +2909 0.65767 0.39183 +2908 0.64030 0.38056 +2885 0.67540 0.36117 +2886 0.66265 0.35257 +2831 0.70499 0.31387 +2832 0.69478 0.30991 +2825 0.73675 0.30597 +2832 0.69478 0.30991 +2833 0.72869 0.30234 +2834 0.72400 0.30478 +2833 0.72869 0.30234 +2822 0.73804 0.29801 +2825 0.73675 0.30597 +2823 0.74261 0.30121 +2818 0.74428 0.30951 +2823 0.74261 0.30121 +2810 0.74710 0.28776 +2823 0.74261 0.30121 +2808 0.74275 0.28264 +2823 0.74261 0.30121 +2806 0.74247 0.27873 +2822 0.73804 0.29801 +2804 0.74237 0.27788 +2821 0.73188 0.29756 +2805 0.74193 0.28115 +2802 0.73276 0.30137 +2805 0.74193 0.28115 +2795 0.73941 0.30695 +2792 0.74077 0.28799 +2795 0.73941 0.30695 +2796 0.61252 0.30993 +2813 0.62623 0.34435 +2798 0.59961 0.34439 +2813 0.62623 0.34435 +2812 0.61876 0.36739 +2813 0.62623 0.34435 +2843 0.62458 0.37881 +2841 0.63168 0.35221 +2843 0.62458 0.37881 +2873 0.63720 0.35734 +2864 0.63047 0.38750 +2873 0.63720 0.35734 +2839 0.63129 0.36075 +2873 0.63720 0.35734 +2838 0.63398 0.33307 +2841 0.63168 0.35221 +2838 0.63398 0.33307 +2813 0.62623 0.34435 +2799 0.63155 0.31785 +2795 0.73941 0.30695 +2800 0.73536 0.32003 +2802 0.73276 0.30137 +2835 0.72326 0.31073 +2802 0.73276 0.30137 +2834 0.72400 0.30478 +2821 0.73188 0.29756 +2822 0.73804 0.29801 +SURF 0x24 +mat 0 +refs 12 +2835 0.72326 0.31073 +2800 0.73536 0.32003 +2846 0.61574 0.30508 +2801 0.62847 0.32396 +2840 0.62442 0.33738 +2801 0.62847 0.32396 +2839 0.63129 0.36075 +2801 0.62847 0.32396 +2838 0.63398 0.33307 +2801 0.62847 0.32396 +2799 0.63155 0.31785 +2800 0.73536 0.32003 +SURF 0x24 +mat 0 +refs 92 +2831 0.70499 0.31387 +2885 0.67540 0.36117 +2831 0.70499 0.31387 +2881 0.58471 0.34123 +2856 0.61220 0.31330 +2881 0.58471 0.34123 +2837 0.62172 0.33272 +2880 0.61010 0.36204 +2836 0.61284 0.33044 +2884 0.60565 0.36194 +2849 0.71077 0.35811 +2879 0.70357 0.38856 +2862 0.68599 0.36358 +2871 0.68075 0.39512 +2870 0.67858 0.35099 +2872 0.67450 0.38498 +2869 0.67149 0.34116 +2872 0.67450 0.38498 +2889 0.65856 0.37503 +2925 0.66664 0.41642 +2889 0.65856 0.37503 +2914 0.65013 0.40558 +2889 0.65856 0.37503 +2890 0.63144 0.39650 +2888 0.63994 0.36587 +2891 0.61530 0.38617 +2888 0.63994 0.36587 +2892 0.62670 0.35404 +2887 0.65126 0.33628 +2893 0.64012 0.32046 +2894 0.66210 0.30444 +2858 0.64886 0.29963 +2895 0.67500 0.29816 +2852 0.66353 0.29060 +2855 0.68960 0.28989 +2815 0.67974 0.28110 +2814 0.71196 0.28789 +2811 0.71216 0.27437 +2814 0.71196 0.28789 +2810 0.74710 0.28776 +2816 0.74093 0.30141 +2818 0.74428 0.30951 +2817 0.74369 0.32120 +2826 0.73992 0.32768 +2817 0.74369 0.32120 +2827 0.74278 0.33372 +2816 0.74093 0.30141 +2828 0.72942 0.31520 +2816 0.74093 0.30141 +2854 0.72110 0.30539 +2814 0.71196 0.28789 +2854 0.72110 0.30539 +2855 0.68960 0.28989 +2866 0.70503 0.29615 +2895 0.67500 0.29816 +2867 0.69162 0.30528 +2894 0.66210 0.30444 +2868 0.68243 0.31633 +2869 0.67149 0.34116 +2868 0.68243 0.31633 +2870 0.67858 0.35099 +2868 0.68243 0.31633 +2861 0.68443 0.32503 +2867 0.69162 0.30528 +2848 0.69830 0.31577 +2867 0.69162 0.30528 +2829 0.71893 0.31283 +2866 0.70503 0.29615 +2829 0.71893 0.31283 +2854 0.72110 0.30539 +2829 0.71893 0.31283 +2828 0.72942 0.31520 +2829 0.71893 0.31283 +2827 0.74278 0.33372 +2830 0.72738 0.33006 +2836 0.61284 0.33044 +2830 0.72738 0.33006 +2849 0.71077 0.35811 +2830 0.72738 0.33006 +2847 0.70577 0.32915 +2829 0.71893 0.31283 +2847 0.70577 0.32915 +2848 0.69830 0.31577 +2860 0.68754 0.33849 +2861 0.68443 0.32503 +2860 0.68754 0.33849 +2870 0.67858 0.35099 +2860 0.68754 0.33849 +2862 0.68599 0.36358 +2860 0.68754 0.33849 +2849 0.71077 0.35811 +2847 0.70577 0.32915 +SURF 0x24 +mat 0 +refs 12 +2836 0.61284 0.33044 +2827 0.74278 0.33372 +2837 0.62172 0.33272 +2826 0.73992 0.32768 +2856 0.61220 0.31330 +2826 0.73992 0.32768 +2831 0.70499 0.31387 +2824 0.74072 0.31590 +2825 0.73675 0.30597 +2824 0.74072 0.31590 +2818 0.74428 0.30951 +2826 0.73992 0.32768 +SURF 0x24 +mat 0 +refs 6 +2887 0.65126 0.33628 +2894 0.66210 0.30444 +2887 0.65126 0.33628 +2869 0.67149 0.34116 +2888 0.63994 0.36587 +2889 0.65856 0.37503 +SURF 0x24 +mat 0 +refs 14 +2772 0.65938 0.28448 +2773 0.72831 0.33061 +2770 0.67796 0.23638 +2771 0.74512 0.28650 +2768 0.69020 0.19972 +2769 0.75420 0.25756 +2766 0.70830 0.16594 +2767 0.76260 0.23657 +2764 0.71541 0.17327 +2765 0.76354 0.22858 +2760 0.70265 0.23031 +2762 0.74382 0.28169 +2761 0.67523 0.33243 +2763 0.72384 0.35245 +SURF 0x24 +mat 0 +refs 30 +2760 0.70265 0.23031 +2761 0.67523 0.33243 +2760 0.70265 0.23031 +2759 0.63500 0.31488 +2758 0.65613 0.18166 +2749 0.61741 0.30386 +2748 0.61033 0.15122 +2749 0.61741 0.30386 +2746 0.60546 0.16468 +2747 0.61259 0.30265 +2744 0.63443 0.13782 +2743 0.64340 0.28764 +2744 0.63443 0.13782 +2740 0.70656 0.19955 +2741 0.67706 0.11771 +2737 0.74861 0.19722 +2736 0.71537 0.10178 +2737 0.74861 0.19722 +2732 0.72544 0.09890 +2733 0.75480 0.20478 +2731 0.71292 0.11378 +2730 0.74000 0.23223 +2729 0.71027 0.16432 +2728 0.71477 0.31168 +2739 0.72375 0.18384 +2738 0.71502 0.36419 +2750 0.74897 0.21484 +2753 0.74760 0.35206 +2754 0.77491 0.22524 +2755 0.75868 0.35740 +SURF 0x24 +mat 0 +refs 6 +2754 0.77491 0.22524 +2756 0.77606 0.14550 +2750 0.74897 0.21484 +2751 0.72053 0.09928 +2739 0.72375 0.18384 +2752 0.66400 0.08098 +SURF 0x24 +mat 0 +refs 12 +2743 0.64340 0.28764 +2757 0.62338 0.41036 +2743 0.64340 0.28764 +2745 0.68576 0.38514 +2740 0.70656 0.19955 +2742 0.72053 0.37429 +2737 0.74861 0.19722 +2742 0.72053 0.37429 +2733 0.75480 0.20478 +2735 0.71029 0.37876 +2730 0.74000 0.23223 +2734 0.70124 0.38602 +SURF 0x24 +mat 0 +refs 51 +2703 0.37206 0.23774 +2702 0.40370 0.24970 +2701 0.37927 0.23899 +2700 0.40370 0.24679 +2693 0.37779 0.23857 +2699 0.40370 0.24814 +2692 0.37861 0.23837 +2697 0.40370 0.24752 +2698 0.38113 0.23750 +2705 0.40370 0.24595 +2706 0.38281 0.23672 +2710 0.40370 0.24386 +2711 0.38366 0.23566 +2715 0.40370 0.24236 +2716 0.38708 0.23459 +2725 0.40370 0.24017 +2726 0.39043 0.23273 +2727 0.40370 0.23820 +2722 0.39588 0.22958 +2721 0.40370 0.23274 +2722 0.39588 0.22958 +2720 0.40370 0.22188 +2722 0.39588 0.22958 +2723 0.38716 0.22188 +2726 0.39043 0.23273 +2724 0.37942 0.22188 +2716 0.38708 0.23459 +2714 0.37606 0.22188 +2711 0.38366 0.23566 +2709 0.37264 0.22188 +2706 0.38281 0.23672 +2704 0.37180 0.22188 +2698 0.38113 0.23750 +2696 0.37012 0.22188 +2692 0.37861 0.23837 +2690 0.36759 0.22188 +2693 0.37779 0.23857 +2690 0.36759 0.22188 +2691 0.36677 0.22188 +2686 0.37861 0.20539 +2684 0.37779 0.20519 +2685 0.40370 0.19829 +2684 0.37779 0.20519 +2681 0.40370 0.19737 +2678 0.37646 0.20477 +2679 0.40370 0.19618 +2676 0.37422 0.20111 +2677 0.40370 0.19376 +2676 0.37422 0.20111 +2672 0.40370 0.19284 +2675 0.37274 0.19321 +SURF 0x24 +mat 0 +refs 30 +2685 0.40370 0.19829 +2686 0.37861 0.20539 +2687 0.40370 0.20021 +2688 0.38113 0.20627 +2689 0.40370 0.20199 +2694 0.38281 0.20704 +2695 0.40370 0.20240 +2707 0.38366 0.20811 +2708 0.40370 0.20391 +2712 0.38708 0.20917 +2713 0.40370 0.20655 +2717 0.39043 0.21104 +2718 0.40370 0.21102 +2719 0.39588 0.21418 +2720 0.40370 0.22188 +2719 0.39588 0.21418 +2723 0.38716 0.22188 +2719 0.39588 0.21418 +2724 0.37942 0.22188 +2717 0.39043 0.21104 +2714 0.37606 0.22188 +2712 0.38708 0.20917 +2709 0.37264 0.22188 +2707 0.38366 0.20811 +2704 0.37180 0.22188 +2694 0.38281 0.20704 +2696 0.37012 0.22188 +2688 0.38113 0.20627 +2690 0.36759 0.22188 +2686 0.37861 0.20539 +SURF 0x24 +mat 0 +refs 15 +2681 0.40370 0.19737 +2683 0.42962 0.20519 +2681 0.40370 0.19737 +2682 0.43095 0.20477 +2679 0.40370 0.19618 +2680 0.43319 0.20111 +2677 0.40370 0.19376 +2680 0.43319 0.20111 +2672 0.40370 0.19284 +2673 0.43466 0.19321 +2671 0.40370 0.19142 +2670 0.44503 0.19229 +2668 0.40370 0.20166 +2669 0.48956 0.20087 +2667 0.50509 0.19331 +SURF 0x24 +mat 0 +refs 4 +2669 0.48956 0.20087 +2670 0.44503 0.19229 +2674 0.46985 0.20440 +2673 0.43466 0.19321 +SURF 0x24 +mat 0 +refs 5 +2664 0.27532 0.25355 +2666 0.39131 0.31104 +2664 0.27532 0.25355 +2665 0.38301 0.32503 +2663 0.22734 0.26581 +SURF 0x24 +mat 0 +refs 12 +2661 0.26487 0.39575 +2662 0.28965 0.23105 +2661 0.26487 0.39575 +2660 0.29861 0.25817 +2659 0.25896 0.43867 +2656 0.31794 0.28270 +2654 0.25981 0.45031 +2655 0.33762 0.29400 +2653 0.27114 0.44176 +2655 0.33762 0.29400 +2658 0.29868 0.41695 +2657 0.36332 0.29784 +SURF 0x24 +mat 0 +refs 5 +2650 0.62048 0.24146 +2652 0.64570 0.16202 +2650 0.62048 0.24146 +2651 0.60695 0.31580 +2649 0.60861 0.33935 +SURF 0x24 +mat 0 +refs 20 +2640 0.42474 0.65049 +2648 0.43008 0.66302 +2640 0.42474 0.65049 +2641 0.45071 0.65899 +2620 0.45463 0.64754 +2631 0.47041 0.66427 +2621 0.47737 0.65487 +2632 0.48473 0.66993 +2633 0.49423 0.66400 +2642 0.48805 0.68039 +2633 0.49423 0.66400 +2643 0.49399 0.67814 +2634 0.50809 0.66237 +2644 0.50206 0.67946 +2635 0.52101 0.66567 +2645 0.50918 0.68366 +2636 0.52806 0.67264 +2646 0.51293 0.68916 +2637 0.52655 0.68062 +2647 0.51209 0.69397 +SURF 0x24 +mat 0 +refs 20 +2611 0.42960 0.63527 +2640 0.42474 0.65049 +2611 0.42960 0.63527 +2620 0.45463 0.64754 +2612 0.46866 0.63707 +2621 0.47737 0.65487 +2622 0.49162 0.64762 +2633 0.49423 0.66400 +2622 0.49162 0.64762 +2634 0.50809 0.66237 +2623 0.50802 0.64517 +2635 0.52101 0.66567 +2624 0.52038 0.64871 +2636 0.52806 0.67264 +2625 0.52372 0.65715 +2637 0.52655 0.68062 +2626 0.51648 0.66719 +2638 0.51705 0.68656 +2627 0.50157 0.67468 +2639 0.50318 0.68819 +SURF 0x24 +mat 0 +refs 21 +2630 0.35468 0.55218 +2629 0.36822 0.47702 +2630 0.35468 0.55218 +2609 0.44280 0.50059 +2607 0.44842 0.61473 +2608 0.50224 0.51826 +2605 0.52099 0.64174 +2606 0.56164 0.53670 +2559 0.55167 0.65080 +2600 0.58756 0.51560 +2559 0.55167 0.65080 +2558 0.54922 0.64190 +2560 0.52786 0.70084 +2558 0.54922 0.64190 +2561 0.52500 0.69199 +2552 0.53406 0.59163 +2511 0.53257 0.62300 +2552 0.53406 0.59163 +2553 0.55881 0.53888 +2554 0.49014 0.47041 +2555 0.52575 0.45331 +SURF 0x24 +mat 0 +refs 10 +2554 0.49014 0.47041 +2552 0.53406 0.59163 +2557 0.50445 0.47082 +2556 0.54634 0.56178 +2602 0.49293 0.41705 +2556 0.54634 0.56178 +2601 0.57452 0.47957 +2556 0.54634 0.56178 +2558 0.54922 0.64190 +2552 0.53406 0.59163 +SURF 0x24 +mat 0 +refs 9 +2601 0.57452 0.47957 +2558 0.54922 0.64190 +2601 0.57452 0.47957 +2600 0.58756 0.51560 +2603 0.52249 0.36497 +2600 0.58756 0.51560 +2604 0.52670 0.37428 +2606 0.56164 0.53670 +2610 0.48864 0.37872 +SURF 0x24 +mat 0 +refs 19 +2628 0.48507 0.67662 +2618 0.47215 0.66886 +2627 0.50157 0.67468 +2617 0.48979 0.66437 +2626 0.51648 0.66719 +2616 0.50636 0.65489 +2625 0.52372 0.65715 +2615 0.51325 0.64407 +2624 0.52038 0.64871 +2614 0.50654 0.63560 +2623 0.50802 0.64517 +2613 0.48810 0.63284 +2622 0.49162 0.64762 +2613 0.48810 0.63284 +2612 0.46866 0.63707 +2565 0.43943 0.62609 +2611 0.42960 0.63527 +2564 0.39851 0.62482 +2619 0.39812 0.64226 +SURF 0x24 +mat 0 +refs 16 +2518 0.40824 0.61393 +2564 0.39851 0.62482 +2518 0.40824 0.61393 +2565 0.43943 0.62609 +2566 0.45190 0.62227 +2613 0.48810 0.63284 +2566 0.45190 0.62227 +2614 0.50654 0.63560 +2567 0.46538 0.62733 +2615 0.51325 0.64407 +2568 0.47072 0.63986 +2616 0.50636 0.65489 +2569 0.46988 0.65456 +2617 0.48979 0.66437 +2570 0.46005 0.66373 +2618 0.47215 0.66886 +SURF 0x24 +mat 0 +refs 15 +2570 0.46005 0.66373 +2551 0.44741 0.65912 +2569 0.46988 0.65456 +2550 0.44467 0.64200 +2568 0.47072 0.63986 +2549 0.43558 0.62467 +2567 0.46538 0.62733 +2517 0.42359 0.61375 +2566 0.45190 0.62227 +2517 0.42359 0.61375 +2518 0.40824 0.61393 +2516 0.40839 0.59852 +2519 0.39012 0.59820 +2562 0.39056 0.55903 +2563 0.39600 0.56356 +SURF 0x24 +mat 0 +refs 126 +2515 0.41198 0.55513 +2562 0.39056 0.55903 +2515 0.41198 0.55513 +2516 0.40839 0.59852 +2513 0.42389 0.59348 +2516 0.40839 0.59852 +2514 0.43589 0.62492 +2517 0.42359 0.61375 +2514 0.43589 0.62492 +2549 0.43558 0.62467 +2514 0.43589 0.62492 +2550 0.44467 0.64200 +2548 0.44020 0.64649 +2551 0.44741 0.65912 +2548 0.44020 0.64649 +2547 0.45041 0.66754 +2495 0.45344 0.64210 +2494 0.46557 0.66966 +2492 0.45167 0.63856 +2491 0.44353 0.65959 +2492 0.45167 0.63856 +2487 0.43088 0.63993 +2488 0.44493 0.60408 +2484 0.43646 0.60993 +2485 0.44398 0.58321 +2483 0.45211 0.54927 +2485 0.44398 0.58321 +2486 0.43730 0.55788 +2485 0.44398 0.58321 +2489 0.43920 0.58263 +2488 0.44493 0.60408 +2493 0.43173 0.59639 +2488 0.44493 0.60408 +2498 0.42787 0.60426 +2492 0.45167 0.63856 +2497 0.44594 0.62608 +2495 0.45344 0.64210 +2496 0.44151 0.62247 +2548 0.44020 0.64649 +2496 0.44151 0.62247 +2514 0.43589 0.62492 +2496 0.44151 0.62247 +2513 0.42389 0.59348 +2496 0.44151 0.62247 +2500 0.43067 0.60189 +2497 0.44594 0.62608 +2499 0.42885 0.60495 +2498 0.42787 0.60426 +2531 0.43702 0.61673 +2498 0.42787 0.60426 +2523 0.44546 0.60671 +2493 0.43173 0.59639 +2520 0.46492 0.59033 +2489 0.43920 0.58263 +2521 0.46241 0.58783 +2522 0.45048 0.58343 +2533 0.45769 0.58969 +2526 0.45191 0.57874 +2536 0.45312 0.58929 +2537 0.46490 0.58720 +2539 0.49214 0.60557 +2538 0.47110 0.58314 +2540 0.50502 0.59364 +2529 0.48171 0.58408 +2571 0.50449 0.59212 +2572 0.47793 0.60528 +2594 0.50581 0.61583 +2596 0.46896 0.62502 +2595 0.51380 0.63303 +2597 0.46232 0.62992 +2588 0.51568 0.64048 +2587 0.50570 0.63434 +2588 0.51568 0.64048 +2586 0.56442 0.63803 +2595 0.51380 0.63303 +2593 0.54972 0.62932 +2594 0.50581 0.61583 +2592 0.53475 0.60379 +2571 0.50449 0.59212 +2592 0.53475 0.60379 +2540 0.50502 0.59364 +2542 0.53239 0.60677 +2539 0.49214 0.60557 +2541 0.51487 0.62266 +2539 0.49214 0.60557 +2574 0.48466 0.60836 +2536 0.45312 0.58929 +2534 0.48457 0.60677 +2533 0.45769 0.58969 +2534 0.48457 0.60677 +2521 0.46241 0.58783 +2535 0.48676 0.59810 +2520 0.46492 0.59033 +2576 0.47639 0.59465 +2520 0.46492 0.59033 +2575 0.45881 0.61081 +2523 0.44546 0.60671 +2579 0.44494 0.62062 +2531 0.43702 0.61673 +2532 0.43778 0.61837 +2499 0.42885 0.60495 +2532 0.43778 0.61837 +2500 0.43067 0.60189 +2530 0.44499 0.61413 +2500 0.43067 0.60189 +2527 0.43209 0.59145 +2513 0.42389 0.59348 +2524 0.43802 0.57883 +2515 0.41198 0.55513 +2524 0.43802 0.57883 +2486 0.43730 0.55788 +2490 0.44149 0.57628 +2489 0.43920 0.58263 +2490 0.44149 0.57628 +2522 0.45048 0.58343 +2490 0.44149 0.57628 +2526 0.45191 0.57874 +2525 0.45871 0.58019 +2537 0.46490 0.58720 +2525 0.45871 0.58019 +2538 0.47110 0.58314 +2525 0.45871 0.58019 +2529 0.48171 0.58408 +2525 0.45871 0.58019 +2524 0.43802 0.57883 +2490 0.44149 0.57628 +SURF 0x24 +mat 0 +refs 26 +2512 0.49153 0.69164 +2511 0.53257 0.62300 +2510 0.52742 0.69658 +2509 0.58010 0.61939 +2510 0.52742 0.69658 +2507 0.60196 0.61812 +2508 0.54740 0.69642 +2505 0.59892 0.60989 +2506 0.54558 0.69380 +2503 0.60571 0.60198 +2504 0.52900 0.69670 +2481 0.62260 0.60500 +2482 0.55066 0.72659 +2479 0.62999 0.62233 +2480 0.56822 0.71175 +2477 0.58640 0.61422 +2478 0.52626 0.70002 +2477 0.58640 0.61422 +2476 0.45155 0.66000 +2475 0.49541 0.57470 +2484 0.43646 0.60993 +2475 0.49541 0.57470 +2483 0.45211 0.54927 +2475 0.49541 0.57470 +2502 0.46074 0.48384 +2501 0.51280 0.44054 +SURF 0x24 +mat 0 +refs 24 +2469 0.45958 0.61816 +2468 0.43695 0.59666 +2470 0.47685 0.57113 +2467 0.45526 0.53904 +2470 0.47685 0.57113 +2471 0.44512 0.54063 +2472 0.47566 0.56853 +2471 0.44512 0.54063 +2474 0.46530 0.59943 +2471 0.44512 0.54063 +2473 0.41541 0.57437 +2463 0.43151 0.52088 +2462 0.39418 0.56645 +2458 0.42403 0.50558 +2459 0.36326 0.52615 +2452 0.42024 0.48474 +2453 0.35510 0.47980 +2452 0.42024 0.48474 +2451 0.35373 0.45676 +2452 0.42024 0.48474 +2447 0.42017 0.47538 +2448 0.45247 0.48444 +2449 0.42510 0.46742 +2450 0.45087 0.47289 +SURF 0x24 +mat 0 +refs 23 +2463 0.43151 0.52088 +2471 0.44512 0.54063 +2463 0.43151 0.52088 +2467 0.45526 0.53904 +2464 0.44472 0.51631 +2468 0.43695 0.59666 +2464 0.44472 0.51631 +2465 0.43592 0.58349 +2464 0.44472 0.51631 +2461 0.44299 0.56495 +2460 0.44289 0.50719 +2456 0.46509 0.53592 +2454 0.44510 0.49347 +2455 0.48178 0.49266 +2454 0.44510 0.49347 +2448 0.45247 0.48444 +2454 0.44510 0.49347 +2452 0.42024 0.48474 +2454 0.44510 0.49347 +2458 0.42403 0.50558 +2460 0.44289 0.50719 +2463 0.43151 0.52088 +2464 0.44472 0.51631 +SURF 0x24 +mat 0 +refs 4 +2455 0.48178 0.49266 +2456 0.46509 0.53592 +2457 0.52212 0.50397 +2466 0.47545 0.61563 +SURF 0x24 +mat 0 +refs 15 +2436 0.46797 0.49030 +2445 0.42797 0.45014 +2436 0.46797 0.49030 +2446 0.41420 0.46474 +2435 0.46636 0.51126 +2443 0.40188 0.48009 +2434 0.45889 0.52693 +2444 0.39325 0.49482 +2433 0.44458 0.53527 +2442 0.37421 0.53486 +2432 0.41630 0.57651 +2437 0.34491 0.58224 +2431 0.39237 0.62931 +2438 0.33048 0.59896 +2439 0.38062 0.64584 +SURF 0x24 +mat 0 +refs 17 +2431 0.39237 0.62931 +2425 0.43241 0.65295 +2432 0.41630 0.57651 +2422 0.45651 0.59974 +2433 0.44458 0.53527 +2426 0.49952 0.55971 +2434 0.45889 0.52693 +2427 0.49506 0.54238 +2435 0.46636 0.51126 +2429 0.49476 0.52911 +2436 0.46797 0.49030 +2429 0.49476 0.52911 +2428 0.49641 0.51520 +2406 0.52574 0.53503 +2428 0.49641 0.51520 +2405 0.53459 0.51652 +2430 0.50330 0.49306 +SURF 0x24 +mat 0 +refs 34 +2403 0.55558 0.53273 +2405 0.53459 0.51652 +2403 0.55558 0.53273 +2406 0.52574 0.53503 +2404 0.54452 0.54377 +2410 0.53551 0.54429 +2411 0.53285 0.54905 +2416 0.49018 0.51392 +2412 0.52207 0.55785 +2413 0.52334 0.56795 +2399 0.53237 0.58279 +2413 0.52334 0.56795 +2415 0.51398 0.55690 +2416 0.49018 0.51392 +2409 0.50280 0.53007 +2416 0.49018 0.51392 +2408 0.52046 0.53276 +2410 0.53551 0.54429 +2408 0.52046 0.53276 +2406 0.52574 0.53503 +2407 0.50253 0.53153 +2429 0.49476 0.52911 +2407 0.50253 0.53153 +2427 0.49506 0.54238 +2414 0.51934 0.57222 +2426 0.49952 0.55971 +2417 0.51705 0.58108 +2422 0.45651 0.59974 +2418 0.48524 0.60470 +2421 0.47135 0.64471 +2418 0.48524 0.60470 +2420 0.48567 0.63475 +2419 0.50223 0.61228 +2423 0.50020 0.63619 +SURF 0x24 +mat 0 +refs 14 +2418 0.48524 0.60470 +2419 0.50223 0.61228 +2418 0.48524 0.60470 +2400 0.53369 0.59661 +2417 0.51705 0.58108 +2400 0.53369 0.59661 +2414 0.51934 0.57222 +2399 0.53237 0.58279 +2414 0.51934 0.57222 +2415 0.51398 0.55690 +2414 0.51934 0.57222 +2409 0.50280 0.53007 +2407 0.50253 0.53153 +2408 0.52046 0.53276 +SURF 0x24 +mat 0 +refs 7 +2422 0.45651 0.59974 +2425 0.43241 0.65295 +2421 0.47135 0.64471 +2424 0.46271 0.66227 +2421 0.47135 0.64471 +2440 0.48039 0.67107 +2441 0.49555 0.66602 +SURF 0x24 +mat 0 +refs 22 +2402 0.57395 0.53320 +2403 0.55558 0.53273 +2401 0.54707 0.55903 +2404 0.54452 0.54377 +2401 0.54707 0.55903 +2411 0.53285 0.54905 +2401 0.54707 0.55903 +2412 0.52207 0.55785 +2397 0.53008 0.57315 +2399 0.53237 0.58279 +2397 0.53008 0.57315 +2400 0.53369 0.59661 +2397 0.53008 0.57315 +2398 0.53414 0.58956 +2394 0.55979 0.59041 +2393 0.54991 0.60456 +2394 0.55979 0.59041 +2388 0.56261 0.62664 +2390 0.57964 0.60294 +2389 0.57829 0.63353 +2391 0.61488 0.60121 +2392 0.63624 0.60194 +SURF 0x24 +mat 0 +refs 6 +2390 0.57964 0.60294 +2396 0.60298 0.58705 +2394 0.55979 0.59041 +2395 0.57320 0.57225 +2397 0.53008 0.57315 +2401 0.54707 0.55903 +SURF 0x24 +mat 0 +refs 28 +2378 0.58206 0.37475 +2373 0.58964 0.35757 +2377 0.59699 0.38248 +2376 0.61088 0.36022 +2379 0.59878 0.38340 +2380 0.61757 0.35305 +2384 0.57076 0.36890 +2382 0.58882 0.33605 +2386 0.54805 0.35714 +2382 0.58882 0.33605 +2385 0.56338 0.32162 +2382 0.58882 0.33605 +2387 0.58111 0.29096 +2382 0.58882 0.33605 +2383 0.49042 0.27101 +2382 0.58882 0.33605 +2381 0.51581 0.29183 +2380 0.61757 0.35305 +2375 0.51136 0.29172 +2376 0.61088 0.36022 +2375 0.51136 0.29172 +2373 0.58964 0.35757 +2374 0.60928 0.31835 +2373 0.58964 0.35757 +2372 0.58645 0.32490 +2371 0.57841 0.35024 +2370 0.58021 0.31476 +2369 0.57235 0.34620 +SURF 0x24 +mat 0 +refs 8 +2367 0.23585 0.46758 +2368 0.24081 0.51436 +2367 0.23585 0.46758 +2364 0.21832 0.52335 +2363 0.21063 0.47673 +2364 0.21832 0.52335 +2365 0.21737 0.47574 +2366 0.23032 0.51385 +SURF 0x24 +mat 0 +refs 11 +2361 0.65014 0.45137 +2362 0.66137 0.43109 +2361 0.65014 0.45137 +2354 0.63973 0.39693 +2357 0.62734 0.42122 +2354 0.63973 0.39693 +2356 0.59632 0.37378 +2355 0.62088 0.36054 +2356 0.59632 0.37378 +2358 0.60086 0.31634 +2360 0.57408 0.33196 +SURF 0x24 +mat 0 +refs 7 +2359 0.65305 0.28591 +2358 0.60086 0.31634 +2359 0.65305 0.28591 +2355 0.62088 0.36054 +2353 0.66597 0.31906 +2354 0.63973 0.39693 +2352 0.68085 0.34796 +SURF 0x24 +mat 0 +refs 10 +2351 0.58656 0.27774 +2350 0.54544 0.32671 +2351 0.58656 0.27774 +2345 0.56708 0.36087 +2344 0.60223 0.30509 +2345 0.56708 0.36087 +2346 0.61595 0.32296 +2347 0.59297 0.39019 +2348 0.51505 0.30674 +2349 0.49388 0.37822 +SURF 0x24 +mat 0 +refs 5 +2341 0.54432 0.38043 +2343 0.59519 0.32231 +2341 0.54432 0.38043 +2342 0.53819 0.32488 +2340 0.51177 0.38241 +SURF 0x24 +mat 0 +refs 17 +2334 0.54041 0.35319 +2330 0.56207 0.31945 +2335 0.57036 0.36869 +2331 0.58370 0.34445 +2336 0.59736 0.38267 +2332 0.60783 0.36480 +2337 0.61749 0.39309 +2332 0.60783 0.36480 +2338 0.50741 0.34721 +2332 0.60783 0.36480 +2339 0.51702 0.32068 +2332 0.60783 0.36480 +2333 0.50192 0.30643 +2331 0.58370 0.34445 +2329 0.60035 0.31753 +2330 0.56207 0.31945 +2328 0.58448 0.29021 +SURF 0x24 +mat 0 +refs 17 +2327 0.76529 0.33357 +2324 0.75011 0.33062 +2326 0.75736 0.25431 +2320 0.72220 0.23672 +2325 0.76469 0.18684 +2320 0.72220 0.23672 +2321 0.69588 0.13174 +2318 0.69128 0.24902 +2319 0.64156 0.15456 +2318 0.69128 0.24902 +2316 0.61887 0.23054 +2317 0.64323 0.28873 +2316 0.61887 0.23054 +2313 0.62633 0.30476 +2316 0.61887 0.23054 +2314 0.60086 0.23968 +2315 0.58804 0.21498 +SURF 0x24 +mat 0 +refs 13 +2313 0.62633 0.30476 +2312 0.62149 0.33488 +2314 0.60086 0.23968 +2309 0.63413 0.26649 +2314 0.60086 0.23968 +2308 0.61700 0.24333 +2307 0.58577 0.21941 +2308 0.61700 0.24333 +2304 0.57181 0.26966 +2306 0.64325 0.29000 +2304 0.57181 0.26966 +2305 0.63448 0.30887 +2303 0.62554 0.32515 +SURF 0x24 +mat 0 +refs 7 +2306 0.64325 0.29000 +2308 0.61700 0.24333 +2306 0.64325 0.29000 +2309 0.63413 0.26649 +2310 0.65255 0.31410 +2312 0.62149 0.33488 +2311 0.61572 0.37753 +SURF 0x24 +mat 0 +refs 7 +2322 0.64952 0.39888 +2317 0.64323 0.28873 +2322 0.64952 0.39888 +2318 0.69128 0.24902 +2323 0.70924 0.35929 +2320 0.72220 0.23672 +2324 0.75011 0.33062 +SURF 0x24 +mat 0 +refs 5 +2300 0.60606 0.45263 +2302 0.63248 0.39509 +2300 0.60606 0.45263 +2301 0.60934 0.37695 +2299 0.58817 0.44844 +SURF 0x24 +mat 0 +refs 5 +2296 0.28163 0.54352 +2298 0.26377 0.51878 +2296 0.28163 0.54352 +2297 0.25570 0.45867 +2295 0.23499 0.51988 +SURF 0x24 +mat 0 +refs 18 +2294 0.57323 0.48753 +2293 0.59496 0.51782 +2294 0.57323 0.48753 +2291 0.61178 0.49385 +2290 0.56927 0.45516 +2291 0.61178 0.49385 +2288 0.61765 0.43570 +2285 0.63067 0.46649 +2289 0.59583 0.42296 +2285 0.63067 0.46649 +2283 0.62180 0.43296 +2284 0.64306 0.49185 +2283 0.62180 0.43296 +2282 0.64639 0.45673 +2283 0.62180 0.43296 +2287 0.65016 0.43569 +2286 0.60291 0.40405 +2292 0.67590 0.37306 +SURF 0x24 +mat 0 +refs 24 +2280 0.35794 0.33174 +2281 0.32745 0.39458 +2278 0.37824 0.34462 +2279 0.34433 0.40508 +2274 0.38104 0.34637 +2275 0.33116 0.42107 +2268 0.38866 0.35121 +2269 0.33644 0.42801 +2268 0.38866 0.35121 +2267 0.35679 0.44093 +2266 0.40688 0.36276 +2263 0.37679 0.45031 +2261 0.42782 0.37605 +2262 0.43033 0.46573 +2260 0.47139 0.40368 +2265 0.47402 0.47325 +2264 0.50346 0.42402 +2265 0.47402 0.47325 +2270 0.51515 0.43143 +2271 0.49052 0.47759 +2272 0.53463 0.44379 +2273 0.50864 0.48530 +2276 0.55332 0.45564 +2277 0.52641 0.49462 +SURF 0x24 +mat 0 +refs 14 +2258 0.51145 0.30020 +2259 0.49725 0.35896 +2258 0.51145 0.30020 +2256 0.59331 0.38055 +2257 0.60563 0.33099 +2256 0.59331 0.38055 +2255 0.59630 0.32717 +2254 0.58036 0.37385 +2253 0.48903 0.31991 +2252 0.59188 0.37981 +2251 0.50922 0.33301 +2250 0.61311 0.39080 +2249 0.51658 0.34051 +2248 0.50646 0.36375 +SURF 0x24 +mat 0 +refs 29 +2246 0.51223 0.48035 +2247 0.52471 0.48525 +2246 0.51223 0.48035 +2239 0.52078 0.50361 +2238 0.50984 0.50054 +2222 0.50138 0.51903 +2238 0.50984 0.50054 +2223 0.49420 0.51785 +2237 0.50122 0.49813 +2236 0.47473 0.51451 +2244 0.48382 0.49325 +2211 0.45487 0.50839 +2245 0.46315 0.48745 +2211 0.45487 0.50839 +2243 0.44455 0.48224 +2210 0.43603 0.50493 +2242 0.41219 0.47317 +2210 0.43603 0.50493 +2231 0.39737 0.50551 +2209 0.42243 0.53619 +2230 0.38698 0.53631 +2212 0.40933 0.56990 +2233 0.37823 0.56659 +2213 0.40150 0.59109 +2232 0.37495 0.58887 +2215 0.40607 0.60769 +2234 0.37430 0.61102 +2217 0.41143 0.62571 +2235 0.37737 0.64027 +SURF 0x24 +mat 0 +refs 65 +2172 0.57914 0.51995 +2127 0.54381 0.58534 +2126 0.55497 0.51318 +2125 0.52504 0.56607 +2124 0.53297 0.50701 +2125 0.52504 0.56607 +2122 0.50897 0.54967 +2123 0.47619 0.61079 +2122 0.50897 0.54967 +2119 0.47062 0.59466 +2122 0.50897 0.54967 +2129 0.49863 0.54813 +2124 0.53297 0.50701 +2129 0.49863 0.54813 +2152 0.51893 0.50307 +2144 0.52181 0.53627 +2151 0.53142 0.50657 +2137 0.54601 0.54035 +2149 0.55444 0.51303 +2106 0.55651 0.53989 +2107 0.56497 0.51600 +2106 0.55651 0.53989 +2095 0.57510 0.51884 +2099 0.56881 0.53812 +2100 0.56448 0.53136 +2120 0.55366 0.56054 +2101 0.55438 0.52874 +2133 0.54330 0.55469 +2102 0.53282 0.52847 +2138 0.52254 0.55480 +2104 0.50130 0.52688 +2130 0.49510 0.55792 +2131 0.46843 0.53039 +2132 0.46485 0.56706 +2155 0.45009 0.56396 +2156 0.44836 0.59986 +2159 0.44209 0.61492 +2177 0.45995 0.63859 +2173 0.46172 0.64358 +2164 0.46559 0.65313 +2173 0.46172 0.64358 +2168 0.47008 0.64643 +2159 0.44209 0.61492 +2174 0.45225 0.61898 +2159 0.44209 0.61492 +2158 0.44771 0.56180 +2155 0.45009 0.56396 +2176 0.45048 0.52609 +2155 0.45009 0.56396 +2153 0.45335 0.52626 +2131 0.46843 0.53039 +2150 0.47562 0.49095 +2131 0.46843 0.53039 +2105 0.50809 0.50005 +2104 0.50130 0.52688 +2103 0.53736 0.50826 +2102 0.53282 0.52847 +2097 0.55919 0.51438 +2101 0.55438 0.52874 +2093 0.56862 0.51702 +2100 0.56448 0.53136 +2093 0.56862 0.51702 +2095 0.57510 0.51884 +2094 0.57254 0.50262 +2096 0.57975 0.49911 +SURF 0x24 +mat 0 +refs 4 +2094 0.57254 0.50262 +2093 0.56862 0.51702 +2098 0.56254 0.49961 +2097 0.55919 0.51438 +SURF 0x24 +mat 0 +refs 107 +2150 0.47562 0.49095 +2153 0.45335 0.52626 +2154 0.46127 0.48692 +2176 0.45048 0.52609 +2184 0.45748 0.48586 +2185 0.47086 0.52970 +2186 0.48390 0.49327 +2221 0.49931 0.53651 +2220 0.50853 0.50017 +2226 0.53193 0.54370 +2241 0.53890 0.50869 +2227 0.53193 0.53390 +2240 0.53697 0.50815 +2229 0.51459 0.52134 +2239 0.52078 0.50361 +2229 0.51459 0.52134 +2222 0.50138 0.51903 +2198 0.48998 0.54304 +2222 0.50138 0.51903 +2197 0.47849 0.54620 +2223 0.49420 0.51785 +2206 0.46005 0.54260 +2236 0.47473 0.51451 +2206 0.46005 0.54260 +2211 0.45487 0.50839 +2207 0.44019 0.53658 +2210 0.43603 0.50493 +2207 0.44019 0.53658 +2209 0.42243 0.53619 +2208 0.42827 0.56593 +2212 0.40933 0.56990 +2214 0.41446 0.59661 +2213 0.40150 0.59109 +2216 0.41961 0.61000 +2215 0.40607 0.60769 +2218 0.42464 0.62601 +2217 0.41143 0.62571 +2188 0.43962 0.64272 +2219 0.43054 0.65275 +2188 0.43962 0.64272 +2178 0.46522 0.66680 +2179 0.47002 0.65261 +2167 0.47799 0.64898 +2171 0.48554 0.64003 +2170 0.48721 0.63272 +2171 0.48554 0.64003 +2180 0.49342 0.63026 +2179 0.47002 0.65261 +2181 0.47102 0.63468 +2179 0.47002 0.65261 +2187 0.45825 0.63618 +2188 0.43962 0.64272 +2187 0.45825 0.63618 +2218 0.42464 0.62601 +2189 0.44020 0.63196 +2216 0.41961 0.61000 +2192 0.43662 0.61614 +2214 0.41446 0.59661 +2194 0.43744 0.60178 +2214 0.41446 0.59661 +2196 0.44639 0.57617 +2208 0.42827 0.56593 +2196 0.44639 0.57617 +2207 0.44019 0.53658 +2196 0.44639 0.57617 +2206 0.46005 0.54260 +2196 0.44639 0.57617 +2197 0.47849 0.54620 +2195 0.45828 0.57383 +2198 0.48998 0.54304 +2199 0.47229 0.56968 +2198 0.48998 0.54304 +2201 0.50218 0.56341 +2229 0.51459 0.52134 +2205 0.51940 0.57199 +2227 0.53193 0.53390 +2205 0.51940 0.57199 +2226 0.53193 0.54370 +2203 0.52273 0.57495 +2221 0.49931 0.53651 +2202 0.48996 0.57284 +2221 0.49931 0.53651 +2175 0.46290 0.56421 +2185 0.47086 0.52970 +2175 0.46290 0.56421 +2176 0.45048 0.52609 +2175 0.46290 0.56421 +2158 0.44771 0.56180 +2175 0.46290 0.56421 +2174 0.45225 0.61898 +2202 0.48996 0.57284 +2182 0.49100 0.61202 +2202 0.48996 0.57284 +2183 0.51120 0.60432 +2203 0.52273 0.57495 +2204 0.50316 0.59992 +2205 0.51940 0.57199 +2200 0.48667 0.59058 +2201 0.50218 0.56341 +2200 0.48667 0.59058 +2199 0.47229 0.56968 +2224 0.45630 0.58908 +2195 0.45828 0.57383 +2193 0.44484 0.59679 +2195 0.45828 0.57383 +2194 0.43744 0.60178 +2196 0.44639 0.57617 +SURF 0x24 +mat 0 +refs 21 +2192 0.43662 0.61614 +2194 0.43744 0.60178 +2192 0.43662 0.61614 +2193 0.44484 0.59679 +2191 0.44866 0.61303 +2224 0.45630 0.58908 +2228 0.46325 0.60834 +2200 0.48667 0.59058 +2225 0.47967 0.62243 +2204 0.50316 0.59992 +2180 0.49342 0.63026 +2183 0.51120 0.60432 +2170 0.48721 0.63272 +2182 0.49100 0.61202 +2170 0.48721 0.63272 +2174 0.45225 0.61898 +2169 0.47976 0.64187 +2168 0.47008 0.64643 +2169 0.47976 0.64187 +2167 0.47799 0.64898 +2170 0.48721 0.63272 +SURF 0x24 +mat 0 +refs 47 +2118 0.42256 0.66955 +2117 0.44744 0.63444 +2119 0.47062 0.59466 +2116 0.47461 0.58559 +2129 0.49863 0.54813 +2116 0.47461 0.58559 +2144 0.52181 0.53627 +2115 0.50301 0.58070 +2137 0.54601 0.54035 +2112 0.53271 0.57695 +2137 0.54601 0.54035 +2109 0.54475 0.57258 +2106 0.55651 0.53989 +2108 0.55499 0.57025 +2099 0.56881 0.53812 +2108 0.55499 0.57025 +2120 0.55366 0.56054 +2121 0.53733 0.59036 +2120 0.55366 0.56054 +2135 0.52715 0.58628 +2133 0.54330 0.55469 +2140 0.51043 0.58433 +2138 0.52254 0.55480 +2146 0.48714 0.58639 +2130 0.49510 0.55792 +2157 0.46222 0.60054 +2132 0.46485 0.56706 +2157 0.46222 0.60054 +2156 0.44836 0.59986 +2145 0.46347 0.63374 +2177 0.45995 0.63859 +2147 0.46402 0.64707 +2177 0.45995 0.63859 +2161 0.46078 0.64925 +2164 0.46559 0.65313 +2162 0.45502 0.67080 +2164 0.46559 0.65313 +2163 0.45567 0.67024 +2165 0.47111 0.65390 +2166 0.45855 0.66757 +2165 0.47111 0.65390 +2178 0.46522 0.66680 +2165 0.47111 0.65390 +2167 0.47799 0.64898 +2165 0.47111 0.65390 +2168 0.47008 0.64643 +2164 0.46559 0.65313 +SURF 0x24 +mat 0 +refs 31 +2162 0.45502 0.67080 +2161 0.46078 0.64925 +2160 0.45693 0.66810 +2147 0.46402 0.64707 +2160 0.45693 0.66810 +2142 0.47269 0.64752 +2148 0.46075 0.66231 +2114 0.48894 0.61470 +2117 0.44744 0.63444 +2114 0.48894 0.61470 +2116 0.47461 0.58559 +2114 0.48894 0.61470 +2115 0.50301 0.58070 +2113 0.52244 0.59890 +2112 0.53271 0.57695 +2113 0.52244 0.59890 +2109 0.54475 0.57258 +2111 0.53179 0.59686 +2110 0.53932 0.59688 +2128 0.52041 0.61243 +2121 0.53733 0.59036 +2136 0.51016 0.61532 +2121 0.53733 0.59036 +2134 0.51636 0.60275 +2135 0.52715 0.58628 +2134 0.51636 0.60275 +2140 0.51043 0.58433 +2139 0.48797 0.62044 +2146 0.48714 0.58639 +2145 0.46347 0.63374 +2157 0.46222 0.60054 +SURF 0x24 +mat 0 +refs 12 +2134 0.51636 0.60275 +2136 0.51016 0.61532 +2139 0.48797 0.62044 +2141 0.47865 0.63520 +2145 0.46347 0.63374 +2141 0.47865 0.63520 +2147 0.46402 0.64707 +2141 0.47865 0.63520 +2142 0.47269 0.64752 +2141 0.47865 0.63520 +2143 0.50824 0.62189 +2136 0.51016 0.61532 +SURF 0x24 +mat 0 +refs 4 +2143 0.50824 0.62189 +2113 0.52244 0.59890 +2142 0.47269 0.64752 +2114 0.48894 0.61470 +SURF 0x24 +mat 0 +refs 4 +2121 0.53733 0.59036 +2108 0.55499 0.57025 +2110 0.53932 0.59688 +2109 0.54475 0.57258 +SURF 0x24 +mat 0 +refs 17 +2089 0.31738 0.47678 +2088 0.31388 0.47719 +2081 0.32295 0.46827 +2087 0.31051 0.47938 +2081 0.32295 0.46827 +2086 0.30890 0.48221 +2081 0.32295 0.46827 +2085 0.30962 0.48467 +2081 0.32295 0.46827 +2084 0.31225 0.48592 +2081 0.32295 0.46827 +2083 0.31585 0.48533 +2081 0.32295 0.46827 +2082 0.31890 0.48340 +2081 0.32295 0.46827 +2079 0.32034 0.48086 +2080 0.31976 0.47831 +SURF 0x24 +mat 0 +refs 17 +2078 0.31732 0.56333 +2077 0.33044 0.56976 +2078 0.31732 0.56333 +2075 0.32941 0.58318 +2076 0.32077 0.56847 +2072 0.32774 0.59621 +2073 0.32532 0.58125 +2067 0.32375 0.61075 +2073 0.32532 0.58125 +2068 0.32451 0.59832 +2074 0.33145 0.57290 +2068 0.32451 0.59832 +2069 0.33169 0.59330 +2063 0.32201 0.60931 +2065 0.33010 0.60861 +2064 0.31572 0.61496 +2066 0.32093 0.61463 +SURF 0x24 +mat 0 +refs 10 +2062 0.31129 0.62076 +2064 0.31572 0.61496 +2062 0.31129 0.62076 +2063 0.32201 0.60931 +2061 0.31720 0.61798 +2068 0.32451 0.59832 +2061 0.31720 0.61798 +2067 0.32375 0.61075 +2071 0.31751 0.63131 +2070 0.33008 0.62611 +SURF 0x24 +mat 0 +refs 5 +2058 0.31914 0.50286 +2060 0.31355 0.50397 +2058 0.31914 0.50286 +2059 0.32571 0.49684 +2057 0.33635 0.49334 +SURF 0x24 +mat 0 +refs 10 +2055 0.37468 0.52044 +2056 0.35291 0.48853 +2053 0.36959 0.52473 +2054 0.35035 0.48992 +2049 0.36471 0.52438 +2050 0.34794 0.48906 +2046 0.36180 0.51949 +2051 0.34660 0.48609 +2048 0.36193 0.51160 +2052 0.34681 0.48207 +SURF 0x24 +mat 0 +refs 5 +2046 0.36180 0.51949 +2048 0.36193 0.51160 +2046 0.36180 0.51949 +2047 0.36956 0.51494 +2045 0.37259 0.52856 +SURF 0x24 +mat 0 +refs 17 +2043 0.18822 0.50796 +2042 0.17809 0.54524 +2041 0.19176 0.50710 +2040 0.18604 0.54299 +2039 0.19465 0.50495 +2038 0.19256 0.53806 +2037 0.19589 0.50230 +2036 0.19504 0.53221 +2035 0.19512 0.49980 +2034 0.19210 0.52789 +2033 0.19263 0.49846 +2032 0.18485 0.52704 +2044 0.18917 0.49914 +2032 0.18485 0.52704 +2030 0.17653 0.52980 +2031 0.19026 0.53071 +2029 0.17895 0.53778 +SURF 0x24 +mat 0 +refs 5 +2026 0.31470 0.60118 +2028 0.32784 0.60474 +2026 0.31470 0.60118 +2027 0.33154 0.58534 +2025 0.31386 0.59065 +SURF 0x24 +mat 0 +refs 17 +2024 0.51445 0.23334 +2023 0.47992 0.27039 +2022 0.54353 0.24195 +2021 0.49625 0.27487 +2020 0.56465 0.25001 +2014 0.52267 0.28289 +2018 0.57266 0.25082 +2015 0.53193 0.28537 +2019 0.51924 0.23196 +2015 0.53193 0.28537 +2017 0.49141 0.26691 +2015 0.53193 0.28537 +2016 0.44824 0.32132 +2015 0.53193 0.28537 +2013 0.47485 0.33140 +2014 0.52267 0.28289 +2012 0.46566 0.32437 +SURF 0x24 +mat 0 +refs 20 +2010 0.54544 0.41939 +2011 0.60246 0.37791 +2010 0.54544 0.41939 +2008 0.57603 0.36990 +2009 0.53448 0.41106 +2008 0.57603 0.36990 +2000 0.52656 0.40318 +1999 0.55970 0.36541 +1996 0.51487 0.35106 +2004 0.59423 0.32836 +1996 0.51487 0.35106 +2002 0.54985 0.31226 +1995 0.48341 0.32954 +2002 0.54985 0.31226 +2001 0.50306 0.28913 +2006 0.59486 0.24259 +2001 0.50306 0.28913 +2005 0.53887 0.22376 +2003 0.44947 0.25248 +2007 0.46321 0.19024 +SURF 0x24 +mat 0 +refs 8 +2001 0.50306 0.28913 +2003 0.44947 0.25248 +2001 0.50306 0.28913 +1998 0.44824 0.30571 +1995 0.48341 0.32954 +1998 0.44824 0.30571 +1993 0.46628 0.37158 +1997 0.45191 0.36750 +SURF 0x24 +mat 0 +refs 6 +1995 0.48341 0.32954 +1993 0.46628 0.37158 +1995 0.48341 0.32954 +1994 0.49218 0.38176 +1996 0.51487 0.35106 +2000 0.52656 0.40318 +SURF 0x24 +mat 0 +refs 17 +1992 0.48094 0.19855 +1991 0.54718 0.25921 +1992 0.48094 0.19855 +1989 0.52795 0.30814 +1990 0.46845 0.26258 +1984 0.51473 0.34544 +1986 0.46254 0.30969 +1984 0.51473 0.34544 +1987 0.45456 0.37664 +1984 0.51473 0.34544 +1985 0.49479 0.39897 +1984 0.51473 0.34544 +1983 0.52802 0.41635 +1984 0.51473 0.34544 +1982 0.57119 0.36193 +1989 0.52795 0.30814 +1988 0.59902 0.32698 +SURF 0x24 +mat 0 +refs 5 +1979 0.37907 0.40751 +1981 0.42981 0.31360 +1979 0.37907 0.40751 +1980 0.47082 0.35612 +1978 0.41631 0.47629 +SURF 0x24 +mat 0 +refs 5 +1975 0.69258 0.46949 +1977 0.67697 0.41316 +1975 0.69258 0.46949 +1976 0.63295 0.46408 +1974 0.60971 0.56421 +SURF 0x24 +mat 0 +refs 96 +1960 0.39785 0.26170 +1973 0.37261 0.25144 +1960 0.39785 0.26170 +1965 0.38595 0.22050 +1961 0.40740 0.24119 +1962 0.42238 0.21707 +1947 0.43145 0.22451 +1962 0.42238 0.21707 +1963 0.46138 0.18554 +1971 0.44686 0.16721 +1972 0.46549 0.17878 +1971 0.44686 0.16721 +1958 0.45064 0.16251 +1968 0.43399 0.13622 +1958 0.45064 0.16251 +1957 0.43831 0.13144 +1956 0.45286 0.16622 +1955 0.43859 0.13963 +1932 0.43850 0.20224 +1953 0.41842 0.18460 +1940 0.40810 0.20552 +1942 0.37815 0.18704 +1940 0.40810 0.20552 +1941 0.36790 0.20791 +1940 0.40810 0.20552 +1939 0.40076 0.22039 +1930 0.42136 0.23681 +1959 0.37318 0.27029 +1930 0.42136 0.23681 +1931 0.39940 0.27389 +1918 0.44041 0.25154 +1931 0.39940 0.27389 +1920 0.42124 0.27992 +1938 0.39127 0.28798 +1923 0.41219 0.29271 +1946 0.38774 0.29238 +1945 0.40652 0.29681 +1946 0.38774 0.29238 +1949 0.41016 0.26584 +1960 0.39785 0.26170 +1949 0.41016 0.26584 +1961 0.40740 0.24119 +1948 0.41932 0.24746 +1947 0.43145 0.22451 +1948 0.41932 0.24746 +1928 0.46391 0.24259 +1948 0.41932 0.24746 +1936 0.45241 0.26326 +1949 0.41016 0.26584 +1950 0.44246 0.28003 +1945 0.40652 0.29681 +1944 0.43410 0.30664 +1923 0.41219 0.29271 +1924 0.44000 0.30492 +1920 0.42124 0.27992 +1921 0.44717 0.29297 +1918 0.44041 0.25154 +1914 0.46363 0.26773 +1918 0.44041 0.25154 +1919 0.44968 0.23419 +1930 0.42136 0.23681 +1933 0.42613 0.21803 +1940 0.40810 0.20552 +1933 0.42613 0.21803 +1932 0.43850 0.20224 +1933 0.42613 0.21803 +1922 0.45877 0.21540 +1919 0.44968 0.23419 +1911 0.47392 0.24920 +1914 0.46363 0.26773 +1912 0.55821 0.30953 +1914 0.46363 0.26773 +1913 0.53944 0.34600 +1921 0.44717 0.29297 +1926 0.52776 0.37424 +1924 0.44000 0.30492 +1937 0.52525 0.37972 +1944 0.43410 0.30664 +1943 0.53552 0.36112 +1944 0.43410 0.30664 +1951 0.54565 0.34624 +1950 0.44246 0.28003 +1934 0.55900 0.32572 +1936 0.45241 0.26326 +1927 0.57071 0.29293 +1928 0.46391 0.24259 +1915 0.57530 0.27822 +1916 0.48344 0.20717 +1902 0.58147 0.26285 +1909 0.48944 0.19937 +1903 0.58469 0.25384 +1908 0.49232 0.20013 +1906 0.57441 0.27342 +1910 0.48242 0.22892 +1911 0.47392 0.24920 +1922 0.45877 0.21540 +SURF 0x24 +mat 0 +refs 6 +1906 0.57441 0.27342 +1911 0.47392 0.24920 +1906 0.57441 0.27342 +1912 0.55821 0.30953 +1907 0.60874 0.29719 +1925 0.59291 0.33118 +SURF 0x24 +mat 0 +refs 14 +1906 0.57441 0.27342 +1907 0.60874 0.29719 +1903 0.58469 0.25384 +1905 0.62376 0.27301 +1903 0.58469 0.25384 +1904 0.62073 0.28418 +1902 0.58147 0.26285 +1917 0.61709 0.29746 +1915 0.57530 0.27822 +1929 0.61558 0.30853 +1927 0.57071 0.29293 +1929 0.61558 0.30853 +1934 0.55900 0.32572 +1935 0.60129 0.34643 +SURF 0x24 +mat 0 +refs 20 +1952 0.39130 0.16024 +1942 0.37815 0.18704 +1952 0.39130 0.16024 +1953 0.41842 0.18460 +1954 0.41570 0.11080 +1955 0.43859 0.13963 +1970 0.41719 0.10751 +1957 0.43831 0.13144 +1969 0.40941 0.12361 +1968 0.43399 0.13622 +1966 0.38423 0.17465 +1964 0.40472 0.18867 +1967 0.36860 0.20650 +1964 0.40472 0.18867 +1965 0.38595 0.22050 +1964 0.40472 0.18867 +1962 0.42238 0.21707 +1964 0.40472 0.18867 +1971 0.44686 0.16721 +1968 0.43399 0.13622 +SURF 0x24 +mat 0 +refs 16 +1900 0.48568 0.25721 +1901 0.44874 0.23966 +1900 0.48568 0.25721 +1899 0.43425 0.27804 +1898 0.47223 0.30121 +1899 0.43425 0.27804 +1897 0.46767 0.32878 +1896 0.42587 0.30742 +1895 0.46723 0.32948 +1894 0.42401 0.31315 +1893 0.47666 0.30962 +1892 0.43208 0.29349 +1888 0.48417 0.29671 +1889 0.44045 0.27757 +1890 0.49575 0.27140 +1891 0.45137 0.25565 +SURF 0x24 +mat 0 +refs 5 +1885 0.43794 0.25067 +1887 0.47558 0.24188 +1885 0.43794 0.25067 +1886 0.58975 0.37322 +1884 0.52757 0.37208 +SURF 0x24 +mat 0 +refs 6 +1873 0.37551 0.36171 +1872 0.37026 0.32492 +1871 0.41552 0.35583 +1870 0.41940 0.32518 +1869 0.42536 0.35589 +1864 0.42726 0.32435 +SURF 0x24 +mat 0 +refs 7 +1867 0.39759 0.36818 +1868 0.42650 0.35864 +1867 0.39759 0.36818 +1862 0.42592 0.32913 +1866 0.39404 0.34116 +1861 0.42962 0.30670 +1865 0.39225 0.31706 +SURF 0x24 +mat 0 +refs 4 +1861 0.42962 0.30670 +1862 0.42592 0.32913 +1863 0.43124 0.30269 +1864 0.42726 0.32435 +SURF 0x24 +mat 0 +refs 5 +1858 0.48353 0.35768 +1860 0.42083 0.24156 +1858 0.48353 0.35768 +1859 0.47186 0.23409 +1857 0.54497 0.36610 +SURF 0x24 +mat 0 +refs 5 +1856 0.57534 0.27210 +1855 0.55782 0.27565 +1846 0.57183 0.27291 +1847 0.48840 0.28914 +1845 0.51769 0.28340 +SURF 0x24 +mat 0 +refs 30 +1854 0.50195 0.28648 +1853 0.46713 0.29331 +1855 0.55782 0.27565 +1851 0.39406 0.30763 +1847 0.48840 0.28914 +1849 0.40846 0.30481 +1848 0.46558 0.29361 +1849 0.40846 0.30481 +1883 0.47553 0.32732 +1849 0.40846 0.30481 +1882 0.41912 0.33556 +1849 0.40846 0.30481 +1850 0.38597 0.30922 +1851 0.39406 0.30763 +1850 0.38597 0.30922 +1880 0.40057 0.33763 +1882 0.41912 0.33556 +1880 0.40057 0.33763 +1881 0.43211 0.35861 +1880 0.40057 0.33763 +1879 0.41597 0.36066 +1876 0.40162 0.33660 +1878 0.41034 0.36052 +1876 0.40162 0.33660 +1877 0.44088 0.35001 +1876 0.40162 0.33660 +1874 0.43378 0.32370 +1876 0.40162 0.33660 +1851 0.39406 0.30763 +1880 0.40057 0.33763 +SURF 0x24 +mat 0 +refs 5 +1842 0.39602 0.27837 +1844 0.39315 0.27761 +1842 0.39602 0.27837 +1843 0.36919 0.25702 +1841 0.37218 0.26098 +SURF 0x24 +mat 0 +refs 7 +1840 0.26990 0.54886 +1839 0.20027 0.58272 +1840 0.26990 0.54886 +1835 0.18707 0.52266 +1837 0.25234 0.46863 +1836 0.17916 0.45464 +1838 0.27486 0.36461 +SURF 0x24 +mat 0 +refs 5 +1832 0.24092 0.39735 +1834 0.29359 0.34785 +1832 0.24092 0.39735 +1833 0.40815 0.40747 +1831 0.32444 0.47318 +SURF 0x24 +mat 0 +refs 5 +1828 0.42783 0.45325 +1830 0.38343 0.52234 +1828 0.42783 0.45325 +1829 0.27501 0.45217 +1827 0.33273 0.39279 +SURF 0x24 +mat 0 +refs 24 +1822 0.54967 0.28287 +1826 0.51592 0.32510 +1822 0.54967 0.28287 +1823 0.48059 0.31181 +1813 0.50843 0.26129 +1814 0.46166 0.30580 +1801 0.47977 0.26697 +1802 0.44168 0.29629 +1789 0.45798 0.26382 +1806 0.38207 0.26985 +1789 0.45798 0.26382 +1790 0.39580 0.24657 +1786 0.40658 0.23079 +1796 0.36860 0.22804 +1786 0.40658 0.23079 +1795 0.38868 0.21073 +1788 0.40737 0.23453 +1795 0.38868 0.21073 +1794 0.38942 0.21468 +1819 0.37126 0.19657 +1794 0.38942 0.21468 +1818 0.37422 0.19656 +1793 0.38368 0.22730 +1817 0.36715 0.21150 +SURF 0x24 +mat 0 +refs 5 +1806 0.38207 0.26985 +1802 0.44168 0.29629 +1806 0.38207 0.26985 +1809 0.42807 0.32554 +1810 0.36993 0.30002 +SURF 0x24 +mat 0 +refs 19 +1822 0.54967 0.28287 +1813 0.50843 0.26129 +1820 0.57798 0.23951 +1811 0.51862 0.24454 +1821 0.57493 0.24645 +1812 0.51762 0.25194 +1824 0.56929 0.25425 +1815 0.51758 0.25879 +1825 0.55163 0.28791 +1815 0.51758 0.25879 +1816 0.51085 0.28454 +1803 0.48768 0.26662 +1804 0.48155 0.28393 +1792 0.46613 0.26551 +1805 0.46173 0.28049 +1798 0.39834 0.25865 +1805 0.46173 0.28049 +1807 0.38918 0.27962 +1808 0.45358 0.30817 +SURF 0x24 +mat 0 +refs 19 +1813 0.50843 0.26129 +1801 0.47977 0.26697 +1811 0.51862 0.24454 +1799 0.48698 0.25535 +1812 0.51762 0.25194 +1800 0.48679 0.26118 +1815 0.51758 0.25879 +1800 0.48679 0.26118 +1803 0.48768 0.26662 +1787 0.46538 0.26018 +1792 0.46613 0.26551 +1787 0.46538 0.26018 +1788 0.40737 0.23453 +1787 0.46538 0.26018 +1786 0.40658 0.23079 +1785 0.46507 0.25421 +1789 0.45798 0.26382 +1799 0.48698 0.25535 +1801 0.47977 0.26697 +SURF 0x24 +mat 0 +refs 4 +1799 0.48698 0.25535 +1785 0.46507 0.25421 +1800 0.48679 0.26118 +1787 0.46538 0.26018 +SURF 0x24 +mat 0 +refs 11 +1793 0.38368 0.22730 +1797 0.37285 0.25021 +1793 0.38368 0.22730 +1798 0.39834 0.25865 +1791 0.40427 0.24375 +1792 0.46613 0.26551 +1791 0.40427 0.24375 +1788 0.40737 0.23453 +1791 0.40427 0.24375 +1794 0.38942 0.21468 +1793 0.38368 0.22730 +SURF 0x24 +mat 0 +refs 36 +1783 0.38174 0.18059 +1767 0.41121 0.18961 +1780 0.39301 0.15766 +1759 0.41919 0.16951 +1781 0.40386 0.13548 +1760 0.43020 0.15143 +1773 0.42157 0.09934 +1762 0.44554 0.11772 +1774 0.42956 0.08317 +1775 0.45256 0.09764 +1782 0.42977 0.08289 +1777 0.44865 0.10024 +1776 0.42307 0.09639 +1764 0.43400 0.12261 +1778 0.39575 0.15206 +1755 0.41600 0.16188 +1779 0.36913 0.20629 +1755 0.41600 0.16188 +1756 0.39529 0.20224 +1737 0.43363 0.17003 +1756 0.39529 0.20224 +1733 0.41910 0.20718 +1757 0.38541 0.22901 +1735 0.41081 0.23640 +1758 0.37969 0.24155 +1736 0.41102 0.24284 +1766 0.39415 0.22390 +1739 0.41782 0.22394 +1767 0.41121 0.18961 +1740 0.43112 0.19659 +1759 0.41919 0.16951 +1742 0.43962 0.17859 +1760 0.43020 0.15143 +1761 0.44803 0.16185 +1762 0.44554 0.11772 +1763 0.46344 0.13326 +SURF 0x24 +mat 0 +refs 22 +1777 0.44865 0.10024 +1784 0.46756 0.11833 +1764 0.43400 0.12261 +1765 0.45371 0.13716 +1755 0.41600 0.16188 +1765 0.45371 0.13716 +1737 0.43363 0.17003 +1738 0.46490 0.14980 +1737 0.43363 0.17003 +1734 0.44793 0.17655 +1733 0.41910 0.20718 +1712 0.43585 0.20950 +1735 0.41081 0.23640 +1710 0.43318 0.24163 +1736 0.41102 0.24284 +1711 0.43669 0.23970 +1739 0.41782 0.22394 +1713 0.44005 0.22831 +1740 0.43112 0.19659 +1741 0.45044 0.20379 +1742 0.43962 0.17859 +1743 0.45939 0.18888 +SURF 0x24 +mat 0 +refs 25 +1712 0.43585 0.20950 +1707 0.46622 0.22178 +1710 0.43318 0.24163 +1705 0.46055 0.24316 +1711 0.43669 0.23970 +1709 0.46377 0.24102 +1713 0.44005 0.22831 +1714 0.46925 0.23258 +1741 0.45044 0.20379 +1714 0.46925 0.23258 +1725 0.47712 0.21808 +1722 0.54189 0.24713 +1724 0.48548 0.20138 +1722 0.54189 0.24713 +1723 0.54988 0.22993 +1732 0.55481 0.25651 +1723 0.54988 0.22993 +1744 0.56478 0.23677 +1746 0.55803 0.20225 +1744 0.56478 0.23677 +1745 0.57785 0.20569 +1750 0.58845 0.24868 +1752 0.60715 0.20630 +1751 0.61957 0.26395 +1772 0.64793 0.20967 +SURF 0x24 +mat 0 +refs 13 +1749 0.60431 0.29418 +1751 0.61957 0.26395 +1749 0.60431 0.29418 +1750 0.58845 0.24868 +1731 0.57590 0.27518 +1744 0.56478 0.23677 +1731 0.57590 0.27518 +1732 0.55481 0.25651 +1731 0.57590 0.27518 +1729 0.56002 0.30816 +1731 0.57590 0.27518 +1754 0.58170 0.33738 +1749 0.60431 0.29418 +SURF 0x24 +mat 0 +refs 11 +1705 0.46055 0.24316 +1707 0.46622 0.22178 +1705 0.46055 0.24316 +1706 0.52437 0.24730 +1704 0.51551 0.27185 +1716 0.53932 0.26038 +1715 0.52711 0.28896 +1727 0.55661 0.28082 +1726 0.53677 0.31977 +1748 0.58959 0.31264 +1747 0.57214 0.35897 +SURF 0x24 +mat 0 +refs 15 +1770 0.64597 0.20463 +1769 0.70916 0.21009 +1753 0.61222 0.24686 +1768 0.67572 0.25503 +1753 0.61222 0.24686 +1771 0.61224 0.32965 +1753 0.61222 0.24686 +1748 0.58959 0.31264 +1753 0.61222 0.24686 +1727 0.55661 0.28082 +1728 0.57688 0.23358 +1716 0.53932 0.26038 +1717 0.55795 0.22756 +1706 0.52437 0.24730 +1718 0.53798 0.21805 +SURF 0x24 +mat 0 +refs 10 +1703 0.46141 0.38950 +1702 0.50342 0.41571 +1697 0.45441 0.37157 +1698 0.51107 0.38844 +1696 0.45736 0.33622 +1695 0.52355 0.34306 +1691 0.45663 0.32539 +1692 0.52872 0.33189 +1693 0.48107 0.17939 +1694 0.54628 0.18265 +SURF 0x24 +mat 0 +refs 5 +1694 0.54628 0.18265 +1701 0.56857 0.29842 +1694 0.54628 0.18265 +1700 0.50072 0.17126 +1699 0.47090 0.17637 +SURF 0x24 +mat 0 +refs 14 +1690 0.67292 0.50545 +1689 0.69023 0.41901 +1683 0.72269 0.47296 +1688 0.75680 0.36561 +1683 0.72269 0.47296 +1687 0.78935 0.35988 +1678 0.76419 0.46136 +1685 0.77748 0.37749 +1679 0.75433 0.46801 +1686 0.73039 0.42598 +1679 0.75433 0.46801 +1681 0.71487 0.49654 +1674 0.73054 0.57049 +1680 0.67776 0.59038 +SURF 0x24 +mat 0 +refs 14 +1682 0.71010 0.58102 +1683 0.72269 0.47296 +1682 0.71010 0.58102 +1678 0.76419 0.46136 +1676 0.72713 0.57258 +1679 0.75433 0.46801 +1676 0.72713 0.57258 +1674 0.73054 0.57049 +1676 0.72713 0.57258 +1675 0.70622 0.64321 +1676 0.72713 0.57258 +1677 0.69865 0.64289 +1682 0.71010 0.58102 +1684 0.68916 0.64451 +SURF 0x24 +mat 0 +refs 6 +1673 0.55109 0.17679 +1669 0.55019 0.33406 +1672 0.48543 0.18955 +1668 0.46478 0.32746 +1671 0.47413 0.19010 +1670 0.45972 0.32752 +SURF 0x24 +mat 0 +refs 13 +1668 0.46478 0.32746 +1669 0.55019 0.33406 +1665 0.47001 0.34191 +1666 0.54749 0.34929 +1665 0.47001 0.34191 +1659 0.53301 0.38713 +1665 0.47001 0.34191 +1662 0.47656 0.37427 +1664 0.45879 0.33789 +1662 0.47656 0.37427 +1663 0.45510 0.37104 +1661 0.48212 0.40085 +1667 0.46161 0.39018 +SURF 0x24 +mat 0 +refs 6 +1661 0.48212 0.40085 +1662 0.47656 0.37427 +1660 0.52632 0.42143 +1659 0.53301 0.38713 +1658 0.55681 0.43617 +1657 0.58421 0.40654 +SURF 0x24 +mat 0 +refs 8 +1656 0.67343 0.24437 +1650 0.61403 0.33552 +1655 0.61441 0.25130 +1646 0.56858 0.32921 +1652 0.54683 0.24506 +1648 0.50443 0.31152 +1653 0.46771 0.25426 +1654 0.45323 0.29211 +SURF 0x24 +mat 0 +refs 6 +1650 0.61403 0.33552 +1651 0.56701 0.38304 +1646 0.56858 0.32921 +1647 0.53253 0.36704 +1648 0.50443 0.31152 +1649 0.47703 0.34115 +SURF 0x24 +mat 0 +refs 7 +1645 0.44377 0.24803 +1644 0.43129 0.29341 +1645 0.44377 0.24803 +1640 0.52705 0.31412 +1638 0.57617 0.26213 +1639 0.58091 0.32950 +1637 0.65593 0.26200 +SURF 0x24 +mat 0 +refs 5 +1639 0.58091 0.32950 +1643 0.53404 0.37222 +1639 0.58091 0.32950 +1642 0.58287 0.38947 +1641 0.63703 0.33520 +SURF 0x24 +mat 0 +refs 8 +1636 0.42861 0.25228 +1635 0.46823 0.28719 +1636 0.42861 0.25228 +1633 0.46790 0.28657 +1634 0.43553 0.25327 +1633 0.46790 0.28657 +1632 0.45038 0.23809 +1631 0.47525 0.26465 +SURF 0x24 +mat 0 +refs 15 +1630 0.50636 0.31702 +1594 0.49570 0.28810 +1629 0.46874 0.32418 +1595 0.45269 0.29653 +1627 0.44594 0.32335 +1596 0.43196 0.30059 +1626 0.45937 0.32032 +1597 0.44390 0.29825 +1628 0.48667 0.31199 +1597 0.44390 0.29825 +1598 0.46762 0.29361 +1597 0.44390 0.29825 +1599 0.52690 0.28199 +1601 0.60255 0.26722 +1600 0.58775 0.27006 +SURF 0x24 +mat 0 +refs 6 +1597 0.44390 0.29825 +1596 0.43196 0.30059 +1597 0.44390 0.29825 +1595 0.45269 0.29653 +1593 0.52079 0.28320 +1594 0.49570 0.28810 +SURF 0x24 +mat 0 +refs 5 +1597 0.44390 0.29825 +1593 0.52079 0.28320 +1601 0.60255 0.26722 +1592 0.58449 0.27065 +1602 0.60220 0.26722 +SURF 0x24 +mat 0 +refs 4 +1593 0.52079 0.28320 +1591 0.54501 0.27841 +1593 0.52079 0.28320 +1592 0.58449 0.27065 +SURF 0x24 +mat 0 +refs 6 +1625 0.39347 0.35096 +1624 0.38487 0.31934 +1620 0.42484 0.34237 +1619 0.41842 0.30903 +1618 0.45169 0.33922 +1611 0.44998 0.30635 +SURF 0x24 +mat 0 +refs 6 +1623 0.41177 0.30365 +1615 0.41553 0.32561 +1612 0.43018 0.30022 +1613 0.43490 0.32314 +1604 0.46227 0.29518 +1614 0.45970 0.31791 +SURF 0x24 +mat 0 +refs 6 +1621 0.39824 0.32750 +1622 0.40301 0.35739 +1615 0.41553 0.32561 +1616 0.42137 0.35395 +1613 0.43490 0.32314 +1617 0.44360 0.34854 +SURF 0x24 +mat 0 +refs 5 +1609 0.47591 0.31186 +1611 0.44998 0.30635 +1609 0.47591 0.31186 +1610 0.45327 0.28980 +1608 0.47665 0.28942 +SURF 0x24 +mat 0 +refs 6 +1608 0.47665 0.28942 +1607 0.47961 0.26342 +1606 0.47845 0.29178 +1605 0.48404 0.26497 +1604 0.46227 0.29518 +1603 0.46381 0.27152 +SURF 0x24 +mat 0 +refs 47 +1589 0.36753 0.33783 +1590 0.33481 0.35745 +1588 0.36276 0.33480 +1587 0.31511 0.36797 +1585 0.36518 0.33634 +1584 0.33813 0.35666 +1585 0.36518 0.33634 +1582 0.34305 0.35124 +1583 0.36273 0.33478 +1578 0.34190 0.35227 +1579 0.36387 0.33551 +1573 0.34218 0.35146 +1574 0.36334 0.33517 +1568 0.34279 0.34886 +1569 0.36202 0.33433 +1563 0.34304 0.34703 +1564 0.36025 0.33321 +1558 0.34259 0.34575 +1559 0.35898 0.33241 +1553 0.34352 0.34229 +1554 0.35714 0.33124 +1548 0.34374 0.33846 +1549 0.35547 0.33018 +1543 0.34400 0.33217 +1544 0.35086 0.32726 +1543 0.34400 0.33217 +1540 0.34169 0.32144 +1543 0.34400 0.33217 +1541 0.33283 0.33541 +1548 0.34374 0.33846 +1546 0.32868 0.34195 +1553 0.34352 0.34229 +1551 0.32689 0.34478 +1558 0.34259 0.34575 +1556 0.32506 0.34767 +1563 0.34304 0.34703 +1561 0.32460 0.34838 +1568 0.34279 0.34886 +1566 0.32370 0.34980 +1573 0.34218 0.35146 +1571 0.32235 0.35193 +1578 0.34190 0.35227 +1576 0.32191 0.35263 +1582 0.34305 0.35124 +1581 0.32120 0.35375 +1584 0.33813 0.35666 +1586 0.31884 0.35746 +SURF 0x24 +mat 0 +refs 37 +1581 0.32120 0.35375 +1580 0.31265 0.33528 +1581 0.32120 0.35375 +1575 0.31372 0.33439 +1576 0.32191 0.35263 +1570 0.31433 0.33380 +1571 0.32235 0.35193 +1565 0.31642 0.33214 +1566 0.32370 0.34980 +1560 0.31797 0.33113 +1561 0.32460 0.34838 +1555 0.31932 0.33099 +1556 0.32506 0.34767 +1550 0.32205 0.32867 +1551 0.32689 0.34478 +1545 0.32543 0.32684 +1546 0.32868 0.34195 +1539 0.33100 0.32393 +1541 0.33283 0.33541 +1539 0.33100 0.32393 +1540 0.34169 0.32144 +1539 0.33100 0.32393 +1542 0.33252 0.31563 +1545 0.32543 0.32684 +1547 0.32874 0.31323 +1550 0.32205 0.32867 +1552 0.32651 0.31181 +1555 0.31932 0.33099 +1557 0.32524 0.31101 +1560 0.31797 0.33113 +1562 0.32489 0.31078 +1565 0.31642 0.33214 +1567 0.32339 0.30983 +1570 0.31433 0.33380 +1572 0.32177 0.30880 +1575 0.31372 0.33439 +1577 0.32099 0.30831 +SURF 0x24 +mat 0 +refs 9 +1500 0.29261 0.29042 +1499 0.18604 0.39726 +1493 0.30155 0.35178 +1496 0.20737 0.44421 +1494 0.31148 0.42936 +1495 0.23029 0.49866 +1494 0.31148 0.42936 +1497 0.26932 0.57163 +1498 0.32188 0.55284 +SURF 0x24 +mat 0 +refs 152 +1493 0.30155 0.35178 +1494 0.31148 0.42936 +1493 0.30155 0.35178 +1463 0.38538 0.41008 +1462 0.40277 0.29874 +1460 0.46288 0.43924 +1459 0.48385 0.31181 +1461 0.52632 0.47387 +1459 0.48385 0.31181 +1458 0.57237 0.37089 +1457 0.52370 0.24886 +1458 0.57237 0.37089 +1468 0.57264 0.27935 +1492 0.63614 0.37106 +1468 0.57264 0.27935 +1469 0.64643 0.36742 +1468 0.57264 0.27935 +1467 0.65360 0.36577 +1449 0.58127 0.25596 +1451 0.66573 0.36130 +1449 0.58127 0.25596 +1450 0.66430 0.34409 +1446 0.58279 0.24710 +1445 0.63547 0.34192 +1444 0.54066 0.24507 +1442 0.64670 0.31848 +1443 0.52506 0.21145 +1442 0.64670 0.31848 +1425 0.52023 0.19809 +1424 0.66329 0.30300 +1423 0.53161 0.20071 +1422 0.69243 0.29175 +1421 0.57088 0.21900 +1420 0.72099 0.29117 +1371 0.61973 0.21084 +1370 0.73044 0.27792 +1369 0.61848 0.21663 +1368 0.71413 0.28348 +1364 0.59340 0.25284 +1366 0.68066 0.30900 +1364 0.59340 0.25284 +1367 0.65069 0.37151 +1364 0.59340 0.25284 +1298 0.56277 0.31507 +1365 0.44747 0.19226 +1298 0.56277 0.31507 +1294 0.44253 0.27688 +1296 0.55484 0.33011 +1292 0.49188 0.31859 +1297 0.55528 0.34849 +1293 0.49087 0.29684 +1347 0.56359 0.33332 +1333 0.49159 0.27000 +1348 0.55791 0.33885 +1277 0.49004 0.27664 +1350 0.53806 0.34940 +1349 0.49135 0.30295 +1350 0.53806 0.34940 +1357 0.48866 0.33231 +1358 0.52331 0.36332 +1357 0.48866 0.33231 +1418 0.48952 0.41042 +1357 0.48866 0.33231 +1363 0.45463 0.37978 +1310 0.44886 0.33278 +1359 0.42742 0.36931 +1312 0.43287 0.33975 +1262 0.41224 0.35855 +1263 0.41890 0.33550 +1243 0.40486 0.34184 +1264 0.41229 0.32164 +1269 0.41726 0.30579 +1268 0.41717 0.30618 +1274 0.42907 0.29064 +1315 0.41619 0.26791 +1316 0.42988 0.26250 +1380 0.41486 0.22925 +1381 0.43042 0.24030 +1390 0.42177 0.21489 +1391 0.43482 0.22529 +1434 0.43911 0.20625 +1435 0.44641 0.21814 +1478 0.45227 0.21131 +1479 0.45471 0.21882 +1488 0.47750 0.23796 +1489 0.47861 0.24182 +1501 0.48446 0.25312 +1481 0.47797 0.24529 +1480 0.47581 0.24711 +1470 0.45078 0.23401 +1472 0.44569 0.23516 +1428 0.43760 0.24256 +1429 0.42822 0.23643 +1385 0.42701 0.25557 +1386 0.41445 0.24568 +1376 0.41452 0.27095 +1377 0.40251 0.25508 +1311 0.41684 0.30208 +1313 0.40813 0.29237 +1263 0.41890 0.33550 +1313 0.40813 0.29237 +1264 0.41229 0.32164 +1314 0.40706 0.27801 +1268 0.41717 0.30618 +1314 0.40706 0.27801 +1315 0.41619 0.26791 +1379 0.40214 0.22755 +1380 0.41486 0.22925 +1389 0.40962 0.21254 +1390 0.42177 0.21489 +1433 0.42973 0.20012 +1434 0.43911 0.20625 +1477 0.44791 0.20764 +1478 0.45227 0.21131 +1487 0.47527 0.23558 +1488 0.47750 0.23796 +1487 0.47527 0.23558 +1501 0.48446 0.25312 +1487 0.47527 0.23558 +1486 0.47271 0.23555 +1477 0.44791 0.20764 +1476 0.44320 0.20890 +1433 0.42973 0.20012 +1432 0.42185 0.20210 +1389 0.40962 0.21254 +1388 0.40336 0.21912 +1379 0.40214 0.22755 +1378 0.39728 0.23719 +1314 0.40706 0.27801 +1378 0.39728 0.23719 +1313 0.40813 0.29237 +1378 0.39728 0.23719 +1377 0.40251 0.25508 +1387 0.40534 0.23183 +1386 0.41445 0.24568 +1430 0.42092 0.22454 +1429 0.42822 0.23643 +1473 0.44115 0.23071 +1472 0.44569 0.23516 +1482 0.47320 0.24691 +1480 0.47581 0.24711 +1482 0.47320 0.24691 +1501 0.48446 0.25312 +1482 0.47320 0.24691 +1483 0.47119 0.24479 +1473 0.44115 0.23071 +1474 0.43896 0.22284 +1430 0.42092 0.22454 +1431 0.41849 0.21142 +1387 0.40534 0.23183 +1388 0.40336 0.21912 +1378 0.39728 0.23719 +SURF 0x24 +mat 0 +refs 16 +1431 0.41849 0.21142 +1388 0.40336 0.21912 +1431 0.41849 0.21142 +1432 0.42185 0.20210 +1475 0.43978 0.21461 +1476 0.44320 0.20890 +1485 0.47074 0.23770 +1486 0.47271 0.23555 +1485 0.47074 0.23770 +1501 0.48446 0.25312 +1484 0.47025 0.24131 +1483 0.47119 0.24479 +1484 0.47025 0.24131 +1474 0.43896 0.22284 +1475 0.43978 0.21461 +1431 0.41849 0.21142 +SURF 0x24 +mat 0 +refs 4 +1475 0.43978 0.21461 +1485 0.47074 0.23770 +1475 0.43978 0.21461 +1484 0.47025 0.24131 +SURF 0x24 +mat 0 +refs 38 +1263 0.41890 0.33550 +1311 0.41684 0.30208 +1312 0.43287 0.33975 +1309 0.42930 0.30715 +1310 0.44886 0.33278 +1307 0.44515 0.30516 +1310 0.44886 0.33278 +1308 0.46077 0.31725 +1357 0.48866 0.33231 +1308 0.46077 0.31725 +1349 0.49135 0.30295 +1306 0.46404 0.29908 +1277 0.49004 0.27664 +1278 0.45743 0.28523 +1276 0.44984 0.27471 +1275 0.44346 0.28097 +1273 0.43502 0.29282 +1274 0.42907 0.29064 +1273 0.43502 0.29282 +1269 0.41726 0.30579 +1270 0.41268 0.30172 +1269 0.41726 0.30579 +1242 0.39377 0.32989 +1243 0.40486 0.34184 +1239 0.36397 0.35680 +1243 0.40486 0.34184 +1244 0.37651 0.37460 +1262 0.41224 0.35855 +1340 0.37833 0.36777 +1359 0.42742 0.36931 +1360 0.39161 0.38625 +1363 0.45463 0.37978 +1360 0.39161 0.38625 +1415 0.40462 0.41064 +1361 0.38763 0.39449 +1414 0.40562 0.42850 +1417 0.39616 0.43768 +1416 0.40331 0.44158 +SURF 0x24 +mat 0 +refs 43 +1417 0.39616 0.43768 +1419 0.39561 0.43907 +1361 0.38763 0.39449 +1362 0.38989 0.41057 +1341 0.37692 0.38158 +1362 0.38989 0.41057 +1355 0.38287 0.39790 +1356 0.40483 0.45737 +1355 0.38287 0.39790 +1354 0.38214 0.40805 +1341 0.37692 0.38158 +1339 0.37728 0.39149 +1340 0.37833 0.36777 +1339 0.37728 0.39149 +1244 0.37651 0.37460 +1238 0.35151 0.36875 +1239 0.36397 0.35680 +1233 0.35583 0.33267 +1239 0.36397 0.35680 +1265 0.37454 0.32322 +1242 0.39377 0.32989 +1266 0.38848 0.32330 +1242 0.39377 0.32989 +1271 0.39856 0.32020 +1270 0.41268 0.30172 +1288 0.41409 0.29618 +1270 0.41268 0.30172 +1272 0.42548 0.28265 +1273 0.43502 0.29282 +1272 0.42548 0.28265 +1276 0.44984 0.27471 +1287 0.44539 0.26007 +1277 0.49004 0.27664 +1287 0.44539 0.26007 +1333 0.49159 0.27000 +1287 0.44539 0.26007 +1293 0.49087 0.29684 +1285 0.44552 0.28431 +1292 0.49188 0.31859 +1282 0.43299 0.30404 +1292 0.49188 0.31859 +1280 0.40343 0.31159 +1294 0.44253 0.27688 +SURF 0x24 +mat 0 +refs 4 +1341 0.37692 0.38158 +1340 0.37833 0.36777 +1361 0.38763 0.39449 +1360 0.39161 0.38625 +SURF 0x24 +mat 0 +refs 25 +1274 0.42907 0.29064 +1275 0.44346 0.28097 +1316 0.42988 0.26250 +1304 0.44234 0.26756 +1381 0.43042 0.24030 +1373 0.44190 0.25443 +1391 0.43482 0.22529 +1383 0.44352 0.23944 +1435 0.44641 0.21814 +1427 0.44884 0.23126 +1479 0.45471 0.21882 +1471 0.45423 0.22758 +1489 0.47861 0.24182 +1471 0.45423 0.22758 +1481 0.47797 0.24529 +1471 0.45423 0.22758 +1470 0.45078 0.23401 +1426 0.44547 0.24059 +1428 0.43760 0.24256 +1384 0.43847 0.25793 +1385 0.42701 0.25557 +1375 0.42992 0.27928 +1376 0.41452 0.27095 +1309 0.42930 0.30715 +1311 0.41684 0.30208 +SURF 0x24 +mat 0 +refs 10 +1307 0.44515 0.30516 +1309 0.42930 0.30715 +1307 0.44515 0.30516 +1375 0.42992 0.27928 +1374 0.44195 0.27803 +1384 0.43847 0.25793 +1382 0.44476 0.25183 +1426 0.44547 0.24059 +1427 0.44884 0.23126 +1471 0.45423 0.22758 +SURF 0x24 +mat 0 +refs 10 +1382 0.44476 0.25183 +1427 0.44884 0.23126 +1382 0.44476 0.25183 +1383 0.44352 0.23944 +1372 0.44668 0.26881 +1373 0.44190 0.25443 +1303 0.45320 0.28070 +1304 0.44234 0.26756 +1278 0.45743 0.28523 +1275 0.44346 0.28097 +SURF 0x24 +mat 0 +refs 12 +1303 0.45320 0.28070 +1278 0.45743 0.28523 +1303 0.45320 0.28070 +1306 0.46404 0.29908 +1305 0.45428 0.29506 +1308 0.46077 0.31725 +1305 0.45428 0.29506 +1307 0.44515 0.30516 +1305 0.45428 0.29506 +1374 0.44195 0.27803 +1372 0.44668 0.26881 +1382 0.44476 0.25183 +SURF 0x24 +mat 0 +refs 4 +1372 0.44668 0.26881 +1303 0.45320 0.28070 +1372 0.44668 0.26881 +1305 0.45428 0.29506 +SURF 0x24 +mat 0 +refs 28 +1443 0.52506 0.21145 +1491 0.44386 0.19266 +1444 0.54066 0.24507 +1448 0.45446 0.22730 +1444 0.54066 0.24507 +1447 0.49605 0.21185 +1446 0.58279 0.24710 +1453 0.49634 0.20260 +1449 0.58127 0.25596 +1453 0.49634 0.20260 +1468 0.57264 0.27935 +1453 0.49634 0.20260 +1457 0.52370 0.24886 +1456 0.45752 0.23128 +1459 0.48385 0.31181 +1456 0.45752 0.23128 +1462 0.40277 0.29874 +1456 0.45752 0.23128 +1466 0.39680 0.22153 +1455 0.44755 0.19047 +1465 0.39213 0.18988 +1455 0.44755 0.19047 +1464 0.38508 0.19584 +1455 0.44755 0.19047 +1452 0.44071 0.19678 +1455 0.44755 0.19047 +1453 0.49634 0.20260 +1456 0.45752 0.23128 +SURF 0x24 +mat 0 +refs 5 +1453 0.49634 0.20260 +1447 0.49605 0.21185 +1452 0.44071 0.19678 +1448 0.45446 0.22730 +1454 0.37492 0.21889 +SURF 0x24 +mat 0 +refs 47 +1351 0.37882 0.43298 +1345 0.37409 0.42972 +1352 0.36632 0.41873 +1344 0.35738 0.41747 +1352 0.36632 0.41873 +1353 0.36986 0.41458 +1356 0.40483 0.45737 +1353 0.36986 0.41458 +1354 0.38214 0.40805 +1343 0.35786 0.40201 +1339 0.37728 0.39149 +1240 0.33482 0.38394 +1238 0.35151 0.36875 +1234 0.30850 0.36361 +1238 0.35151 0.36875 +1232 0.33450 0.35259 +1233 0.35583 0.33267 +1231 0.34181 0.32287 +1279 0.37601 0.31598 +1280 0.40343 0.31159 +1281 0.39455 0.30634 +1282 0.43299 0.30404 +1284 0.42301 0.28574 +1285 0.44552 0.28431 +1284 0.42301 0.28574 +1287 0.44539 0.26007 +1284 0.42301 0.28574 +1272 0.42548 0.28265 +1284 0.42301 0.28574 +1288 0.41409 0.29618 +1284 0.42301 0.28574 +1289 0.40188 0.32175 +1281 0.39455 0.30634 +1286 0.39312 0.32155 +1281 0.39455 0.30634 +1283 0.37749 0.32055 +1279 0.37601 0.31598 +1283 0.37749 0.32055 +1233 0.35583 0.33267 +1267 0.37077 0.32114 +1265 0.37454 0.32322 +1267 0.37077 0.32114 +1322 0.36708 0.30388 +1321 0.36862 0.31066 +1322 0.36708 0.30388 +1331 0.37084 0.29531 +1332 0.36456 0.29139 +SURF 0x24 +mat 0 +refs 7 +1343 0.35786 0.40201 +1353 0.36986 0.41458 +1343 0.35786 0.40201 +1344 0.35738 0.41747 +1338 0.34437 0.42614 +1345 0.37409 0.42972 +1346 0.36179 0.44614 +SURF 0x24 +mat 0 +refs 50 +1335 0.30047 0.47982 +1342 0.28749 0.51452 +1335 0.30047 0.47982 +1257 0.25474 0.50968 +1255 0.24348 0.48283 +1258 0.22063 0.52507 +1255 0.24348 0.48283 +1256 0.22468 0.51971 +1253 0.23362 0.46709 +1254 0.22473 0.51579 +1245 0.22377 0.44875 +1252 0.22478 0.51493 +1247 0.21589 0.47336 +1251 0.22541 0.51817 +1247 0.21589 0.47336 +1334 0.22696 0.52494 +1247 0.21589 0.47336 +1250 0.25631 0.53455 +1247 0.21589 0.47336 +1249 0.24809 0.49231 +1247 0.21589 0.47336 +1248 0.23152 0.42476 +1245 0.22377 0.44875 +1246 0.24728 0.40065 +1245 0.22377 0.44875 +1241 0.29392 0.42432 +1253 0.23362 0.46709 +1241 0.29392 0.42432 +1255 0.24348 0.48283 +1241 0.29392 0.42432 +1335 0.30047 0.47982 +1336 0.32645 0.42209 +1337 0.32375 0.49779 +1336 0.32645 0.42209 +1338 0.34437 0.42614 +1336 0.32645 0.42209 +1343 0.35786 0.40201 +1336 0.32645 0.42209 +1240 0.33482 0.38394 +1241 0.29392 0.42432 +1237 0.27707 0.37496 +1246 0.24728 0.40065 +1236 0.26319 0.39608 +1248 0.23152 0.42476 +1236 0.26319 0.39608 +1249 0.24809 0.49231 +1259 0.24153 0.46253 +1249 0.24809 0.49231 +1260 0.25358 0.57167 +1261 0.26909 0.57878 +SURF 0x24 +mat 0 +refs 19 +1240 0.33482 0.38394 +1237 0.27707 0.37496 +1234 0.30850 0.36361 +1236 0.26319 0.39608 +1234 0.30850 0.36361 +1235 0.27456 0.37069 +1232 0.33450 0.35259 +1230 0.29961 0.34741 +1231 0.34181 0.32287 +1230 0.29961 0.34741 +1291 0.27881 0.34253 +1235 0.27456 0.37069 +1295 0.24470 0.38802 +1236 0.26319 0.39608 +1295 0.24470 0.38802 +1259 0.24153 0.46253 +1299 0.22374 0.44752 +1260 0.25358 0.57167 +1302 0.22382 0.55785 +SURF 0x24 +mat 0 +refs 5 +1299 0.22374 0.44752 +1301 0.17347 0.41065 +1295 0.24470 0.38802 +1300 0.21765 0.31348 +1291 0.27881 0.34253 +SURF 0x24 +mat 0 +refs 20 +1229 0.43053 0.39270 +1228 0.39201 0.34773 +1223 0.46363 0.34789 +1222 0.42020 0.29708 +1218 0.47939 0.33241 +1219 0.43327 0.28157 +1218 0.47939 0.33241 +1217 0.45179 0.26882 +1215 0.49860 0.31783 +1216 0.45680 0.26268 +1214 0.50693 0.31530 +1216 0.45680 0.26268 +1221 0.51735 0.33323 +1220 0.45027 0.27870 +1221 0.51735 0.33323 +1225 0.44774 0.26049 +1224 0.53308 0.32107 +1225 0.44774 0.26049 +1227 0.54769 0.29068 +1226 0.45390 0.24465 +SURF 0x24 +mat 0 +refs 39 +1212 0.40716 0.19628 +1213 0.49998 0.19925 +1210 0.40714 0.22039 +1211 0.49998 0.22082 +1208 0.40993 0.24231 +1209 0.49998 0.24562 +1198 0.42559 0.29577 +1199 0.49998 0.29722 +1194 0.44264 0.33670 +1197 0.49998 0.33519 +1194 0.44264 0.33670 +1183 0.49998 0.34903 +1182 0.44782 0.35296 +1181 0.49998 0.37210 +1179 0.45100 0.37239 +1180 0.49998 0.39423 +1176 0.45265 0.39238 +1178 0.49998 0.42524 +1171 0.45172 0.42027 +1177 0.49998 0.48565 +1171 0.45172 0.42027 +1172 0.46484 0.48011 +1173 0.41079 0.41823 +1174 0.43238 0.47842 +1185 0.37038 0.41971 +1184 0.40086 0.47817 +1185 0.37038 0.41971 +1192 0.37852 0.48102 +1185 0.37038 0.41971 +1191 0.33201 0.42731 +1186 0.35851 0.39979 +1196 0.32416 0.40835 +1187 0.34927 0.38927 +1196 0.32416 0.40835 +1195 0.34227 0.39343 +1204 0.32938 0.40594 +1203 0.34319 0.39461 +1205 0.36363 0.39602 +1207 0.31576 0.38499 +SURF 0x24 +mat 0 +refs 4 +1206 0.31074 0.40942 +1205 0.36363 0.39602 +1206 0.31074 0.40942 +1204 0.32938 0.40594 +SURF 0x24 +mat 0 +refs 26 +1173 0.41079 0.41823 +1185 0.37038 0.41971 +1173 0.41079 0.41823 +1186 0.35851 0.39979 +1175 0.39605 0.39529 +1187 0.34927 0.38927 +1188 0.38154 0.38008 +1189 0.33920 0.38061 +1190 0.37487 0.36405 +1201 0.32333 0.37235 +1193 0.37824 0.34783 +1202 0.32232 0.31360 +1193 0.37824 0.34783 +1200 0.36647 0.29923 +1193 0.37824 0.34783 +1198 0.42559 0.29577 +1193 0.37824 0.34783 +1194 0.44264 0.33670 +1190 0.37487 0.36405 +1182 0.44782 0.35296 +1188 0.38154 0.38008 +1179 0.45100 0.37239 +1175 0.39605 0.39529 +1176 0.45265 0.39238 +1173 0.41079 0.41823 +1171 0.45172 0.42027 +SURF 0x24 +mat 0 +refs 6 +1166 0.40143 0.59901 +1170 0.39725 0.59359 +1166 0.40143 0.59901 +1167 0.40095 0.58360 +1168 0.39122 0.57399 +1169 0.39509 0.56523 +SURF 0x24 +mat 0 +refs 21 +1165 0.45949 0.17736 +1164 0.56002 0.26681 +1163 0.48780 0.17352 +1162 0.57787 0.25325 +1160 0.49568 0.15928 +1161 0.59048 0.24366 +1158 0.48011 0.16666 +1159 0.57266 0.25721 +1157 0.44977 0.19583 +1156 0.53048 0.28926 +1155 0.42713 0.26136 +1154 0.48487 0.32392 +1155 0.42713 0.26136 +1153 0.46081 0.34221 +1152 0.41252 0.29175 +1151 0.44167 0.35676 +1150 0.39679 0.30390 +1149 0.43903 0.35874 +1147 0.38637 0.28597 +1148 0.43184 0.36420 +1146 0.37804 0.28851 +SURF 0x24 +mat 0 +refs 5 +1143 0.33684 0.59556 +1145 0.39569 0.63539 +1143 0.33684 0.59556 +1144 0.37630 0.64613 +1142 0.31288 0.60693 +SURF 0x24 +mat 0 +refs 11 +1141 0.60574 0.37042 +1140 0.67264 0.41815 +1141 0.60574 0.37042 +1138 0.66347 0.41663 +1139 0.58357 0.36910 +1136 0.64506 0.42202 +1137 0.57424 0.36529 +1132 0.64593 0.43559 +1134 0.58333 0.39013 +1133 0.65153 0.46014 +1135 0.59104 0.42891 +SURF 0x24 +mat 0 +refs 23 +1131 0.52236 0.37195 +1130 0.56108 0.38310 +1128 0.59594 0.19821 +1129 0.60483 0.35982 +1128 0.59594 0.19821 +1126 0.61288 0.35834 +1127 0.58689 0.20546 +1125 0.62357 0.37048 +1124 0.58855 0.22901 +1122 0.64258 0.38059 +1123 0.59317 0.25891 +1120 0.65210 0.39144 +1121 0.60428 0.30363 +1118 0.63783 0.38247 +1119 0.60387 0.32573 +1116 0.62183 0.37457 +1117 0.58889 0.31381 +1114 0.59993 0.36263 +1115 0.56709 0.29683 +1110 0.59053 0.35234 +1112 0.53833 0.29859 +1111 0.57834 0.34793 +1113 0.51145 0.30020 +SURF 0x24 +mat 0 +refs 33 +269 0.56215 0.47760 +1109 0.58707 0.42130 +269 0.56215 0.47760 +1108 0.59728 0.39824 +1107 0.56391 0.47362 +1105 0.60040 0.39118 +1106 0.56569 0.46959 +1104 0.60704 0.37617 +264 0.57842 0.44082 +1103 0.61418 0.36004 +261 0.58545 0.42492 +1101 0.62086 0.34494 +1102 0.58953 0.41572 +1101 0.62086 0.34494 +257 0.59010 0.41442 +1100 0.61278 0.36321 +257 0.59010 0.41442 +1098 0.60805 0.37389 +1099 0.58444 0.42720 +1097 0.59878 0.39484 +253 0.57117 0.45720 +1096 0.59193 0.41033 +251 0.56086 0.48051 +1094 0.58720 0.42101 +1095 0.55071 0.50346 +1092 0.58275 0.43107 +1093 0.54145 0.52438 +1090 0.58078 0.43553 +1091 0.53555 0.53772 +1087 0.58130 0.43435 +243 0.54079 0.52588 +1088 0.58272 0.43114 +1089 0.55047 0.50399 +SURF 0x24 +mat 0 +refs 7 +1085 0.41115 0.39363 +1086 0.42297 0.39963 +1083 0.42764 0.37693 +1081 0.43501 0.38399 +1083 0.42764 0.37693 +1082 0.45806 0.37842 +1084 0.45826 0.37167 +SURF 0x24 +mat 0 +refs 5 +1078 0.43523 0.38398 +1080 0.42773 0.37929 +1078 0.43523 0.38398 +1079 0.41709 0.39897 +1077 0.42294 0.39962 +SURF 0x24 +mat 0 +refs 5 +1074 0.34397 0.34754 +1076 0.32320 0.35098 +1074 0.34397 0.34754 +1075 0.31966 0.35568 +1073 0.34090 0.35725 +SURF 0x24 +mat 0 +refs 7 +1071 0.40709 0.39275 +1072 0.42588 0.39951 +1069 0.42366 0.37367 +1067 0.43720 0.38496 +1069 0.42366 0.37367 +1068 0.45804 0.37912 +1070 0.45842 0.36637 +SURF 0x24 +mat 0 +refs 5 +1064 0.43993 0.38493 +1066 0.42373 0.37635 +1064 0.43993 0.38493 +1065 0.41301 0.39881 +1063 0.42540 0.39935 +SURF 0x24 +mat 0 +refs 5 +1060 0.34366 0.34716 +1062 0.32422 0.34873 +1060 0.34366 0.34716 +1061 0.31744 0.35910 +1059 0.34087 0.36206 +SURF 0x24 +mat 0 +refs 7 +1057 0.41050 0.39404 +1058 0.42680 0.39953 +1055 0.42465 0.37379 +1053 0.43801 0.38594 +1055 0.42465 0.37379 +1054 0.45798 0.38074 +1056 0.45836 0.36613 +SURF 0x24 +mat 0 +refs 5 +1050 0.43784 0.38603 +1052 0.41817 0.37525 +1050 0.43784 0.38603 +1051 0.41054 0.39866 +1049 0.42746 0.39937 +SURF 0x24 +mat 0 +refs 5 +1046 0.34157 0.34729 +1048 0.32529 0.34697 +1046 0.34157 0.34729 +1047 0.31605 0.36115 +1045 0.33849 0.36718 +SURF 0x24 +mat 0 +refs 7 +1043 0.41498 0.39412 +1044 0.42680 0.39953 +1041 0.42914 0.37365 +1039 0.43801 0.38594 +1041 0.42914 0.37365 +1040 0.45798 0.38074 +1042 0.45835 0.36639 +SURF 0x24 +mat 0 +refs 5 +1036 0.43784 0.38603 +1038 0.42266 0.37514 +1036 0.43784 0.38603 +1037 0.41503 0.39879 +1035 0.42746 0.39937 +SURF 0x24 +mat 0 +refs 5 +1032 0.34157 0.34729 +1034 0.32529 0.34697 +1032 0.34157 0.34729 +1033 0.31845 0.35736 +1031 0.34109 0.36352 +SURF 0x24 +mat 0 +refs 5 +1028 0.44164 0.38654 +1030 0.42658 0.37568 +1028 0.44164 0.38654 +1029 0.41909 0.39889 +1027 0.42860 0.39938 +SURF 0x24 +mat 0 +refs 5 +1024 0.34369 0.34319 +1026 0.32589 0.34599 +1024 0.34369 0.34319 +1025 0.32061 0.35391 +1023 0.34282 0.35996 +SURF 0x24 +mat 0 +refs 7 +1021 0.41787 0.39836 +1022 0.43433 0.40215 +1019 0.43041 0.37661 +1017 0.44134 0.38715 +1019 0.43041 0.37661 +1018 0.45794 0.38235 +1020 0.45830 0.36922 +SURF 0x24 +mat 0 +refs 5 +1014 0.44164 0.38654 +1016 0.42899 0.37876 +1014 0.44164 0.38654 +1015 0.42159 0.39902 +1013 0.42860 0.39938 +SURF 0x24 +mat 0 +refs 5 +1010 0.34369 0.34319 +1012 0.32589 0.34599 +1010 0.34369 0.34319 +1011 0.32200 0.35183 +1009 0.34186 0.35639 +SURF 0x24 +mat 0 +refs 7 +1007 0.32098 0.35265 +1008 0.33119 0.34248 +1005 0.31103 0.33226 +1003 0.32187 0.32879 +1005 0.31103 0.33226 +1004 0.32621 0.31207 +1006 0.31830 0.30708 +SURF 0x24 +mat 0 +refs 7 +1001 0.34392 0.35128 +1002 0.34335 0.33885 +999 0.32513 0.34677 +997 0.32795 0.34264 +999 0.32513 0.34677 +998 0.32577 0.32647 +1000 0.31357 0.33202 +SURF 0x24 +mat 0 +refs 7 +995 0.32238 0.34440 +996 0.32888 0.34173 +993 0.31653 0.32944 +991 0.32557 0.32674 +993 0.31653 0.32944 +992 0.32849 0.31352 +994 0.32183 0.30932 +SURF 0x24 +mat 0 +refs 7 +989 0.32771 0.33929 +990 0.33285 0.33541 +987 0.32632 0.32892 +985 0.33068 0.32446 +987 0.32632 0.32892 +986 0.33233 0.31595 +988 0.32962 0.31434 +SURF 0x24 +mat 0 +refs 7 +983 0.34038 0.33919 +984 0.34379 0.33248 +981 0.33091 0.33729 +979 0.33276 0.33542 +981 0.33091 0.33729 +980 0.33583 0.32110 +982 0.32642 0.33034 +SURF 0x24 +mat 0 +refs 8 +977 0.32295 0.35079 +978 0.32129 0.36394 +977 0.32295 0.35079 +975 0.34437 0.35963 +976 0.34266 0.34958 +975 0.34437 0.35963 +974 0.36018 0.33361 +973 0.36588 0.33723 +SURF 0x24 +mat 0 +refs 8 +971 0.32469 0.34844 +972 0.31975 0.36779 +971 0.32469 0.34844 +969 0.34484 0.36476 +970 0.34308 0.34721 +969 0.34484 0.36476 +968 0.35959 0.33324 +967 0.37036 0.34007 +SURF 0x24 +mat 0 +refs 8 +965 0.32518 0.34766 +966 0.32059 0.36425 +965 0.32518 0.34766 +963 0.34530 0.36388 +964 0.34272 0.34601 +963 0.34530 0.36388 +962 0.35822 0.33237 +961 0.37053 0.34025 +SURF 0x24 +mat 0 +refs 8 +959 0.32518 0.34766 +960 0.32304 0.36049 +959 0.32518 0.34766 +957 0.34792 0.36023 +958 0.34272 0.34601 +957 0.34792 0.36023 +956 0.35822 0.33237 +955 0.37031 0.34011 +SURF 0x24 +mat 0 +refs 8 +953 0.32723 0.33996 +954 0.32114 0.35571 +953 0.32723 0.33996 +951 0.34618 0.35752 +952 0.34359 0.34256 +951 0.34618 0.35752 +950 0.35686 0.33151 +949 0.36794 0.33856 +SURF 0x24 +mat 0 +refs 8 +947 0.32723 0.33996 +948 0.32238 0.35354 +947 0.32723 0.33996 +945 0.34506 0.35385 +946 0.34359 0.34256 +945 0.34506 0.35385 +944 0.35686 0.33151 +943 0.36475 0.33654 +SURF 0x24 +mat 0 +refs 8 +941 0.32889 0.34173 +942 0.32924 0.34876 +941 0.32889 0.34173 +939 0.34528 0.34767 +940 0.34386 0.33834 +939 0.34528 0.34767 +938 0.35457 0.33006 +937 0.36121 0.33430 +SURF 0x24 +mat 0 +refs 8 +935 0.33291 0.33545 +936 0.33160 0.34176 +935 0.33291 0.33545 +933 0.34157 0.33859 +934 0.34374 0.33275 +933 0.34157 0.33859 +932 0.35074 0.32763 +931 0.35336 0.32939 +SURF 0x24 +mat 0 +refs 13 +929 0.65255 0.60669 +930 0.66605 0.62422 +921 0.62660 0.61763 +922 0.64507 0.64041 +904 0.59718 0.63503 +905 0.61784 0.66186 +888 0.56497 0.64858 +905 0.61784 0.66186 +906 0.59443 0.69474 +907 0.65452 0.71091 +908 0.62485 0.75392 +909 0.67723 0.74139 +910 0.64031 0.79713 +SURF 0x24 +mat 0 +refs 19 +928 0.60374 0.58905 +921 0.62660 0.61763 +917 0.56801 0.59596 +904 0.59718 0.63503 +886 0.54086 0.59595 +888 0.56497 0.64858 +885 0.50784 0.59614 +887 0.53088 0.67048 +885 0.50784 0.59614 +927 0.51653 0.67624 +916 0.49262 0.59397 +927 0.51653 0.67624 +890 0.47006 0.58890 +893 0.47098 0.65579 +892 0.42143 0.54504 +897 0.40488 0.62815 +896 0.39286 0.54873 +899 0.37357 0.61836 +898 0.36623 0.55254 +SURF 0x24 +mat 0 +refs 32 +892 0.42143 0.54504 +891 0.43964 0.52426 +890 0.47006 0.58890 +889 0.45210 0.50973 +877 0.46830 0.57773 +869 0.45667 0.53136 +868 0.45922 0.58671 +866 0.45419 0.57737 +868 0.45922 0.58671 +867 0.47574 0.64988 +868 0.45922 0.58671 +873 0.51002 0.65566 +874 0.48894 0.58641 +876 0.51990 0.64832 +875 0.49969 0.58492 +882 0.56177 0.62684 +883 0.53369 0.57481 +903 0.58691 0.61377 +883 0.53369 0.57481 +902 0.55267 0.57800 +884 0.53331 0.57560 +918 0.55338 0.57806 +884 0.53331 0.57560 +917 0.56801 0.59596 +884 0.53331 0.57560 +886 0.54086 0.59595 +879 0.50161 0.58597 +885 0.50784 0.59614 +878 0.49165 0.58901 +916 0.49262 0.59397 +877 0.46830 0.57773 +890 0.47006 0.58890 +SURF 0x24 +mat 0 +refs 8 +877 0.46830 0.57773 +868 0.45922 0.58671 +878 0.49165 0.58901 +874 0.48894 0.58641 +879 0.50161 0.58597 +875 0.49969 0.58492 +884 0.53331 0.57560 +883 0.53369 0.57481 +SURF 0x24 +mat 0 +refs 7 +887 0.53088 0.67048 +888 0.56497 0.64858 +887 0.53088 0.67048 +906 0.59443 0.69474 +911 0.53803 0.74982 +908 0.62485 0.75392 +912 0.55794 0.81469 +SURF 0x24 +mat 0 +refs 7 +909 0.67723 0.74139 +926 0.69550 0.69281 +909 0.67723 0.74139 +925 0.70166 0.69580 +919 0.68182 0.74985 +920 0.70790 0.69990 +914 0.68676 0.75560 +SURF 0x24 +mat 0 +refs 9 +923 0.66369 0.63651 +924 0.62986 0.59780 +901 0.63643 0.66263 +903 0.58691 0.61377 +901 0.63643 0.66263 +882 0.56177 0.62684 +881 0.60160 0.71635 +876 0.51990 0.64832 +880 0.56074 0.77505 +SURF 0x24 +mat 0 +refs 8 +901 0.63643 0.66263 +881 0.60160 0.71635 +901 0.63643 0.66263 +900 0.62766 0.76594 +913 0.65991 0.71132 +900 0.62766 0.76594 +914 0.68676 0.75560 +915 0.64469 0.81970 +SURF 0x24 +mat 0 +refs 17 +894 0.31434 0.51830 +895 0.37704 0.62181 +871 0.34900 0.49100 +870 0.44306 0.63483 +863 0.36335 0.47969 +864 0.47925 0.63893 +863 0.36335 0.47969 +862 0.46835 0.63647 +861 0.36677 0.47700 +860 0.45810 0.63104 +858 0.37023 0.47427 +859 0.45529 0.60760 +857 0.39494 0.45480 +866 0.45419 0.57737 +865 0.40860 0.44405 +869 0.45667 0.53136 +872 0.41650 0.43782 +SURF 0x24 +mat 0 +refs 4 +856 0.38600 0.46011 +853 0.29126 0.40777 +855 0.40580 0.43337 +854 0.32724 0.36110 +SURF 0x24 +mat 0 +refs 12 +853 0.29126 0.40777 +852 0.32689 0.48840 +853 0.29126 0.40777 +850 0.27127 0.46747 +851 0.21470 0.37007 +850 0.27127 0.46747 +849 0.18168 0.37154 +848 0.22824 0.46514 +844 0.19708 0.38616 +847 0.23931 0.46950 +842 0.25357 0.42328 +846 0.28402 0.48879 +SURF 0x24 +mat 0 +refs 6 +845 0.18118 0.29475 +844 0.19708 0.38616 +839 0.25037 0.36395 +842 0.25357 0.42328 +838 0.33448 0.44805 +843 0.35799 0.48037 +SURF 0x24 +mat 0 +refs 26 +839 0.25037 0.36395 +838 0.33448 0.44805 +839 0.25037 0.36395 +830 0.31906 0.43002 +831 0.21540 0.29729 +830 0.31906 0.43002 +825 0.20938 0.31319 +821 0.26954 0.41963 +817 0.19961 0.31455 +816 0.25194 0.42793 +815 0.19255 0.30642 +816 0.25194 0.42793 +814 0.25730 0.41893 +818 0.34104 0.47551 +819 0.28253 0.38598 +820 0.35408 0.43546 +823 0.31289 0.34992 +824 0.45540 0.39698 +823 0.31289 0.34992 +826 0.47781 0.37105 +827 0.34627 0.32880 +828 0.47774 0.37602 +829 0.33201 0.33006 +828 0.47774 0.37602 +834 0.34970 0.38213 +833 0.48389 0.39584 +SURF 0x24 +mat 0 +refs 5 +818 0.34104 0.47551 +816 0.25194 0.42793 +822 0.34677 0.48343 +821 0.26954 0.41963 +832 0.37710 0.47616 +SURF 0x24 +mat 0 +refs 7 +840 0.32113 0.42853 +841 0.24425 0.29525 +836 0.32640 0.43729 +837 0.26140 0.32952 +836 0.32640 0.43729 +834 0.34970 0.38213 +835 0.38480 0.43956 +SURF 0x24 +mat 0 +refs 10 +812 0.31303 0.38862 +813 0.40530 0.49349 +812 0.31303 0.38862 +810 0.43575 0.45283 +811 0.37765 0.33685 +806 0.47818 0.43247 +807 0.43982 0.29997 +806 0.47818 0.43247 +805 0.50000 0.29258 +804 0.50000 0.42493 +SURF 0x24 +mat 0 +refs 5 +807 0.43982 0.29997 +805 0.50000 0.29258 +807 0.43982 0.29997 +808 0.50000 0.20599 +809 0.37475 0.20781 +SURF 0x24 +mat 0 +refs 14 +803 0.58953 0.41572 +802 0.66880 0.47959 +803 0.58953 0.41572 +800 0.65464 0.46261 +801 0.59010 0.41442 +800 0.65464 0.46261 +796 0.58445 0.42720 +794 0.65043 0.48128 +796 0.58445 0.42720 +795 0.64406 0.50817 +797 0.57117 0.45720 +795 0.64406 0.50817 +799 0.56086 0.48051 +798 0.62054 0.52481 +SURF 0x24 +mat 0 +refs 20 +791 0.43942 0.32223 +792 0.38631 0.36140 +788 0.42772 0.27341 +789 0.31901 0.35393 +784 0.30564 0.21057 +793 0.26009 0.35353 +784 0.30564 0.21057 +786 0.24378 0.26976 +784 0.30564 0.21057 +785 0.22263 0.24435 +782 0.30810 0.17512 +783 0.22031 0.26546 +782 0.30810 0.17512 +780 0.28346 0.19750 +790 0.36869 0.14343 +780 0.28346 0.19750 +779 0.36134 0.16077 +780 0.28346 0.19750 +776 0.30215 0.22628 +781 0.27024 0.29445 +SURF 0x24 +mat 0 +refs 35 +779 0.36134 0.16077 +776 0.30215 0.22628 +775 0.37088 0.17503 +766 0.28584 0.23111 +765 0.38128 0.17444 +760 0.27885 0.22415 +759 0.38510 0.16653 +756 0.28105 0.21361 +755 0.40118 0.18141 +754 0.31441 0.22100 +758 0.43674 0.21314 +754 0.31441 0.22100 +752 0.35795 0.25259 +753 0.27215 0.33338 +752 0.35795 0.25259 +751 0.31923 0.33574 +752 0.35795 0.25259 +761 0.35624 0.34954 +762 0.41311 0.23382 +763 0.34661 0.33895 +764 0.38309 0.24568 +770 0.31587 0.38454 +764 0.38309 0.24568 +767 0.30432 0.28240 +768 0.43881 0.18804 +769 0.32123 0.24801 +774 0.44353 0.18010 +769 0.32123 0.24801 +772 0.35441 0.25206 +771 0.26164 0.38987 +772 0.35441 0.25206 +773 0.29124 0.41422 +772 0.35441 0.25206 +777 0.31652 0.44344 +778 0.38232 0.30764 +SURF 0x24 +mat 0 +refs 5 +753 0.27215 0.33338 +754 0.31441 0.22100 +753 0.27215 0.33338 +756 0.28105 0.21361 +757 0.23066 0.33324 +SURF 0x24 +mat 0 +refs 6 +782 0.30810 0.17512 +790 0.36869 0.14343 +782 0.30810 0.17512 +787 0.39309 0.18045 +784 0.30564 0.21057 +788 0.42772 0.27341 +SURF 0x24 +mat 0 +refs 9 +749 0.43049 0.10697 +750 0.31416 0.17461 +748 0.44214 0.14066 +747 0.31931 0.20541 +745 0.44936 0.16156 +743 0.33114 0.22478 +745 0.44936 0.16156 +744 0.35183 0.24050 +746 0.45622 0.18140 +SURF 0x24 +mat 0 +refs 14 +741 0.40313 0.31553 +742 0.43731 0.39155 +739 0.41235 0.29781 +740 0.44501 0.37963 +735 0.40917 0.29819 +736 0.44981 0.39027 +733 0.40397 0.31419 +734 0.45902 0.43260 +729 0.44053 0.30906 +730 0.49507 0.46655 +731 0.43564 0.28659 +732 0.48970 0.46906 +737 0.40562 0.31817 +738 0.44569 0.47101 +SURF 0x24 +mat 0 +refs 11 +719 0.48022 0.28857 +728 0.49924 0.31300 +719 0.48022 0.28857 +722 0.50038 0.31214 +718 0.47467 0.27976 +721 0.49223 0.31833 +717 0.44091 0.24950 +721 0.49223 0.31833 +720 0.43752 0.23257 +723 0.49732 0.31446 +724 0.40863 0.23369 +SURF 0x24 +mat 0 +refs 15 +718 0.47467 0.27976 +717 0.44091 0.24950 +718 0.47467 0.27976 +711 0.45002 0.26733 +719 0.48022 0.28857 +711 0.45002 0.26733 +715 0.47482 0.29453 +712 0.45031 0.29661 +714 0.47326 0.29853 +713 0.45297 0.30011 +726 0.47373 0.29984 +713 0.45297 0.30011 +725 0.45378 0.30117 +716 0.44771 0.32147 +727 0.44715 0.32003 +SURF 0x24 +mat 0 +refs 16 +716 0.44771 0.32147 +713 0.45297 0.30011 +710 0.44435 0.31497 +712 0.45031 0.29661 +710 0.44435 0.31497 +711 0.45002 0.26733 +710 0.44435 0.31497 +707 0.44176 0.28945 +709 0.45398 0.34740 +707 0.44176 0.28945 +708 0.45626 0.34566 +706 0.44476 0.31158 +704 0.45177 0.34908 +706 0.44476 0.31158 +703 0.41262 0.26257 +705 0.42243 0.25778 +SURF 0x24 +mat 0 +refs 5 +702 0.42648 0.36830 +704 0.45177 0.34908 +702 0.42648 0.36830 +703 0.41262 0.26257 +701 0.34925 0.26968 +SURF 0x24 +mat 0 +refs 13 +699 0.42272 0.38268 +700 0.31095 0.43715 +693 0.41651 0.44968 +694 0.24475 0.52298 +691 0.41612 0.48610 +692 0.25461 0.56393 +691 0.41612 0.48610 +687 0.26364 0.56768 +688 0.41746 0.47501 +683 0.28567 0.54561 +685 0.42181 0.46426 +684 0.35450 0.49859 +686 0.44484 0.45907 +SURF 0x24 +mat 0 +refs 11 +698 0.28902 0.58105 +697 0.41092 0.52750 +698 0.28902 0.58105 +695 0.40261 0.51842 +696 0.27159 0.55920 +690 0.40486 0.48373 +689 0.23465 0.54396 +684 0.35450 0.49859 +682 0.21207 0.53667 +683 0.28567 0.54561 +681 0.16444 0.55374 +SURF 0x24 +mat 0 +refs 11 +680 0.25971 0.55457 +679 0.19432 0.49299 +678 0.29089 0.55304 +677 0.23347 0.47315 +676 0.30113 0.56138 +675 0.25039 0.46113 +674 0.30966 0.57929 +673 0.25513 0.45965 +671 0.31541 0.61532 +672 0.22351 0.44644 +670 0.25059 0.56780 +SURF 0x24 +mat 0 +refs 7 +668 0.41345 0.26501 +667 0.48558 0.29999 +666 0.43408 0.28984 +669 0.51850 0.34484 +666 0.43408 0.28984 +664 0.46109 0.30584 +665 0.39905 0.24327 +SURF 0x24 +mat 0 +refs 23 +664 0.46109 0.30584 +663 0.50251 0.37426 +664 0.46109 0.30584 +661 0.52369 0.34486 +662 0.48016 0.26216 +661 0.52369 0.34486 +660 0.48928 0.24225 +659 0.53291 0.32713 +658 0.48058 0.24109 +657 0.52973 0.32751 +656 0.47678 0.23138 +655 0.52453 0.34352 +652 0.48735 0.21788 +651 0.56109 0.33839 +650 0.50612 0.21946 +649 0.55620 0.31592 +647 0.47855 0.25418 +645 0.52618 0.34749 +647 0.47855 0.25418 +646 0.45583 0.39476 +648 0.40101 0.31606 +653 0.40454 0.38463 +654 0.35827 0.34239 +SURF 0x24 +mat 0 +refs 49 +628 0.53613 0.58643 +632 0.57561 0.55962 +628 0.53613 0.58643 +631 0.56659 0.54405 +629 0.52920 0.57320 +642 0.55425 0.52675 +641 0.51741 0.55464 +633 0.55811 0.53138 +630 0.51777 0.55539 +634 0.57851 0.55413 +630 0.51777 0.55539 +610 0.53868 0.57393 +611 0.47477 0.59541 +610 0.53868 0.57393 +609 0.52043 0.63920 +606 0.56875 0.60874 +603 0.59255 0.63772 +607 0.60328 0.58682 +603 0.59255 0.63772 +608 0.62884 0.61705 +603 0.59255 0.63772 +604 0.64205 0.63478 +599 0.60786 0.66172 +604 0.64205 0.63478 +601 0.59910 0.65416 +605 0.63531 0.62799 +612 0.58870 0.64513 +613 0.62412 0.61578 +635 0.57937 0.63899 +636 0.61284 0.60527 +635 0.57937 0.63899 +640 0.58834 0.58053 +635 0.57937 0.63899 +638 0.55138 0.60971 +635 0.57937 0.63899 +639 0.52596 0.63819 +635 0.57937 0.63899 +637 0.54917 0.67915 +635 0.57937 0.63899 +614 0.55689 0.69421 +612 0.58870 0.64513 +614 0.55689 0.69421 +601 0.59910 0.65416 +600 0.57013 0.71844 +599 0.60786 0.66172 +598 0.57445 0.72700 +603 0.59255 0.63772 +602 0.54811 0.69110 +609 0.52043 0.63920 +SURF 0x24 +mat 0 +refs 35 +617 0.42987 0.61081 +624 0.36974 0.63612 +617 0.42987 0.61081 +623 0.34192 0.59446 +616 0.40802 0.58862 +625 0.33911 0.59389 +619 0.40156 0.58144 +626 0.35798 0.62047 +619 0.40156 0.58144 +622 0.41610 0.59430 +618 0.45312 0.57027 +622 0.41610 0.59430 +621 0.46795 0.58223 +644 0.46292 0.63928 +627 0.49847 0.61179 +643 0.49512 0.68036 +627 0.49847 0.61179 +639 0.52596 0.63819 +627 0.49847 0.61179 +638 0.55138 0.60971 +627 0.49847 0.61179 +628 0.53613 0.58643 +621 0.46795 0.58223 +629 0.52920 0.57320 +618 0.45312 0.57027 +641 0.51741 0.55464 +618 0.45312 0.57027 +630 0.51777 0.55539 +615 0.45615 0.57405 +611 0.47477 0.59541 +616 0.40802 0.58862 +611 0.47477 0.59541 +617 0.42987 0.61081 +609 0.52043 0.63920 +620 0.48662 0.65975 +SURF 0x24 +mat 0 +refs 5 +615 0.45615 0.57405 +616 0.40802 0.58862 +615 0.45615 0.57405 +619 0.40156 0.58144 +618 0.45312 0.57027 +SURF 0x24 +mat 0 +refs 5 +595 0.31386 0.50820 +597 0.39394 0.41364 +595 0.31386 0.50820 +596 0.37254 0.40619 +594 0.24802 0.46949 +SURF 0x24 +mat 0 +refs 5 +591 0.24755 0.43431 +593 0.23690 0.36784 +591 0.24755 0.43431 +592 0.35581 0.43151 +590 0.34549 0.47417 +SURF 0x24 +mat 0 +refs 32 +574 0.64726 0.50345 +575 0.60851 0.52825 +574 0.64726 0.50345 +552 0.59460 0.48600 +573 0.63049 0.46615 +553 0.57520 0.37877 +573 0.63049 0.46615 +576 0.59406 0.36911 +586 0.66405 0.44517 +576 0.59406 0.36911 +585 0.61242 0.35700 +564 0.53797 0.43597 +585 0.61242 0.35700 +555 0.56423 0.41424 +584 0.63666 0.33860 +550 0.56394 0.40929 +549 0.63470 0.33636 +546 0.55677 0.41262 +545 0.62537 0.33950 +541 0.51021 0.42832 +545 0.62537 0.33950 +537 0.58943 0.35805 +554 0.66212 0.44966 +537 0.58943 0.35805 +536 0.65011 0.45932 +532 0.56837 0.36881 +528 0.62213 0.48004 +533 0.55076 0.37720 +528 0.62213 0.48004 +529 0.59962 0.48966 +530 0.64574 0.52079 +531 0.62052 0.53256 +SURF 0x24 +mat 0 +refs 9 +526 0.53108 0.26928 +527 0.56783 0.37945 +526 0.53108 0.26928 +520 0.58151 0.37011 +522 0.54041 0.26614 +521 0.58920 0.36441 +523 0.54237 0.26838 +524 0.56976 0.37496 +525 0.51812 0.28678 +SURF 0x24 +mat 0 +refs 6 +518 0.31089 0.32783 +519 0.41437 0.37633 +517 0.35434 0.28359 +516 0.47222 0.32486 +515 0.39845 0.23975 +514 0.49460 0.30200 +SURF 0x24 +mat 0 +refs 9 +508 0.37652 0.50611 +513 0.31252 0.45337 +508 0.37652 0.50611 +510 0.27179 0.48500 +506 0.33911 0.53491 +509 0.24021 0.50727 +505 0.31401 0.55193 +512 0.21305 0.53432 +511 0.29633 0.56601 +SURF 0x24 +mat 0 +refs 7 +507 0.42162 0.53249 +508 0.37652 0.50611 +507 0.42162 0.53249 +506 0.33911 0.53491 +504 0.38324 0.55975 +505 0.31401 0.55193 +503 0.36904 0.56898 +SURF 0x24 +mat 0 +refs 10 +499 0.28894 0.56921 +502 0.22213 0.53902 +499 0.28894 0.56921 +501 0.27308 0.51039 +497 0.33413 0.53504 +500 0.36300 0.45475 +497 0.33413 0.53504 +496 0.39615 0.49555 +495 0.37124 0.55992 +494 0.42005 0.52710 +SURF 0x24 +mat 0 +refs 5 +497 0.33413 0.53504 +495 0.37124 0.55992 +497 0.33413 0.53504 +498 0.33822 0.58979 +499 0.28894 0.56921 +SURF 0x24 +mat 0 +refs 6 +493 0.27761 0.64906 +492 0.28508 0.64210 +488 0.33540 0.58125 +491 0.33594 0.58929 +486 0.36970 0.54043 +490 0.37186 0.54977 +SURF 0x24 +mat 0 +refs 4 +486 0.36970 0.54043 +487 0.36260 0.51375 +488 0.33540 0.58125 +489 0.32807 0.55987 +SURF 0x24 +mat 0 +refs 7 +472 0.30700 0.53958 +473 0.32818 0.47946 +472 0.30700 0.53958 +471 0.24623 0.46799 +469 0.24213 0.54241 +470 0.18874 0.45442 +468 0.19018 0.53734 +SURF 0x24 +mat 0 +refs 5 +465 0.21096 0.54541 +467 0.22046 0.49371 +465 0.21096 0.54541 +466 0.30874 0.47716 +464 0.28554 0.53814 +SURF 0x24 +mat 0 +refs 99 +443 0.63276 0.46602 +463 0.63450 0.50236 +443 0.63276 0.46602 +462 0.61470 0.51430 +442 0.61161 0.46796 +462 0.61470 0.51430 +440 0.60698 0.46272 +461 0.61454 0.51498 +440 0.60698 0.46272 +460 0.65483 0.48620 +440 0.60698 0.46272 +439 0.64515 0.44141 +432 0.61611 0.43176 +431 0.64217 0.41481 +430 0.61600 0.41108 +431 0.64217 0.41481 +409 0.63702 0.39562 +433 0.67592 0.39792 +409 0.63702 0.39562 +404 0.66462 0.37890 +402 0.56750 0.42712 +394 0.63391 0.46437 +393 0.59186 0.41543 +394 0.63391 0.46437 +390 0.60960 0.40831 +392 0.64516 0.46033 +390 0.60960 0.40831 +391 0.64209 0.46546 +390 0.60960 0.40831 +389 0.60818 0.41186 +399 0.60590 0.38168 +389 0.60818 0.41186 +396 0.60432 0.38538 +395 0.60047 0.41780 +397 0.59253 0.39267 +395 0.60047 0.41780 +400 0.58725 0.42687 +407 0.70206 0.36694 +400 0.58725 0.42687 +405 0.69007 0.37694 +406 0.63029 0.33582 +437 0.66789 0.39539 +406 0.63029 0.33582 +436 0.65168 0.40524 +426 0.61404 0.34504 +427 0.59943 0.35271 +422 0.59983 0.31831 +428 0.57755 0.33290 +423 0.52548 0.40496 +457 0.56153 0.31690 +458 0.51282 0.38807 +459 0.47956 0.40705 +322 0.49336 0.36417 +321 0.45541 0.38611 +322 0.49336 0.36417 +323 0.51550 0.35140 +458 0.51282 0.38807 +456 0.53064 0.37581 +423 0.52548 0.40496 +419 0.54256 0.39473 +422 0.59983 0.31831 +417 0.55325 0.41428 +426 0.61404 0.34504 +417 0.55325 0.41428 +406 0.63029 0.33582 +401 0.57077 0.40567 +400 0.58725 0.42687 +401 0.57077 0.40567 +397 0.59253 0.39267 +411 0.58758 0.37034 +397 0.59253 0.39267 +410 0.60178 0.36187 +396 0.60432 0.38538 +413 0.59932 0.36022 +399 0.60590 0.38168 +412 0.57733 0.36816 +399 0.60590 0.38168 +398 0.57958 0.38489 +390 0.60960 0.40831 +398 0.57958 0.38489 +393 0.59186 0.41543 +403 0.55060 0.39766 +402 0.56750 0.42712 +414 0.52222 0.41831 +402 0.56750 0.42712 +408 0.60293 0.34205 +409 0.63702 0.39562 +425 0.58632 0.35665 +430 0.61600 0.41108 +434 0.62114 0.41564 +432 0.61611 0.43176 +435 0.62107 0.43538 +440 0.60698 0.46272 +435 0.62107 0.43538 +442 0.61161 0.46796 +441 0.63457 0.43201 +443 0.63276 0.46602 +444 0.65719 0.42022 +445 0.66431 0.44747 +SURF 0x24 +mat 0 +refs 49 +436 0.65168 0.40524 +444 0.65719 0.42022 +436 0.65168 0.40524 +441 0.63457 0.43201 +438 0.63203 0.41365 +435 0.62107 0.43538 +438 0.63203 0.41365 +434 0.62114 0.41564 +429 0.59018 0.35666 +425 0.58632 0.35665 +424 0.56842 0.34049 +425 0.58632 0.35665 +420 0.56443 0.34014 +408 0.60293 0.34205 +420 0.56443 0.34014 +414 0.52222 0.41831 +421 0.54876 0.32334 +414 0.52222 0.41831 +415 0.50960 0.40706 +403 0.55060 0.39766 +416 0.54235 0.38428 +398 0.57958 0.38489 +416 0.54235 0.38428 +412 0.57733 0.36816 +451 0.53224 0.36770 +412 0.57733 0.36816 +448 0.56906 0.34510 +413 0.59932 0.36022 +449 0.59368 0.33467 +410 0.60178 0.36187 +446 0.59837 0.33470 +411 0.58758 0.37034 +447 0.58136 0.34746 +411 0.58758 0.37034 +418 0.55886 0.38551 +401 0.57077 0.40567 +418 0.55886 0.38551 +417 0.55325 0.41428 +418 0.55886 0.38551 +419 0.54256 0.39473 +455 0.54985 0.36693 +456 0.53064 0.37581 +324 0.53685 0.33901 +323 0.51550 0.35140 +324 0.53685 0.33901 +314 0.57168 0.31885 +455 0.54985 0.36693 +447 0.58136 0.34746 +418 0.55886 0.38551 +SURF 0x24 +mat 0 +refs 40 +436 0.65168 0.40524 +438 0.63203 0.41365 +427 0.59943 0.35271 +429 0.59018 0.35666 +428 0.57755 0.33290 +424 0.56842 0.34049 +457 0.56153 0.31690 +452 0.54535 0.32881 +459 0.47956 0.40705 +453 0.52005 0.31029 +321 0.45541 0.38611 +320 0.43712 0.39667 +321 0.45541 0.38611 +319 0.44766 0.39059 +323 0.51550 0.35140 +315 0.58765 0.30975 +314 0.57168 0.31885 +313 0.58732 0.30986 +447 0.58136 0.34746 +313 0.58732 0.30986 +446 0.59837 0.33470 +315 0.58765 0.30975 +449 0.59368 0.33467 +316 0.57457 0.31724 +448 0.56906 0.34510 +317 0.52088 0.34826 +451 0.53224 0.36770 +318 0.46858 0.37849 +451 0.53224 0.36770 +450 0.49257 0.38970 +416 0.54235 0.38428 +450 0.49257 0.38970 +415 0.50960 0.40706 +454 0.53177 0.30306 +421 0.54876 0.32334 +453 0.52005 0.31029 +421 0.54876 0.32334 +452 0.54535 0.32881 +420 0.56443 0.34014 +424 0.56842 0.34049 +SURF 0x24 +mat 0 +refs 12 +320 0.43712 0.39667 +453 0.52005 0.31029 +320 0.43712 0.39667 +454 0.53177 0.30306 +319 0.44766 0.39059 +450 0.49257 0.38970 +319 0.44766 0.39059 +318 0.46858 0.37849 +319 0.44766 0.39059 +317 0.52088 0.34826 +315 0.58765 0.30975 +316 0.57457 0.31724 +SURF 0x24 +mat 0 +refs 8 +388 0.31194 0.43668 +387 0.41925 0.41102 +382 0.28773 0.49412 +381 0.39851 0.47960 +380 0.28485 0.52728 +379 0.38280 0.52699 +383 0.31181 0.55589 +386 0.39000 0.54069 +SURF 0x24 +mat 0 +refs 5 +380 0.28485 0.52728 +383 0.31181 0.55589 +380 0.28485 0.52728 +384 0.24930 0.58231 +385 0.17673 0.53226 +SURF 0x24 +mat 0 +refs 14 +378 0.33498 0.63103 +377 0.41441 0.58790 +378 0.33498 0.63103 +371 0.41916 0.63354 +370 0.32603 0.68978 +371 0.41916 0.63354 +367 0.33267 0.73236 +364 0.41854 0.65254 +366 0.33464 0.72062 +365 0.41805 0.65651 +368 0.34425 0.67289 +369 0.41428 0.60024 +373 0.34712 0.59319 +376 0.40076 0.54588 +SURF 0x24 +mat 0 +refs 5 +368 0.34425 0.67289 +373 0.34712 0.59319 +368 0.34425 0.67289 +374 0.32069 0.60227 +375 0.28647 0.71625 +SURF 0x24 +mat 0 +refs 7 +363 0.47415 0.60425 +365 0.41805 0.65651 +363 0.47415 0.60425 +364 0.41854 0.65254 +362 0.47072 0.59748 +371 0.41916 0.63354 +372 0.46827 0.58817 +SURF 0x24 +mat 0 +refs 22 +359 0.55826 0.53647 +361 0.57231 0.52889 +359 0.55826 0.53647 +360 0.58437 0.54352 +356 0.57176 0.55400 +357 0.60580 0.56284 +355 0.59412 0.57923 +349 0.61740 0.57328 +350 0.60709 0.59224 +345 0.62254 0.57492 +344 0.61237 0.59379 +346 0.62805 0.57723 +340 0.61755 0.59649 +347 0.62245 0.56667 +341 0.61019 0.58495 +348 0.60022 0.53794 +341 0.61019 0.58495 +342 0.58301 0.55183 +333 0.60291 0.61325 +334 0.56940 0.56630 +335 0.56562 0.64110 +336 0.54214 0.59241 +SURF 0x24 +mat 0 +refs 15 +335 0.56562 0.64110 +338 0.59247 0.68538 +333 0.60291 0.61325 +337 0.61361 0.62968 +341 0.61019 0.58495 +337 0.61361 0.62968 +340 0.61755 0.59649 +339 0.60737 0.62559 +344 0.61237 0.59379 +343 0.60121 0.62259 +350 0.60709 0.59224 +351 0.58091 0.60538 +355 0.59412 0.57923 +354 0.55078 0.57020 +356 0.57176 0.55400 +SURF 0x24 +mat 0 +refs 7 +358 0.52355 0.59164 +354 0.55078 0.57020 +358 0.52355 0.59164 +351 0.58091 0.60538 +352 0.56023 0.64069 +343 0.60121 0.62259 +353 0.58294 0.67117 +SURF 0x24 +mat 0 +refs 5 +330 0.60777 0.29672 +332 0.50618 0.34758 +330 0.60777 0.29672 +331 0.51389 0.34164 +329 0.54780 0.39525 +SURF 0x24 +mat 0 +refs 5 +326 0.54787 0.34459 +328 0.55086 0.37119 +326 0.54787 0.34459 +327 0.59400 0.34324 +325 0.58163 0.32770 +SURF 0x24 +mat 0 +refs 5 +310 0.22561 0.54436 +312 0.29294 0.57882 +310 0.22561 0.54436 +311 0.27032 0.55875 +309 0.18160 0.51571 +SURF 0x24 +mat 0 +refs 7 +308 0.43385 0.12616 +307 0.41414 0.12263 +305 0.44647 0.14612 +303 0.41180 0.13534 +305 0.44647 0.14612 +304 0.40956 0.14234 +306 0.46590 0.15712 +SURF 0x24 +mat 0 +refs 20 +302 0.65111 0.38117 +301 0.66881 0.47958 +300 0.64560 0.39711 +299 0.65464 0.46261 +298 0.63807 0.41328 +297 0.65043 0.48128 +296 0.62847 0.43630 +295 0.64406 0.50817 +294 0.62759 0.45021 +293 0.62054 0.52480 +292 0.62084 0.46128 +291 0.59857 0.54038 +290 0.61464 0.46820 +289 0.58211 0.55529 +288 0.59692 0.47552 +287 0.57722 0.56410 +286 0.58910 0.46440 +285 0.56875 0.53904 +284 0.57809 0.44175 +283 0.55048 0.50397 +SURF 0x24 +mat 0 +refs 14 +282 0.39928 0.46145 +281 0.36335 0.47969 +282 0.39928 0.46145 +280 0.46836 0.63646 +279 0.44662 0.47607 +280 0.46836 0.63646 +278 0.45482 0.47601 +277 0.45810 0.63104 +275 0.46303 0.46207 +276 0.45529 0.60760 +274 0.47979 0.44856 +273 0.45419 0.57737 +272 0.48709 0.43611 +271 0.45668 0.53136 +SURF 0x24 +mat 0 +refs 32 +270 0.58705 0.42129 +269 0.56215 0.47760 +267 0.59725 0.39822 +268 0.56391 0.47362 +266 0.60037 0.39117 +265 0.56569 0.46959 +263 0.60701 0.37616 +264 0.57842 0.44082 +262 0.61415 0.36002 +261 0.58545 0.42492 +260 0.62083 0.34493 +259 0.58953 0.41572 +260 0.62083 0.34493 +257 0.59010 0.41442 +258 0.61275 0.36319 +257 0.59010 0.41442 +256 0.60802 0.37388 +255 0.58445 0.42720 +254 0.59875 0.39483 +253 0.57117 0.45720 +252 0.59190 0.41032 +251 0.56086 0.48051 +250 0.58717 0.42100 +249 0.55071 0.50346 +248 0.58272 0.43106 +247 0.54145 0.52438 +246 0.58075 0.43551 +245 0.53555 0.53772 +244 0.58127 0.43433 +243 0.54079 0.52588 +242 0.58269 0.43113 +241 0.55047 0.50399 +SURF 0x24 +mat 0 +refs 5 +238 0.40333 0.19986 +240 0.38045 0.20610 +238 0.40333 0.19986 +239 0.37288 0.19927 +237 0.40333 0.19311 +SURF 0x24 +mat 0 +refs 5 +234 0.45488 0.30298 +236 0.45212 0.29001 +234 0.45488 0.30298 +235 0.47548 0.29235 +233 0.47462 0.30251 +SURF 0x24 +mat 0 +refs 8 +231 0.45086 0.32362 +232 0.44283 0.31735 +231 0.45086 0.32362 +229 0.45170 0.29799 +230 0.45487 0.30295 +229 0.45170 0.29799 +228 0.47476 0.30268 +227 0.47370 0.29390 +SURF 0x24 +mat 0 +refs 5 +224 0.40333 0.20056 +226 0.38268 0.20701 +224 0.40333 0.20056 +225 0.36881 0.19613 +223 0.40333 0.18780 +SURF 0x24 +mat 0 +refs 5 +220 0.45681 0.30517 +222 0.45025 0.28631 +220 0.45681 0.30517 +221 0.47551 0.28720 +219 0.47524 0.30484 +SURF 0x24 +mat 0 +refs 8 +217 0.45133 0.32346 +218 0.43833 0.31565 +217 0.45133 0.32346 +215 0.44926 0.29472 +216 0.45663 0.30469 +215 0.44926 0.29472 +214 0.47698 0.30694 +213 0.47347 0.28894 +SURF 0x24 +mat 0 +refs 5 +210 0.40332 0.20218 +212 0.38351 0.20796 +210 0.40332 0.20218 +211 0.36980 0.19622 +209 0.40327 0.18757 +SURF 0x24 +mat 0 +refs 5 +206 0.45737 0.30590 +208 0.45140 0.28977 +206 0.45737 0.30590 +207 0.47604 0.28805 +205 0.47499 0.30607 +SURF 0x24 +mat 0 +refs 8 +203 0.45193 0.32146 +204 0.43436 0.31164 +203 0.45193 0.32146 +201 0.44783 0.29271 +202 0.45790 0.30631 +201 0.44783 0.29271 +200 0.47480 0.30600 +199 0.47083 0.28392 +SURF 0x24 +mat 0 +refs 5 +196 0.40332 0.20218 +198 0.38351 0.20796 +196 0.40332 0.20218 +197 0.37428 0.19595 +195 0.40327 0.18782 +SURF 0x24 +mat 0 +refs 5 +192 0.45737 0.30590 +194 0.45415 0.29331 +192 0.45737 0.30590 +193 0.47897 0.29146 +191 0.47499 0.30607 +SURF 0x24 +mat 0 +refs 8 +189 0.45193 0.32146 +190 0.43689 0.31535 +189 0.45193 0.32146 +187 0.45054 0.29627 +188 0.45790 0.30631 +187 0.45054 0.29627 +186 0.47480 0.30600 +185 0.47374 0.28734 +SURF 0x24 +mat 0 +refs 8 +183 0.45504 0.32487 +184 0.43962 0.31821 +183 0.45504 0.32487 +181 0.45302 0.29950 +182 0.45862 0.30721 +181 0.45302 0.29950 +180 0.47680 0.30927 +179 0.47578 0.29073 +SURF 0x24 +mat 0 +refs 5 +176 0.40332 0.20379 +178 0.38688 0.20907 +176 0.40332 0.20379 +177 0.37564 0.19887 +175 0.40330 0.19065 +SURF 0x24 +mat 0 +refs 5 +172 0.46006 0.31340 +174 0.45267 0.29822 +172 0.46006 0.31340 +173 0.47746 0.29430 +171 0.47614 0.30943 +SURF 0x24 +mat 0 +refs 8 +169 0.38641 0.23522 +170 0.37428 0.24074 +169 0.38641 0.23522 +167 0.36749 0.22153 +168 0.37451 0.22169 +167 0.36749 0.22153 +166 0.38716 0.20846 +165 0.37428 0.20106 +SURF 0x24 +mat 0 +refs 8 +163 0.38031 0.22428 +164 0.36625 0.22110 +163 0.38031 0.22428 +161 0.37814 0.20178 +162 0.38688 0.20907 +161 0.37814 0.20178 +160 0.40332 0.20379 +159 0.40330 0.19443 +SURF 0x24 +mat 0 +refs 8 +157 0.38989 0.23260 +158 0.37970 0.23974 +157 0.38989 0.23260 +155 0.37345 0.22146 +156 0.37844 0.22163 +155 0.37345 0.22146 +154 0.39093 0.21113 +153 0.37970 0.20380 +SURF 0x24 +mat 0 +refs 8 +151 0.37971 0.22193 +152 0.37397 0.21787 +151 0.37971 0.22193 +149 0.38347 0.20491 +150 0.39059 0.21111 +149 0.38347 0.20491 +148 0.40332 0.20649 +147 0.40330 0.19862 +SURF 0x24 +mat 0 +refs 8 +145 0.38717 0.22190 +146 0.38114 0.21963 +145 0.38717 0.22190 +143 0.38915 0.21291 +144 0.39525 0.21420 +143 0.38915 0.21291 +142 0.40333 0.21103 +141 0.40324 0.20788 +SURF 0x24 +mat 0 +refs 8 +139 0.39551 0.22957 +140 0.38801 0.23028 +139 0.39551 0.22957 +137 0.38454 0.22127 +138 0.38711 0.22183 +137 0.38454 0.22127 +136 0.40085 0.21675 +135 0.38801 0.21375 +SURF 0x24 +mat 0 +refs 5 +132 0.40333 0.24401 +134 0.40333 0.25076 +132 0.40333 0.24401 +133 0.37288 0.24460 +131 0.38045 0.23777 +SURF 0x24 +mat 0 +refs 5 +128 0.45514 0.30278 +130 0.44941 0.32167 +128 0.45514 0.30278 +129 0.43939 0.31978 +127 0.44339 0.29665 +SURF 0x24 +mat 0 +refs 5 +124 0.40333 0.24331 +126 0.40333 0.25607 +124 0.40333 0.24331 +125 0.36881 0.24774 +123 0.38268 0.23686 +SURF 0x24 +mat 0 +refs 5 +120 0.45673 0.30522 +122 0.45148 0.32289 +120 0.45673 0.30522 +121 0.43442 0.31844 +119 0.44032 0.29386 +SURF 0x24 +mat 0 +refs 5 +116 0.40332 0.24170 +118 0.40326 0.25631 +116 0.40332 0.24170 +117 0.36980 0.24765 +115 0.38351 0.23591 +SURF 0x24 +mat 0 +refs 5 +112 0.45729 0.30596 +114 0.45274 0.32298 +112 0.45729 0.30596 +113 0.43509 0.31917 +111 0.44334 0.29589 +SURF 0x24 +mat 0 +refs 5 +108 0.40332 0.24170 +110 0.40326 0.25605 +108 0.40332 0.24170 +109 0.37428 0.24792 +107 0.38351 0.23591 +SURF 0x24 +mat 0 +refs 5 +104 0.45729 0.30596 +106 0.45274 0.32298 +104 0.45729 0.30596 +105 0.43759 0.32290 +103 0.44602 0.29949 +SURF 0x24 +mat 0 +refs 5 +100 0.40332 0.24009 +102 0.40330 0.25322 +100 0.40332 0.24009 +101 0.37564 0.24500 +99 0.38688 0.23480 +SURF 0x24 +mat 0 +refs 5 +96 0.46380 0.31056 +98 0.45566 0.32499 +96 0.46380 0.31056 +97 0.44074 0.32221 +95 0.45115 0.29937 +SURF 0x24 +mat 0 +refs 7 +93 0.36625 0.22277 +94 0.38031 0.21959 +91 0.37814 0.24209 +89 0.38688 0.23480 +91 0.37814 0.24209 +90 0.40332 0.24009 +92 0.40330 0.24944 +SURF 0x24 +mat 0 +refs 7 +87 0.37397 0.22600 +88 0.37971 0.22194 +85 0.38347 0.23896 +83 0.39059 0.23276 +85 0.38347 0.23896 +84 0.40332 0.23738 +86 0.40330 0.24525 +SURF 0x24 +mat 0 +refs 7 +81 0.38114 0.22424 +82 0.38717 0.22197 +79 0.38915 0.23096 +77 0.39525 0.22967 +79 0.38915 0.23096 +78 0.40333 0.23284 +80 0.40324 0.23599 +SURF 0x24 +mat 0 +refs 34 +66 0.35987 0.42764 +72 0.37036 0.45094 +66 0.35987 0.42764 +73 0.37572 0.43707 +67 0.36468 0.41521 +74 0.38774 0.42602 +68 0.37545 0.40531 +75 0.40320 0.42076 +69 0.38930 0.40059 +76 0.41795 0.42270 +69 0.38930 0.40059 +70 0.40252 0.40233 +63 0.38071 0.39759 +70 0.40252 0.40233 +64 0.38851 0.39862 +71 0.41157 0.41005 +64 0.38851 0.39862 +54 0.39385 0.40317 +53 0.37596 0.40616 +52 0.39529 0.41005 +53 0.37596 0.40616 +55 0.39245 0.41739 +53 0.37596 0.40616 +56 0.38609 0.42323 +53 0.37596 0.40616 +57 0.37791 0.42602 +53 0.37596 0.40616 +58 0.37010 0.42499 +53 0.37596 0.40616 +59 0.36477 0.42043 +60 0.36332 0.41356 +59 0.36477 0.42043 +66 0.35987 0.42764 +65 0.36231 0.43928 +SURF 0x24 +mat 0 +refs 12 +60 0.36332 0.41356 +66 0.35987 0.42764 +60 0.36332 0.41356 +67 0.36468 0.41521 +61 0.36616 0.40622 +68 0.37545 0.40531 +62 0.37253 0.40038 +69 0.38930 0.40059 +62 0.37253 0.40038 +63 0.38071 0.39759 +53 0.37596 0.40616 +64 0.38851 0.39862 +SURF 0x24 +mat 0 +refs 4 +62 0.37253 0.40038 +53 0.37596 0.40616 +61 0.36616 0.40622 +60 0.36332 0.41356 +SURF 0x24 +mat 0 +refs 19 +51 0.31512 0.36992 +50 0.34050 0.36705 +51 0.31512 0.36992 +41 0.35306 0.36277 +27 0.32637 0.36608 +42 0.36561 0.36705 +28 0.33762 0.36992 +43 0.37480 0.37874 +31 0.34586 0.38040 +44 0.37817 0.39472 +33 0.34887 0.39472 +45 0.37480 0.41069 +35 0.34586 0.40904 +46 0.36561 0.42239 +37 0.33762 0.41952 +47 0.35306 0.42667 +39 0.32637 0.42336 +48 0.34050 0.42239 +49 0.31512 0.41952 +SURF 0x24 +mat 0 +refs 15 +29 0.31142 0.37781 +27 0.32637 0.36608 +29 0.31142 0.37781 +28 0.33762 0.36992 +30 0.31806 0.38008 +31 0.34586 0.38040 +32 0.32293 0.38627 +33 0.34887 0.39472 +34 0.32471 0.39472 +35 0.34586 0.40904 +36 0.32293 0.40317 +37 0.33762 0.41952 +38 0.31806 0.40936 +39 0.32637 0.42336 +40 0.31142 0.41163 +SURF 0x24 +mat 0 +refs 12 +22 0.40860 0.35760 +26 0.38617 0.37982 +22 0.40860 0.35760 +25 0.37779 0.36867 +23 0.40289 0.33253 +24 0.38868 0.35103 +23 0.40289 0.33253 +17 0.39710 0.34146 +12 0.42226 0.31640 +17 0.39710 0.34146 +18 0.42676 0.33337 +19 0.39778 0.34884 +SURF 0x24 +mat 0 +refs 32 +14 0.41985 0.34580 +22 0.40860 0.35760 +14 0.41985 0.34580 +23 0.40289 0.33253 +13 0.42067 0.31616 +12 0.42226 0.31640 +10 0.44515 0.29489 +12 0.42226 0.31640 +9 0.44668 0.29837 +18 0.42676 0.33337 +9 0.44668 0.29837 +20 0.45251 0.32129 +4 0.47394 0.27635 +21 0.47063 0.29747 +5 0.48540 0.27449 +16 0.47905 0.28932 +5 0.48540 0.27449 +15 0.47064 0.30029 +5 0.48540 0.27449 +6 0.47291 0.28710 +3 0.49361 0.26653 +7 0.47592 0.28485 +3 0.49361 0.26653 +8 0.47330 0.30569 +3 0.49361 0.26653 +2 0.48930 0.28471 +1 0.47642 0.27319 +0 0.47472 0.29362 +10 0.44515 0.29489 +11 0.44223 0.32610 +13 0.42067 0.31616 +14 0.41985 0.34580 +SURF 0x24 +mat 0 +refs 6 +10 0.44515 0.29489 +9 0.44668 0.29837 +1 0.47642 0.27319 +4 0.47394 0.27635 +3 0.49361 0.26653 +5 0.48540 0.27449 +SURF 0x24 +mat 0 +refs 88 +529 0.59962 0.48966 +533 0.55076 0.37720 +529 0.59962 0.48966 +535 0.52901 0.39466 +534 0.58292 0.49637 +535 0.52901 0.39466 +539 0.56404 0.50611 +538 0.53486 0.39651 +551 0.56917 0.50296 +547 0.54747 0.39057 +552 0.59460 0.48600 +547 0.54747 0.39057 +553 0.57520 0.37877 +562 0.56493 0.35240 +553 0.57520 0.37877 +578 0.58228 0.34315 +576 0.59406 0.36911 +578 0.58228 0.34315 +564 0.53797 0.43597 +577 0.57171 0.31661 +565 0.52846 0.41375 +579 0.50138 0.39955 +589 0.52160 0.38792 +484 0.48679 0.36753 +485 0.51263 0.35259 +475 0.56043 0.32510 +589 0.52160 0.38792 +587 0.56339 0.36180 +565 0.52846 0.41375 +557 0.56045 0.39182 +564 0.53797 0.43597 +557 0.56045 0.39182 +555 0.56423 0.41424 +556 0.56067 0.38751 +550 0.56394 0.40929 +567 0.55491 0.38931 +546 0.55677 0.41262 +566 0.50682 0.41710 +541 0.51021 0.42832 +558 0.54327 0.32543 +541 0.51021 0.42832 +540 0.54968 0.33727 +537 0.58943 0.35805 +540 0.54968 0.33727 +532 0.56837 0.36881 +543 0.53183 0.34744 +533 0.55076 0.37720 +542 0.51157 0.37113 +535 0.52901 0.39466 +544 0.51856 0.37088 +538 0.53486 0.39651 +548 0.53320 0.36530 +547 0.54747 0.39057 +548 0.53320 0.36530 +562 0.56493 0.35240 +561 0.51841 0.34813 +562 0.56493 0.35240 +563 0.55730 0.32956 +578 0.58228 0.34315 +563 0.55730 0.32956 +577 0.57171 0.31661 +563 0.55730 0.32956 +579 0.50138 0.39955 +580 0.48701 0.40781 +579 0.50138 0.39955 +483 0.46666 0.37916 +484 0.48679 0.36753 +483 0.46666 0.37916 +482 0.41626 0.40829 +580 0.48701 0.40781 +571 0.49864 0.33054 +563 0.55730 0.32956 +571 0.49864 0.33054 +561 0.51841 0.34813 +572 0.48177 0.33852 +561 0.51841 0.34813 +570 0.50381 0.35531 +548 0.53320 0.36530 +570 0.50381 0.35531 +544 0.51856 0.37088 +560 0.49843 0.35700 +542 0.51157 0.37113 +560 0.49843 0.35700 +543 0.53183 0.34744 +559 0.52391 0.33714 +543 0.53183 0.34744 +558 0.54327 0.32543 +540 0.54968 0.33727 +SURF 0x24 +mat 0 +refs 41 +559 0.52391 0.33714 +558 0.54327 0.32543 +568 0.47464 0.39966 +566 0.50682 0.41710 +569 0.50796 0.38367 +567 0.55491 0.38931 +583 0.56147 0.35640 +556 0.56067 0.38751 +582 0.56773 0.35483 +557 0.56045 0.39182 +582 0.56773 0.35483 +587 0.56339 0.36180 +474 0.56350 0.32319 +475 0.56043 0.32510 +476 0.54808 0.33224 +484 0.48679 0.36753 +480 0.40356 0.41563 +482 0.41626 0.40829 +481 0.39642 0.41976 +571 0.49864 0.33054 +481 0.39642 0.41976 +572 0.48177 0.33852 +480 0.40356 0.41563 +572 0.48177 0.33852 +581 0.48243 0.33721 +570 0.50381 0.35531 +581 0.48243 0.33721 +560 0.49843 0.35700 +581 0.48243 0.33721 +559 0.52391 0.33714 +588 0.50866 0.31456 +568 0.47464 0.39966 +479 0.43511 0.39740 +568 0.47464 0.39966 +478 0.46802 0.37837 +569 0.50796 0.38367 +477 0.49874 0.36062 +583 0.56147 0.35640 +476 0.54808 0.33224 +582 0.56773 0.35483 +474 0.56350 0.32319 +SURF 0x24 +mat 0 +refs 8 +477 0.49874 0.36062 +476 0.54808 0.33224 +478 0.46802 0.37837 +480 0.40356 0.41563 +479 0.43511 0.39740 +480 0.40356 0.41563 +588 0.50866 0.31456 +581 0.48243 0.33721 +SURF 0x24 +mat 0 +refs 84 +1398 0.38175 0.26849 +1330 0.37769 0.30512 +1328 0.38034 0.26924 +1329 0.37613 0.30080 +1318 0.37246 0.29730 +1317 0.37348 0.30998 +1283 0.37749 0.32055 +1317 0.37348 0.30998 +1267 0.37077 0.32114 +1317 0.37348 0.30998 +1321 0.36862 0.31066 +1329 0.37613 0.30080 +1321 0.36862 0.31066 +1330 0.37769 0.30512 +1331 0.37084 0.29531 +1330 0.37769 0.30512 +1399 0.37606 0.26287 +1398 0.38175 0.26849 +1404 0.38203 0.23507 +1400 0.38739 0.23809 +1405 0.37403 0.20622 +1400 0.38739 0.23809 +1403 0.37264 0.19459 +1400 0.38739 0.23809 +1402 0.37627 0.20792 +1401 0.38599 0.24155 +1413 0.36715 0.19814 +1412 0.37189 0.24155 +1436 0.36718 0.19438 +1411 0.37039 0.24397 +1441 0.38218 0.20908 +1410 0.39191 0.26007 +1441 0.38218 0.20908 +1440 0.39649 0.23848 +1490 0.37517 0.18364 +1439 0.39787 0.22685 +1490 0.37517 0.18364 +1437 0.39189 0.23168 +1438 0.37344 0.20065 +1437 0.39189 0.23168 +1407 0.37964 0.24616 +1406 0.40346 0.27574 +1396 0.38178 0.27589 +1395 0.40355 0.28896 +1323 0.38437 0.29200 +1324 0.40364 0.30206 +1266 0.38848 0.32330 +1324 0.40364 0.30206 +1271 0.39856 0.32020 +1326 0.41052 0.30683 +1271 0.39856 0.32020 +1290 0.40210 0.32057 +1288 0.41409 0.29618 +1290 0.40210 0.32057 +1289 0.40188 0.32175 +1290 0.40210 0.32057 +1325 0.40935 0.30821 +1326 0.41052 0.30683 +1397 0.40955 0.29938 +1326 0.41052 0.30683 +1394 0.41058 0.29527 +1324 0.40364 0.30206 +1394 0.41058 0.29527 +1395 0.40355 0.28896 +1408 0.41069 0.27970 +1406 0.40346 0.27574 +1408 0.41069 0.27970 +1437 0.39189 0.23168 +1408 0.41069 0.27970 +1439 0.39787 0.22685 +1408 0.41069 0.27970 +1440 0.39649 0.23848 +1409 0.40991 0.28426 +1410 0.39191 0.26007 +1393 0.39483 0.29092 +1410 0.39191 0.26007 +1392 0.37278 0.28176 +1411 0.37039 0.24397 +1327 0.37155 0.27090 +1412 0.37189 0.24155 +1328 0.38034 0.26924 +1401 0.38599 0.24155 +1398 0.38175 0.26849 +1400 0.38739 0.23809 +SURF 0x24 +mat 0 +refs 18 +1328 0.38034 0.26924 +1318 0.37246 0.29730 +1327 0.37155 0.27090 +1319 0.37367 0.29398 +1392 0.37278 0.28176 +1319 0.37367 0.29398 +1393 0.39483 0.29092 +1320 0.39671 0.30475 +1397 0.40955 0.29938 +1320 0.39671 0.30475 +1325 0.40935 0.30821 +1320 0.39671 0.30475 +1289 0.40188 0.32175 +1320 0.39671 0.30475 +1286 0.39312 0.32155 +1319 0.37367 0.29398 +1283 0.37749 0.32055 +1318 0.37246 0.29730 +SURF 0x24 +mat 0 +refs 5 +1393 0.39483 0.29092 +1397 0.40955 0.29938 +1409 0.40991 0.28426 +1394 0.41058 0.29527 +1408 0.41069 0.27970 +SURF 0x24 +mat 0 +refs 24 +1715 0.52711 0.28896 +1726 0.53677 0.31977 +1719 0.53325 0.28922 +1730 0.54353 0.32154 +1721 0.54259 0.27889 +1729 0.56002 0.30816 +1721 0.54259 0.27889 +1732 0.55481 0.25651 +1721 0.54259 0.27889 +1722 0.54189 0.24713 +1720 0.53025 0.26506 +1714 0.46925 0.23258 +1720 0.53025 0.26506 +1709 0.46377 0.24102 +1708 0.52232 0.27278 +1705 0.46055 0.24316 +1708 0.52232 0.27278 +1704 0.51551 0.27185 +1708 0.52232 0.27278 +1715 0.52711 0.28896 +1708 0.52232 0.27278 +1719 0.53325 0.28922 +1720 0.53025 0.26506 +1721 0.54259 0.27889 +SURF 0x24 +mat 0 +refs 8 +1874 0.43378 0.32370 +1851 0.39406 0.30763 +1874 0.43378 0.32370 +1852 0.42982 0.30062 +1875 0.46648 0.31560 +1852 0.42982 0.30062 +1853 0.46713 0.29331 +1851 0.39406 0.30763 +SURF 0x24 +mat 0 +refs 15 +2225 0.47967 0.62243 +2180 0.49342 0.63026 +2190 0.46173 0.62926 +2181 0.47102 0.63468 +2190 0.46173 0.62926 +2187 0.45825 0.63618 +2190 0.46173 0.62926 +2189 0.44020 0.63196 +2190 0.46173 0.62926 +2192 0.43662 0.61614 +2190 0.46173 0.62926 +2191 0.44866 0.61303 +2190 0.46173 0.62926 +2228 0.46325 0.60834 +2225 0.47967 0.62243 +SURF 0x24 +mat 0 +refs 60 +2529 0.48171 0.58408 +2524 0.43802 0.57883 +2528 0.46222 0.60087 +2527 0.43209 0.59145 +2528 0.46222 0.60087 +2530 0.44499 0.61413 +2577 0.45693 0.61955 +2530 0.44499 0.61413 +2578 0.44824 0.62328 +2532 0.43778 0.61837 +2578 0.44824 0.62328 +2579 0.44494 0.62062 +2598 0.45852 0.62729 +2575 0.45881 0.61081 +2599 0.48803 0.62112 +2576 0.47639 0.59465 +2590 0.51168 0.60835 +2535 0.48676 0.59810 +2589 0.51325 0.61073 +2534 0.48457 0.60677 +2582 0.50732 0.62353 +2574 0.48466 0.60836 +2573 0.50988 0.62625 +2541 0.51487 0.62266 +2543 0.54441 0.62751 +2541 0.51487 0.62266 +2544 0.56462 0.62054 +2542 0.53239 0.60677 +2581 0.56857 0.62125 +2592 0.53475 0.60379 +2581 0.56857 0.62125 +2593 0.54972 0.62932 +2581 0.56857 0.62125 +2586 0.56442 0.63803 +2581 0.56857 0.62125 +2580 0.58251 0.63332 +2544 0.56462 0.62054 +2546 0.57163 0.62980 +2543 0.54441 0.62751 +2545 0.55555 0.63114 +2573 0.50988 0.62625 +2591 0.54192 0.62884 +2582 0.50732 0.62353 +2584 0.55463 0.62466 +2589 0.51325 0.61073 +2583 0.55803 0.62627 +2590 0.51168 0.60835 +2585 0.53840 0.63371 +2599 0.48803 0.62112 +2587 0.50570 0.63434 +2598 0.45852 0.62729 +2597 0.46232 0.62992 +2578 0.44824 0.62328 +2597 0.46232 0.62992 +2577 0.45693 0.61955 +2596 0.46896 0.62502 +2577 0.45693 0.61955 +2572 0.47793 0.60528 +2528 0.46222 0.60087 +2529 0.48171 0.58408 +SURF 0x24 +mat 0 +refs 11 +2586 0.56442 0.63803 +2587 0.50570 0.63434 +2586 0.56442 0.63803 +2585 0.53840 0.63371 +2580 0.58251 0.63332 +2583 0.55803 0.62627 +2580 0.58251 0.63332 +2584 0.55463 0.62466 +2546 0.57163 0.62980 +2591 0.54192 0.62884 +2545 0.55555 0.63114 +SURF 0x24 +mat 0 +refs 75 +1526 0.50334 0.56759 +1528 0.47265 0.54415 +1526 0.50334 0.56759 +1538 0.48423 0.55063 +1525 0.51664 0.56671 +1537 0.49907 0.54965 +1524 0.52930 0.55938 +1536 0.51320 0.54147 +1523 0.53794 0.54757 +1535 0.52283 0.52829 +1522 0.54022 0.53443 +1534 0.52538 0.51363 +1521 0.53556 0.52350 +1533 0.52017 0.50144 +1520 0.52518 0.51770 +1532 0.50860 0.49496 +1519 0.51188 0.51858 +1531 0.49376 0.49594 +1518 0.49921 0.52591 +1530 0.47963 0.50412 +1517 0.49058 0.53772 +1529 0.47000 0.51730 +1515 0.48829 0.55085 +1527 0.46744 0.53196 +1516 0.49296 0.56179 +1528 0.47265 0.54415 +1516 0.49296 0.56179 +1526 0.50334 0.56759 +1514 0.51780 0.56849 +1526 0.50334 0.56759 +1513 0.52566 0.56797 +1525 0.51664 0.56671 +1512 0.53314 0.56365 +1524 0.52930 0.55938 +1511 0.53823 0.55667 +1523 0.53794 0.54757 +1510 0.53959 0.54892 +1522 0.54022 0.53443 +1509 0.53683 0.54246 +1521 0.53556 0.52350 +1508 0.53070 0.53903 +1520 0.52518 0.51770 +1507 0.52285 0.53955 +1519 0.51188 0.51858 +1506 0.51537 0.54388 +1518 0.49921 0.52591 +1505 0.51027 0.55086 +1517 0.49058 0.53772 +1504 0.50892 0.55861 +1515 0.48829 0.55085 +1502 0.51168 0.56507 +1516 0.49296 0.56179 +1502 0.51168 0.56507 +1514 0.51780 0.56849 +1503 0.52864 0.55864 +1513 0.52566 0.56797 +1503 0.52864 0.55864 +1512 0.53314 0.56365 +1503 0.52864 0.55864 +1511 0.53823 0.55667 +1503 0.52864 0.55864 +1510 0.53959 0.54892 +1503 0.52864 0.55864 +1509 0.53683 0.54246 +1503 0.52864 0.55864 +1508 0.53070 0.53903 +1503 0.52864 0.55864 +1507 0.52285 0.53955 +1503 0.52864 0.55864 +1506 0.51537 0.54388 +1503 0.52864 0.55864 +1505 0.51027 0.55086 +1503 0.52864 0.55864 +1504 0.50892 0.55861 +1502 0.51168 0.56507 +kids 0 From 37c74f6fa3737b439b69feef75870d366945be8f Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Mon, 6 Jul 2020 20:16:22 -0400 Subject: [PATCH 018/129] add test to unit for acc file format loader --- test/unit/utACImportExport.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/unit/utACImportExport.cpp b/test/unit/utACImportExport.cpp index a7f432a56..573e716b6 100644 --- a/test/unit/utACImportExport.cpp +++ b/test/unit/utACImportExport.cpp @@ -101,6 +101,12 @@ TEST(utACImportExport, importWuson) { ASSERT_NE(nullptr, scene); } +TEST(utACImportExport, importWusonACC) { + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AC/Wuson.acc", aiProcess_ValidateDataStructure); + ASSERT_NE(nullptr, scene); +} + TEST(utACImportExport, testFormatDetection) { Assimp::Importer importer; const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/AC/TestFormatDetection", aiProcess_ValidateDataStructure); From 9aa468262f615dee390e3ce1bf34cdc14a676fa5 Mon Sep 17 00:00:00 2001 From: kimkulling Date: Tue, 7 Jul 2020 17:35:03 +0200 Subject: [PATCH 019/129] closes https://github.com/assimp/assimp/issues/3252: fix build. --- code/AssetLib/3DS/3DSHelper.h | 2 +- code/AssetLib/IFC/IFCReaderGen_2x3.h | 2 +- code/AssetLib/M3D/m3d.h | 4 +++- code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp | 4 ++-- code/AssetLib/Step/STEPFile.h | 6 +++--- code/Common/Exporter.cpp | 4 ++-- code/Common/Subdivision.cpp | 2 +- 7 files changed, 13 insertions(+), 11 deletions(-) diff --git a/code/AssetLib/3DS/3DSHelper.h b/code/AssetLib/3DS/3DSHelper.h index 89c15f5f2..3ccb1fd07 100644 --- a/code/AssetLib/3DS/3DSHelper.h +++ b/code/AssetLib/3DS/3DSHelper.h @@ -321,7 +321,7 @@ public: struct Face : public FaceWithSmoothingGroup { }; -#ifdef _WIN32 +#if _MSC_VER > 1920 #pragma warning(disable : 4315) #endif diff --git a/code/AssetLib/IFC/IFCReaderGen_2x3.h b/code/AssetLib/IFC/IFCReaderGen_2x3.h index 8ae623dd8..b3f71a7f1 100644 --- a/code/AssetLib/IFC/IFCReaderGen_2x3.h +++ b/code/AssetLib/IFC/IFCReaderGen_2x3.h @@ -45,7 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "AssetLib/Step/STEPFile.h" -#ifdef _WIN32 +#if _MSC_VER > 1920 # pragma warning( disable : 4512 ) #endif // _WIN32 diff --git a/code/AssetLib/M3D/m3d.h b/code/AssetLib/M3D/m3d.h index 3d7a2564c..5ab3d16de 100644 --- a/code/AssetLib/M3D/m3d.h +++ b/code/AssetLib/M3D/m3d.h @@ -85,7 +85,9 @@ typedef uint16_t M3D_INDEX; #define M3D_BONEMAXLEVEL 8 #endif #ifndef _MSC_VER +#ifndef _inline #define _inline __inline__ +#endif #define _pack __attribute__((packed)) #define _unused __attribute__((unused)) #else @@ -99,7 +101,7 @@ typedef uint16_t M3D_INDEX; #define _register #endif -#ifdef _WIN32 +#if _MSC_VER > 1920 # pragma warning(push) # pragma warning(disable : 4100 4127 4189 4505 4244 4403 4701 4703) # if (_MSC_VER > 1800 ) diff --git a/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp b/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp index 2bb7b42ee..e9930dfed 100644 --- a/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp +++ b/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp @@ -68,8 +68,8 @@ namespace Assimp { namespace MDL { namespace HalfLife { -#ifdef _WIN32 -# pragma warning(disable : 4706) +#if _MSC_VER > 1920 +# pragma warning(disable : 4706) #endif // _WIN32 // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/Step/STEPFile.h b/code/AssetLib/Step/STEPFile.h index 1448c107f..72648e462 100644 --- a/code/AssetLib/Step/STEPFile.h +++ b/code/AssetLib/Step/STEPFile.h @@ -54,7 +54,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include -#ifdef _WIN32 +#if _MSC_VER > 1920 # pragma warning(push) # pragma warning(disable : 4127 4456 4245 4512 ) #endif // _WIN32 @@ -727,7 +727,7 @@ struct InternGenericConvert> { } }; -#ifdef _WIN32 +#if _MSC_VER > 1920 #pragma warning(push) #pragma warning(disable : 4127) #endif // _WIN32 @@ -960,7 +960,7 @@ private: const EXPRESS::ConversionSchema *schema; }; -#ifdef _WIN32 +#if _MSC_VER > 1920 #pragma warning(pop) #endif // _WIN32 diff --git a/code/Common/Exporter.cpp b/code/Common/Exporter.cpp index 58fc01d91..a47c52a6c 100644 --- a/code/Common/Exporter.cpp +++ b/code/Common/Exporter.cpp @@ -74,8 +74,8 @@ Here we implement only the C++ interface (Assimp::Exporter). namespace Assimp { -#ifdef _WIN32 -# pragma warning( disable : 4800 ) +#if _MSC_VER > 1920 +# pragma warning( disable : 4800 ) #endif // _WIN32 diff --git a/code/Common/Subdivision.cpp b/code/Common/Subdivision.cpp index b1f07c9f5..4f64a00c4 100644 --- a/code/Common/Subdivision.cpp +++ b/code/Common/Subdivision.cpp @@ -53,7 +53,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; void mydummy() {} -#ifdef _WIN32 +#if _MSC_VER > 1920 #pragma warning(disable : 4709) #endif // _WIN32 // ------------------------------------------------------------------------------------------------ From 628394baec21c65f5f197f5b2255524a8f028985 Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Tue, 7 Jul 2020 23:29:54 -0400 Subject: [PATCH 020/129] check for invalid vertex --- code/AssetLib/AC/ACLoader.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/AssetLib/AC/ACLoader.cpp b/code/AssetLib/AC/ACLoader.cpp index 6be720f02..5b63d315e 100644 --- a/code/AssetLib/AC/ACLoader.cpp +++ b/code/AssetLib/AC/ACLoader.cpp @@ -624,6 +624,9 @@ aiNode *AC3DImporter::ConvertObjectSection(Object &object, ++uv; } } + if (static_cast(vertices - mesh->mVertices) >= mesh->mNumVertices) { + throw DeadlyImportError("AC3D: Invalid number of vertices"); + } *vertices++ = object.vertices[entry3.first] + object.translation; if (uv) { uv->x = entry3.second.x; From b8ec93aa2137d18e8fb861df17fb6878b8e7d656 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 11 Jul 2020 22:34:43 +0200 Subject: [PATCH 021/129] use c-styl cast in a c-file --- samples/SimpleOpenGL/Sample_SimpleOpenGL.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/SimpleOpenGL/Sample_SimpleOpenGL.c b/samples/SimpleOpenGL/Sample_SimpleOpenGL.c index 01704a1e4..bcb109564 100644 --- a/samples/SimpleOpenGL/Sample_SimpleOpenGL.c +++ b/samples/SimpleOpenGL/Sample_SimpleOpenGL.c @@ -278,7 +278,7 @@ void do_motion (void) static int frames = 0; int time = glutGet(GLUT_ELAPSED_TIME); - angle += static_cast((time-prev_time)*0.01); + angle += (float)((time-prev_time)*0.01); prev_time = time; frames += 1; From 108b3a62e5b1ace725f3ddee06a701eddc19199e Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 11 Jul 2020 22:45:45 +0200 Subject: [PATCH 022/129] Update Exporter.hpp revert merge issue --- include/assimp/Exporter.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/assimp/Exporter.hpp b/include/assimp/Exporter.hpp index 6fcbafe92..15918dd47 100644 --- a/include/assimp/Exporter.hpp +++ b/include/assimp/Exporter.hpp @@ -110,9 +110,9 @@ public: ExportFormatEntry() : mExportFunction(), mEnforcePP() { - mDescription.id = NULL; - mDescription.description = NULL; - mDescription.fileExtension = NULL; + mDescription.id = nullptr; + mDescription.description = nullptr; + mDescription.fileExtension = nullptr; } }; From a9a0c3093226a23eb7558539bc6ebe5bcb98442b Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 19 Jun 2020 00:15:12 -0700 Subject: [PATCH 023/129] Build viewer and publish artifacts on windows-msvc. This commit introduces Github Actions support for building the tools and viewer and making these available for download as a zip file in the artifacts area of the Github Actions page. This allows for continuous validation that the viewer and tools build successfully, and the download is useful for quick testing of the very latest assimp functionality without needing to download and build it from source. This only applies to windows-msvc, since the assimp viewer is only supported on that platform. It downloads the June 2010 DirectX SDK from the Microsoft servers and installs it. It also uses a cache to prevent having to perform this DX SDK download and installation repeatedly for every commit. Note, it's necessary install the older June 2010 DXSDK because assimp uses the now deprecated D3DX libraries, and these libraries are not included in the stock Windows Server image provided by Github Actions. --- .github/workflows/ccpp.yml | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml index 08292d55f..e542821e8 100644 --- a/.github/workflows/ccpp.yml +++ b/.github/workflows/ccpp.yml @@ -44,16 +44,46 @@ jobs: with: CXX: ${{ matrix.cxx }} CC: ${{ matrix.cc }} + + - name: Cache DX SDK + id: dxcache + if: matrix.name == 'windows-msvc' + uses: actions/cache@v2 + with: + path: '${{ github.workspace }}/DX_SDK' + key: ${{ runner.os }}-DX_SDK + restore-keys: | + ${{ runner.os }}-DX_SDK + + - name: Download DXSetup + if: matrix.name == 'windows-msvc' && steps.dxcache.outputs.cache-hit != 'true' + run: | + curl -s -o DXSDK_Jun10.exe --location https://download.microsoft.com/download/A/E/7/AE743F1F-632B-4809-87A9-AA1BB3458E31/DXSDK_Jun10.exe + cmd.exe /c start /wait .\DXSDK_Jun10.exe /U /O /F /S /P "${{ github.workspace }}\DX_SDK" + + - name: Set Windows specific CMake arguments + if: matrix.name == 'windows-msvc' + id: windows_extra_cmake_args + run: echo "::set-output name=args::'-DASSIMP_BUILD_ASSIMP_TOOLS=1 -DASSIMP_BUILD_ASSIMP_VIEW=1'" - name: configure and build uses: lukka/run-cmake@v2 + env: + DXSDK_DIR: '${{ github.workspace }}/DX_SDK' + with: cmakeListsOrSettingsJson: CMakeListsTxtAdvanced cmakeListsTxtPath: '${{ github.workspace }}/CMakeLists.txt' - cmakeAppendedArgs: '-GNinja -DCMAKE_BUILD_TYPE=Release' + cmakeAppendedArgs: '-GNinja -DCMAKE_BUILD_TYPE=Release ${{ steps.windows_extra_cmake_args.outputs.args }}' buildWithCMakeArgs: '-- -v' buildDirectory: '${{ github.workspace }}/build/' - name: test run: cd build/bin && ./unit shell: bash + + - uses: actions/upload-artifact@v2 + if: matrix.name == 'windows-msvc' + with: + name: 'assimp-bins-${{ matrix.name }}-${{ github.sha }}' + path: build/bin From 6619ec82531e76ebb926d0ba9e90bc31623b765e Mon Sep 17 00:00:00 2001 From: Ryan Styrczula Date: Mon, 22 Jun 2020 14:26:37 -0400 Subject: [PATCH 024/129] FBXExporter: Use scene metadata for global settings Models with non-standard axes and scale are not imported and exported correctly if the input metadata is ignored. --- code/AssetLib/FBX/FBXExporter.cpp | 93 +++++++++++++++++++++++++------ 1 file changed, 76 insertions(+), 17 deletions(-) diff --git a/code/AssetLib/FBX/FBXExporter.cpp b/code/AssetLib/FBX/FBXExporter.cpp index 3fc7701f5..bd59cf885 100644 --- a/code/AssetLib/FBX/FBXExporter.cpp +++ b/code/AssetLib/FBX/FBXExporter.cpp @@ -400,6 +400,65 @@ void FBXExporter::WriteHeaderExtension () ); } +// WriteGlobalSettings helpers + +void WritePropInt(const aiScene* scene, FBX::Node& p, const std::string& key, int defaultValue) +{ + int value; + if (scene->mMetaData->Get(key, value)) { + p.AddP70int(key, value); + } else { + p.AddP70int(key, defaultValue); + } +} + +void WritePropDouble(const aiScene* scene, FBX::Node& p, const std::string& key, double defaultValue) +{ + double value; + if (scene->mMetaData->Get(key, value)) { + p.AddP70double(key, value); + } else { + // fallback lookup float instead + float floatValue; + if (scene->mMetaData->Get(key, floatValue)) { + p.AddP70double(key, (double)floatValue); + } else { + p.AddP70double(key, defaultValue); + } + } +} + +void WritePropEnum(const aiScene* scene, FBX::Node& p, const std::string& key, int defaultValue) +{ + int value; + if (scene->mMetaData->Get(key, value)) { + p.AddP70enum(key, value); + } else { + p.AddP70enum(key, defaultValue); + } +} + +void WritePropColor(const aiScene* scene, FBX::Node& p, const std::string& key, const aiVector3D& defaultValue) +{ + aiVector3D value; + if (scene->mMetaData->Get(key, value)) { + // ai_real can be float or double, cast to avoid warnings + p.AddP70color(key, (double)value.x, (double)value.y, (double)value.z); + } else { + p.AddP70color(key, 0.0, 0.0, 0.0); + } +} + +void WritePropString(const aiScene* scene, FBX::Node& p, const std::string& key, const std::string& defaultValue) +{ + aiString value; // MetaData doesn't hold std::string + if (scene->mMetaData->Get(key, value)) { + p.AddP70string(key, value.C_Str()); + } else { + p.AddP70string(key, defaultValue); + } +} + void FBXExporter::WriteGlobalSettings () { if (!binary) { @@ -409,26 +468,26 @@ void FBXExporter::WriteGlobalSettings () gs.AddChild("Version", int32_t(1000)); FBX::Node p("Properties70"); - p.AddP70int("UpAxis", 1); - p.AddP70int("UpAxisSign", 1); - p.AddP70int("FrontAxis", 2); - p.AddP70int("FrontAxisSign", 1); - p.AddP70int("CoordAxis", 0); - p.AddP70int("CoordAxisSign", 1); - p.AddP70int("OriginalUpAxis", 1); - p.AddP70int("OriginalUpAxisSign", 1); - p.AddP70double("UnitScaleFactor", 1.0); - p.AddP70double("OriginalUnitScaleFactor", 1.0); - p.AddP70color("AmbientColor", 0.0, 0.0, 0.0); - p.AddP70string("DefaultCamera", "Producer Perspective"); - p.AddP70enum("TimeMode", 11); - p.AddP70enum("TimeProtocol", 2); - p.AddP70enum("SnapOnFrameMode", 0); + WritePropInt(mScene, p, "UpAxis", 1); + WritePropInt(mScene, p, "UpAxisSign", 1); + WritePropInt(mScene, p, "FrontAxis", 2); + WritePropInt(mScene, p, "FrontAxisSign", 1); + WritePropInt(mScene, p, "CoordAxis", 0); + WritePropInt(mScene, p, "CoordAxisSign", 1); + WritePropInt(mScene, p, "OriginalUpAxis", 1); + WritePropInt(mScene, p, "OriginalUpAxisSign", 1); + WritePropDouble(mScene, p, "UnitScaleFactor", 1.0); + WritePropDouble(mScene, p, "OriginalUnitScaleFactor", 1.0); + WritePropColor(mScene, p, "AmbientColor", aiVector3D((ai_real)0.0, (ai_real)0.0, (ai_real)0.0)); + WritePropString(mScene, p,"DefaultCamera", "Producer Perspective"); + WritePropEnum(mScene, p, "TimeMode", 11); + WritePropEnum(mScene, p, "TimeProtocol", 2); + WritePropEnum(mScene, p, "SnapOnFrameMode", 0); p.AddP70time("TimeSpanStart", 0); // TODO: animation support p.AddP70time("TimeSpanStop", FBX::SECOND); // TODO: animation support - p.AddP70double("CustomFrameRate", -1.0); + WritePropDouble(mScene, p, "CustomFrameRate", -1.0); p.AddP70("TimeMarker", "Compound", "", ""); // not sure what this is - p.AddP70int("CurrentTimeMarker", -1); + WritePropInt(mScene, p, "CurrentTimeMarker", -1); gs.AddChild(p); gs.Dump(outfile, binary, 0); From 0c2f7a119cd6e2ad371638af2452be3568753629 Mon Sep 17 00:00:00 2001 From: Ryan Styrczula Date: Mon, 22 Jun 2020 15:22:08 -0400 Subject: [PATCH 025/129] FBXExporter: Forgot WritePropColor defaultValue --- code/AssetLib/FBX/FBXExporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/FBX/FBXExporter.cpp b/code/AssetLib/FBX/FBXExporter.cpp index bd59cf885..20d166179 100644 --- a/code/AssetLib/FBX/FBXExporter.cpp +++ b/code/AssetLib/FBX/FBXExporter.cpp @@ -445,7 +445,7 @@ void WritePropColor(const aiScene* scene, FBX::Node& p, const std::string& key, // ai_real can be float or double, cast to avoid warnings p.AddP70color(key, (double)value.x, (double)value.y, (double)value.z); } else { - p.AddP70color(key, 0.0, 0.0, 0.0); + p.AddP70color(key, (double)defaultValue.x, (double)defaultValue.y, (double)defaultValue.z); } } From 84e342acd7399934eb85eb86568dcddb0021b798 Mon Sep 17 00:00:00 2001 From: Ryan Styrczula Date: Tue, 14 Jul 2020 10:39:18 -0400 Subject: [PATCH 026/129] DefaultIOStream: Remove assert on empty count fwrite() is valid to call with a 0 count, and will simply return 0. See: https://en.cppreference.com/w/cpp/io/c/fwrite http://www.cplusplus.com/reference/cstdio/fwrite/ There are code paths where StreamWriter will call Tell(), which calls Flush(), which calls Write(buffer.data(), 1, buffer.size()). This can happen when nothing has yet been written to the buffer, so size is 0. --- code/Common/DefaultIOStream.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/Common/DefaultIOStream.cpp b/code/Common/DefaultIOStream.cpp index 65edd1bdd..32f47ab07 100644 --- a/code/Common/DefaultIOStream.cpp +++ b/code/Common/DefaultIOStream.cpp @@ -100,7 +100,6 @@ size_t DefaultIOStream::Write(const void *pvBuffer, size_t pCount) { ai_assert(nullptr != pvBuffer); ai_assert(0 != pSize); - ai_assert(0 != pCount); return (mFile ? ::fwrite(pvBuffer, pSize, pCount, mFile) : 0); } From 209a61d0e7c0bb8a6940752f0aee371dbe51e328 Mon Sep 17 00:00:00 2001 From: Rahul Sheth Date: Tue, 14 Jul 2020 13:55:37 -0400 Subject: [PATCH 027/129] Update hunter and utf8cpp inclusion --- CMakeLists.txt | 4 ++-- cmake/assimp-hunter-config.cmake.in | 2 +- code/AssetLib/MMD/MMDPmxParser.cpp | 2 +- code/AssetLib/SIB/SIBImporter.cpp | 2 +- code/AssetLib/STEPParser/STEPFileEncoding.cpp | 2 +- code/AssetLib/X3D/FIReader.cpp | 2 +- code/CMakeLists.txt | 4 ++-- code/Common/BaseImporter.cpp | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b350f6e3..37a44d160 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,8 +44,8 @@ option(ASSIMP_HUNTER_ENABLED "Enable Hunter package manager support" OFF) IF(ASSIMP_HUNTER_ENABLED) include("cmake/HunterGate.cmake") HunterGate( - URL "https://github.com/ruslo/hunter/archive/v0.23.176.tar.gz" - SHA1 "2e9ae973d028660b735ac4c6142725ca36a0048a" + URL "https://github.com/cpp-pm/hunter/archive/v0.23.261.tar.gz" + SHA1 "1540dad7b97c849784a09e8c452ba811c9f71ba2" ) add_definitions(-DASSIMP_USE_HUNTER) diff --git a/cmake/assimp-hunter-config.cmake.in b/cmake/assimp-hunter-config.cmake.in index 34762ac54..8707602e5 100644 --- a/cmake/assimp-hunter-config.cmake.in +++ b/cmake/assimp-hunter-config.cmake.in @@ -2,7 +2,7 @@ find_package(RapidJSON CONFIG REQUIRED) find_package(ZLIB CONFIG REQUIRED) -find_package(utf8 CONFIG REQUIRED) +find_package(utf8cpp CONFIG REQUIRED) find_package(irrXML CONFIG REQUIRED) find_package(minizip CONFIG REQUIRED) find_package(openddlparser CONFIG REQUIRED) diff --git a/code/AssetLib/MMD/MMDPmxParser.cpp b/code/AssetLib/MMD/MMDPmxParser.cpp index 6421f38cb..7ac5ac399 100644 --- a/code/AssetLib/MMD/MMDPmxParser.cpp +++ b/code/AssetLib/MMD/MMDPmxParser.cpp @@ -43,7 +43,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "MMDPmxParser.h" #include #ifdef ASSIMP_USE_HUNTER -# include +# include #else # include "../contrib/utf8cpp/source/utf8.h" #endif diff --git a/code/AssetLib/SIB/SIBImporter.cpp b/code/AssetLib/SIB/SIBImporter.cpp index b36c6d9b1..33beb0087 100644 --- a/code/AssetLib/SIB/SIBImporter.cpp +++ b/code/AssetLib/SIB/SIBImporter.cpp @@ -59,7 +59,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #ifdef ASSIMP_USE_HUNTER -#include +#include #else //# include "../contrib/ConvertUTF/ConvertUTF.h" #include "../contrib/utf8cpp/source/utf8.h" diff --git a/code/AssetLib/STEPParser/STEPFileEncoding.cpp b/code/AssetLib/STEPParser/STEPFileEncoding.cpp index d917c28f3..1d1150c08 100644 --- a/code/AssetLib/STEPParser/STEPFileEncoding.cpp +++ b/code/AssetLib/STEPParser/STEPFileEncoding.cpp @@ -46,7 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "STEPFileEncoding.h" #include #ifdef ASSIMP_USE_HUNTER -# include +# include #else # include #endif diff --git a/code/AssetLib/X3D/FIReader.cpp b/code/AssetLib/X3D/FIReader.cpp index de9f035f2..c1b439bda 100644 --- a/code/AssetLib/X3D/FIReader.cpp +++ b/code/AssetLib/X3D/FIReader.cpp @@ -61,7 +61,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #ifdef ASSIMP_USE_HUNTER -# include +# include #else # include "../contrib/utf8cpp/source/utf8.h" #endif diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 9f8f519d9..bb43449e1 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -899,7 +899,7 @@ ENDIF() # utf8 IF(ASSIMP_HUNTER_ENABLED) hunter_add_package(utf8) - find_package(utf8 CONFIG REQUIRED) + find_package(utf8cpp CONFIG REQUIRED) ELSE() # utf8 is header-only, so Assimp doesn't need to do anything. ENDIF() @@ -1159,7 +1159,7 @@ IF(ASSIMP_HUNTER_ENABLED) minizip::minizip ZLIB::zlib RapidJSON::rapidjson - utf8::utf8 + utf8cpp zip::zip ) ELSE() diff --git a/code/Common/BaseImporter.cpp b/code/Common/BaseImporter.cpp index 47ff05f2f..bcea076be 100644 --- a/code/Common/BaseImporter.cpp +++ b/code/Common/BaseImporter.cpp @@ -343,7 +343,7 @@ std::string BaseImporter::GetExtension(const std::string &file) { } #ifdef ASSIMP_USE_HUNTER -#include +#include #else #include "../contrib/utf8cpp/source/utf8.h" #endif From abc6b9ce4c84beb5ea4dcb6e32826b25bb599103 Mon Sep 17 00:00:00 2001 From: Rahul Sheth Date: Tue, 14 Jul 2020 14:07:36 -0400 Subject: [PATCH 028/129] ifdef fixes to fix MSVC warnings --- code/AssetLib/glTF/glTFAsset.inl | 4 ++-- code/AssetLib/glTF/glTFAssetWriter.inl | 4 ++-- code/AssetLib/glTF/glTFImporter.cpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/AssetLib/glTF/glTFAsset.inl b/code/AssetLib/glTF/glTFAsset.inl index 116f76535..c72b9698d 100644 --- a/code/AssetLib/glTF/glTFAsset.inl +++ b/code/AssetLib/glTF/glTFAsset.inl @@ -836,8 +836,8 @@ inline void Mesh::Read(Value &pJSON_Object, Asset &pAsset_Root) { if (json_extensions == nullptr) goto mr_skip_extensions; - for (Value::MemberIterator it_memb = json_extensions->MemberBegin(); it_memb != json_extensions->MemberEnd(); it_memb++) { #ifdef ASSIMP_IMPORTER_GLTF_USE_OPEN3DGC + for (Value::MemberIterator it_memb = json_extensions->MemberBegin(); it_memb != json_extensions->MemberEnd(); it_memb++) { if (it_memb->name.GetString() == std::string("Open3DGC-compression")) { // Search for compressed data. // Compressed data contain description of part of "buffer" which is encoded. This part must be decoded and @@ -887,11 +887,11 @@ inline void Mesh::Read(Value &pJSON_Object, Asset &pAsset_Root) { Extension.push_back(ext_o3dgc); // store info in mesh extensions list. } // if(it_memb->name.GetString() == "Open3DGC-compression") else -#endif { throw DeadlyImportError(std::string("GLTF: Unknown mesh extension: \"") + it_memb->name.GetString() + "\"."); } } // for(Value::MemberIterator it_memb = json_extensions->MemberBegin(); it_memb != json_extensions->MemberEnd(); json_extensions++) +#endif mr_skip_extensions: diff --git a/code/AssetLib/glTF/glTFAssetWriter.inl b/code/AssetLib/glTF/glTFAssetWriter.inl index d8d2556fa..5b07eb2e9 100644 --- a/code/AssetLib/glTF/glTFAssetWriter.inl +++ b/code/AssetLib/glTF/glTFAssetWriter.inl @@ -305,11 +305,11 @@ namespace glTF { Value json_extensions; json_extensions.SetObject(); +#ifdef ASSIMP_IMPORTER_GLTF_USE_OPEN3DGC for(Mesh::SExtension* ptr_ext : m.Extension) { switch(ptr_ext->Type) { -#ifdef ASSIMP_IMPORTER_GLTF_USE_OPEN3DGC case Mesh::SExtension::EType::Compression_Open3DGC: { Value json_comp_data; @@ -339,11 +339,11 @@ namespace glTF { } break; -#endif default: throw DeadlyImportError("GLTF: Can not write mesh: unknown mesh extension, only Open3DGC is supported."); }// switch(ptr_ext->Type) }// for(Mesh::SExtension* ptr_ext : m.Extension) +#endif // Add extensions to mesh obj.AddMember("extensions", json_extensions, w.mAl); diff --git a/code/AssetLib/glTF/glTFImporter.cpp b/code/AssetLib/glTF/glTFImporter.cpp index b4ef9b06f..3f9176cca 100644 --- a/code/AssetLib/glTF/glTFImporter.cpp +++ b/code/AssetLib/glTF/glTFImporter.cpp @@ -215,8 +215,8 @@ void glTFImporter::ImportMeshes(glTF::Asset &r) { // Check if mesh extensions is used if (mesh.Extension.size() > 0) { - for (Mesh::SExtension *cur_ext : mesh.Extension) { #ifdef ASSIMP_IMPORTER_GLTF_USE_OPEN3DGC + for (Mesh::SExtension *cur_ext : mesh.Extension) { if (cur_ext->Type == Mesh::SExtension::EType::Compression_Open3DGC) { // Limitations for meshes when using Open3DGC-compression. // It's a current limitation of sp... Specification have not this part still - about mesh compression. Why only one primitive? @@ -233,12 +233,12 @@ void glTFImporter::ImportMeshes(glTF::Asset &r) { buf->EncodedRegion_SetCurrent(mesh.id); } else -#endif { throw DeadlyImportError("GLTF: Can not import mesh: unknown mesh extension (code: \"" + to_string(cur_ext->Type) + "\"), only Open3DGC is supported."); } } +#endif } // if(mesh.Extension.size() > 0) meshOffsets.push_back(k); From 0bad2c7b6a48f07d89f4b8d4d8de00c14da5605f Mon Sep 17 00:00:00 2001 From: Rahul Sheth Date: Tue, 14 Jul 2020 18:40:54 -0400 Subject: [PATCH 029/129] Move library configuration outside Hunter block --- CMakeLists.txt | 56 +++++++++++++++++++++++++------------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 37a44d160..23725381d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -357,6 +357,34 @@ IF (NOT TARGET uninstall) ADD_CUSTOM_TARGET(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") ENDIF() +# cmake configuration files +if(${BUILD_SHARED_LIBS}) + set(BUILD_LIB_TYPE SHARED) +else() + set(BUILD_LIB_TYPE STATIC) +endif() + +IF( UNIX ) + # Use GNUInstallDirs for Unix predefined directories + INCLUDE(GNUInstallDirs) + + SET( ASSIMP_LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}) + SET( ASSIMP_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}) + SET( ASSIMP_BIN_INSTALL_DIR ${CMAKE_INSTALL_BINDIR}) +ELSE() + # Cache these to allow the user to override them on non-Unix platforms + SET( ASSIMP_LIB_INSTALL_DIR "lib" CACHE STRING + "Path the built library files are installed to." ) + SET( ASSIMP_INCLUDE_INSTALL_DIR "include" CACHE STRING + "Path the header files are installed to." ) + SET( ASSIMP_BIN_INSTALL_DIR "bin" CACHE STRING + "Path the tool executables are installed to." ) + + SET(CMAKE_INSTALL_FULL_INCLUDEDIR ${CMAKE_INSTALL_PREFIX}/${ASSIMP_INCLUDE_INSTALL_DIR}) + SET(CMAKE_INSTALL_FULL_LIBDIR ${CMAKE_INSTALL_PREFIX}/${ASSIMP_LIB_INSTALL_DIR}) + SET(CMAKE_INSTALL_FULL_BINDIR ${CMAKE_INSTALL_PREFIX}/${ASSIMP_BIN_INSTALL_DIR}) +ENDIF() + IF(ASSIMP_HUNTER_ENABLED) set(CONFIG_INSTALL_DIR "lib/cmake/${PROJECT_NAME}") set(INCLUDE_INSTALL_DIR "include") @@ -395,34 +423,6 @@ IF(ASSIMP_HUNTER_ENABLED) DESTINATION "${CONFIG_INSTALL_DIR}" ) ELSE() - # cmake configuration files - if(${BUILD_SHARED_LIBS}) - set(BUILD_LIB_TYPE SHARED) - else() - set(BUILD_LIB_TYPE STATIC) - endif() - - IF( UNIX ) - # Use GNUInstallDirs for Unix predefined directories - INCLUDE(GNUInstallDirs) - - SET( ASSIMP_LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}) - SET( ASSIMP_INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}) - SET( ASSIMP_BIN_INSTALL_DIR ${CMAKE_INSTALL_BINDIR}) - ELSE() - # Cache these to allow the user to override them on non-Unix platforms - SET( ASSIMP_LIB_INSTALL_DIR "lib" CACHE STRING - "Path the built library files are installed to." ) - SET( ASSIMP_INCLUDE_INSTALL_DIR "include" CACHE STRING - "Path the header files are installed to." ) - SET( ASSIMP_BIN_INSTALL_DIR "bin" CACHE STRING - "Path the tool executables are installed to." ) - - SET(CMAKE_INSTALL_FULL_INCLUDEDIR ${CMAKE_INSTALL_PREFIX}/${ASSIMP_INCLUDE_INSTALL_DIR}) - SET(CMAKE_INSTALL_FULL_LIBDIR ${CMAKE_INSTALL_PREFIX}/${ASSIMP_LIB_INSTALL_DIR}) - SET(CMAKE_INSTALL_FULL_BINDIR ${CMAKE_INSTALL_PREFIX}/${ASSIMP_BIN_INSTALL_DIR}) - ENDIF() - CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/assimp-config.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/assimp-config.cmake" @ONLY IMMEDIATE) CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/assimpTargets.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/assimpTargets.cmake" @ONLY IMMEDIATE) IF (is_multi_config) From 700d8e6614cf3b75e686fb5e491384efb675096c Mon Sep 17 00:00:00 2001 From: awr1 <41453959+awr1@users.noreply.github.com> Date: Tue, 14 Jul 2020 21:19:07 -0500 Subject: [PATCH 030/129] Fix MinGW builds (issues related to pragmas and format strings) --- code/AssetLib/Assbin/AssbinFileWriter.cpp | 8 ++++---- code/AssetLib/Assjson/cencode.h | 4 ++-- code/AssetLib/glTF/glTFAsset.inl | 12 ++++++------ code/AssetLib/glTF/glTFAssetWriter.inl | 6 +++--- code/AssetLib/glTF/glTFCommon.h | 8 ++++---- code/AssetLib/glTF/glTFExporter.cpp | 10 +++++++++- code/AssetLib/glTF2/glTF2Asset.inl | 14 +++++++------- contrib/poly2tri/poly2tri/sweep/sweep.cc | 8 ++++---- contrib/zip/src/zip.h | 8 ++++++-- include/assimp/StringUtils.h | 12 ++++++++++-- 10 files changed, 55 insertions(+), 35 deletions(-) diff --git a/code/AssetLib/Assbin/AssbinFileWriter.cpp b/code/AssetLib/Assbin/AssbinFileWriter.cpp index a879e637c..83a647a0b 100644 --- a/code/AssetLib/Assbin/AssbinFileWriter.cpp +++ b/code/AssetLib/Assbin/AssbinFileWriter.cpp @@ -60,10 +60,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include -#ifdef _WIN32 +#if _MSC_VER #pragma warning(push) #pragma warning(disable : 4706) -#endif // _WIN32 +#endif // _MSC_VER namespace Assimp { @@ -825,8 +825,8 @@ void DumpSceneToAssbin( AssbinFileWriter fileWriter(shortened, compressed); fileWriter.WriteBinaryDump(pFile, cmd, pIOSystem, pScene); } -#ifdef _WIN32 +#if _MSC_VER #pragma warning(pop) -#endif // _WIN32 +#endif // _MSC_VER } // end of namespace Assimp diff --git a/code/AssetLib/Assjson/cencode.h b/code/AssetLib/Assjson/cencode.h index 6bf76724e..a7893c434 100644 --- a/code/AssetLib/Assjson/cencode.h +++ b/code/AssetLib/Assjson/cencode.h @@ -8,9 +8,9 @@ For details, see http://sourceforge.net/projects/libb64 #ifndef BASE64_CENCODE_H #define BASE64_CENCODE_H -#ifdef _WIN32 +#ifdef _MSC_VER #pragma warning(disable : 4127 ) -#endif // _WIN32 +#endif // _MSC_VER typedef enum { diff --git a/code/AssetLib/glTF/glTFAsset.inl b/code/AssetLib/glTF/glTFAsset.inl index 116f76535..eae56a64d 100644 --- a/code/AssetLib/glTF/glTFAsset.inl +++ b/code/AssetLib/glTF/glTFAsset.inl @@ -57,10 +57,10 @@ namespace glTF { namespace { -#ifdef _WIN32 +#if _MSC_VER # pragma warning(push) # pragma warning(disable : 4706) -#endif // _WIN32 +#endif // _MSC_VER // // JSON Value reading helpers @@ -372,7 +372,7 @@ inline void Buffer::EncodedRegion_Mark(const size_t pOffset, const size_t pEncod char val[val_size]; - ai_snprintf(val, val_size, "%llu", (long long)pOffset); + ai_snprintf(val, val_size, AI_SIZEFMT, pOffset); throw DeadlyImportError(std::string("GLTF: incorrect offset value (") + val + ") for marking encoded region."); } @@ -382,7 +382,7 @@ inline void Buffer::EncodedRegion_Mark(const size_t pOffset, const size_t pEncod char val[val_size]; - ai_snprintf(val, val_size, "%llu, %llu", (long long)pOffset, (long long)pEncodedData_Length); + ai_snprintf(val, val_size, AI_SIZEFMT, AI_SIZEFMT, pOffset, pEncodedData_Length); throw DeadlyImportError(std::string("GLTF: encoded region with offset/length (") + val + ") is out of range."); } @@ -1412,8 +1412,8 @@ inline std::string Asset::FindUniqueID(const std::string &str, const char *suffi return id; } -#ifdef _WIN32 +#if _MSC_VER # pragma warning(pop) -#endif // WIN32 +#endif // _MSC_VER } // namespace glTF diff --git a/code/AssetLib/glTF/glTFAssetWriter.inl b/code/AssetLib/glTF/glTFAssetWriter.inl index d8d2556fa..779c8ce58 100644 --- a/code/AssetLib/glTF/glTFAssetWriter.inl +++ b/code/AssetLib/glTF/glTFAssetWriter.inl @@ -43,10 +43,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#ifdef _WIN32 +#if _MSC_VER # pragma warning(push) # pragma warning( disable : 4706) -#endif // _WIN32 +#endif // _MSC_VER namespace glTF { @@ -707,7 +707,7 @@ namespace glTF { w.WriteObjects(d); } -#ifdef _WIN32 +#if _MSC_VER # pragma warning(pop) #endif // _WIN32 diff --git a/code/AssetLib/glTF/glTFCommon.h b/code/AssetLib/glTF/glTFCommon.h index b151918b6..f70780ed4 100644 --- a/code/AssetLib/glTF/glTFCommon.h +++ b/code/AssetLib/glTF/glTFCommon.h @@ -190,10 +190,10 @@ inline void CopyValue(const glTFCommon::mat4 &v, aiMatrix4x4 &o) { o.d4 = v[15]; } -#ifdef _WIN32 +#if _MSC_VER # pragma warning(push) # pragma warning(disable : 4310) -#endif // _WIN32 +#endif // _MSC_VER inline std::string getCurrentAssetDir(const std::string &pFile) { std::string path = pFile; @@ -204,9 +204,9 @@ inline std::string getCurrentAssetDir(const std::string &pFile) { return path; } -#ifdef _WIN32 +#if _MSC_VER # pragma warning(pop) -#endif // _WIN32 +#endif // _MSC_VER namespace Util { diff --git a/code/AssetLib/glTF/glTFExporter.cpp b/code/AssetLib/glTF/glTFExporter.cpp index b85affc08..3edb87623 100644 --- a/code/AssetLib/glTF/glTFExporter.cpp +++ b/code/AssetLib/glTF/glTFExporter.cpp @@ -525,6 +525,10 @@ void ExportSkin(Asset& mAsset, const aiMesh* aimesh, Ref& meshRef, Ref encoder; o3dgc::IndexedFaceSet comp_o3dgc_ifs; @@ -793,6 +797,10 @@ void glTFExporter::ExportMeshes() } } +#if __GNUC__ +#pragma GCC diagnostic pop +#endif // __GNUC__ + /* * Export the root node of the node hierarchy. * Calls ExportNode for all children. diff --git a/code/AssetLib/glTF2/glTF2Asset.inl b/code/AssetLib/glTF2/glTF2Asset.inl index 142f39841..ca622d1e2 100644 --- a/code/AssetLib/glTF2/glTF2Asset.inl +++ b/code/AssetLib/glTF2/glTF2Asset.inl @@ -436,7 +436,7 @@ inline void Buffer::EncodedRegion_Mark(const size_t pOffset, const size_t pEncod char val[val_size]; - ai_snprintf(val, val_size, "%llu", (long long)pOffset); + ai_snprintf(val, val_size, AI_SIZEFMT, pOffset); throw DeadlyImportError(std::string("GLTF: incorrect offset value (") + val + ") for marking encoded region."); } @@ -446,7 +446,7 @@ inline void Buffer::EncodedRegion_Mark(const size_t pOffset, const size_t pEncod char val[val_size]; - ai_snprintf(val, val_size, "%llu, %llu", (long long)pOffset, (long long)pEncodedData_Length); + ai_snprintf(val, val_size, AI_SIZEFMT, AI_SIZEFMT, pOffset, pEncodedData_Length); throw DeadlyImportError(std::string("GLTF: encoded region with offset/length (") + val + ") is out of range."); } @@ -1042,10 +1042,10 @@ inline int Compare(const char *attr, const char (&str)[N]) { return (strncmp(attr, str, N - 1) == 0) ? N - 1 : 0; } -#ifdef _WIN32 +#if _MSC_VER #pragma warning(push) #pragma warning(disable : 4706) -#endif // _WIN32 +#endif // _MSC_VER inline bool GetAttribVector(Mesh::Primitive &p, const char *attr, Mesh::AccessorList *&v, int &pos) { if ((pos = Compare(attr, "POSITION"))) { @@ -1723,8 +1723,8 @@ inline std::string Asset::FindUniqueID(const std::string &str, const char *suffi return id; } -#ifdef _WIN32 -#pragma warning(pop) -#endif // _WIN32 +#if _MSC_VER +# pragma warning(pop) +#endif // _MSC_VER } // namespace glTF2 diff --git a/contrib/poly2tri/poly2tri/sweep/sweep.cc b/contrib/poly2tri/poly2tri/sweep/sweep.cc index 9e3666001..23aeb6b57 100644 --- a/contrib/poly2tri/poly2tri/sweep/sweep.cc +++ b/contrib/poly2tri/poly2tri/sweep/sweep.cc @@ -36,10 +36,10 @@ namespace p2t { -#ifdef _WIN32 +#ifdef _MSC_VER # pragma warning(push) # pragma warning( disable : 4702 ) -#endif // _WIN32 +#endif // _MSC_VER // Triangulate simple polygon with holes void Sweep::Triangulate(SweepContext& tcx) @@ -800,8 +800,8 @@ Sweep::~Sweep() { } -#ifdef _WIN32 +#ifdef _MSC_VER # pragma warning( pop ) -#endif // _WIN32 +#endif // _MSC_VER } diff --git a/contrib/zip/src/zip.h b/contrib/zip/src/zip.h index 807e328a8..2ebe9394d 100644 --- a/contrib/zip/src/zip.h +++ b/contrib/zip/src/zip.h @@ -15,9 +15,9 @@ #include #include -#ifdef _WIN32 +#ifdef _MSC_VER #pragma warning(disable : 4127 ) -#endif //_WIN32 +#endif //_MSC_VER #ifdef __cplusplus extern "C" { @@ -319,6 +319,10 @@ extern int zip_extract(const char *zipname, const char *dir, /** @} */ +#ifdef _MSC_VER +#pragma warning(pop) +#endif //_MSC_VER + #ifdef __cplusplus } #endif diff --git a/include/assimp/StringUtils.h b/include/assimp/StringUtils.h index 7e1cb4ce0..d848a6527 100644 --- a/include/assimp/StringUtils.h +++ b/include/assimp/StringUtils.h @@ -53,6 +53,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +#ifdef _MSC_VER +# define AI_SIZEFMT "%Iu" +#else +# define AI_SIZEFMT "%zu" +#endif + /// @fn ai_snprintf /// @brief The portable version of the function snprintf ( C99 standard ), which works on visual studio compilers 2013 and earlier. /// @param outBuf The buffer to write in @@ -87,6 +93,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. return count; } +#elif defined(__MINGW32__) +# define ai_snprintf __mingw_snprintf #else # define ai_snprintf snprintf #endif @@ -150,7 +158,7 @@ std::string DecimalToHexa( T toConvert ) { /// @param g aiColor.g /// @param b aiColor.b /// @param a aiColor.a -/// @param with_head # +/// @param with_head # /// @return The hexadecimal string, is empty in case of an error. AI_FORCE_INLINE std::string Rgba2Hex(int r, int g, int b, int a, bool with_head) { std::stringstream ss; @@ -158,7 +166,7 @@ AI_FORCE_INLINE std::string Rgba2Hex(int r, int g, int b, int a, bool with_head) ss << "#"; } ss << std::hex << (r << 24 | g << 16 | b << 8 | a); - + return ss.str(); } From 93d567e3b10285d7fde4ec77edd5d5b71ddf26d4 Mon Sep 17 00:00:00 2001 From: awr1 <41453959+awr1@users.noreply.github.com> Date: Tue, 14 Jul 2020 21:32:22 -0500 Subject: [PATCH 031/129] Fix sprintf format string --- code/AssetLib/glTF/glTFAsset.inl | 2 +- code/AssetLib/glTF2/glTF2Asset.inl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/glTF/glTFAsset.inl b/code/AssetLib/glTF/glTFAsset.inl index eae56a64d..ea6a6b11a 100644 --- a/code/AssetLib/glTF/glTFAsset.inl +++ b/code/AssetLib/glTF/glTFAsset.inl @@ -382,7 +382,7 @@ inline void Buffer::EncodedRegion_Mark(const size_t pOffset, const size_t pEncod char val[val_size]; - ai_snprintf(val, val_size, AI_SIZEFMT, AI_SIZEFMT, pOffset, pEncodedData_Length); + ai_snprintf(val, val_size, AI_SIZEFMT " " AI_SIZEFMT, pOffset, pEncodedData_Length); throw DeadlyImportError(std::string("GLTF: encoded region with offset/length (") + val + ") is out of range."); } diff --git a/code/AssetLib/glTF2/glTF2Asset.inl b/code/AssetLib/glTF2/glTF2Asset.inl index ca622d1e2..a89b65f1a 100644 --- a/code/AssetLib/glTF2/glTF2Asset.inl +++ b/code/AssetLib/glTF2/glTF2Asset.inl @@ -446,7 +446,7 @@ inline void Buffer::EncodedRegion_Mark(const size_t pOffset, const size_t pEncod char val[val_size]; - ai_snprintf(val, val_size, AI_SIZEFMT, AI_SIZEFMT, pOffset, pEncodedData_Length); + ai_snprintf(val, val_size, AI_SIZEFMT " " AI_SIZEFMT, pOffset, pEncodedData_Length); throw DeadlyImportError(std::string("GLTF: encoded region with offset/length (") + val + ") is out of range."); } From 3bf6963d206ad2ab120eb4ea56b57e1f7f23d120 Mon Sep 17 00:00:00 2001 From: awr1 <41453959+awr1@users.noreply.github.com> Date: Tue, 14 Jul 2020 21:34:30 -0500 Subject: [PATCH 032/129] Use a better divider for import error --- code/AssetLib/glTF/glTFAsset.inl | 2 +- code/AssetLib/glTF2/glTF2Asset.inl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/glTF/glTFAsset.inl b/code/AssetLib/glTF/glTFAsset.inl index ea6a6b11a..a5e539345 100644 --- a/code/AssetLib/glTF/glTFAsset.inl +++ b/code/AssetLib/glTF/glTFAsset.inl @@ -382,7 +382,7 @@ inline void Buffer::EncodedRegion_Mark(const size_t pOffset, const size_t pEncod char val[val_size]; - ai_snprintf(val, val_size, AI_SIZEFMT " " AI_SIZEFMT, pOffset, pEncodedData_Length); + ai_snprintf(val, val_size, AI_SIZEFMT "/" AI_SIZEFMT, pOffset, pEncodedData_Length); throw DeadlyImportError(std::string("GLTF: encoded region with offset/length (") + val + ") is out of range."); } diff --git a/code/AssetLib/glTF2/glTF2Asset.inl b/code/AssetLib/glTF2/glTF2Asset.inl index a89b65f1a..2dfe2f41e 100644 --- a/code/AssetLib/glTF2/glTF2Asset.inl +++ b/code/AssetLib/glTF2/glTF2Asset.inl @@ -446,7 +446,7 @@ inline void Buffer::EncodedRegion_Mark(const size_t pOffset, const size_t pEncod char val[val_size]; - ai_snprintf(val, val_size, AI_SIZEFMT " " AI_SIZEFMT, pOffset, pEncodedData_Length); + ai_snprintf(val, val_size, AI_SIZEFMT "/" AI_SIZEFMT, pOffset, pEncodedData_Length); throw DeadlyImportError(std::string("GLTF: encoded region with offset/length (") + val + ") is out of range."); } From b3f61f87597d38e4c611edcc80c326ae726bbdb3 Mon Sep 17 00:00:00 2001 From: awr1 <41453959+awr1@users.noreply.github.com> Date: Tue, 14 Jul 2020 21:44:33 -0500 Subject: [PATCH 033/129] Fix error where -Wunused-but-set-variable might not be available --- code/AssetLib/glTF/glTFExporter.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/AssetLib/glTF/glTFExporter.cpp b/code/AssetLib/glTF/glTFExporter.cpp index 3edb87623..5f911b422 100644 --- a/code/AssetLib/glTF/glTFExporter.cpp +++ b/code/AssetLib/glTF/glTFExporter.cpp @@ -525,9 +525,9 @@ void ExportSkin(Asset& mAsset, const aiMesh* aimesh, Ref& meshRef, Ref Date: Tue, 14 Jul 2020 21:48:46 -0500 Subject: [PATCH 034/129] Remove unnecessary inversion in preproc --- code/AssetLib/glTF/glTFExporter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/glTF/glTFExporter.cpp b/code/AssetLib/glTF/glTFExporter.cpp index 5f911b422..44a37af49 100644 --- a/code/AssetLib/glTF/glTFExporter.cpp +++ b/code/AssetLib/glTF/glTFExporter.cpp @@ -525,7 +525,7 @@ void ExportSkin(Asset& mAsset, const aiMesh* aimesh, Ref& meshRef, Ref Date: Tue, 14 Jul 2020 21:50:22 -0500 Subject: [PATCH 035/129] Preproc conditional should be &&, not || --- code/AssetLib/glTF/glTFExporter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/glTF/glTFExporter.cpp b/code/AssetLib/glTF/glTFExporter.cpp index 44a37af49..032555fc3 100644 --- a/code/AssetLib/glTF/glTFExporter.cpp +++ b/code/AssetLib/glTF/glTFExporter.cpp @@ -525,7 +525,7 @@ void ExportSkin(Asset& mAsset, const aiMesh* aimesh, Ref& meshRef, Ref Date: Tue, 14 Jul 2020 21:58:36 -0500 Subject: [PATCH 036/129] Try to fix lexing issue with preproc w/r/t __has_warning --- code/AssetLib/glTF/glTFExporter.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/glTF/glTFExporter.cpp b/code/AssetLib/glTF/glTFExporter.cpp index 032555fc3..be9dddef7 100644 --- a/code/AssetLib/glTF/glTFExporter.cpp +++ b/code/AssetLib/glTF/glTFExporter.cpp @@ -525,9 +525,11 @@ void ExportSkin(Asset& mAsset, const aiMesh* aimesh, Ref& meshRef, Ref Date: Tue, 14 Jul 2020 22:07:24 -0500 Subject: [PATCH 037/129] Ensure that zip.h warning disable is pushed --- contrib/zip/src/zip.h | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/zip/src/zip.h b/contrib/zip/src/zip.h index 2ebe9394d..87f3654f4 100644 --- a/contrib/zip/src/zip.h +++ b/contrib/zip/src/zip.h @@ -16,6 +16,7 @@ #include #ifdef _MSC_VER +#pragma warning(push) #pragma warning(disable : 4127 ) #endif //_MSC_VER From a56134ba330775415dd6148d8667e9a3c7ce2537 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Wed, 15 Jul 2020 09:05:09 +0100 Subject: [PATCH 038/129] Drop faces when indices are out of range. --- code/AssetLib/glTF2/glTF2Importer.cpp | 117 +++++++++++++++----------- 1 file changed, 67 insertions(+), 50 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 4d740d8c1..1c32b48e2 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -298,25 +298,37 @@ void glTF2Importer::ImportMaterials(glTF2::Asset &r) { } } -static inline void SetFace(aiFace &face, int a) { - face.mNumIndices = 1; - face.mIndices = new unsigned int[1]; - face.mIndices[0] = a; +static inline void SetFaceAndAdvance(aiFace*& face, unsigned int numVertices, unsigned int a) { + if (a >= numVertices) { + return; + } + face->mNumIndices = 1; + face->mIndices = new unsigned int[1]; + face->mIndices[0] = a; + ++face; } -static inline void SetFace(aiFace &face, int a, int b) { - face.mNumIndices = 2; - face.mIndices = new unsigned int[2]; - face.mIndices[0] = a; - face.mIndices[1] = b; +static inline void SetFaceAndAdvance(aiFace*& face, unsigned int numVertices, unsigned int a, unsigned int b) { + if ((a >= numVertices) || (b >= numVertices)) { + return; + } + face->mNumIndices = 2; + face->mIndices = new unsigned int[2]; + face->mIndices[0] = a; + face->mIndices[1] = b; + ++face; } -static inline void SetFace(aiFace &face, int a, int b, int c) { - face.mNumIndices = 3; - face.mIndices = new unsigned int[3]; - face.mIndices[0] = a; - face.mIndices[1] = b; - face.mIndices[2] = c; +static inline void SetFaceAndAdvance(aiFace*& face, unsigned int numVertices, unsigned int a, unsigned int b, unsigned int c) { + if ((a >= numVertices) || (b >= numVertices) || (c >= numVertices)) { + return; + } + face->mNumIndices = 3; + face->mIndices = new unsigned int[3]; + face->mIndices[0] = a; + face->mIndices[1] = b; + face->mIndices[2] = c; + ++face; } #ifdef ASSIMP_BUILD_DEBUG @@ -486,6 +498,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { } aiFace *faces = nullptr; + aiFace *facePtr = nullptr; size_t nFaces = 0; if (prim.indices) { @@ -497,9 +510,9 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { switch (prim.mode) { case PrimitiveMode_POINTS: { nFaces = count; - faces = new aiFace[nFaces]; + facePtr = faces = new aiFace[nFaces]; for (unsigned int i = 0; i < count; ++i) { - SetFace(faces[i], data.GetUInt(i)); + SetFaceAndAdvance(facePtr, aim->mNumVertices, data.GetUInt(i)); } break; } @@ -510,9 +523,9 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { ASSIMP_LOG_WARN("The number of vertices was not compatible with the LINES mode. Some vertices were dropped."); count = nFaces * 2; } - faces = new aiFace[nFaces]; + facePtr = faces = new aiFace[nFaces]; for (unsigned int i = 0; i < count; i += 2) { - SetFace(faces[i / 2], data.GetUInt(i), data.GetUInt(i + 1)); + SetFaceAndAdvance(facePtr, aim->mNumVertices, data.GetUInt(i), data.GetUInt(i + 1)); } break; } @@ -520,13 +533,13 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { case PrimitiveMode_LINE_LOOP: case PrimitiveMode_LINE_STRIP: { nFaces = count - ((prim.mode == PrimitiveMode_LINE_STRIP) ? 1 : 0); - faces = new aiFace[nFaces]; - SetFace(faces[0], data.GetUInt(0), data.GetUInt(1)); + facePtr = faces = new aiFace[nFaces]; + SetFaceAndAdvance(facePtr, aim->mNumVertices, data.GetUInt(0), data.GetUInt(1)); for (unsigned int i = 2; i < count; ++i) { - SetFace(faces[i - 1], faces[i - 2].mIndices[1], data.GetUInt(i)); + SetFaceAndAdvance(facePtr, aim->mNumVertices, faces[i - 2].mIndices[1], data.GetUInt(i)); } if (prim.mode == PrimitiveMode_LINE_LOOP) { // close the loop - SetFace(faces[count - 1], faces[count - 2].mIndices[1], faces[0].mIndices[0]); + SetFaceAndAdvance(facePtr, aim->mNumVertices, faces[count - 2].mIndices[1], faces[0].mIndices[0]); } break; } @@ -537,33 +550,33 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { ASSIMP_LOG_WARN("The number of vertices was not compatible with the TRIANGLES mode. Some vertices were dropped."); count = nFaces * 3; } - faces = new aiFace[nFaces]; + facePtr = faces = new aiFace[nFaces]; for (unsigned int i = 0; i < count; i += 3) { - SetFace(faces[i / 3], data.GetUInt(i), data.GetUInt(i + 1), data.GetUInt(i + 2)); + SetFaceAndAdvance(facePtr, aim->mNumVertices, data.GetUInt(i), data.GetUInt(i + 1), data.GetUInt(i + 2)); } break; } case PrimitiveMode_TRIANGLE_STRIP: { nFaces = count - 2; - faces = new aiFace[nFaces]; + facePtr = faces = new aiFace[nFaces]; for (unsigned int i = 0; i < nFaces; ++i) { //The ordering is to ensure that the triangles are all drawn with the same orientation if ((i + 1) % 2 == 0) { //For even n, vertices n + 1, n, and n + 2 define triangle n - SetFace(faces[i], data.GetUInt(i + 1), data.GetUInt(i), data.GetUInt(i + 2)); + SetFaceAndAdvance(facePtr, aim->mNumVertices, data.GetUInt(i + 1), data.GetUInt(i), data.GetUInt(i + 2)); } else { //For odd n, vertices n, n+1, and n+2 define triangle n - SetFace(faces[i], data.GetUInt(i), data.GetUInt(i + 1), data.GetUInt(i + 2)); + SetFaceAndAdvance(facePtr, aim->mNumVertices, data.GetUInt(i), data.GetUInt(i + 1), data.GetUInt(i + 2)); } } break; } case PrimitiveMode_TRIANGLE_FAN: nFaces = count - 2; - faces = new aiFace[nFaces]; - SetFace(faces[0], data.GetUInt(0), data.GetUInt(1), data.GetUInt(2)); + facePtr = faces = new aiFace[nFaces]; + SetFaceAndAdvance(facePtr, data.GetUInt(0), data.GetUInt(1), data.GetUInt(2)); for (unsigned int i = 1; i < nFaces; ++i) { - SetFace(faces[i], faces[0].mIndices[0], faces[i - 1].mIndices[2], data.GetUInt(i + 2)); + SetFaceAndAdvance(facePtr, aim->mNumVertices, faces[0].mIndices[0], faces[i - 1].mIndices[2], data.GetUInt(i + 2)); } break; } @@ -575,9 +588,9 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { switch (prim.mode) { case PrimitiveMode_POINTS: { nFaces = count; - faces = new aiFace[nFaces]; + facePtr = faces = new aiFace[nFaces]; for (unsigned int i = 0; i < count; ++i) { - SetFace(faces[i], i); + SetFaceAndAdvance(facePtr, aim->mNumVertices, i); } break; } @@ -588,9 +601,9 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { ASSIMP_LOG_WARN("The number of vertices was not compatible with the LINES mode. Some vertices were dropped."); count = (unsigned int)nFaces * 2; } - faces = new aiFace[nFaces]; + facePtr = faces = new aiFace[nFaces]; for (unsigned int i = 0; i < count; i += 2) { - SetFace(faces[i / 2], i, i + 1); + SetFaceAndAdvance(facePtr, aim->mNumVertices, i, i + 1); } break; } @@ -598,13 +611,13 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { case PrimitiveMode_LINE_LOOP: case PrimitiveMode_LINE_STRIP: { nFaces = count - ((prim.mode == PrimitiveMode_LINE_STRIP) ? 1 : 0); - faces = new aiFace[nFaces]; - SetFace(faces[0], 0, 1); + facePtr = faces = new aiFace[nFaces]; + SetFaceAndAdvance(facePtr, aim->mNumVertices, 0, 1); for (unsigned int i = 2; i < count; ++i) { - SetFace(faces[i - 1], faces[i - 2].mIndices[1], i); + SetFaceAndAdvance(facePtr, aim->mNumVertices, faces[i - 2].mIndices[1], i); } if (prim.mode == PrimitiveMode_LINE_LOOP) { // close the loop - SetFace(faces[count - 1], faces[count - 2].mIndices[1], faces[0].mIndices[0]); + SetFaceAndAdvance(facePtr, aim->mNumVertices, faces[count - 2].mIndices[1], faces[0].mIndices[0]); } break; } @@ -615,42 +628,46 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { ASSIMP_LOG_WARN("The number of vertices was not compatible with the TRIANGLES mode. Some vertices were dropped."); count = (unsigned int)nFaces * 3; } - faces = new aiFace[nFaces]; + facePtr = faces = new aiFace[nFaces]; for (unsigned int i = 0; i < count; i += 3) { - SetFace(faces[i / 3], i, i + 1, i + 2); + SetFaceAndAdvance(facePtr, aim->mNumVertices, i, i + 1, i + 2); } break; } case PrimitiveMode_TRIANGLE_STRIP: { nFaces = count - 2; - faces = new aiFace[nFaces]; + facePtr = faces = new aiFace[nFaces]; for (unsigned int i = 0; i < nFaces; ++i) { //The ordering is to ensure that the triangles are all drawn with the same orientation if ((i + 1) % 2 == 0) { //For even n, vertices n + 1, n, and n + 2 define triangle n - SetFace(faces[i], i + 1, i, i + 2); + SetFaceAndAdvance(facePtr, aim->mNumVertices, i + 1, i, i + 2); } else { //For odd n, vertices n, n+1, and n+2 define triangle n - SetFace(faces[i], i, i + 1, i + 2); + SetFaceAndAdvance(facePtr, aim->mNumVertices, i, i + 1, i + 2); } } break; } case PrimitiveMode_TRIANGLE_FAN: nFaces = count - 2; - faces = new aiFace[nFaces]; - SetFace(faces[0], 0, 1, 2); + facePtr = faces = new aiFace[nFaces]; + SetFaceAndAdvance(facePtr, aim->mNumVertices, 0, 1, 2); for (unsigned int i = 1; i < nFaces; ++i) { - SetFace(faces[i], faces[0].mIndices[0], faces[i - 1].mIndices[2], i + 2); + SetFaceAndAdvance(facePtr, aim->mNumVertices, faces[0].mIndices[0], faces[i - 1].mIndices[2], i + 2); } break; } } - if (nullptr != faces) { + if (faces) { aim->mFaces = faces; - aim->mNumFaces = static_cast(nFaces); - ai_assert(CheckValidFacesIndices(faces, static_cast(nFaces), aim->mNumVertices)); + const unsigned int actualNumFaces = facePtr - faces; + if (actualNumFaces < nFaces) { + ASSIMP_LOG_WARN("Some faces had out-of-range indices. Those faces were dropped."); + } + aim->mNumFaces = actualNumFaces; + ai_assert(CheckValidFacesIndices(faces, actualNumFaces, aim->mNumVertices)); } if (prim.material) { From c0d978786e3714aaeb2934540b6c425823509c13 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Wed, 15 Jul 2020 09:12:52 +0100 Subject: [PATCH 039/129] Fix warning --- code/AssetLib/glTF2/glTF2Importer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 1c32b48e2..9ce488cbd 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -662,7 +662,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { if (faces) { aim->mFaces = faces; - const unsigned int actualNumFaces = facePtr - faces; + const unsigned int actualNumFaces = static_cast(facePtr - faces); if (actualNumFaces < nFaces) { ASSIMP_LOG_WARN("Some faces had out-of-range indices. Those faces were dropped."); } From 7e7161852ae2a724e1f44667294b048a3281f670 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Wed, 15 Jul 2020 11:19:10 +0100 Subject: [PATCH 040/129] Add a unit test. --- .../glTF2/IndexOutOfRange/IndexOutOfRange.bin | Bin 0 -> 648 bytes .../IndexOutOfRange/IndexOutOfRange.gltf | 142 ++++++++++++++++++ test/unit/utglTF2ImportExport.cpp | 28 ++++ 3 files changed, 170 insertions(+) create mode 100644 test/models/glTF2/IndexOutOfRange/IndexOutOfRange.bin create mode 100644 test/models/glTF2/IndexOutOfRange/IndexOutOfRange.gltf diff --git a/test/models/glTF2/IndexOutOfRange/IndexOutOfRange.bin b/test/models/glTF2/IndexOutOfRange/IndexOutOfRange.bin new file mode 100644 index 0000000000000000000000000000000000000000..b7cfe377b9cdabc5bc9ed9879730941916b3946e GIT binary patch literal 648 zcmb7;0Sbap5JaDqm6es1bsVqe%{p4`2t&(9kc7v~?hM}rf8$^WOMZN(?t))>OE2Y4 zIp=K7|8vXl>iFlv-P0ZFm?6B-oYniRxnr+fzC`YAz-dW4cdufTg sR^{^3{GnpSI;hxCvt<|5>}fb~3>r?foVf%oS2}LogN_G1PhLUK7moElJ^%m! literal 0 HcmV?d00001 diff --git a/test/models/glTF2/IndexOutOfRange/IndexOutOfRange.gltf b/test/models/glTF2/IndexOutOfRange/IndexOutOfRange.gltf new file mode 100644 index 000000000..67561c591 --- /dev/null +++ b/test/models/glTF2/IndexOutOfRange/IndexOutOfRange.gltf @@ -0,0 +1,142 @@ +{ + "asset": { + "generator": "COLLADA2GLTF", + "version": "2.0" + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ], + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ] + }, + { + "mesh": 0 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 2 + }, + "indices": 0, + "mode": 4, + "material": 0 + } + ], + "name": "Mesh" + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5123, + "count": 36, + "max": [ + 255 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 0, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 288, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.800000011920929, + 0.0, + 0.0, + 1.0 + ], + "metallicFactor": 0.0 + }, + "name": "Red" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 576, + "byteLength": 72, + "target": 34963 + }, + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 576, + "byteStride": 12, + "target": 34962 + } + ], + "buffers": [ + { + "byteLength": 648, + "uri": "IndexOutOfRange.bin" + } + ] +} diff --git a/test/unit/utglTF2ImportExport.cpp b/test/unit/utglTF2ImportExport.cpp index 6791d5f89..8bc20e950 100644 --- a/test/unit/utglTF2ImportExport.cpp +++ b/test/unit/utglTF2ImportExport.cpp @@ -541,3 +541,31 @@ TEST_F(utglTF2ImportExport, norootnode_issue_3269) { const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/issue_3269/texcoord_crash.gltf", aiProcess_ValidateDataStructure); ASSERT_EQ(scene, nullptr); } + +#include +#include + +TEST_F(utglTF2ImportExport, indexOutOfRange) { + // The contents of an asset should not lead to an assert. + Assimp::Importer importer; + + struct WarningObserver : Assimp::LogStream + { + bool m_observedWarning = false; + void write(const char *message) override + { + m_observedWarning = m_observedWarning || std::strstr(message, "faces were dropped"); + } + }; + WarningObserver warningObserver; + + DefaultLogger::get()->attachStream(&warningObserver); + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/IndexOutOfRange/IndexOutOfRange.gltf", aiProcess_ValidateDataStructure); + ASSERT_NE(scene, nullptr); + ASSERT_NE(scene->mRootNode, nullptr); + ASSERT_EQ(scene->mNumMeshes, 1); + EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 11); + DefaultLogger::get()->detachStream(&warningObserver); + EXPECT_TRUE(warningObserver.m_observedWarning); +} + From 212903e935d64e8d0d3f20c68603744ddbc213f9 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Wed, 15 Jul 2020 12:19:00 +0100 Subject: [PATCH 041/129] Unit test for all indices out of range, and fix. --- code/AssetLib/glTF2/glTF2Importer.cpp | 8 ++++++-- test/unit/utglTF2ImportExport.cpp | 25 ++++++++++++++++--------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 9ce488cbd..0b784e0d4 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -574,7 +574,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { case PrimitiveMode_TRIANGLE_FAN: nFaces = count - 2; facePtr = faces = new aiFace[nFaces]; - SetFaceAndAdvance(facePtr, data.GetUInt(0), data.GetUInt(1), data.GetUInt(2)); + SetFaceAndAdvance(facePtr, aim->mNumVertices, data.GetUInt(0), data.GetUInt(1), data.GetUInt(2)); for (unsigned int i = 1; i < nFaces; ++i) { SetFaceAndAdvance(facePtr, aim->mNumVertices, faces[0].mIndices[0], faces[i - 1].mIndices[2], data.GetUInt(i + 2)); } @@ -664,7 +664,11 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { aim->mFaces = faces; const unsigned int actualNumFaces = static_cast(facePtr - faces); if (actualNumFaces < nFaces) { - ASSIMP_LOG_WARN("Some faces had out-of-range indices. Those faces were dropped."); + ASSIMP_LOG_WARN("Some faces in mesh had out-of-range indices. Those faces were dropped."); + } + if (actualNumFaces == 0) + { + throw DeadlyImportError(std::string("Mesh \"") + aim->mName.C_Str() + "\" has no faces"); } aim->mNumFaces = actualNumFaces; ai_assert(CheckValidFacesIndices(faces, actualNumFaces, aim->mNumVertices)); diff --git a/test/unit/utglTF2ImportExport.cpp b/test/unit/utglTF2ImportExport.cpp index 8bc20e950..c3ad2d994 100644 --- a/test/unit/utglTF2ImportExport.cpp +++ b/test/unit/utglTF2ImportExport.cpp @@ -46,11 +46,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include +#include + #include #include - using namespace Assimp; class utglTF2ImportExport : public AbstractImportExportBase { @@ -542,14 +544,11 @@ TEST_F(utglTF2ImportExport, norootnode_issue_3269) { ASSERT_EQ(scene, nullptr); } -#include -#include - TEST_F(utglTF2ImportExport, indexOutOfRange) { // The contents of an asset should not lead to an assert. Assimp::Importer importer; - struct WarningObserver : Assimp::LogStream + struct LogObserver : Assimp::LogStream { bool m_observedWarning = false; void write(const char *message) override @@ -557,15 +556,23 @@ TEST_F(utglTF2ImportExport, indexOutOfRange) { m_observedWarning = m_observedWarning || std::strstr(message, "faces were dropped"); } }; - WarningObserver warningObserver; + LogObserver logObserver; - DefaultLogger::get()->attachStream(&warningObserver); + DefaultLogger::get()->attachStream(&logObserver); const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/IndexOutOfRange/IndexOutOfRange.gltf", aiProcess_ValidateDataStructure); ASSERT_NE(scene, nullptr); ASSERT_NE(scene->mRootNode, nullptr); ASSERT_EQ(scene->mNumMeshes, 1); EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 11); - DefaultLogger::get()->detachStream(&warningObserver); - EXPECT_TRUE(warningObserver.m_observedWarning); + DefaultLogger::get()->detachStream(&logObserver); + EXPECT_TRUE(logObserver.m_observedWarning); } +TEST_F(utglTF2ImportExport, allIndicesOutOfRange) { + // The contents of an asset should not lead to an assert. + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/IndexOutOfRange/AllIndicesOutOfRange.gltf", aiProcess_ValidateDataStructure); + ASSERT_EQ(scene, nullptr); + std::string error = importer.GetErrorString(); + ASSERT_NE(error.find("Mesh \"Mesh\" has no faces"), std::string::npos); +} From fff6396e3c997b2a4368e597511495967e1eca82 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Wed, 15 Jul 2020 12:22:28 +0100 Subject: [PATCH 042/129] Rename to avoid overloading problems. --- code/AssetLib/glTF2/glTF2Importer.cpp | 46 +++++++++++++-------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 0b784e0d4..fae87a990 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -298,7 +298,7 @@ void glTF2Importer::ImportMaterials(glTF2::Asset &r) { } } -static inline void SetFaceAndAdvance(aiFace*& face, unsigned int numVertices, unsigned int a) { +static inline void SetFaceAndAdvance1(aiFace*& face, unsigned int numVertices, unsigned int a) { if (a >= numVertices) { return; } @@ -308,7 +308,7 @@ static inline void SetFaceAndAdvance(aiFace*& face, unsigned int numVertices, un ++face; } -static inline void SetFaceAndAdvance(aiFace*& face, unsigned int numVertices, unsigned int a, unsigned int b) { +static inline void SetFaceAndAdvance2(aiFace*& face, unsigned int numVertices, unsigned int a, unsigned int b) { if ((a >= numVertices) || (b >= numVertices)) { return; } @@ -319,7 +319,7 @@ static inline void SetFaceAndAdvance(aiFace*& face, unsigned int numVertices, un ++face; } -static inline void SetFaceAndAdvance(aiFace*& face, unsigned int numVertices, unsigned int a, unsigned int b, unsigned int c) { +static inline void SetFaceAndAdvance3(aiFace*& face, unsigned int numVertices, unsigned int a, unsigned int b, unsigned int c) { if ((a >= numVertices) || (b >= numVertices) || (c >= numVertices)) { return; } @@ -512,7 +512,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { nFaces = count; facePtr = faces = new aiFace[nFaces]; for (unsigned int i = 0; i < count; ++i) { - SetFaceAndAdvance(facePtr, aim->mNumVertices, data.GetUInt(i)); + SetFaceAndAdvance1(facePtr, aim->mNumVertices, data.GetUInt(i)); } break; } @@ -525,7 +525,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { } facePtr = faces = new aiFace[nFaces]; for (unsigned int i = 0; i < count; i += 2) { - SetFaceAndAdvance(facePtr, aim->mNumVertices, data.GetUInt(i), data.GetUInt(i + 1)); + SetFaceAndAdvance2(facePtr, aim->mNumVertices, data.GetUInt(i), data.GetUInt(i + 1)); } break; } @@ -534,12 +534,12 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { case PrimitiveMode_LINE_STRIP: { nFaces = count - ((prim.mode == PrimitiveMode_LINE_STRIP) ? 1 : 0); facePtr = faces = new aiFace[nFaces]; - SetFaceAndAdvance(facePtr, aim->mNumVertices, data.GetUInt(0), data.GetUInt(1)); + SetFaceAndAdvance2(facePtr, aim->mNumVertices, data.GetUInt(0), data.GetUInt(1)); for (unsigned int i = 2; i < count; ++i) { - SetFaceAndAdvance(facePtr, aim->mNumVertices, faces[i - 2].mIndices[1], data.GetUInt(i)); + SetFaceAndAdvance2(facePtr, aim->mNumVertices, faces[i - 2].mIndices[1], data.GetUInt(i)); } if (prim.mode == PrimitiveMode_LINE_LOOP) { // close the loop - SetFaceAndAdvance(facePtr, aim->mNumVertices, faces[count - 2].mIndices[1], faces[0].mIndices[0]); + SetFaceAndAdvance2(facePtr, aim->mNumVertices, faces[count - 2].mIndices[1], faces[0].mIndices[0]); } break; } @@ -552,7 +552,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { } facePtr = faces = new aiFace[nFaces]; for (unsigned int i = 0; i < count; i += 3) { - SetFaceAndAdvance(facePtr, aim->mNumVertices, data.GetUInt(i), data.GetUInt(i + 1), data.GetUInt(i + 2)); + SetFaceAndAdvance3(facePtr, aim->mNumVertices, data.GetUInt(i), data.GetUInt(i + 1), data.GetUInt(i + 2)); } break; } @@ -563,10 +563,10 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { //The ordering is to ensure that the triangles are all drawn with the same orientation if ((i + 1) % 2 == 0) { //For even n, vertices n + 1, n, and n + 2 define triangle n - SetFaceAndAdvance(facePtr, aim->mNumVertices, data.GetUInt(i + 1), data.GetUInt(i), data.GetUInt(i + 2)); + SetFaceAndAdvance3(facePtr, aim->mNumVertices, data.GetUInt(i + 1), data.GetUInt(i), data.GetUInt(i + 2)); } else { //For odd n, vertices n, n+1, and n+2 define triangle n - SetFaceAndAdvance(facePtr, aim->mNumVertices, data.GetUInt(i), data.GetUInt(i + 1), data.GetUInt(i + 2)); + SetFaceAndAdvance3(facePtr, aim->mNumVertices, data.GetUInt(i), data.GetUInt(i + 1), data.GetUInt(i + 2)); } } break; @@ -574,9 +574,9 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { case PrimitiveMode_TRIANGLE_FAN: nFaces = count - 2; facePtr = faces = new aiFace[nFaces]; - SetFaceAndAdvance(facePtr, aim->mNumVertices, data.GetUInt(0), data.GetUInt(1), data.GetUInt(2)); + SetFaceAndAdvance3(facePtr, aim->mNumVertices, data.GetUInt(0), data.GetUInt(1), data.GetUInt(2)); for (unsigned int i = 1; i < nFaces; ++i) { - SetFaceAndAdvance(facePtr, aim->mNumVertices, faces[0].mIndices[0], faces[i - 1].mIndices[2], data.GetUInt(i + 2)); + SetFaceAndAdvance3(facePtr, aim->mNumVertices, faces[0].mIndices[0], faces[i - 1].mIndices[2], data.GetUInt(i + 2)); } break; } @@ -590,7 +590,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { nFaces = count; facePtr = faces = new aiFace[nFaces]; for (unsigned int i = 0; i < count; ++i) { - SetFaceAndAdvance(facePtr, aim->mNumVertices, i); + SetFaceAndAdvance1(facePtr, aim->mNumVertices, i); } break; } @@ -603,7 +603,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { } facePtr = faces = new aiFace[nFaces]; for (unsigned int i = 0; i < count; i += 2) { - SetFaceAndAdvance(facePtr, aim->mNumVertices, i, i + 1); + SetFaceAndAdvance2(facePtr, aim->mNumVertices, i, i + 1); } break; } @@ -612,12 +612,12 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { case PrimitiveMode_LINE_STRIP: { nFaces = count - ((prim.mode == PrimitiveMode_LINE_STRIP) ? 1 : 0); facePtr = faces = new aiFace[nFaces]; - SetFaceAndAdvance(facePtr, aim->mNumVertices, 0, 1); + SetFaceAndAdvance2(facePtr, aim->mNumVertices, 0, 1); for (unsigned int i = 2; i < count; ++i) { - SetFaceAndAdvance(facePtr, aim->mNumVertices, faces[i - 2].mIndices[1], i); + SetFaceAndAdvance2(facePtr, aim->mNumVertices, faces[i - 2].mIndices[1], i); } if (prim.mode == PrimitiveMode_LINE_LOOP) { // close the loop - SetFaceAndAdvance(facePtr, aim->mNumVertices, faces[count - 2].mIndices[1], faces[0].mIndices[0]); + SetFaceAndAdvance2(facePtr, aim->mNumVertices, faces[count - 2].mIndices[1], faces[0].mIndices[0]); } break; } @@ -630,7 +630,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { } facePtr = faces = new aiFace[nFaces]; for (unsigned int i = 0; i < count; i += 3) { - SetFaceAndAdvance(facePtr, aim->mNumVertices, i, i + 1, i + 2); + SetFaceAndAdvance3(facePtr, aim->mNumVertices, i, i + 1, i + 2); } break; } @@ -641,10 +641,10 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { //The ordering is to ensure that the triangles are all drawn with the same orientation if ((i + 1) % 2 == 0) { //For even n, vertices n + 1, n, and n + 2 define triangle n - SetFaceAndAdvance(facePtr, aim->mNumVertices, i + 1, i, i + 2); + SetFaceAndAdvance3(facePtr, aim->mNumVertices, i + 1, i, i + 2); } else { //For odd n, vertices n, n+1, and n+2 define triangle n - SetFaceAndAdvance(facePtr, aim->mNumVertices, i, i + 1, i + 2); + SetFaceAndAdvance3(facePtr, aim->mNumVertices, i, i + 1, i + 2); } } break; @@ -652,9 +652,9 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { case PrimitiveMode_TRIANGLE_FAN: nFaces = count - 2; facePtr = faces = new aiFace[nFaces]; - SetFaceAndAdvance(facePtr, aim->mNumVertices, 0, 1, 2); + SetFaceAndAdvance3(facePtr, aim->mNumVertices, 0, 1, 2); for (unsigned int i = 1; i < nFaces; ++i) { - SetFaceAndAdvance(facePtr, aim->mNumVertices, faces[0].mIndices[0], faces[i - 1].mIndices[2], i + 2); + SetFaceAndAdvance3(facePtr, aim->mNumVertices, faces[0].mIndices[0], faces[i - 1].mIndices[2], i + 2); } break; } From d4f5f29b44d64f3dd44b5e68e90e6d395f528f5b Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Wed, 15 Jul 2020 12:22:39 +0100 Subject: [PATCH 043/129] Add missing asset --- .../IndexOutOfRange/AllIndicesOutOfRange.bin | Bin 0 -> 648 bytes .../IndexOutOfRange/AllIndicesOutOfRange.gltf | 142 ++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 test/models/glTF2/IndexOutOfRange/AllIndicesOutOfRange.bin create mode 100644 test/models/glTF2/IndexOutOfRange/AllIndicesOutOfRange.gltf diff --git a/test/models/glTF2/IndexOutOfRange/AllIndicesOutOfRange.bin b/test/models/glTF2/IndexOutOfRange/AllIndicesOutOfRange.bin new file mode 100644 index 0000000000000000000000000000000000000000..8fef5c7c04bc230c538c8bf7aed41e73d302acb9 GIT binary patch literal 648 zcmb`BfeFAc2n5|Mt7Wr}*5(37MFLW2;Q7-RV}x%GDWcg4dQ@1NcSS)YSh literal 0 HcmV?d00001 diff --git a/test/models/glTF2/IndexOutOfRange/AllIndicesOutOfRange.gltf b/test/models/glTF2/IndexOutOfRange/AllIndicesOutOfRange.gltf new file mode 100644 index 000000000..3dbb6efe4 --- /dev/null +++ b/test/models/glTF2/IndexOutOfRange/AllIndicesOutOfRange.gltf @@ -0,0 +1,142 @@ +{ + "asset": { + "generator": "COLLADA2GLTF", + "version": "2.0" + }, + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ], + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ] + }, + { + "mesh": 0 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 2 + }, + "indices": 0, + "mode": 4, + "material": 0 + } + ], + "name": "Mesh" + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5123, + "count": 36, + "max": [ + 255 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 0, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 288, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.800000011920929, + 0.0, + 0.0, + 1.0 + ], + "metallicFactor": 0.0 + }, + "name": "Red" + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 576, + "byteLength": 72, + "target": 34963 + }, + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 576, + "byteStride": 12, + "target": 34962 + } + ], + "buffers": [ + { + "byteLength": 648, + "uri": "AllIndicesOutOfRange.bin" + } + ] +} From f3170a96ba48b6938ff455d6ea5a2cfd5919c884 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Wed, 15 Jul 2020 12:36:48 +0100 Subject: [PATCH 044/129] Ensure data does not depend on faces we may not have created. --- code/AssetLib/glTF2/glTF2Importer.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index fae87a990..566e48a69 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -536,10 +536,10 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { facePtr = faces = new aiFace[nFaces]; SetFaceAndAdvance2(facePtr, aim->mNumVertices, data.GetUInt(0), data.GetUInt(1)); for (unsigned int i = 2; i < count; ++i) { - SetFaceAndAdvance2(facePtr, aim->mNumVertices, faces[i - 2].mIndices[1], data.GetUInt(i)); + SetFaceAndAdvance2(facePtr, aim->mNumVertices, data.GetUInt(i - 1), data.GetUInt(i)); } if (prim.mode == PrimitiveMode_LINE_LOOP) { // close the loop - SetFaceAndAdvance2(facePtr, aim->mNumVertices, faces[count - 2].mIndices[1], faces[0].mIndices[0]); + SetFaceAndAdvance2(facePtr, aim->mNumVertices, data.GetUInt(static_cast(count) - 1), faces[0].mIndices[0]); } break; } @@ -576,7 +576,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { facePtr = faces = new aiFace[nFaces]; SetFaceAndAdvance3(facePtr, aim->mNumVertices, data.GetUInt(0), data.GetUInt(1), data.GetUInt(2)); for (unsigned int i = 1; i < nFaces; ++i) { - SetFaceAndAdvance3(facePtr, aim->mNumVertices, faces[0].mIndices[0], faces[i - 1].mIndices[2], data.GetUInt(i + 2)); + SetFaceAndAdvance3(facePtr, aim->mNumVertices, data.GetUInt(0), data.GetUInt(i + 1), data.GetUInt(i + 2)); } break; } @@ -614,10 +614,10 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { facePtr = faces = new aiFace[nFaces]; SetFaceAndAdvance2(facePtr, aim->mNumVertices, 0, 1); for (unsigned int i = 2; i < count; ++i) { - SetFaceAndAdvance2(facePtr, aim->mNumVertices, faces[i - 2].mIndices[1], i); + SetFaceAndAdvance2(facePtr, aim->mNumVertices, i - 1, i); } if (prim.mode == PrimitiveMode_LINE_LOOP) { // close the loop - SetFaceAndAdvance2(facePtr, aim->mNumVertices, faces[count - 2].mIndices[1], faces[0].mIndices[0]); + SetFaceAndAdvance2(facePtr, aim->mNumVertices, count - 1, 0); } break; } @@ -654,7 +654,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { facePtr = faces = new aiFace[nFaces]; SetFaceAndAdvance3(facePtr, aim->mNumVertices, 0, 1, 2); for (unsigned int i = 1; i < nFaces; ++i) { - SetFaceAndAdvance3(facePtr, aim->mNumVertices, faces[0].mIndices[0], faces[i - 1].mIndices[2], i + 2); + SetFaceAndAdvance3(facePtr, aim->mNumVertices, 0, i + 1, i + 2); } break; } From 37e1fb9cd7a85e0716cc17175ac914f403cf25e2 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Wed, 15 Jul 2020 14:19:13 +0100 Subject: [PATCH 045/129] Fix message --- code/AssetLib/glTF2/glTF2Importer.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 566e48a69..441219feb 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -299,9 +299,9 @@ void glTF2Importer::ImportMaterials(glTF2::Asset &r) { } static inline void SetFaceAndAdvance1(aiFace*& face, unsigned int numVertices, unsigned int a) { - if (a >= numVertices) { - return; - } + if (a >= numVertices) { + return; + } face->mNumIndices = 1; face->mIndices = new unsigned int[1]; face->mIndices[0] = a; @@ -309,14 +309,14 @@ static inline void SetFaceAndAdvance1(aiFace*& face, unsigned int numVertices, u } static inline void SetFaceAndAdvance2(aiFace*& face, unsigned int numVertices, unsigned int a, unsigned int b) { - if ((a >= numVertices) || (b >= numVertices)) { - return; - } + if ((a >= numVertices) || (b >= numVertices)) { + return; + } face->mNumIndices = 2; face->mIndices = new unsigned int[2]; face->mIndices[0] = a; face->mIndices[1] = b; - ++face; + ++face; } static inline void SetFaceAndAdvance3(aiFace*& face, unsigned int numVertices, unsigned int a, unsigned int b, unsigned int c) { @@ -328,7 +328,7 @@ static inline void SetFaceAndAdvance3(aiFace*& face, unsigned int numVertices, u face->mIndices[0] = a; face->mIndices[1] = b; face->mIndices[2] = c; - ++face; + ++face; } #ifdef ASSIMP_BUILD_DEBUG @@ -498,7 +498,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { } aiFace *faces = nullptr; - aiFace *facePtr = nullptr; + aiFace *facePtr = nullptr; size_t nFaces = 0; if (prim.indices) { @@ -664,7 +664,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { aim->mFaces = faces; const unsigned int actualNumFaces = static_cast(facePtr - faces); if (actualNumFaces < nFaces) { - ASSIMP_LOG_WARN("Some faces in mesh had out-of-range indices. Those faces were dropped."); + ASSIMP_LOG_WARN("Some faces had out-of-range indices. Those faces were dropped."); } if (actualNumFaces == 0) { From e1bab44e19d797a9372669a3d3dd333784e26000 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Wed, 15 Jul 2020 15:02:27 +0100 Subject: [PATCH 046/129] Exception safety --- code/AssetLib/glTF2/glTF2Importer.cpp | 6 +++--- include/assimp/BaseImporter.h | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 441219feb..18c95d42b 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -347,7 +347,7 @@ static inline bool CheckValidFacesIndices(aiFace *faces, unsigned nFaces, unsign void glTF2Importer::ImportMeshes(glTF2::Asset &r) { ASSIMP_LOG_DEBUG_F("Importing ", r.meshes.Size(), " meshes"); - std::vector meshes; + std::vector> meshes; unsigned int k = 0; meshOffsets.clear(); @@ -361,8 +361,8 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { for (unsigned int p = 0; p < mesh.primitives.size(); ++p) { Mesh::Primitive &prim = mesh.primitives[p]; - aiMesh *aim = new aiMesh(); - meshes.push_back(aim); + meshes.emplace_back(std::make_unique()); + aiMesh *aim = meshes.back().get(); aim->mName = mesh.name.empty() ? mesh.id : mesh.name; diff --git a/include/assimp/BaseImporter.h b/include/assimp/BaseImporter.h index ed146168d..cc14f2f03 100644 --- a/include/assimp/BaseImporter.h +++ b/include/assimp/BaseImporter.h @@ -57,6 +57,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include struct aiScene; struct aiImporterDesc; @@ -391,6 +392,24 @@ public: // static utilities } } + // ------------------------------------------------------------------- + /** Utility function to move a std::vector of unique_ptrs into a aiScene array + * @param vec The vector of unique_ptrs to be moved + * @param out The output pointer to the allocated array. + * @param numOut The output count of elements copied. */ + template + AI_FORCE_INLINE static void CopyVector( + std::vector> &vec, + T **&out, + unsigned int &outLength) { + outLength = unsigned(vec.size()); + if (outLength) { + out = new T*[outLength]; + T** outPtr = out; + std::for_each(vec.begin(), vec.end(), [&outPtr](auto& uPtr){*outPtr = uPtr.release(); ++outPtr; }); + } + } + protected: /// Error description in case there was one. std::string m_ErrorText; From e51e07982d3ae6056f84a9881d6ab3a1d34f935e Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Wed, 15 Jul 2020 15:05:42 +0100 Subject: [PATCH 047/129] Remove generic lambda usage. --- include/assimp/BaseImporter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/assimp/BaseImporter.h b/include/assimp/BaseImporter.h index cc14f2f03..e6ff2e68d 100644 --- a/include/assimp/BaseImporter.h +++ b/include/assimp/BaseImporter.h @@ -406,7 +406,7 @@ public: // static utilities if (outLength) { out = new T*[outLength]; T** outPtr = out; - std::for_each(vec.begin(), vec.end(), [&outPtr](auto& uPtr){*outPtr = uPtr.release(); ++outPtr; }); + std::for_each(vec.begin(), vec.end(), [&outPtr](std::unique_ptr& uPtr){*outPtr = uPtr.release(); ++outPtr; }); } } From 04df5f8b1e585fbe74a0934b07308cb9784fa9c6 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Wed, 15 Jul 2020 15:47:25 +0100 Subject: [PATCH 048/129] Don't use make_unique --- code/AssetLib/glTF2/glTF2Importer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 18c95d42b..23d42ba97 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -361,8 +361,8 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { for (unsigned int p = 0; p < mesh.primitives.size(); ++p) { Mesh::Primitive &prim = mesh.primitives[p]; - meshes.emplace_back(std::make_unique()); - aiMesh *aim = meshes.back().get(); + aiMesh *aim = new aiMesh(); + meshes.push_back(std::unique_ptr(aim)); aim->mName = mesh.name.empty() ? mesh.id : mesh.name; From 84e68eaf24b3635b2d4be518f5cf0382340dff18 Mon Sep 17 00:00:00 2001 From: Kota Iguchi Date: Thu, 16 Jul 2020 15:26:02 +0900 Subject: [PATCH 049/129] fix invalid pointer for bone animation --- code/Common/Importer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/Common/Importer.cpp b/code/Common/Importer.cpp index a46d39b48..77eb8ef8c 100644 --- a/code/Common/Importer.cpp +++ b/code/Common/Importer.cpp @@ -1174,7 +1174,7 @@ void Importer::GetMemoryRequirements(aiMemoryInfo& in) const { // add all bone anims for (unsigned int a = 0; a < pc->mNumChannels; ++a) { - const aiNodeAnim* pc2 = pc->mChannels[i]; + const aiNodeAnim* pc2 = pc->mChannels[a]; in.animations += sizeof(aiNodeAnim); in.animations += pc2->mNumPositionKeys * sizeof(aiVectorKey); in.animations += pc2->mNumScalingKeys * sizeof(aiVectorKey); From 719cc82a1f1270396a1d6465a7250ea13bc5a371 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Fri, 17 Jul 2020 10:29:44 +0100 Subject: [PATCH 050/129] Apply clangformat --- code/AssetLib/AC/ACLoader.h | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/code/AssetLib/AC/ACLoader.h b/code/AssetLib/AC/ACLoader.h index e330ddf1b..69f6ae1b0 100644 --- a/code/AssetLib/AC/ACLoader.h +++ b/code/AssetLib/AC/ACLoader.h @@ -69,7 +69,10 @@ public: // Represents an AC3D material struct Material { Material() : - rgb(0.6f, 0.6f, 0.6f), spec(1.f, 1.f, 1.f), shin(0.f), trans(0.f) {} + rgb(0.6f, 0.6f, 0.6f), + spec(1.f, 1.f, 1.f), + shin(0.f), + trans(0.f) {} // base color of the material aiColor3D rgb; @@ -96,7 +99,8 @@ public: // Represents an AC3D surface struct Surface { Surface() : - mat(0), flags(0) {} + mat(0), + flags(0) {} unsigned int mat, flags; @@ -107,7 +111,19 @@ public: // Represents an AC3D object struct Object { Object() : - type(World), name(""), children(), texture(""), texRepeat(1.f, 1.f), texOffset(0.0f, 0.0f), rotation(), translation(), vertices(), surfaces(), numRefs(0), subDiv(0), crease() {} + type(World), + name(""), + children(), + texture(""), + texRepeat(1.f, 1.f), + texOffset(0.0f, 0.0f), + rotation(), + translation(), + vertices(), + surfaces(), + numRefs(0), + subDiv(0), + crease() {} // Type description enum Type { From 17b9403b7a6d5f38066a033e7cd0118af891107c Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Fri, 17 Jul 2020 11:23:50 +0100 Subject: [PATCH 051/129] ACLoader: Use enum for Surface flags --- code/AssetLib/AC/ACLoader.cpp | 33 +++++++++++++++++---------------- code/AssetLib/AC/ACLoader.h | 12 ++++++++++++ 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/code/AssetLib/AC/ACLoader.cpp b/code/AssetLib/AC/ACLoader.cpp index 5b63d315e..4291ce8d1 100644 --- a/code/AssetLib/AC/ACLoader.cpp +++ b/code/AssetLib/AC/ACLoader.cpp @@ -471,32 +471,33 @@ aiNode *AC3DImporter::ConvertObjectSection(Object &object, ++node->mNumMeshes; } - switch ((*it).flags & 0xf) { + switch ((*it).GetType()) { // closed line - case 0x1: + case Surface::ClosedLine: needMat[idx].first += (unsigned int)(*it).entries.size(); needMat[idx].second += (unsigned int)(*it).entries.size() << 1u; break; // unclosed line - case 0x2: + case Surface::OpenLine: needMat[idx].first += (unsigned int)(*it).entries.size() - 1; needMat[idx].second += ((unsigned int)(*it).entries.size() - 1) << 1u; break; // triangle strip - case 0x4: + case Surface::TriangleStrip: needMat[idx].first += (unsigned int)(*it).entries.size() - 2; needMat[idx].second += ((unsigned int)(*it).entries.size() - 2) * 3; break; - // 0 == polygon, else unknown default: - if ((*it).flags & 0xf) { - ASSIMP_LOG_WARN("AC3D: The type flag of a surface is unknown"); - (*it).flags &= ~(0xf); - } + // Coerce unknowns to a polygon and warn + ASSIMP_LOG_WARN_F("AC3D: The type flag of a surface is unknown: ", (*it).flags); + (*it).flags &= ~(Surface::Mask); + // fallthrough + // polygon + case Surface::Polygon: // the number of faces increments by one, the number // of vertices by surface.numref. needMat[idx].first++; @@ -552,8 +553,8 @@ aiNode *AC3DImporter::ConvertObjectSection(Object &object, const Surface &src = *it; // closed polygon - unsigned int type = (*it).flags & 0xf; - if (!type) { + uint8_t type = (*it).GetType(); + if (type == Surface::Polygon) { aiFace &face = *faces++; face.mNumIndices = (unsigned int)src.entries.size(); if (0 != face.mNumIndices) { @@ -576,7 +577,7 @@ aiNode *AC3DImporter::ConvertObjectSection(Object &object, } } } - } else if (type == 0x4) { + } else if (type == Surface::TriangleStrip) { for (unsigned int i = 0; i < (unsigned int)src.entries.size() - 2; ++i) { const Surface::SurfaceEntry &entry1 = src.entries[i]; const Surface::SurfaceEntry &entry2 = src.entries[i + 1]; @@ -584,8 +585,8 @@ aiNode *AC3DImporter::ConvertObjectSection(Object &object, // skip degenerate triangles if (object.vertices[entry1.first] == object.vertices[entry2.first] || - object.vertices[entry1.first] == object.vertices[entry3.first] || - object.vertices[entry2.first] == object.vertices[entry3.first]) { + object.vertices[entry1.first] == object.vertices[entry3.first] || + object.vertices[entry2.first] == object.vertices[entry3.first]) { mesh->mNumFaces--; mesh->mNumVertices -= 3; continue; @@ -640,7 +641,7 @@ aiNode *AC3DImporter::ConvertObjectSection(Object &object, // either a closed or an unclosed line unsigned int tmp = (unsigned int)(*it).entries.size(); - if (0x2 == type) --tmp; + if (Surface::OpenLine == type) --tmp; for (unsigned int m = 0; m < tmp; ++m) { aiFace &face = *faces++; @@ -663,7 +664,7 @@ aiNode *AC3DImporter::ConvertObjectSection(Object &object, ++uv; } - if (0x1 == type && tmp - 1 == m) { + if (Surface::ClosedLine == type && tmp - 1 == m) { // if this is a closed line repeat its beginning now it2 = (*it).entries.begin(); } else diff --git a/code/AssetLib/AC/ACLoader.h b/code/AssetLib/AC/ACLoader.h index 69f6ae1b0..92a5114f1 100644 --- a/code/AssetLib/AC/ACLoader.h +++ b/code/AssetLib/AC/ACLoader.h @@ -106,6 +106,18 @@ public: typedef std::pair SurfaceEntry; std::vector entries; + + // Type is low nibble of flags + enum Type : uint8_t { + Polygon = 0x0, + ClosedLine = 0x1, + OpenLine = 0x2, + TriangleStrip = 0x4, // ACC extension (TORCS and Speed Dreams) + + Mask = 0xf, + }; + + inline constexpr uint8_t GetType() const { return (flags & Mask); } }; // Represents an AC3D object From ce133e5add2732511365845a8749674723efce10 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Fri, 17 Jul 2020 11:58:17 +0100 Subject: [PATCH 052/129] Set CMake policy CMP0092 Disable cmake's automatic /W3 for MSVC --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b350f6e3..5c1a697ee 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,6 +35,7 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #---------------------------------------------------------------------- SET(CMAKE_POLICY_DEFAULT_CMP0074 NEW) +cmake_policy(SET CMP0092 NEW) CMAKE_MINIMUM_REQUIRED( VERSION 3.0 ) From a4eceb7b3ff19a86236a56a92d05a0817fd03833 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Fri, 17 Jul 2020 12:06:52 +0100 Subject: [PATCH 053/129] Set CMP0092 the other way --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 00819679c..43b9d9d1e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,7 +35,7 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #---------------------------------------------------------------------- SET(CMAKE_POLICY_DEFAULT_CMP0074 NEW) -cmake_policy(SET CMP0092 NEW) +SET(CMAKE_POLICY_DEFAULT_CMP0092 NEW) CMAKE_MINIMUM_REQUIRED( VERSION 3.0 ) From 9cad10a99553c1eafd299f68649f15433659fbb4 Mon Sep 17 00:00:00 2001 From: RichardTea <31507749+RichardTea@users.noreply.github.com> Date: Fri, 17 Jul 2020 14:58:51 +0100 Subject: [PATCH 054/129] Disable MSVC warnings on all MSVC Fixes the build on MSVC 2017 (and probably MSVC 2015) --- code/AssetLib/3DS/3DSHelper.h | 9 +- code/AssetLib/IFC/IFCReaderGen_2x3.h | 9 +- code/AssetLib/M3D/m3d.h | 1308 +++++++++---------- code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp | 4 +- code/AssetLib/Step/STEPFile.h | 8 +- code/Common/Exporter.cpp | 4 +- code/Common/Subdivision.cpp | 4 +- 7 files changed, 678 insertions(+), 668 deletions(-) diff --git a/code/AssetLib/3DS/3DSHelper.h b/code/AssetLib/3DS/3DSHelper.h index 3ccb1fd07..a2be07874 100644 --- a/code/AssetLib/3DS/3DSHelper.h +++ b/code/AssetLib/3DS/3DSHelper.h @@ -321,9 +321,10 @@ public: struct Face : public FaceWithSmoothingGroup { }; -#if _MSC_VER > 1920 +#ifdef _MSC_VER +#pragma warning(push) #pragma warning(disable : 4315) -#endif +#endif // _MSC_VER // --------------------------------------------------------------------------- /** Helper structure representing a texture */ @@ -412,6 +413,10 @@ struct Texture { #include +#ifdef _MSC_VER +#pragma warning(pop) +#endif // _MSC_VER + // --------------------------------------------------------------------------- /** Helper structure representing a 3ds material */ struct Material { diff --git a/code/AssetLib/IFC/IFCReaderGen_2x3.h b/code/AssetLib/IFC/IFCReaderGen_2x3.h index b3f71a7f1..f87f121b9 100644 --- a/code/AssetLib/IFC/IFCReaderGen_2x3.h +++ b/code/AssetLib/IFC/IFCReaderGen_2x3.h @@ -45,9 +45,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "AssetLib/Step/STEPFile.h" -#if _MSC_VER > 1920 +#ifdef _MSC_VER +# pragma warning(push) # pragma warning( disable : 4512 ) -#endif // _WIN32 +#endif // _MSC_VER namespace Assimp { namespace IFC { @@ -4372,4 +4373,8 @@ namespace STEP { } //! STEP } //! Assimp +#ifdef _MSC_VER +# pragma warning(pop) +#endif // _MSC_VER + #endif // INCLUDED_IFC_READER_GEN_H diff --git a/code/AssetLib/M3D/m3d.h b/code/AssetLib/M3D/m3d.h index 5ab3d16de..d8e13db4d 100644 --- a/code/AssetLib/M3D/m3d.h +++ b/code/AssetLib/M3D/m3d.h @@ -101,13 +101,13 @@ typedef uint16_t M3D_INDEX; #define _register #endif -#if _MSC_VER > 1920 +#ifdef _MSC_VER # pragma warning(push) # pragma warning(disable : 4100 4127 4189 4505 4244 4403 4701 4703) # if (_MSC_VER > 1800 ) # pragma warning(disable : 5573 5744) # endif -#endif // _WIN32 +#endif // _MSC_VER /*** File format structures ***/ @@ -821,7 +821,7 @@ static unsigned char *_m3dstbi__convert_format(unsigned char *data, int img_n, i break; STBI__CASE(4, 3) { dest[0] = src[0], dest[1] = src[1], dest[2] = src[2]; } break; - default: STBI_ASSERT(0); + default: STBI_ASSERT(0); } #undef STBI__CASE } @@ -881,7 +881,7 @@ static _m3dstbi__uint16 *_m3dstbi__convert_format16(_m3dstbi__uint16 *data, int break; STBI__CASE(4, 3) { dest[0] = src[0], dest[1] = src[1], dest[2] = src[2]; } break; - default: STBI_ASSERT(0); + default: STBI_ASSERT(0); } #undef STBI__CASE } @@ -1358,13 +1358,13 @@ static int _m3dstbi__create_png_image_raw(_m3dstbi__png *a, unsigned char *raw, for (k = 0; k < filter_bytes; ++k) { switch (filter) { - case STBI__F_none: cur[k] = raw[k]; break; - case STBI__F_sub: cur[k] = raw[k]; break; - case STBI__F_up: cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; - case STBI__F_avg: cur[k] = STBI__BYTECAST(raw[k] + (prior[k] >> 1)); break; - case STBI__F_paeth: cur[k] = STBI__BYTECAST(raw[k] + _m3dstbi__paeth(0, prior[k], 0)); break; - case STBI__F_avg_first: cur[k] = raw[k]; break; - case STBI__F_paeth_first: cur[k] = raw[k]; break; + case STBI__F_none: cur[k] = raw[k]; break; + case STBI__F_sub: cur[k] = raw[k]; break; + case STBI__F_up: cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; + case STBI__F_avg: cur[k] = STBI__BYTECAST(raw[k] + (prior[k] >> 1)); break; + case STBI__F_paeth: cur[k] = STBI__BYTECAST(raw[k] + _m3dstbi__paeth(0, prior[k], 0)); break; + case STBI__F_avg_first: cur[k] = raw[k]; break; + case STBI__F_paeth_first: cur[k] = raw[k]; break; } } @@ -1394,21 +1394,21 @@ static int _m3dstbi__create_png_image_raw(_m3dstbi__png *a, unsigned char *raw, case f: \ for (k = 0; k < nk; ++k) switch (filter) { - case STBI__F_none: - memcpy(cur, raw, nk); - break; - STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k - filter_bytes]); } - break; - STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } - break; - STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - filter_bytes]) >> 1)); } - break; - STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + _m3dstbi__paeth(cur[k - filter_bytes], prior[k], prior[k - filter_bytes])); } - break; - STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k - filter_bytes] >> 1)); } - break; - STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + _m3dstbi__paeth(cur[k - filter_bytes], 0, 0)); } - break; + case STBI__F_none: + memcpy(cur, raw, nk); + break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k - filter_bytes]); } + break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } + break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - filter_bytes]) >> 1)); } + break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + _m3dstbi__paeth(cur[k - filter_bytes], prior[k], prior[k - filter_bytes])); } + break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k - filter_bytes] >> 1)); } + break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + _m3dstbi__paeth(cur[k - filter_bytes], 0, 0)); } + break; } #undef STBI__CASE raw += nk; @@ -1658,155 +1658,155 @@ static int _m3dstbi__parse_png_file(_m3dstbi__png *z, int scan, int req_comp) { for (;;) { _m3dstbi__pngchunk c = _m3dstbi__get_chunk_header(s); switch (c.type) { - case STBI__PNG_TYPE('C', 'g', 'B', 'I'): - _m3dstbi__skip(s, c.length); - break; - case STBI__PNG_TYPE('I', 'H', 'D', 'R'): { - int comp, filter; - if (!first) return _m3dstbi__err("multiple IHDR", "Corrupt PNG"); - first = 0; - if (c.length != 13) return _m3dstbi__err("bad IHDR len", "Corrupt PNG"); - s->img_x = _m3dstbi__get32be(s); - if (s->img_x > (1 << 24)) return _m3dstbi__err("too large", "Very large image (corrupt?)"); - s->img_y = _m3dstbi__get32be(s); - if (s->img_y > (1 << 24)) return _m3dstbi__err("too large", "Very large image (corrupt?)"); - z->depth = _m3dstbi__get8(s); - if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return _m3dstbi__err("1/2/4/8/16-bit only", "PNG not supported: 1/2/4/8/16-bit only"); - color = _m3dstbi__get8(s); - if (color > 6) return _m3dstbi__err("bad ctype", "Corrupt PNG"); - if (color == 3 && z->depth == 16) return _m3dstbi__err("bad ctype", "Corrupt PNG"); - if (color == 3) - pal_img_n = 3; - else if (color & 1) - return _m3dstbi__err("bad ctype", "Corrupt PNG"); - comp = _m3dstbi__get8(s); - if (comp) return _m3dstbi__err("bad comp method", "Corrupt PNG"); - filter = _m3dstbi__get8(s); - if (filter) return _m3dstbi__err("bad filter method", "Corrupt PNG"); - interlace = _m3dstbi__get8(s); - if (interlace > 1) return _m3dstbi__err("bad interlace method", "Corrupt PNG"); - if (!s->img_x || !s->img_y) return _m3dstbi__err("0-pixel image", "Corrupt PNG"); - if (!pal_img_n) { - s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); - if ((1 << 30) / s->img_x / s->img_n < s->img_y) return _m3dstbi__err("too large", "Image too large to decode"); - if (scan == STBI__SCAN_header) return 1; - } else { - s->img_n = 1; - if ((1 << 30) / s->img_x / 4 < s->img_y) return _m3dstbi__err("too large", "Corrupt PNG"); - } - break; + case STBI__PNG_TYPE('C', 'g', 'B', 'I'): + _m3dstbi__skip(s, c.length); + break; + case STBI__PNG_TYPE('I', 'H', 'D', 'R'): { + int comp, filter; + if (!first) return _m3dstbi__err("multiple IHDR", "Corrupt PNG"); + first = 0; + if (c.length != 13) return _m3dstbi__err("bad IHDR len", "Corrupt PNG"); + s->img_x = _m3dstbi__get32be(s); + if (s->img_x > (1 << 24)) return _m3dstbi__err("too large", "Very large image (corrupt?)"); + s->img_y = _m3dstbi__get32be(s); + if (s->img_y > (1 << 24)) return _m3dstbi__err("too large", "Very large image (corrupt?)"); + z->depth = _m3dstbi__get8(s); + if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16) return _m3dstbi__err("1/2/4/8/16-bit only", "PNG not supported: 1/2/4/8/16-bit only"); + color = _m3dstbi__get8(s); + if (color > 6) return _m3dstbi__err("bad ctype", "Corrupt PNG"); + if (color == 3 && z->depth == 16) return _m3dstbi__err("bad ctype", "Corrupt PNG"); + if (color == 3) + pal_img_n = 3; + else if (color & 1) + return _m3dstbi__err("bad ctype", "Corrupt PNG"); + comp = _m3dstbi__get8(s); + if (comp) return _m3dstbi__err("bad comp method", "Corrupt PNG"); + filter = _m3dstbi__get8(s); + if (filter) return _m3dstbi__err("bad filter method", "Corrupt PNG"); + interlace = _m3dstbi__get8(s); + if (interlace > 1) return _m3dstbi__err("bad interlace method", "Corrupt PNG"); + if (!s->img_x || !s->img_y) return _m3dstbi__err("0-pixel image", "Corrupt PNG"); + if (!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return _m3dstbi__err("too large", "Image too large to decode"); + if (scan == STBI__SCAN_header) return 1; + } else { + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) return _m3dstbi__err("too large", "Corrupt PNG"); } + break; + } - case STBI__PNG_TYPE('P', 'L', 'T', 'E'): { - if (first) return _m3dstbi__err("first not IHDR", "Corrupt PNG"); - if (c.length > 256 * 3) return _m3dstbi__err("invalid PLTE", "Corrupt PNG"); - pal_len = c.length / 3; - if (pal_len * 3 != c.length) return _m3dstbi__err("invalid PLTE", "Corrupt PNG"); - for (i = 0; i < pal_len; ++i) { - palette[i * 4 + 0] = _m3dstbi__get8(s); - palette[i * 4 + 1] = _m3dstbi__get8(s); - palette[i * 4 + 2] = _m3dstbi__get8(s); - palette[i * 4 + 3] = 255; - } - break; + case STBI__PNG_TYPE('P', 'L', 'T', 'E'): { + if (first) return _m3dstbi__err("first not IHDR", "Corrupt PNG"); + if (c.length > 256 * 3) return _m3dstbi__err("invalid PLTE", "Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return _m3dstbi__err("invalid PLTE", "Corrupt PNG"); + for (i = 0; i < pal_len; ++i) { + palette[i * 4 + 0] = _m3dstbi__get8(s); + palette[i * 4 + 1] = _m3dstbi__get8(s); + palette[i * 4 + 2] = _m3dstbi__get8(s); + palette[i * 4 + 3] = 255; } + break; + } - case STBI__PNG_TYPE('t', 'R', 'N', 'S'): { - if (first) return _m3dstbi__err("first not IHDR", "Corrupt PNG"); - if (z->idata) return _m3dstbi__err("tRNS after IDAT", "Corrupt PNG"); - if (pal_img_n) { - if (scan == STBI__SCAN_header) { - s->img_n = 4; - return 1; - } - if (pal_len == 0) return _m3dstbi__err("tRNS before PLTE", "Corrupt PNG"); - if (c.length > pal_len) return _m3dstbi__err("bad tRNS len", "Corrupt PNG"); - pal_img_n = 4; - for (i = 0; i < c.length; ++i) - palette[i * 4 + 3] = _m3dstbi__get8(s); - } else { - if (!(s->img_n & 1)) return _m3dstbi__err("tRNS with alpha", "Corrupt PNG"); - if (c.length != (_m3dstbi__uint32)s->img_n * 2) return _m3dstbi__err("bad tRNS len", "Corrupt PNG"); - has_trans = 1; - if (z->depth == 16) { - for (k = 0; k < s->img_n; ++k) - tc16[k] = (_m3dstbi__uint16)_m3dstbi__get16be(s); - } else { - for (k = 0; k < s->img_n; ++k) - tc[k] = (unsigned char)(_m3dstbi__get16be(s) & 255) * _m3dstbi__depth_scale_table[z->depth]; - } - } - break; - } - - case STBI__PNG_TYPE('I', 'D', 'A', 'T'): { - if (first) return _m3dstbi__err("first not IHDR", "Corrupt PNG"); - if (pal_img_n && !pal_len) return _m3dstbi__err("no PLTE", "Corrupt PNG"); + case STBI__PNG_TYPE('t', 'R', 'N', 'S'): { + if (first) return _m3dstbi__err("first not IHDR", "Corrupt PNG"); + if (z->idata) return _m3dstbi__err("tRNS after IDAT", "Corrupt PNG"); + if (pal_img_n) { if (scan == STBI__SCAN_header) { - s->img_n = pal_img_n; + s->img_n = 4; return 1; } - if ((int)(ioff + c.length) < (int)ioff) return 0; - if (ioff + c.length > idata_limit) { - _m3dstbi__uint32 idata_limit_old = idata_limit; - unsigned char *p; - if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; - while (ioff + c.length > idata_limit) - idata_limit *= 2; - STBI_NOTUSED(idata_limit_old); - p = (unsigned char *)STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); - if (p == NULL) return _m3dstbi__err("outofmem", "Out of memory"); - z->idata = p; + if (pal_len == 0) return _m3dstbi__err("tRNS before PLTE", "Corrupt PNG"); + if (c.length > pal_len) return _m3dstbi__err("bad tRNS len", "Corrupt PNG"); + pal_img_n = 4; + for (i = 0; i < c.length; ++i) + palette[i * 4 + 3] = _m3dstbi__get8(s); + } else { + if (!(s->img_n & 1)) return _m3dstbi__err("tRNS with alpha", "Corrupt PNG"); + if (c.length != (_m3dstbi__uint32)s->img_n * 2) return _m3dstbi__err("bad tRNS len", "Corrupt PNG"); + has_trans = 1; + if (z->depth == 16) { + for (k = 0; k < s->img_n; ++k) + tc16[k] = (_m3dstbi__uint16)_m3dstbi__get16be(s); + } else { + for (k = 0; k < s->img_n; ++k) + tc[k] = (unsigned char)(_m3dstbi__get16be(s) & 255) * _m3dstbi__depth_scale_table[z->depth]; } - if (!_m3dstbi__getn(s, z->idata + ioff, c.length)) return _m3dstbi__err("outofdata", "Corrupt PNG"); - ioff += c.length; - break; } + break; + } - case STBI__PNG_TYPE('I', 'E', 'N', 'D'): { - _m3dstbi__uint32 raw_len, bpl; - if (first) return _m3dstbi__err("first not IHDR", "Corrupt PNG"); - if (scan != STBI__SCAN_load) return 1; - if (z->idata == NULL) return _m3dstbi__err("no IDAT", "Corrupt PNG"); - bpl = (s->img_x * z->depth + 7) / 8; - raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; - z->expanded = (unsigned char *)_m3dstbi_zlib_decode_malloc_guesssize_headerflag((char *)z->idata, ioff, raw_len, (int *)&raw_len, 1); - if (z->expanded == NULL) return 0; - STBI_FREE(z->idata); - z->idata = NULL; - if ((req_comp == s->img_n + 1 && req_comp != 3 && !pal_img_n) || has_trans) - s->img_out_n = s->img_n + 1; - else - s->img_out_n = s->img_n; - if (!_m3dstbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; - if (has_trans) { - if (z->depth == 16) { - if (!_m3dstbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; - } else { - if (!_m3dstbi__compute_transparency(z, tc, s->img_out_n)) return 0; - } - } - if (pal_img_n) { - s->img_n = pal_img_n; - s->img_out_n = pal_img_n; - if (req_comp >= 3) s->img_out_n = req_comp; - if (!_m3dstbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) - return 0; - } else if (has_trans) { - ++s->img_n; - } - STBI_FREE(z->expanded); - z->expanded = NULL; + case STBI__PNG_TYPE('I', 'D', 'A', 'T'): { + if (first) return _m3dstbi__err("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return _m3dstbi__err("no PLTE", "Corrupt PNG"); + if (scan == STBI__SCAN_header) { + s->img_n = pal_img_n; return 1; } + if ((int)(ioff + c.length) < (int)ioff) return 0; + if (ioff + c.length > idata_limit) { + _m3dstbi__uint32 idata_limit_old = idata_limit; + unsigned char *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + STBI_NOTUSED(idata_limit_old); + p = (unsigned char *)STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); + if (p == NULL) return _m3dstbi__err("outofmem", "Out of memory"); + z->idata = p; + } + if (!_m3dstbi__getn(s, z->idata + ioff, c.length)) return _m3dstbi__err("outofdata", "Corrupt PNG"); + ioff += c.length; + break; + } - default: - if (first) return _m3dstbi__err("first not IHDR", "Corrupt PNG"); - if ((c.type & (1 << 29)) == 0) { - return _m3dstbi__err("invalid_chunk", "PNG not supported: unknown PNG chunk type"); + case STBI__PNG_TYPE('I', 'E', 'N', 'D'): { + _m3dstbi__uint32 raw_len, bpl; + if (first) return _m3dstbi__err("first not IHDR", "Corrupt PNG"); + if (scan != STBI__SCAN_load) return 1; + if (z->idata == NULL) return _m3dstbi__err("no IDAT", "Corrupt PNG"); + bpl = (s->img_x * z->depth + 7) / 8; + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (unsigned char *)_m3dstbi_zlib_decode_malloc_guesssize_headerflag((char *)z->idata, ioff, raw_len, (int *)&raw_len, 1); + if (z->expanded == NULL) return 0; + STBI_FREE(z->idata); + z->idata = NULL; + if ((req_comp == s->img_n + 1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n + 1; + else + s->img_out_n = s->img_n; + if (!_m3dstbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; + if (has_trans) { + if (z->depth == 16) { + if (!_m3dstbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; + } else { + if (!_m3dstbi__compute_transparency(z, tc, s->img_out_n)) return 0; } - _m3dstbi__skip(s, c.length); - break; + } + if (pal_img_n) { + s->img_n = pal_img_n; + s->img_out_n = pal_img_n; + if (req_comp >= 3) s->img_out_n = req_comp; + if (!_m3dstbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } else if (has_trans) { + ++s->img_n; + } + STBI_FREE(z->expanded); + z->expanded = NULL; + return 1; + } + + default: + if (first) return _m3dstbi__err("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { + return _m3dstbi__err("invalid_chunk", "PNG not supported: unknown PNG chunk type"); + } + _m3dstbi__skip(s, c.length); + break; } _m3dstbi__get32be(s); } @@ -2283,18 +2283,18 @@ void _m3d_getpr(m3d_t *model, _unused m3dread_t readfilecb, _unused m3dfree_t fr } while (0) _inline static unsigned char *_m3d_getidx(unsigned char *data, char type, M3D_INDEX *idx) { switch (type) { - case 1: - *idx = data[0] > 253 ? (int8_t)data[0] : data[0]; - data++; - break; - case 2: - *idx = *((uint16_t *)data) > 65533 ? *((int16_t *)data) : *((uint16_t *)data); - data += 2; - break; - case 4: - *idx = *((int32_t *)data); - data += 4; - break; + case 1: + *idx = data[0] > 253 ? (int8_t)data[0] : data[0]; + data++; + break; + case 2: + *idx = *((uint16_t *)data) > 65533 ? *((int16_t *)data) : *((uint16_t *)data); + data += 2; + break; + case 4: + *idx = *((int32_t *)data); + data += 4; + break; } return data; } @@ -2682,27 +2682,27 @@ m3d_t *m3d_load(unsigned char *data, m3dread_t readfilecb, m3dfree_t freecb, m3d if (!m->prop) goto memerr; m->prop[j].type = n + (k == m3dpf_map && n < 128 ? 128 : 0); switch (k) { - case m3dpf_color: ptr = _m3d_gethex(ptr, &m->prop[j].value.color); break; - case m3dpf_uint8: - case m3dpf_uint16: - case m3dpf_uint32: ptr = _m3d_getint(ptr, &m->prop[j].value.num); break; - case m3dpf_float: ptr = _m3d_getfloat(ptr, &m->prop[j].value.fnum); break; - case m3dpf_map: - pe = _m3d_safestr(ptr, 0); - if (!pe || !*pe) goto asciiend; - m->prop[j].value.textureid = _m3d_gettx(model, readfilecb, freecb, pe); - if (model->errcode == M3D_ERR_ALLOC) { - M3D_FREE(pe); - goto memerr; - } - /* this error code only returned if readfilecb was specified */ - if (m->prop[j].value.textureid == M3D_UNDEF) { - M3D_LOG("Texture not found"); - M3D_LOG(pe); - m->numprop--; - } + case m3dpf_color: ptr = _m3d_gethex(ptr, &m->prop[j].value.color); break; + case m3dpf_uint8: + case m3dpf_uint16: + case m3dpf_uint32: ptr = _m3d_getint(ptr, &m->prop[j].value.num); break; + case m3dpf_float: ptr = _m3d_getfloat(ptr, &m->prop[j].value.fnum); break; + case m3dpf_map: + pe = _m3d_safestr(ptr, 0); + if (!pe || !*pe) goto asciiend; + m->prop[j].value.textureid = _m3d_gettx(model, readfilecb, freecb, pe); + if (model->errcode == M3D_ERR_ALLOC) { M3D_FREE(pe); - break; + goto memerr; + } + /* this error code only returned if readfilecb was specified */ + if (m->prop[j].value.textureid == M3D_UNDEF) { + M3D_LOG("Texture not found"); + M3D_LOG(pe); + m->numprop--; + } + M3D_FREE(pe); + break; } } else { M3D_LOG("Unknown material property in"); @@ -2835,48 +2835,48 @@ m3d_t *m3d_load(unsigned char *data, m3dread_t readfilecb, m3dfree_t freecb, m3d } if (*ptr == ']' || *ptr == '\r' || *ptr == '\n') break; switch (cd->a[((k - n) % (cd->p - n)) + n]) { - case m3dcp_mi_t: - mi = M3D_UNDEF; - if (*ptr != '\r' && *ptr != '\n') { - pe = _m3d_safestr(ptr, 0); - if (!pe || !*pe) goto asciiend; - for (n = 0; n < model->nummaterial; n++) - if (!strcmp(pe, model->material[n].name)) { - mi = (M3D_INDEX)n; - break; - } - if (mi == M3D_UNDEF && !(model->flags & M3D_FLG_MTLLIB)) { - mi = model->nummaterial++; - model->material = (m3dm_t *)M3D_REALLOC(model->material, - model->nummaterial * sizeof(m3dm_t)); - if (!model->material) goto memerr; - model->material[mi].name = pe; - model->material[mi].numprop = 1; - model->material[mi].prop = NULL; - } else - M3D_FREE(pe); - } - h->cmd[j].arg[k] = mi; - break; - case m3dcp_vc_t: - _m3d_getfloat(ptr, &w); - h->cmd[j].arg[k] = *((uint32_t *)&w); - break; - case m3dcp_va_t: - ptr = _m3d_getint(ptr, &h->cmd[j].arg[k]); - n = k + 1; - l += (h->cmd[j].arg[k] - 1) * (cd->p - k - 1); - h->cmd[j].arg = (uint32_t *)M3D_REALLOC(h->cmd[j].arg, l * sizeof(uint32_t)); - if (!h->cmd[j].arg) goto memerr; - memset(&h->cmd[j].arg[k + 1], 0, (l - k - 1) * sizeof(uint32_t)); - break; - case m3dcp_qi_t: - ptr = _m3d_getint(ptr, &h->cmd[j].arg[k]); - model->vertex[h->cmd[i].arg[k]].skinid = M3D_INDEXMAX; - break; - default: - ptr = _m3d_getint(ptr, &h->cmd[j].arg[k]); - break; + case m3dcp_mi_t: + mi = M3D_UNDEF; + if (*ptr != '\r' && *ptr != '\n') { + pe = _m3d_safestr(ptr, 0); + if (!pe || !*pe) goto asciiend; + for (n = 0; n < model->nummaterial; n++) + if (!strcmp(pe, model->material[n].name)) { + mi = (M3D_INDEX)n; + break; + } + if (mi == M3D_UNDEF && !(model->flags & M3D_FLG_MTLLIB)) { + mi = model->nummaterial++; + model->material = (m3dm_t *)M3D_REALLOC(model->material, + model->nummaterial * sizeof(m3dm_t)); + if (!model->material) goto memerr; + model->material[mi].name = pe; + model->material[mi].numprop = 1; + model->material[mi].prop = NULL; + } else + M3D_FREE(pe); + } + h->cmd[j].arg[k] = mi; + break; + case m3dcp_vc_t: + _m3d_getfloat(ptr, &w); + h->cmd[j].arg[k] = *((uint32_t *)&w); + break; + case m3dcp_va_t: + ptr = _m3d_getint(ptr, &h->cmd[j].arg[k]); + n = k + 1; + l += (h->cmd[j].arg[k] - 1) * (cd->p - k - 1); + h->cmd[j].arg = (uint32_t *)M3D_REALLOC(h->cmd[j].arg, l * sizeof(uint32_t)); + if (!h->cmd[j].arg) goto memerr; + memset(&h->cmd[j].arg[k + 1], 0, (l - k - 1) * sizeof(uint32_t)); + break; + case m3dcp_qi_t: + ptr = _m3d_getint(ptr, &h->cmd[j].arg[k]); + model->vertex[h->cmd[i].arg[k]].skinid = M3D_INDEXMAX; + break; + default: + ptr = _m3d_getint(ptr, &h->cmd[j].arg[k]); + break; } } } else { @@ -3207,22 +3207,22 @@ m3d_t *m3d_load(unsigned char *data, m3dread_t readfilecb, m3dfree_t freecb, m3d if (!model->tmap) goto memerr; for (i = 0, data += sizeof(m3dchunk_t); data < chunk; i++) { switch (model->vc_s) { - case 1: - model->tmap[i].u = (M3D_FLOAT)(data[0]) / (M3D_FLOAT)255.0; - model->tmap[i].v = (M3D_FLOAT)(data[1]) / (M3D_FLOAT)255.0; - break; - case 2: - model->tmap[i].u = (M3D_FLOAT)(*((int16_t *)(data + 0))) / (M3D_FLOAT)65535.0; - model->tmap[i].v = (M3D_FLOAT)(*((int16_t *)(data + 2))) / (M3D_FLOAT)65535.0; - break; - case 4: - model->tmap[i].u = (M3D_FLOAT)(*((float *)(data + 0))); - model->tmap[i].v = (M3D_FLOAT)(*((float *)(data + 4))); - break; - case 8: - model->tmap[i].u = (M3D_FLOAT)(*((double *)(data + 0))); - model->tmap[i].v = (M3D_FLOAT)(*((double *)(data + 8))); - break; + case 1: + model->tmap[i].u = (M3D_FLOAT)(data[0]) / (M3D_FLOAT)255.0; + model->tmap[i].v = (M3D_FLOAT)(data[1]) / (M3D_FLOAT)255.0; + break; + case 2: + model->tmap[i].u = (M3D_FLOAT)(*((int16_t *)(data + 0))) / (M3D_FLOAT)65535.0; + model->tmap[i].v = (M3D_FLOAT)(*((int16_t *)(data + 2))) / (M3D_FLOAT)65535.0; + break; + case 4: + model->tmap[i].u = (M3D_FLOAT)(*((float *)(data + 0))); + model->tmap[i].v = (M3D_FLOAT)(*((float *)(data + 4))); + break; + case 8: + model->tmap[i].u = (M3D_FLOAT)(*((double *)(data + 0))); + model->tmap[i].v = (M3D_FLOAT)(*((double *)(data + 8))); + break; } data += reclen; } @@ -3243,49 +3243,49 @@ m3d_t *m3d_load(unsigned char *data, m3dread_t readfilecb, m3dfree_t freecb, m3d memset(model->vertex, 0, model->numvertex * sizeof(m3dv_t)); for (i = 0, data += sizeof(m3dchunk_t); data < chunk && i < model->numvertex; i++) { switch (model->vc_s) { - case 1: - model->vertex[i].x = (M3D_FLOAT)((int8_t)data[0]) / (M3D_FLOAT)127.0; - model->vertex[i].y = (M3D_FLOAT)((int8_t)data[1]) / (M3D_FLOAT)127.0; - model->vertex[i].z = (M3D_FLOAT)((int8_t)data[2]) / (M3D_FLOAT)127.0; - model->vertex[i].w = (M3D_FLOAT)((int8_t)data[3]) / (M3D_FLOAT)127.0; - data += 4; - break; - case 2: - model->vertex[i].x = (M3D_FLOAT)(*((int16_t *)(data + 0))) / (M3D_FLOAT)32767.0; - model->vertex[i].y = (M3D_FLOAT)(*((int16_t *)(data + 2))) / (M3D_FLOAT)32767.0; - model->vertex[i].z = (M3D_FLOAT)(*((int16_t *)(data + 4))) / (M3D_FLOAT)32767.0; - model->vertex[i].w = (M3D_FLOAT)(*((int16_t *)(data + 6))) / (M3D_FLOAT)32767.0; - data += 8; - break; - case 4: - model->vertex[i].x = (M3D_FLOAT)(*((float *)(data + 0))); - model->vertex[i].y = (M3D_FLOAT)(*((float *)(data + 4))); - model->vertex[i].z = (M3D_FLOAT)(*((float *)(data + 8))); - model->vertex[i].w = (M3D_FLOAT)(*((float *)(data + 12))); - data += 16; - break; - case 8: - model->vertex[i].x = (M3D_FLOAT)(*((double *)(data + 0))); - model->vertex[i].y = (M3D_FLOAT)(*((double *)(data + 8))); - model->vertex[i].z = (M3D_FLOAT)(*((double *)(data + 16))); - model->vertex[i].w = (M3D_FLOAT)(*((double *)(data + 24))); - data += 32; - break; + case 1: + model->vertex[i].x = (M3D_FLOAT)((int8_t)data[0]) / (M3D_FLOAT)127.0; + model->vertex[i].y = (M3D_FLOAT)((int8_t)data[1]) / (M3D_FLOAT)127.0; + model->vertex[i].z = (M3D_FLOAT)((int8_t)data[2]) / (M3D_FLOAT)127.0; + model->vertex[i].w = (M3D_FLOAT)((int8_t)data[3]) / (M3D_FLOAT)127.0; + data += 4; + break; + case 2: + model->vertex[i].x = (M3D_FLOAT)(*((int16_t *)(data + 0))) / (M3D_FLOAT)32767.0; + model->vertex[i].y = (M3D_FLOAT)(*((int16_t *)(data + 2))) / (M3D_FLOAT)32767.0; + model->vertex[i].z = (M3D_FLOAT)(*((int16_t *)(data + 4))) / (M3D_FLOAT)32767.0; + model->vertex[i].w = (M3D_FLOAT)(*((int16_t *)(data + 6))) / (M3D_FLOAT)32767.0; + data += 8; + break; + case 4: + model->vertex[i].x = (M3D_FLOAT)(*((float *)(data + 0))); + model->vertex[i].y = (M3D_FLOAT)(*((float *)(data + 4))); + model->vertex[i].z = (M3D_FLOAT)(*((float *)(data + 8))); + model->vertex[i].w = (M3D_FLOAT)(*((float *)(data + 12))); + data += 16; + break; + case 8: + model->vertex[i].x = (M3D_FLOAT)(*((double *)(data + 0))); + model->vertex[i].y = (M3D_FLOAT)(*((double *)(data + 8))); + model->vertex[i].z = (M3D_FLOAT)(*((double *)(data + 16))); + model->vertex[i].w = (M3D_FLOAT)(*((double *)(data + 24))); + data += 32; + break; } switch (model->ci_s) { - case 1: - model->vertex[i].color = model->cmap ? model->cmap[data[0]] : 0; - data++; - break; - case 2: - model->vertex[i].color = model->cmap ? model->cmap[*((uint16_t *)data)] : 0; - data += 2; - break; - case 4: - model->vertex[i].color = *((uint32_t *)data); - data += 4; - break; - /* case 8: break; */ + case 1: + model->vertex[i].color = model->cmap ? model->cmap[data[0]] : 0; + data++; + break; + case 2: + model->vertex[i].color = model->cmap ? model->cmap[*((uint16_t *)data)] : 0; + data += 2; + break; + case 4: + model->vertex[i].color = *((uint32_t *)data); + data += 4; + break; + /* case 8: break; */ } model->vertex[i].skinid = M3D_UNDEF; data = _m3d_getidx(data, model->sk_s, &model->vertex[i].skinid); @@ -3414,55 +3414,55 @@ m3d_t *m3d_load(unsigned char *data, m3dread_t readfilecb, m3dfree_t freecb, m3d } } switch (k) { - case m3dpf_color: - switch (model->ci_s) { - case 1: - m->prop[i].value.color = model->cmap ? model->cmap[data[0]] : 0; - data++; - break; - case 2: - m->prop[i].value.color = model->cmap ? model->cmap[*((uint16_t *)data)] : 0; - data += 2; - break; - case 4: - m->prop[i].value.color = *((uint32_t *)data); - data += 4; - break; - } + case m3dpf_color: + switch (model->ci_s) { + case 1: + m->prop[i].value.color = model->cmap ? model->cmap[data[0]] : 0; + data++; break; - - case m3dpf_uint8: m->prop[i].value.num = *data++; break; - case m3dpf_uint16: - m->prop[i].value.num = *((uint16_t *)data); + case 2: + m->prop[i].value.color = model->cmap ? model->cmap[*((uint16_t *)data)] : 0; data += 2; break; - case m3dpf_uint32: - m->prop[i].value.num = *((uint32_t *)data); - data += 4; - break; - case m3dpf_float: - m->prop[i].value.fnum = *((float *)data); + case 4: + m->prop[i].value.color = *((uint32_t *)data); data += 4; break; + } + break; - case m3dpf_map: - M3D_GETSTR(name); - m->prop[i].value.textureid = _m3d_gettx(model, readfilecb, freecb, name); - if (model->errcode == M3D_ERR_ALLOC) goto memerr; - /* this error code only returned if readfilecb was specified */ - if (m->prop[i].value.textureid == M3D_UNDEF) { - M3D_LOG("Texture not found"); - M3D_LOG(m->name); - m->numprop--; - } - break; + case m3dpf_uint8: m->prop[i].value.num = *data++; break; + case m3dpf_uint16: + m->prop[i].value.num = *((uint16_t *)data); + data += 2; + break; + case m3dpf_uint32: + m->prop[i].value.num = *((uint32_t *)data); + data += 4; + break; + case m3dpf_float: + m->prop[i].value.fnum = *((float *)data); + data += 4; + break; - default: - M3D_LOG("Unknown material property in"); + case m3dpf_map: + M3D_GETSTR(name); + m->prop[i].value.textureid = _m3d_gettx(model, readfilecb, freecb, name); + if (model->errcode == M3D_ERR_ALLOC) goto memerr; + /* this error code only returned if readfilecb was specified */ + if (m->prop[i].value.textureid == M3D_UNDEF) { + M3D_LOG("Texture not found"); M3D_LOG(m->name); - model->errcode = M3D_ERR_UNKPROP; - data = chunk; - break; + m->numprop--; + } + break; + + default: + M3D_LOG("Unknown material property in"); + M3D_LOG(m->name); + model->errcode = M3D_ERR_UNKPROP; + data = chunk; + break; } } m->prop = (m3dp_t *)M3D_REALLOC(m->prop, m->numprop * sizeof(m3dp_t)); @@ -3570,45 +3570,45 @@ m3d_t *m3d_load(unsigned char *data, m3dread_t readfilecb, m3dfree_t freecb, m3d memset(h->cmd[i].arg, 0, cd->p * sizeof(uint32_t)); for (k = n = 0, l = cd->p; k < l; k++) switch (cd->a[((k - n) % (cd->p - n)) + n]) { - case m3dcp_mi_t: - h->cmd[i].arg[k] = M3D_NOTDEFINED; - M3D_GETSTR(name); - if (name) { - for (n = 0; n < model->nummaterial; n++) - if (!strcmp(name, model->material[n].name)) { - h->cmd[i].arg[k] = n; - break; - } - if (h->cmd[i].arg[k] == M3D_NOTDEFINED) model->errcode = M3D_ERR_MTRL; - } - break; - case m3dcp_vc_t: - f = 0.0f; - switch (model->vc_s) { - case 1: f = (float)((int8_t)data[0]) / 127; break; - case 2: f = (float)(*((int16_t *)(data + 0))) / 32767; break; - case 4: f = (float)(*((float *)(data + 0))); break; - case 8: f = (float)(*((double *)(data + 0))); break; - } - h->cmd[i].arg[k] = *((uint32_t *)&f); - data += model->vc_s; - break; - case m3dcp_hi_t: data = _m3d_getidx(data, model->hi_s, &h->cmd[i].arg[k]); break; - case m3dcp_fi_t: data = _m3d_getidx(data, model->fi_s, &h->cmd[i].arg[k]); break; - case m3dcp_ti_t: data = _m3d_getidx(data, model->ti_s, &h->cmd[i].arg[k]); break; - case m3dcp_qi_t: - case m3dcp_vi_t: data = _m3d_getidx(data, model->vi_s, &h->cmd[i].arg[k]); break; - case m3dcp_i1_t: data = _m3d_getidx(data, 1, &h->cmd[i].arg[k]); break; - case m3dcp_i2_t: data = _m3d_getidx(data, 2, &h->cmd[i].arg[k]); break; - case m3dcp_i4_t: data = _m3d_getidx(data, 4, &h->cmd[i].arg[k]); break; - case m3dcp_va_t: - data = _m3d_getidx(data, 4, &h->cmd[i].arg[k]); - n = k + 1; - l += (h->cmd[i].arg[k] - 1) * (cd->p - k - 1); - h->cmd[i].arg = (uint32_t *)M3D_REALLOC(h->cmd[i].arg, l * sizeof(uint32_t)); - if (!h->cmd[i].arg) goto memerr; - memset(&h->cmd[i].arg[k + 1], 0, (l - k - 1) * sizeof(uint32_t)); - break; + case m3dcp_mi_t: + h->cmd[i].arg[k] = M3D_NOTDEFINED; + M3D_GETSTR(name); + if (name) { + for (n = 0; n < model->nummaterial; n++) + if (!strcmp(name, model->material[n].name)) { + h->cmd[i].arg[k] = n; + break; + } + if (h->cmd[i].arg[k] == M3D_NOTDEFINED) model->errcode = M3D_ERR_MTRL; + } + break; + case m3dcp_vc_t: + f = 0.0f; + switch (model->vc_s) { + case 1: f = (float)((int8_t)data[0]) / 127; break; + case 2: f = (float)(*((int16_t *)(data + 0))) / 32767; break; + case 4: f = (float)(*((float *)(data + 0))); break; + case 8: f = (float)(*((double *)(data + 0))); break; + } + h->cmd[i].arg[k] = *((uint32_t *)&f); + data += model->vc_s; + break; + case m3dcp_hi_t: data = _m3d_getidx(data, model->hi_s, &h->cmd[i].arg[k]); break; + case m3dcp_fi_t: data = _m3d_getidx(data, model->fi_s, &h->cmd[i].arg[k]); break; + case m3dcp_ti_t: data = _m3d_getidx(data, model->ti_s, &h->cmd[i].arg[k]); break; + case m3dcp_qi_t: + case m3dcp_vi_t: data = _m3d_getidx(data, model->vi_s, &h->cmd[i].arg[k]); break; + case m3dcp_i1_t: data = _m3d_getidx(data, 1, &h->cmd[i].arg[k]); break; + case m3dcp_i2_t: data = _m3d_getidx(data, 2, &h->cmd[i].arg[k]); break; + case m3dcp_i4_t: data = _m3d_getidx(data, 4, &h->cmd[i].arg[k]); break; + case m3dcp_va_t: + data = _m3d_getidx(data, 4, &h->cmd[i].arg[k]); + n = k + 1; + l += (h->cmd[i].arg[k] - 1) * (cd->p - k - 1); + h->cmd[i].arg = (uint32_t *)M3D_REALLOC(h->cmd[i].arg, l * sizeof(uint32_t)); + if (!h->cmd[i].arg) goto memerr; + memset(&h->cmd[i].arg[k + 1], 0, (l - k - 1) * sizeof(uint32_t)); + break; } } } else @@ -3627,19 +3627,19 @@ m3d_t *m3d_load(unsigned char *data, m3dread_t readfilecb, m3dfree_t freecb, m3d if (model->ci_s && model->ci_s < 4 && !model->cmap) model->errcode = M3D_ERR_CMAP; k = 0; switch (model->ci_s) { - case 1: - k = model->cmap ? model->cmap[data[0]] : 0; - data++; - break; - case 2: - k = model->cmap ? model->cmap[*((uint16_t *)data)] : 0; - data += 2; - break; - case 4: - k = *((uint32_t *)data); - data += 4; - break; - /* case 8: break; */ + case 1: + k = model->cmap ? model->cmap[data[0]] : 0; + data++; + break; + case 2: + k = model->cmap ? model->cmap[*((uint16_t *)data)] : 0; + data += 2; + break; + case 4: + k = *((uint32_t *)data); + data += 4; + break; + /* case 8: break; */ } reclen = model->vi_s + model->si_s; i = model->numlabel; @@ -4267,16 +4267,16 @@ static uint32_t _m3d_cmapidx(uint32_t *cmap, uint32_t numcmap, uint32_t color) { /* add index to output */ static unsigned char *_m3d_addidx(unsigned char *out, char type, uint32_t idx) { switch (type) { - case 1: *out++ = (uint8_t)(idx); break; - case 2: - *((uint16_t *)out) = (uint16_t)(idx); - out += 2; - break; - case 4: - *((uint32_t *)out) = (uint32_t)(idx); - out += 4; - break; - /* case 0: case 8: break; */ + case 1: *out++ = (uint8_t)(idx); break; + case 2: + *((uint16_t *)out) = (uint16_t)(idx); + out += 2; + break; + case 4: + *((uint32_t *)out) = (uint32_t)(idx); + out += 4; + break; + /* case 0: case 8: break; */ } return out; } @@ -4288,26 +4288,26 @@ static void _m3d_round(int quality, m3dv_t *src, m3dv_t *dst) { if (src != dst) memcpy(dst, src, sizeof(m3dv_t)); /* round according to quality */ switch (quality) { - case M3D_EXP_INT8: - t = (int)(src->x * 127 + (src->x >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); - dst->x = (M3D_FLOAT)t / (M3D_FLOAT)127.0; - t = (int)(src->y * 127 + (src->y >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); - dst->y = (M3D_FLOAT)t / (M3D_FLOAT)127.0; - t = (int)(src->z * 127 + (src->z >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); - dst->z = (M3D_FLOAT)t / (M3D_FLOAT)127.0; - t = (int)(src->w * 127 + (src->w >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); - dst->w = (M3D_FLOAT)t / (M3D_FLOAT)127.0; - break; - case M3D_EXP_INT16: - t = (int)(src->x * 32767 + (src->x >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); - dst->x = (M3D_FLOAT)t / (M3D_FLOAT)32767.0; - t = (int)(src->y * 32767 + (src->y >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); - dst->y = (M3D_FLOAT)t / (M3D_FLOAT)32767.0; - t = (int)(src->z * 32767 + (src->z >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); - dst->z = (M3D_FLOAT)t / (M3D_FLOAT)32767.0; - t = (int)(src->w * 32767 + (src->w >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); - dst->w = (M3D_FLOAT)t / (M3D_FLOAT)32767.0; - break; + case M3D_EXP_INT8: + t = (int)(src->x * 127 + (src->x >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); + dst->x = (M3D_FLOAT)t / (M3D_FLOAT)127.0; + t = (int)(src->y * 127 + (src->y >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); + dst->y = (M3D_FLOAT)t / (M3D_FLOAT)127.0; + t = (int)(src->z * 127 + (src->z >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); + dst->z = (M3D_FLOAT)t / (M3D_FLOAT)127.0; + t = (int)(src->w * 127 + (src->w >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); + dst->w = (M3D_FLOAT)t / (M3D_FLOAT)127.0; + break; + case M3D_EXP_INT16: + t = (int)(src->x * 32767 + (src->x >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); + dst->x = (M3D_FLOAT)t / (M3D_FLOAT)32767.0; + t = (int)(src->y * 32767 + (src->y >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); + dst->y = (M3D_FLOAT)t / (M3D_FLOAT)32767.0; + t = (int)(src->z * 32767 + (src->z >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); + dst->z = (M3D_FLOAT)t / (M3D_FLOAT)32767.0; + t = (int)(src->w * 32767 + (src->w >= 0 ? (M3D_FLOAT)0.5 : (M3D_FLOAT)-0.5)); + dst->w = (M3D_FLOAT)t / (M3D_FLOAT)32767.0; + break; } if (dst->x == (M3D_FLOAT)-0.0) dst->x = (M3D_FLOAT)0.0; if (dst->y == (M3D_FLOAT)-0.0) dst->y = (M3D_FLOAT)0.0; @@ -4484,23 +4484,23 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size cd = &m3d_commandtypes[cmd->type]; for (k = n = 0, l = cd->p; k < l; k++) switch (cd->a[((k - n) % (cd->p - n)) + n]) { - case m3dcp_mi_t: - if (!(flags & M3D_EXP_NOMATERIAL) && cmd->arg[k] < model->nummaterial) - mtrlidx[cmd->arg[k]] = 0; - break; - case m3dcp_ti_t: - if (!(flags & M3D_EXP_NOTXTCRD) && cmd->arg[k] < model->numtmap) - tmapidx[cmd->arg[k]] = 0; - break; - case m3dcp_qi_t: - case m3dcp_vi_t: - if (cmd->arg[k] < model->numvertex) - vrtxidx[cmd->arg[k]] = 0; - break; - case m3dcp_va_t: - n = k + 1; - l += (cmd->arg[k] - 1) * (cd->p - k - 1); - break; + case m3dcp_mi_t: + if (!(flags & M3D_EXP_NOMATERIAL) && cmd->arg[k] < model->nummaterial) + mtrlidx[cmd->arg[k]] = 0; + break; + case m3dcp_ti_t: + if (!(flags & M3D_EXP_NOTXTCRD) && cmd->arg[k] < model->numtmap) + tmapidx[cmd->arg[k]] = 0; + break; + case m3dcp_qi_t: + case m3dcp_vi_t: + if (cmd->arg[k] < model->numvertex) + vrtxidx[cmd->arg[k]] = 0; + break; + case m3dcp_va_t: + n = k + 1; + l += (cmd->arg[k] - 1) * (cd->p - k - 1); + break; } } } @@ -4615,22 +4615,22 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size for (i = 0; i < model->numtmap; i++) { if (tmapidx[i] == M3D_UNDEF) continue; switch (quality) { - case M3D_EXP_INT8: - l = (unsigned int)(model->tmap[i].u * 255); - tcoord.data.u = (M3D_FLOAT)l / (M3D_FLOAT)255.0; - l = (unsigned int)(model->tmap[i].v * 255); - tcoord.data.v = (M3D_FLOAT)l / (M3D_FLOAT)255.0; - break; - case M3D_EXP_INT16: - l = (unsigned int)(model->tmap[i].u * 65535); - tcoord.data.u = (M3D_FLOAT)l / (M3D_FLOAT)65535.0; - l = (unsigned int)(model->tmap[i].v * 65535); - tcoord.data.v = (M3D_FLOAT)l / (M3D_FLOAT)65535.0; - break; - default: - tcoord.data.u = model->tmap[i].u; - tcoord.data.v = model->tmap[i].v; - break; + case M3D_EXP_INT8: + l = (unsigned int)(model->tmap[i].u * 255); + tcoord.data.u = (M3D_FLOAT)l / (M3D_FLOAT)255.0; + l = (unsigned int)(model->tmap[i].v * 255); + tcoord.data.v = (M3D_FLOAT)l / (M3D_FLOAT)255.0; + break; + case M3D_EXP_INT16: + l = (unsigned int)(model->tmap[i].u * 65535); + tcoord.data.u = (M3D_FLOAT)l / (M3D_FLOAT)65535.0; + l = (unsigned int)(model->tmap[i].v * 65535); + tcoord.data.v = (M3D_FLOAT)l / (M3D_FLOAT)65535.0; + break; + default: + tcoord.data.u = model->tmap[i].u; + tcoord.data.v = model->tmap[i].v; + break; } if (flags & M3D_EXP_FLIPTXTCRD) tcoord.data.v = (M3D_FLOAT)1.0 - tcoord.data.v; @@ -4959,26 +4959,26 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size } } switch (k) { - case m3dpf_color: ptr += sprintf(ptr, "%s #%08x\r\n", sn, m->prop[i].value.color); break; - case m3dpf_uint8: - case m3dpf_uint16: - case m3dpf_uint32: ptr += sprintf(ptr, "%s %d\r\n", sn, m->prop[i].value.num); break; - case m3dpf_float: ptr += sprintf(ptr, "%s %g\r\n", sn, m->prop[i].value.fnum); break; - case m3dpf_map: - if (m->prop[i].value.textureid < model->numtexture && - model->texture[m->prop[i].value.textureid].name) { - sl = _m3d_safestr(model->texture[m->prop[i].value.textureid].name, 0); - if (!sl) { - setlocale(LC_NUMERIC, ol); - goto memerr; - } - if (*sl) - ptr += sprintf(ptr, "map_%s %s\r\n", sn, sl); - M3D_FREE(sn); - M3D_FREE(sl); - sl = NULL; + case m3dpf_color: ptr += sprintf(ptr, "%s #%08x\r\n", sn, m->prop[i].value.color); break; + case m3dpf_uint8: + case m3dpf_uint16: + case m3dpf_uint32: ptr += sprintf(ptr, "%s %d\r\n", sn, m->prop[i].value.num); break; + case m3dpf_float: ptr += sprintf(ptr, "%s %g\r\n", sn, m->prop[i].value.fnum); break; + case m3dpf_map: + if (m->prop[i].value.textureid < model->numtexture && + model->texture[m->prop[i].value.textureid].name) { + sl = _m3d_safestr(model->texture[m->prop[i].value.textureid].name, 0); + if (!sl) { + setlocale(LC_NUMERIC, ol); + goto memerr; } - break; + if (*sl) + ptr += sprintf(ptr, "map_%s %s\r\n", sn, sl); + M3D_FREE(sn); + M3D_FREE(sl); + sl = NULL; + } + break; } sn = NULL; } @@ -5102,16 +5102,16 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size len = (unsigned int)((uintptr_t)ptr + (uintptr_t)strlen(cd->key) + (uintptr_t)3); for (k = 0; k < cd->p; k++) switch (cd->a[k]) { - case m3dcp_mi_t: - if (cmd->arg[k] != M3D_NOTDEFINED) { - len += (unsigned int)strlen(model->material[cmd->arg[k]].name) + 1; - } - break; - case m3dcp_va_t: - len += cmd->arg[k] * (cd->p - k - 1) * 16; - k = cd->p; - break; - default: len += 16; break; + case m3dcp_mi_t: + if (cmd->arg[k] != M3D_NOTDEFINED) { + len += (unsigned int)strlen(model->material[cmd->arg[k]].name) + 1; + } + break; + case m3dcp_va_t: + len += cmd->arg[k] * (cd->p - k - 1) * 16; + k = cd->p; + break; + default: len += 16; break; } out = (unsigned char *)M3D_REALLOC(out, len); ptr += (uintptr_t)out; @@ -5122,25 +5122,25 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size ptr += sprintf(ptr, "%s", cd->key); for (k = n = 0, l = cd->p; k < l; k++) { switch (cd->a[((k - n) % (cd->p - n)) + n]) { - case m3dcp_mi_t: - if (cmd->arg[k] != M3D_NOTDEFINED) { - sn = _m3d_safestr(model->material[cmd->arg[k]].name, 0); - if (!sn) { - setlocale(LC_NUMERIC, ol); - goto memerr; - } - ptr += sprintf(ptr, " %s", sn); - M3D_FREE(sn); - sn = NULL; + case m3dcp_mi_t: + if (cmd->arg[k] != M3D_NOTDEFINED) { + sn = _m3d_safestr(model->material[cmd->arg[k]].name, 0); + if (!sn) { + setlocale(LC_NUMERIC, ol); + goto memerr; } - break; - case m3dcp_vc_t: ptr += sprintf(ptr, " %g", *((float *)&cmd->arg[k])); break; - case m3dcp_va_t: - ptr += sprintf(ptr, " %d[", cmd->arg[k]); - n = k + 1; - l += (cmd->arg[k] - 1) * (cd->p - k - 1); - break; - default: ptr += sprintf(ptr, " %d", cmd->arg[k]); break; + ptr += sprintf(ptr, " %s", sn); + M3D_FREE(sn); + sn = NULL; + } + break; + case m3dcp_vc_t: ptr += sprintf(ptr, " %g", *((float *)&cmd->arg[k])); break; + case m3dcp_va_t: + ptr += sprintf(ptr, " %d[", cmd->arg[k]); + n = k + 1; + l += (cmd->arg[k] - 1) * (cd->p - k - 1); + break; + default: ptr += sprintf(ptr, " %d", cmd->arg[k]); break; } } ptr += sprintf(ptr, "%s\r\n", l > cd->p ? " ]" : ""); @@ -5384,28 +5384,28 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size if (tmap[i].newidx == last) continue; last = tmap[i].newidx; switch (vc_s) { - case 1: - *out++ = (uint8_t)(tmap[i].data.u * 255); - *out++ = (uint8_t)(tmap[i].data.v * 255); - break; - case 2: - *((uint16_t *)out) = (uint16_t)(tmap[i].data.u * 65535); - out += 2; - *((uint16_t *)out) = (uint16_t)(tmap[i].data.v * 65535); - out += 2; - break; - case 4: - *((float *)out) = tmap[i].data.u; - out += 4; - *((float *)out) = tmap[i].data.v; - out += 4; - break; - case 8: - *((double *)out) = tmap[i].data.u; - out += 8; - *((double *)out) = tmap[i].data.v; - out += 8; - break; + case 1: + *out++ = (uint8_t)(tmap[i].data.u * 255); + *out++ = (uint8_t)(tmap[i].data.v * 255); + break; + case 2: + *((uint16_t *)out) = (uint16_t)(tmap[i].data.u * 65535); + out += 2; + *((uint16_t *)out) = (uint16_t)(tmap[i].data.v * 65535); + out += 2; + break; + case 4: + *((float *)out) = tmap[i].data.u; + out += 4; + *((float *)out) = tmap[i].data.v; + out += 4; + break; + case 8: + *((double *)out) = tmap[i].data.u; + out += 8; + *((double *)out) = tmap[i].data.v; + out += 8; + break; } } *length = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t *)h + len)); @@ -5425,54 +5425,54 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size if (vrtx[i].newidx == last) continue; last = vrtx[i].newidx; switch (vc_s) { - case 1: - *out++ = (int8_t)(vrtx[i].data.x * 127); - *out++ = (int8_t)(vrtx[i].data.y * 127); - *out++ = (int8_t)(vrtx[i].data.z * 127); - *out++ = (int8_t)(vrtx[i].data.w * 127); - break; - case 2: - *((int16_t *)out) = (int16_t)(vrtx[i].data.x * 32767); - out += 2; - *((int16_t *)out) = (int16_t)(vrtx[i].data.y * 32767); - out += 2; - *((int16_t *)out) = (int16_t)(vrtx[i].data.z * 32767); - out += 2; - *((int16_t *)out) = (int16_t)(vrtx[i].data.w * 32767); - out += 2; - break; - case 4: - memcpy(out, &vrtx[i].data.x, sizeof(float)); - out += 4; - memcpy(out, &vrtx[i].data.y, sizeof(float)); - out += 4; - memcpy(out, &vrtx[i].data.z, sizeof(float)); - out += 4; - memcpy(out, &vrtx[i].data.w, sizeof(float)); - out += 4; - break; - case 8: - *((double *)out) = vrtx[i].data.x; - out += 8; - *((double *)out) = vrtx[i].data.y; - out += 8; - *((double *)out) = vrtx[i].data.z; - out += 8; - *((double *)out) = vrtx[i].data.w; - out += 8; - break; + case 1: + *out++ = (int8_t)(vrtx[i].data.x * 127); + *out++ = (int8_t)(vrtx[i].data.y * 127); + *out++ = (int8_t)(vrtx[i].data.z * 127); + *out++ = (int8_t)(vrtx[i].data.w * 127); + break; + case 2: + *((int16_t *)out) = (int16_t)(vrtx[i].data.x * 32767); + out += 2; + *((int16_t *)out) = (int16_t)(vrtx[i].data.y * 32767); + out += 2; + *((int16_t *)out) = (int16_t)(vrtx[i].data.z * 32767); + out += 2; + *((int16_t *)out) = (int16_t)(vrtx[i].data.w * 32767); + out += 2; + break; + case 4: + memcpy(out, &vrtx[i].data.x, sizeof(float)); + out += 4; + memcpy(out, &vrtx[i].data.y, sizeof(float)); + out += 4; + memcpy(out, &vrtx[i].data.z, sizeof(float)); + out += 4; + memcpy(out, &vrtx[i].data.w, sizeof(float)); + out += 4; + break; + case 8: + *((double *)out) = vrtx[i].data.x; + out += 8; + *((double *)out) = vrtx[i].data.y; + out += 8; + *((double *)out) = vrtx[i].data.z; + out += 8; + *((double *)out) = vrtx[i].data.w; + out += 8; + break; } idx = _m3d_cmapidx(cmap, numcmap, vrtx[i].data.color); switch (ci_s) { - case 1: *out++ = (uint8_t)(idx); break; - case 2: - *((uint16_t *)out) = (uint16_t)(idx); - out += 2; - break; - case 4: - *((uint32_t *)out) = vrtx[i].data.color; - out += 4; - break; + case 1: *out++ = (uint8_t)(idx); break; + case 2: + *((uint16_t *)out) = (uint16_t)(idx); + out += 2; + break; + case 4: + *((uint32_t *)out) = vrtx[i].data.color; + out += 4; + break; } out = _m3d_addidx(out, sk_s, vrtx[i].data.skinid); } @@ -5510,19 +5510,19 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size j++) weights[j] = (uint8_t)(skin[i].data.weight[j] * 255); switch (nb_s) { - case 1: weights[0] = 255; break; - case 2: - *((uint16_t *)out) = *((uint16_t *)&weights[0]); - out += 2; - break; - case 4: - *((uint32_t *)out) = *((uint32_t *)&weights[0]); - out += 4; - break; - case 8: - *((uint64_t *)out) = *((uint64_t *)&weights[0]); - out += 8; - break; + case 1: weights[0] = 255; break; + case 2: + *((uint16_t *)out) = *((uint16_t *)&weights[0]); + out += 2; + break; + case 4: + *((uint32_t *)out) = *((uint32_t *)&weights[0]); + out += 4; + break; + case 8: + *((uint64_t *)out) = *((uint64_t *)&weights[0]); + out += 8; + break; } for (j = 0; j < (uint32_t)nb_s && skin[i].data.boneid[j] != M3D_UNDEF && weights[j]; j++) { out = _m3d_addidx(out, bi_s, skin[i].data.boneid[j]); @@ -5561,41 +5561,41 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size if (k == 256) continue; *out++ = m->prop[i].type; switch (k) { - case m3dpf_color: - if (!(flags & M3D_EXP_NOCMAP)) { - idx = _m3d_cmapidx(cmap, numcmap, m->prop[i].value.color); - switch (ci_s) { - case 1: *out++ = (uint8_t)(idx); break; - case 2: - *((uint16_t *)out) = (uint16_t)(idx); - out += 2; - break; - case 4: - *((uint32_t *)out) = (uint32_t)(m->prop[i].value.color); - out += 4; - break; - } - } else - out--; - break; - case m3dpf_uint8: *out++ = m->prop[i].value.num; break; - case m3dpf_uint16: - *((uint16_t *)out) = m->prop[i].value.num; - out += 2; - break; - case m3dpf_uint32: - *((uint32_t *)out) = m->prop[i].value.num; - out += 4; - break; - case m3dpf_float: - *((float *)out) = m->prop[i].value.fnum; - out += 4; - break; + case m3dpf_color: + if (!(flags & M3D_EXP_NOCMAP)) { + idx = _m3d_cmapidx(cmap, numcmap, m->prop[i].value.color); + switch (ci_s) { + case 1: *out++ = (uint8_t)(idx); break; + case 2: + *((uint16_t *)out) = (uint16_t)(idx); + out += 2; + break; + case 4: + *((uint32_t *)out) = (uint32_t)(m->prop[i].value.color); + out += 4; + break; + } + } else + out--; + break; + case m3dpf_uint8: *out++ = m->prop[i].value.num; break; + case m3dpf_uint16: + *((uint16_t *)out) = m->prop[i].value.num; + out += 2; + break; + case m3dpf_uint32: + *((uint32_t *)out) = m->prop[i].value.num; + out += 4; + break; + case m3dpf_float: + *((float *)out) = m->prop[i].value.fnum; + out += 4; + break; - case m3dpf_map: - idx = _m3d_stridx(str, numstr, model->texture[m->prop[i].value.textureid].name); - out = _m3d_addidx(out, si_s, idx); - break; + case m3dpf_map: + idx = _m3d_stridx(str, numstr, model->texture[m->prop[i].value.textureid].name); + out = _m3d_addidx(out, si_s, idx); + break; } } *length = (uint32_t)((uintptr_t)out - (uintptr_t)((uint8_t *)h + len)); @@ -5689,40 +5689,40 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size if (cmd->type > 127) *out++ = (cmd->type >> 7) & 0xff; for (k = n = 0, l = cd->p; k < l; k++) { switch (cd->a[((k - n) % (cd->p - n)) + n]) { - case m3dcp_mi_t: - out = _m3d_addidx(out, si_s, cmd->arg[k] < model->nummaterial ? _m3d_stridx(str, numstr, model->material[cmd->arg[k]].name) : 0); + case m3dcp_mi_t: + out = _m3d_addidx(out, si_s, cmd->arg[k] < model->nummaterial ? _m3d_stridx(str, numstr, model->material[cmd->arg[k]].name) : 0); + break; + case m3dcp_vc_t: + min_x = *((float *)&cmd->arg[k]); + switch (vc_s) { + case 1: *out++ = (int8_t)(min_x * 127); break; + case 2: + *((int16_t *)out) = (int16_t)(min_x * 32767); + out += 2; break; - case m3dcp_vc_t: - min_x = *((float *)&cmd->arg[k]); - switch (vc_s) { - case 1: *out++ = (int8_t)(min_x * 127); break; - case 2: - *((int16_t *)out) = (int16_t)(min_x * 32767); - out += 2; - break; - case 4: - *((float *)out) = min_x; - out += 4; - break; - case 8: - *((double *)out) = min_x; - out += 8; - break; - } + case 4: + *((float *)out) = min_x; + out += 4; break; - case m3dcp_hi_t: out = _m3d_addidx(out, hi_s, cmd->arg[k]); break; - case m3dcp_fi_t: out = _m3d_addidx(out, fi_s, cmd->arg[k]); break; - case m3dcp_ti_t: out = _m3d_addidx(out, ti_s, cmd->arg[k]); break; - case m3dcp_qi_t: - case m3dcp_vi_t: out = _m3d_addidx(out, vi_s, cmd->arg[k]); break; - case m3dcp_i1_t: out = _m3d_addidx(out, 1, cmd->arg[k]); break; - case m3dcp_i2_t: out = _m3d_addidx(out, 2, cmd->arg[k]); break; - case m3dcp_i4_t: out = _m3d_addidx(out, 4, cmd->arg[k]); break; - case m3dcp_va_t: - out = _m3d_addidx(out, 4, cmd->arg[k]); - n = k + 1; - l += (cmd->arg[k] - 1) * (cd->p - k - 1); + case 8: + *((double *)out) = min_x; + out += 8; break; + } + break; + case m3dcp_hi_t: out = _m3d_addidx(out, hi_s, cmd->arg[k]); break; + case m3dcp_fi_t: out = _m3d_addidx(out, fi_s, cmd->arg[k]); break; + case m3dcp_ti_t: out = _m3d_addidx(out, ti_s, cmd->arg[k]); break; + case m3dcp_qi_t: + case m3dcp_vi_t: out = _m3d_addidx(out, vi_s, cmd->arg[k]); break; + case m3dcp_i1_t: out = _m3d_addidx(out, 1, cmd->arg[k]); break; + case m3dcp_i2_t: out = _m3d_addidx(out, 2, cmd->arg[k]); break; + case m3dcp_i4_t: out = _m3d_addidx(out, 4, cmd->arg[k]); break; + case m3dcp_va_t: + out = _m3d_addidx(out, 4, cmd->arg[k]); + n = k + 1; + l += (cmd->arg[k] - 1) * (cd->p - k - 1); + break; } } } @@ -5756,15 +5756,15 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size out = _m3d_addidx(out, si_s, _m3d_stridx(str, numstr, model->label[l].lang)); idx = _m3d_cmapidx(cmap, numcmap, model->label[i].color); switch (ci_s) { - case 1: *out++ = (uint8_t)(idx); break; - case 2: - *((uint16_t *)out) = (uint16_t)(idx); - out += 2; - break; - case 4: - *((uint32_t *)out) = model->label[i].color; - out += 4; - break; + case 1: *out++ = (uint8_t)(idx); break; + case 2: + *((uint16_t *)out) = (uint16_t)(idx); + out += 2; + break; + case 4: + *((uint32_t *)out) = model->label[i].color; + out += 4; + break; } } out = _m3d_addidx(out, vi_s, vrtxidx[model->label[i].vertexid]); @@ -5889,7 +5889,7 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size } #endif -#endif +#endif /* M3D_IMPLEMENTATION */ #ifdef __cplusplus } @@ -6147,11 +6147,11 @@ public: #endif /* impl */ } // namespace M3D -#ifdef _WIN32 -# pragma warning(pop) -#endif // _WIN32 +#endif /* M3D_CPPWRAPPER */ -#endif +#ifdef _MSC_VER +# pragma warning(pop) +#endif /* _MSC_VER */ #endif /* __cplusplus */ diff --git a/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp b/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp index e9930dfed..c57b43c11 100644 --- a/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp +++ b/code/AssetLib/MDL/HalfLife/HL1MDLLoader.cpp @@ -68,9 +68,9 @@ namespace Assimp { namespace MDL { namespace HalfLife { -#if _MSC_VER > 1920 +#ifdef _MSC_VER # pragma warning(disable : 4706) -#endif // _WIN32 +#endif // _MSC_VER // ------------------------------------------------------------------------------------------------ HL1MDLLoader::HL1MDLLoader( diff --git a/code/AssetLib/Step/STEPFile.h b/code/AssetLib/Step/STEPFile.h index 72648e462..2072ac2a6 100644 --- a/code/AssetLib/Step/STEPFile.h +++ b/code/AssetLib/Step/STEPFile.h @@ -54,10 +54,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include -#if _MSC_VER > 1920 +#ifdef _MSC_VER # pragma warning(push) # pragma warning(disable : 4127 4456 4245 4512 ) -#endif // _WIN32 +#endif // _MSC_VER // #if _MSC_VER > 1500 || (defined __GNUC___) @@ -960,9 +960,9 @@ private: const EXPRESS::ConversionSchema *schema; }; -#if _MSC_VER > 1920 +#ifdef _MSC_VER #pragma warning(pop) -#endif // _WIN32 +#endif // _MSC_VER } // namespace STEP diff --git a/code/Common/Exporter.cpp b/code/Common/Exporter.cpp index 031d5c24e..6b3a50346 100644 --- a/code/Common/Exporter.cpp +++ b/code/Common/Exporter.cpp @@ -74,9 +74,9 @@ Here we implement only the C++ interface (Assimp::Exporter). namespace Assimp { -#if _MSC_VER > 1920 +#ifdef _MSC_VER # pragma warning( disable : 4800 ) -#endif // _WIN32 +#endif // _MSC_VER // PostStepRegistry.cpp diff --git a/code/Common/Subdivision.cpp b/code/Common/Subdivision.cpp index 4f64a00c4..c60d2f0d3 100644 --- a/code/Common/Subdivision.cpp +++ b/code/Common/Subdivision.cpp @@ -53,9 +53,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; void mydummy() {} -#if _MSC_VER > 1920 +#ifdef _MSC_VER #pragma warning(disable : 4709) -#endif // _WIN32 +#endif // _MSC_VER // ------------------------------------------------------------------------------------------------ /** Subdivider stub class to implement the Catmull-Clarke subdivision algorithm. The * implementation is basing on recursive refinement. Directly evaluating the result is also From 13ee2306c34ae25a6376fc5de0811e39225306f5 Mon Sep 17 00:00:00 2001 From: MeyerFabian Date: Mon, 20 Jul 2020 17:04:11 +0200 Subject: [PATCH 055/129] build/clang-cl-windows --- CMakeLists.txt | 6 +++- code/AssetLib/M3D/m3d.h | 4 +-- code/AssetLib/Step/STEPFile.h | 8 ++--- code/CMakeLists.txt | 1 - .../gtest/include/gtest/internal/gtest-port.h | 14 +++++++++ contrib/gtest/src/gtest-port.cc | 3 +- .../rapidjson/include/rapidjson/document.h | 2 +- .../rapidjson/include/rapidjson/encodings.h | 4 +-- .../include/rapidjson/internal/meta.h | 4 +-- contrib/rapidjson/include/rapidjson/reader.h | 4 +-- contrib/rapidjson/include/rapidjson/writer.h | 6 ++-- contrib/unzip/ioapi.c | 15 +++++----- contrib/unzip/ioapi.h | 2 +- contrib/unzip/unzip.c | 1 - contrib/zip/src/miniz.h | 6 ++-- include/assimp/Compiler/poppack1.h | 2 +- include/assimp/Compiler/pushpack1.h | 2 +- test/unit/UnitTestFileGenerator.h | 30 +++++++++---------- test/unit/utColladaImportExport.cpp | 1 - 19 files changed, 65 insertions(+), 50 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 23725381d..ecf1de619 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -257,7 +257,11 @@ IF ((CMAKE_C_COMPILER_ID MATCHES "GNU") AND NOT CMAKE_COMPILER_IS_MINGW) SET(LIBSTDC++_LIBRARIES -lstdc++) ELSEIF(MSVC) # enable multi-core compilation with MSVC - ADD_COMPILE_OPTIONS(/MP /bigobj /W4 /WX ) + IF( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) # clang-cl + ADD_COMPILE_OPTIONS(/bigobj /W4 /WX ) + ELSE() # msvc + ADD_COMPILE_OPTIONS(/MP /bigobj /W4 /WX) + ENDIF() # disable "elements of array '' will be default initialized" warning on MSVC2013 IF(MSVC12) ADD_COMPILE_OPTIONS(/wd4351) diff --git a/code/AssetLib/M3D/m3d.h b/code/AssetLib/M3D/m3d.h index 5ab3d16de..e0d456c3c 100644 --- a/code/AssetLib/M3D/m3d.h +++ b/code/AssetLib/M3D/m3d.h @@ -84,7 +84,7 @@ typedef uint16_t M3D_INDEX; #ifndef M3D_BONEMAXLEVEL #define M3D_BONEMAXLEVEL 8 #endif -#ifndef _MSC_VER +#if !defined(_MSC_VER) || defined(__clang__) #ifndef _inline #define _inline __inline__ #endif @@ -101,7 +101,7 @@ typedef uint16_t M3D_INDEX; #define _register #endif -#if _MSC_VER > 1920 +#if _MSC_VER > 1920 && !defined(__clang__) # pragma warning(push) # pragma warning(disable : 4100 4127 4189 4505 4244 4403 4701 4703) # if (_MSC_VER > 1800 ) diff --git a/code/AssetLib/Step/STEPFile.h b/code/AssetLib/Step/STEPFile.h index 72648e462..1ef5d65c4 100644 --- a/code/AssetLib/Step/STEPFile.h +++ b/code/AssetLib/Step/STEPFile.h @@ -130,8 +130,8 @@ namespace STEP { * coupled with a line number. */ // ------------------------------------------------------------------------------- struct SyntaxError : DeadlyImportError { - enum { - LINE_NOT_SPECIFIED = 0xffffffffffffffffLL + enum : uint64_t { + LINE_NOT_SPECIFIED = 0xfffffffffffffffLL }; SyntaxError(const std::string &s, uint64_t line = LINE_NOT_SPECIFIED); @@ -143,8 +143,8 @@ struct SyntaxError : DeadlyImportError { * It is typically coupled with both an entity id and a line number.*/ // ------------------------------------------------------------------------------- struct TypeError : DeadlyImportError { - enum { - ENTITY_NOT_SPECIFIED = 0xffffffffffffffffLL, + enum : uint64_t { + ENTITY_NOT_SPECIFIED = 0xffffffffffffffffUL, ENTITY_NOT_SPECIFIED_32 = 0x00000000ffffffff }; diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index bb43449e1..2ba893281 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -45,7 +45,6 @@ # cmake_minimum_required( VERSION 3.0 ) SET( HEADER_PATH ../include/assimp ) - if(NOT ANDROID AND ASSIMP_ANDROID_JNIIOSYSTEM) message(WARNING "Requesting Android JNI I/O-System in non-Android toolchain. Resetting ASSIMP_ANDROID_JNIIOSYSTEM to OFF.") set(ASSIMP_ANDROID_JNIIOSYSTEM OFF) diff --git a/contrib/gtest/include/gtest/internal/gtest-port.h b/contrib/gtest/include/gtest/internal/gtest-port.h index 0094ed507..f66d9cd32 100644 --- a/contrib/gtest/include/gtest/internal/gtest-port.h +++ b/contrib/gtest/include/gtest/internal/gtest-port.h @@ -312,10 +312,22 @@ __pragma(warning(disable: warnings)) # define GTEST_DISABLE_MSC_WARNINGS_POP_() \ __pragma(warning(pop)) +# if defined(__clang__) +# define GTEST_DISABLE_CLANG_DEPRECATED_WARNINGS_PUSH_() \ + _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") +# define GTEST_DISABLE_CLANG_WARNINGS_POP_() \ + _Pragma("clang diagnostic pop") +# else +# define GTEST_DISABLE_CLANG_DEPRECATED_WARNINGS_PUSH_() +# define GTEST_DISABLE_CLANG_WARNINGS_POP_() +# endif #else // Older versions of MSVC don't have __pragma. # define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) # define GTEST_DISABLE_MSC_WARNINGS_POP_() +# define GTEST_DISABLE_CLANG_DEPRECATED_WARNINGS_PUSH_() +# define GTEST_DISABLE_CLANG_WARNINGS_POP_() #endif #ifndef GTEST_LANG_CXX11 @@ -2352,6 +2364,7 @@ inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); } // Functions deprecated by MSVC 8.0. GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996 /* deprecated function */) +GTEST_DISABLE_CLANG_DEPRECATED_WARNINGS_PUSH_() inline const char* StrNCpy(char* dest, const char* src, size_t n) { return strncpy(dest, src, n); @@ -2399,6 +2412,7 @@ inline const char* GetEnv(const char* name) { #endif } +GTEST_DISABLE_CLANG_WARNINGS_POP_() GTEST_DISABLE_MSC_WARNINGS_POP_() #if GTEST_OS_WINDOWS_MOBILE diff --git a/contrib/gtest/src/gtest-port.cc b/contrib/gtest/src/gtest-port.cc index e5bf3dd2b..e04aa9a57 100644 --- a/contrib/gtest/src/gtest-port.cc +++ b/contrib/gtest/src/gtest-port.cc @@ -926,7 +926,7 @@ GTestLog::~GTestLog() { // Disable Microsoft deprecation warnings for POSIX functions called from // this class (creat, dup, dup2, and close) GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996) - +GTEST_DISABLE_CLANG_DEPRECATED_WARNINGS_PUSH_() #if GTEST_HAS_STREAM_REDIRECTION // Object that captures an output stream (stdout/stderr). @@ -1010,6 +1010,7 @@ class CapturedStream { }; GTEST_DISABLE_MSC_WARNINGS_POP_() +GTEST_DISABLE_CLANG_WARNINGS_POP_() static CapturedStream* g_captured_stderr = NULL; static CapturedStream* g_captured_stdout = NULL; diff --git a/contrib/rapidjson/include/rapidjson/document.h b/contrib/rapidjson/include/rapidjson/document.h index 473d846e3..17df30725 100644 --- a/contrib/rapidjson/include/rapidjson/document.h +++ b/contrib/rapidjson/include/rapidjson/document.h @@ -31,7 +31,7 @@ #include RAPIDJSON_DIAG_PUSH -#ifdef _MSC_VER +#if defined(_MSC_VER) && !(__clang__) RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant RAPIDJSON_DIAG_OFF(4244) // conversion from kXxxFlags to 'uint16_t', possible loss of data #endif diff --git a/contrib/rapidjson/include/rapidjson/encodings.h b/contrib/rapidjson/include/rapidjson/encodings.h index 0df1c3435..de4d9d216 100644 --- a/contrib/rapidjson/include/rapidjson/encodings.h +++ b/contrib/rapidjson/include/rapidjson/encodings.h @@ -17,7 +17,7 @@ #include "rapidjson.h" -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(4244) // conversion from 'type1' to 'type2', possible loss of data RAPIDJSON_DIAG_OFF(4702) // unreachable code @@ -709,7 +709,7 @@ struct Transcoder { RAPIDJSON_NAMESPACE_END -#if defined(__GNUC__) || defined(_MSC_VER) +#if defined(__GNUC__) || (defined(_MSC_VER) && !defined(__clang__)) RAPIDJSON_DIAG_POP #endif diff --git a/contrib/rapidjson/include/rapidjson/internal/meta.h b/contrib/rapidjson/include/rapidjson/internal/meta.h index 5a9aaa428..bcbfc7709 100644 --- a/contrib/rapidjson/include/rapidjson/internal/meta.h +++ b/contrib/rapidjson/include/rapidjson/internal/meta.h @@ -21,7 +21,7 @@ RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(effc++) #endif -#if defined(_MSC_VER) +#if defined(_MSC_VER) && !defined(__clang__) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(6334) #endif @@ -174,7 +174,7 @@ template struct RemoveSfinaeTag { typedef T Type; RAPIDJSON_NAMESPACE_END //@endcond -#if defined(__GNUC__) || defined(_MSC_VER) +#if defined(__GNUC__) || (defined(_MSC_VER) && !defined(__clang__)) RAPIDJSON_DIAG_POP #endif diff --git a/contrib/rapidjson/include/rapidjson/reader.h b/contrib/rapidjson/include/rapidjson/reader.h index 120c31115..4b172e953 100644 --- a/contrib/rapidjson/include/rapidjson/reader.h +++ b/contrib/rapidjson/include/rapidjson/reader.h @@ -37,7 +37,7 @@ #include #endif -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant RAPIDJSON_DIAG_OFF(4702) // unreachable code @@ -2214,7 +2214,7 @@ RAPIDJSON_DIAG_POP RAPIDJSON_DIAG_POP #endif -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) RAPIDJSON_DIAG_POP #endif diff --git a/contrib/rapidjson/include/rapidjson/writer.h b/contrib/rapidjson/include/rapidjson/writer.h index e610ebb60..53d1a5d7f 100644 --- a/contrib/rapidjson/include/rapidjson/writer.h +++ b/contrib/rapidjson/include/rapidjson/writer.h @@ -36,7 +36,7 @@ #include #endif -#ifdef _MSC_VER +#if defined (_MSC_VER) && !defined(__clang__) RAPIDJSON_DIAG_PUSH RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant #endif @@ -700,11 +700,11 @@ inline bool Writer::ScanWriteUnescapedString(StringStream& is, siz RAPIDJSON_NAMESPACE_END -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) RAPIDJSON_DIAG_POP #endif -#ifdef __clang__ +#if defined(__clang__) RAPIDJSON_DIAG_POP #endif diff --git a/contrib/unzip/ioapi.c b/contrib/unzip/ioapi.c index e1ef46088..0f1bf4f21 100644 --- a/contrib/unzip/ioapi.c +++ b/contrib/unzip/ioapi.c @@ -1,11 +1,3 @@ -/* ioapi.c -- IO base function header for compress/uncompress .zip - files using zlib + zip or unzip API - - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant -*/ - #include #include #include @@ -16,6 +8,10 @@ #ifdef _WIN32 # pragma warning(push) # pragma warning(disable : 4131 4100) +# ifdef __clang__ +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wunused-parameter" +# endif #endif // _WIN32 /* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ @@ -181,4 +177,7 @@ void fill_fopen_filefunc (pzlib_filefunc_def) #ifdef _WIN32 # pragma warning(pop) +# ifdef __clang__ +# pragma clang diagnostic pop +# endif #endif // _WIN32 diff --git a/contrib/unzip/ioapi.h b/contrib/unzip/ioapi.h index 7d457baab..63ec641bf 100644 --- a/contrib/unzip/ioapi.h +++ b/contrib/unzip/ioapi.h @@ -24,7 +24,7 @@ #ifndef ZCALLBACK -#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) +#if (defined(_WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) #define ZCALLBACK CALLBACK #else #define ZCALLBACK diff --git a/contrib/unzip/unzip.c b/contrib/unzip/unzip.c index 3937f821e..7bac01df0 100644 --- a/contrib/unzip/unzip.c +++ b/contrib/unzip/unzip.c @@ -1554,7 +1554,6 @@ extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) char *szComment; uLong uSizeBuf; { - int err=UNZ_OK; unz_s* s; uLong uReadThis ; if (file==NULL) diff --git a/contrib/zip/src/miniz.h b/contrib/zip/src/miniz.h index 07f7b2de2..7570ae929 100644 --- a/contrib/zip/src/miniz.h +++ b/contrib/zip/src/miniz.h @@ -5361,7 +5361,7 @@ mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, } else { // Temporarily allocate a read buffer. read_buf_size = MZ_MIN(file_stat.m_comp_size, MZ_ZIP_MAX_IO_BUF_SIZE); -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (read_buf_size > 0x7FFFFFFF)) #else @@ -5454,7 +5454,7 @@ void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); alloc_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? comp_size : uncomp_size; -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF)) #else if (((sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF)) @@ -5560,7 +5560,7 @@ mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method)) { // The file is stored or the caller has requested the compressed data. if (pZip->m_pState->m_pMem) { -#ifdef _MSC_VER +#if defined (_MSC_VER) && !defined(__clang__) if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (file_stat.m_comp_size > 0xFFFFFFFF)) #else diff --git a/include/assimp/Compiler/poppack1.h b/include/assimp/Compiler/poppack1.h index e033bc147..a8e9a3c7e 100644 --- a/include/assimp/Compiler/poppack1.h +++ b/include/assimp/Compiler/poppack1.h @@ -14,7 +14,7 @@ #endif // reset packing to the original value -#if defined(_MSC_VER) || defined(__BORLANDC__) || defined (__BCPLUSPLUS__) +#if (defined(_MSC_VER) && !defined(__clang__)) || defined(__BORLANDC__) || defined (__BCPLUSPLUS__) # pragma pack( pop ) #endif #undef PACK_STRUCT diff --git a/include/assimp/Compiler/pushpack1.h b/include/assimp/Compiler/pushpack1.h index 4c9fbb857..2a5e2dfe6 100644 --- a/include/assimp/Compiler/pushpack1.h +++ b/include/assimp/Compiler/pushpack1.h @@ -22,7 +22,7 @@ # error poppack1.h must be included after pushpack1.h #endif -#if defined(_MSC_VER) || defined(__BORLANDC__) || defined (__BCPLUSPLUS__) +#if (defined(_MSC_VER) && !defined(__clang__)) || defined(__BORLANDC__) || defined (__BCPLUSPLUS__) # pragma pack(push,1) # define PACK_STRUCT #elif defined( __GNUC__ ) || defined(__clang__) diff --git a/test/unit/UnitTestFileGenerator.h b/test/unit/UnitTestFileGenerator.h index 91d69357f..2166c6939 100644 --- a/test/unit/UnitTestFileGenerator.h +++ b/test/unit/UnitTestFileGenerator.h @@ -44,21 +44,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#if defined(__GNUC__) || defined(__clang__) -#define TMP_PATH "/tmp/" -inline FILE* MakeTmpFile(char* tmplate) -{ - auto fd = mkstemp(tmplate); - EXPECT_NE(-1, fd); - if(fd == -1) - { - return nullptr; - } - auto fs = fdopen(fd, "w+"); - EXPECT_NE(nullptr, fs); - return fs; -} -#elif defined(_MSC_VER) +#if defined(_MSC_VER) #include #define TMP_PATH "./" inline FILE* MakeTmpFile(char* tmplate) @@ -73,4 +59,18 @@ inline FILE* MakeTmpFile(char* tmplate) EXPECT_NE(fs, nullptr); return fs; } +#elif defined(__GNUC__) || defined(__clang__) +#define TMP_PATH "/tmp/" +inline FILE* MakeTmpFile(char* tmplate) +{ + auto fd = mkstemp(tmplate); + EXPECT_NE(-1, fd); + if(fd == -1) + { + return nullptr; + } + auto fs = fdopen(fd, "w+"); + EXPECT_NE(nullptr, fs); + return fs; +} #endif diff --git a/test/unit/utColladaImportExport.cpp b/test/unit/utColladaImportExport.cpp index 451c8e235..100ca548a 100644 --- a/test/unit/utColladaImportExport.cpp +++ b/test/unit/utColladaImportExport.cpp @@ -157,7 +157,6 @@ public: static inline void CheckNodeIdNames(IdNameMap &nodeIdMap, IdNameMap &nodeNameMap, const aiNode *parent, size_t index) { IdNameString namePair = GetItemIdName(parent, index); - const auto result = nodeNameMap.insert(namePair); IdNameString idPair = GetColladaIdName(parent, index); ReportDuplicate(nodeIdMap, idPair, typeid(aiNode).name()); From a19e4e41129589c2ca1e09a476ae57874462d685 Mon Sep 17 00:00:00 2001 From: MeyerFabian Date: Mon, 20 Jul 2020 18:28:50 +0200 Subject: [PATCH 056/129] Make clang with msvc abi work. --- code/AssetLib/Blender/BlenderTessellator.cpp | 8 +++++++- code/CMakeLists.txt | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/Blender/BlenderTessellator.cpp b/code/AssetLib/Blender/BlenderTessellator.cpp index 3c1cd6ea8..3366d56c5 100644 --- a/code/AssetLib/Blender/BlenderTessellator.cpp +++ b/code/AssetLib/Blender/BlenderTessellator.cpp @@ -386,7 +386,14 @@ void BlenderTessellatorP2T::ReferencePoints( std::vector< Blender::PointP2T >& p // ------------------------------------------------------------------------------------------------ inline PointP2T& BlenderTessellatorP2T::GetActualPointStructure( p2t::Point& point ) const { +#if defined __clang__ +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Winvalid-offsetof" +#endif // __clang__ unsigned int pointOffset = offsetof( PointP2T, point2D ); +#if defined __clang__ +# pragma clang diagnostic pop +#endif PointP2T& pointStruct = *reinterpret_cast< PointP2T* >( reinterpret_cast< char* >( &point ) - pointOffset ); if ( pointStruct.magic != static_cast( BLEND_TESS_MAGIC ) ) { @@ -394,7 +401,6 @@ inline PointP2T& BlenderTessellatorP2T::GetActualPointStructure( p2t::Point& poi } return pointStruct; } - // ------------------------------------------------------------------------------------------------ void BlenderTessellatorP2T::MakeFacesFromTriangles( std::vector< p2t::Triangle* >& triangles ) const { diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 2ba893281..23cfba4ff 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1065,7 +1065,7 @@ endif() ADD_DEFINITIONS( -DASSIMP_BUILD_DLL_EXPORT ) -if ( MSVC ) +IF( MSVC OR "${CMAKE_CXX_SIMULATE_ID}" MATCHES "MSVC") # clang with MSVC ABI ADD_DEFINITIONS( -D_SCL_SECURE_NO_WARNINGS ) ADD_DEFINITIONS( -D_CRT_SECURE_NO_WARNINGS ) endif () From 51e592123add5da3359f37465b3e28b73852e678 Mon Sep 17 00:00:00 2001 From: MeyerFabian Date: Mon, 20 Jul 2020 18:42:57 +0200 Subject: [PATCH 057/129] Fix two deletions. --- code/CMakeLists.txt | 1 + contrib/unzip/ioapi.c | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 23cfba4ff..7ccc6439f 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -45,6 +45,7 @@ # cmake_minimum_required( VERSION 3.0 ) SET( HEADER_PATH ../include/assimp ) + if(NOT ANDROID AND ASSIMP_ANDROID_JNIIOSYSTEM) message(WARNING "Requesting Android JNI I/O-System in non-Android toolchain. Resetting ASSIMP_ANDROID_JNIIOSYSTEM to OFF.") set(ASSIMP_ANDROID_JNIIOSYSTEM OFF) diff --git a/contrib/unzip/ioapi.c b/contrib/unzip/ioapi.c index 0f1bf4f21..5e0497f9e 100644 --- a/contrib/unzip/ioapi.c +++ b/contrib/unzip/ioapi.c @@ -1,3 +1,11 @@ +/* ioapi.c -- IO base function header for compress/uncompress .zip + files using zlib + zip or unzip API + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant +*/ + #include #include #include From 5e0b9e0f32f93520b26187161ad1b23e5defad1b Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 23 Jul 2020 11:35:36 +0200 Subject: [PATCH 058/129] Remove travix + assveyor. --- Readme.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/Readme.md b/Readme.md index dc54870a0..3f2edd402 100644 --- a/Readme.md +++ b/Readme.md @@ -4,8 +4,6 @@ A library to import and export various 3d-model-formats including scene-post-pro ### Current project status ### [![Financial Contributors on Open Collective](https://opencollective.com/assimp/all/badge.svg?label=financial+contributors)](https://opencollective.com/assimp) ![C/C++ CI](https://github.com/assimp/assimp/workflows/C/C++%20CI/badge.svg) -[![Linux Build Status](https://travis-ci.org/assimp/assimp.svg)](https://travis-ci.org/assimp/assimp) -[![Windows Build Status](https://ci.appveyor.com/api/projects/status/tmo433wax6u6cjp4?svg=true)](https://ci.appveyor.com/project/kimkulling/assimp) Coverity Scan Build Status From eb44eb13e6120d2bf74a0f4c8f6b479a0351e339 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 23 Jul 2020 19:15:46 +0200 Subject: [PATCH 059/129] fix namespace issue in fuzzer. --- fuzz/assimp_fuzzer.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/fuzz/assimp_fuzzer.cc b/fuzz/assimp_fuzzer.cc index 86ffe18ed..933d783db 100644 --- a/fuzz/assimp_fuzzer.cc +++ b/fuzz/assimp_fuzzer.cc @@ -42,6 +42,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include +using namespace Assimp; + extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t dataSize) { aiLogStream stream = aiGetPredefinedLogStream(aiDefaultLogStream_STDOUT,NULL); aiAttachLogStream(&stream); From 9a4b3fd9de1f91df5e4f8b1f26ce090024cc6107 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 23 Jul 2020 20:16:11 +0200 Subject: [PATCH 060/129] use correct include. --- fuzz/assimp_fuzzer.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fuzz/assimp_fuzzer.cc b/fuzz/assimp_fuzzer.cc index 933d783db..ca3f765e1 100644 --- a/fuzz/assimp_fuzzer.cc +++ b/fuzz/assimp_fuzzer.cc @@ -38,7 +38,7 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------- */ -#include +#include #include #include From dcc8419722258aaf577af1ff858233aa0d3fa552 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 23 Jul 2020 21:01:08 +0200 Subject: [PATCH 061/129] add missing include for logging. --- fuzz/assimp_fuzzer.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/fuzz/assimp_fuzzer.cc b/fuzz/assimp_fuzzer.cc index ca3f765e1..b65ee0236 100644 --- a/fuzz/assimp_fuzzer.cc +++ b/fuzz/assimp_fuzzer.cc @@ -38,6 +38,7 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------- */ +#include #include #include #include From 6886ea6c6571bfc03a9811cb38ee31f5f16b2d64 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 24 Jul 2020 10:57:24 +0200 Subject: [PATCH 062/129] Fix warning: comparison between unsigned and signed. --- test/unit/utglTF2ImportExport.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/test/unit/utglTF2ImportExport.cpp b/test/unit/utglTF2ImportExport.cpp index c3ad2d994..e991b04f3 100644 --- a/test/unit/utglTF2ImportExport.cpp +++ b/test/unit/utglTF2ImportExport.cpp @@ -548,11 +548,9 @@ TEST_F(utglTF2ImportExport, indexOutOfRange) { // The contents of an asset should not lead to an assert. Assimp::Importer importer; - struct LogObserver : Assimp::LogStream - { + struct LogObserver : Assimp::LogStream { bool m_observedWarning = false; - void write(const char *message) override - { + void write(const char *message) override { m_observedWarning = m_observedWarning || std::strstr(message, "faces were dropped"); } }; @@ -562,8 +560,8 @@ TEST_F(utglTF2ImportExport, indexOutOfRange) { const aiScene *scene = importer.ReadFile(ASSIMP_TEST_MODELS_DIR "/glTF2/IndexOutOfRange/IndexOutOfRange.gltf", aiProcess_ValidateDataStructure); ASSERT_NE(scene, nullptr); ASSERT_NE(scene->mRootNode, nullptr); - ASSERT_EQ(scene->mNumMeshes, 1); - EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 11); + ASSERT_EQ(scene->mNumMeshes, 1u); + EXPECT_EQ(scene->mMeshes[0]->mNumFaces, 11u); DefaultLogger::get()->detachStream(&logObserver); EXPECT_TRUE(logObserver.m_observedWarning); } From ad18e365e5290217fe79a95a261d8886e668223b Mon Sep 17 00:00:00 2001 From: Rahul Sheth Date: Wed, 22 Jul 2020 10:57:25 -0400 Subject: [PATCH 063/129] Fixing more warnings --- code/AssetLib/IFC/IFCReaderGen1_2x3.cpp | 9 +++++++++ code/AssetLib/IFC/IFCReaderGen2_2x3.cpp | 9 +++++++++ code/AssetLib/M3D/m3d.h | 20 ++++++++++---------- code/AssetLib/glTF/glTFExporter.cpp | 10 +++++++++- code/AssetLib/glTF2/glTF2Asset.h | 2 +- 5 files changed, 38 insertions(+), 12 deletions(-) diff --git a/code/AssetLib/IFC/IFCReaderGen1_2x3.cpp b/code/AssetLib/IFC/IFCReaderGen1_2x3.cpp index 3376f4d9e..2cfa22530 100644 --- a/code/AssetLib/IFC/IFCReaderGen1_2x3.cpp +++ b/code/AssetLib/IFC/IFCReaderGen1_2x3.cpp @@ -45,6 +45,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "IFCReaderGen_2x3.h" +#if _MSC_VER +# pragma warning(push) +# pragma warning(disable : 4702) +#endif // _MSC_VER + namespace Assimp { using namespace ::Assimp::IFC; @@ -3165,4 +3170,8 @@ template <> size_t GenericFill(const DB& db, const LI } // ! STEP } // ! Assimp +#if _MSC_VER +# pragma warning(pop) +#endif // _MSC_VER + #endif diff --git a/code/AssetLib/IFC/IFCReaderGen2_2x3.cpp b/code/AssetLib/IFC/IFCReaderGen2_2x3.cpp index e6687014d..c58c7c42f 100644 --- a/code/AssetLib/IFC/IFCReaderGen2_2x3.cpp +++ b/code/AssetLib/IFC/IFCReaderGen2_2x3.cpp @@ -43,6 +43,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "IFCReaderGen_2x3.h" +#if _MSC_VER +# pragma warning(push) +# pragma warning(disable : 4702) +#endif // _MSC_VER + namespace Assimp { using namespace IFC; using namespace ::Assimp::IFC::Schema_2x3; @@ -1915,4 +1920,8 @@ template <> size_t GenericFill(const DB& db, const LIST& } // ! STEP } // ! Assimp +#if _MSC_VER +# pragma warning(pop) +#endif // _MSC_VER + #endif diff --git a/code/AssetLib/M3D/m3d.h b/code/AssetLib/M3D/m3d.h index fb980b9c4..905ff5095 100644 --- a/code/AssetLib/M3D/m3d.h +++ b/code/AssetLib/M3D/m3d.h @@ -686,7 +686,11 @@ typedef struct } _m3dstbi__result_info; #define STBI_ASSERT(v) -#define STBI_NOTUSED(v) (void)sizeof(v) +#ifdef _MSC_VER +#define STBI_NOTUSED(v) (void)(v) +#else +#define STBI_NOTUSED(v) (void)sizeof(v) +#endif #define STBI__BYTECAST(x) ((unsigned char)((x)&255)) #define STBI_MALLOC(sz) M3D_MALLOC(sz) #define STBI_REALLOC(p, newsz) M3D_REALLOC(p, newsz) @@ -699,10 +703,6 @@ _inline static unsigned char _m3dstbi__get8(_m3dstbi__context *s) { return 0; } -_inline static int _m3dstbi__at_eof(_m3dstbi__context *s) { - return s->img_buffer >= s->img_buffer_end; -} - static void _m3dstbi__skip(_m3dstbi__context *s, int n) { if (n < 0) { s->img_buffer = s->img_buffer_end; @@ -4347,7 +4347,7 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size char vc_s, vi_s, si_s, ci_s, ti_s, bi_s, nb_s, sk_s, fc_s, hi_s, fi_s; char *sn = NULL, *sl = NULL, *sa = NULL, *sd = NULL; unsigned char *out = NULL, *z = NULL, weights[M3D_NUMBONE], *norm = NULL; - unsigned int i, j, k, l, n, len, chunklen, *length; + unsigned int i = 0, j = 0, k = 0, l = 0, n = 0, len = 0, chunklen = 0, *length = NULL; M3D_FLOAT scale = (M3D_FLOAT)0.0, min_x, max_x, min_y, max_y, min_z, max_z; M3D_INDEX last, *vrtxidx = NULL, *mtrlidx = NULL, *tmapidx = NULL, *skinidx = NULL; uint32_t idx, numcmap = 0, *cmap = NULL, numvrtx = 0, maxvrtx = 0, numtmap = 0, maxtmap = 0, numproc = 0; @@ -5578,9 +5578,9 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size } else out--; break; - case m3dpf_uint8: *out++ = m->prop[i].value.num; break; + case m3dpf_uint8: *out++ = (uint8_t)m->prop[i].value.num; break; case m3dpf_uint16: - *((uint16_t *)out) = m->prop[i].value.num; + *((uint16_t *)out) = (uint16_t)m->prop[i].value.num; out += 2; break; case m3dpf_uint32: @@ -5655,7 +5655,7 @@ unsigned char *m3d_save(m3d_t *model, int quality, int flags, unsigned int *size face[i].data.normal[1] == M3D_UNDEF || face[i].data.normal[2] == M3D_UNDEF) ? 0 : 2); - *out++ = k; + *out++ = (uint8_t)k; for (j = 0; j < 3; j++) { out = _m3d_addidx(out, vi_s, vrtxidx[face[i].data.vertex[j]]); if (k & 1) @@ -6149,7 +6149,7 @@ public: #endif /* M3D_CPPWRAPPER */ -#ifdef _MSC_VER +#if _MSC_VER > 1920 && !defined(__clang__) # pragma warning(pop) #endif /* _MSC_VER */ diff --git a/code/AssetLib/glTF/glTFExporter.cpp b/code/AssetLib/glTF/glTFExporter.cpp index be9dddef7..1951167c6 100644 --- a/code/AssetLib/glTF/glTFExporter.cpp +++ b/code/AssetLib/glTF/glTFExporter.cpp @@ -542,10 +542,12 @@ void glTFExporter::ExportMeshes() // Variables needed for compression. BEGIN. // Indices, not pointers - because pointer to buffer is changing while writing to it. +#ifdef ASSIMP_IMPORTER_GLTF_USE_OPEN3DGC size_t idx_srcdata_begin = 0; // Index of buffer before writing mesh data. Also, index of begin of coordinates array in buffer. size_t idx_srcdata_normal = SIZE_MAX;// Index of begin of normals array in buffer. SIZE_MAX - mean that mesh has no normals. - std::vector idx_srcdata_tc;// Array of indices. Every index point to begin of texture coordinates array in buffer. size_t idx_srcdata_ind;// Index of begin of coordinates indices array in buffer. +#endif + std::vector idx_srcdata_tc;// Array of indices. Every index point to begin of texture coordinates array in buffer. bool comp_allow;// Point that data of current mesh can be compressed. // Variables needed for compression. END. @@ -615,13 +617,17 @@ void glTFExporter::ExportMeshes() /******************* Vertices ********************/ // If compression is used then you need parameters of uncompressed region: begin and size. At this step "begin" is stored. +#ifdef ASSIMP_IMPORTER_GLTF_USE_OPEN3DGC if(comp_allow) idx_srcdata_begin = b->byteLength; +#endif Ref v = ExportData(*mAsset, meshId, b, aim->mNumVertices, aim->mVertices, AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT, BufferViewTarget_ARRAY_BUFFER); if (v) p.attributes.position.push_back(v); /******************** Normals ********************/ +#ifdef ASSIMP_IMPORTER_GLTF_USE_OPEN3DGC if(comp_allow && (aim->mNormals != 0)) idx_srcdata_normal = b->byteLength;// Store index of normals array. +#endif Ref n = ExportData(*mAsset, meshId, b, aim->mNumVertices, aim->mNormals, AttribType::VEC3, AttribType::VEC3, ComponentType_FLOAT, BufferViewTarget_ARRAY_BUFFER); if (n) p.attributes.normal.push_back(n); @@ -646,7 +652,9 @@ void glTFExporter::ExportMeshes() } /*************** Vertices indices ****************/ +#ifdef ASSIMP_IMPORTER_GLTF_USE_OPEN3DGC idx_srcdata_ind = b->byteLength;// Store index of indices array. +#endif if (aim->mNumFaces > 0) { std::vector indices; diff --git a/code/AssetLib/glTF2/glTF2Asset.h b/code/AssetLib/glTF2/glTF2Asset.h index e45b53006..763a6ac37 100644 --- a/code/AssetLib/glTF2/glTF2Asset.h +++ b/code/AssetLib/glTF2/glTF2Asset.h @@ -804,7 +804,7 @@ struct CustomExtension : public Object { Nullable> mValues; operator bool() const { - return Size(); + return Size() != 0; } size_t Size() const { From 3170c3d15cbbf00b830988d97a79ec6a7b40743e Mon Sep 17 00:00:00 2001 From: Ryan Styrczula Date: Thu, 30 Jul 2020 09:21:22 -0400 Subject: [PATCH 064/129] FBXExport: Fix crash if scene->mMetaData is null --- code/AssetLib/FBX/FBXExporter.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/AssetLib/FBX/FBXExporter.cpp b/code/AssetLib/FBX/FBXExporter.cpp index 20d166179..99ab7508e 100644 --- a/code/AssetLib/FBX/FBXExporter.cpp +++ b/code/AssetLib/FBX/FBXExporter.cpp @@ -405,7 +405,7 @@ void FBXExporter::WriteHeaderExtension () void WritePropInt(const aiScene* scene, FBX::Node& p, const std::string& key, int defaultValue) { int value; - if (scene->mMetaData->Get(key, value)) { + if (scene->mMetaData != nullptr && scene->mMetaData->Get(key, value)) { p.AddP70int(key, value); } else { p.AddP70int(key, defaultValue); @@ -415,12 +415,12 @@ void WritePropInt(const aiScene* scene, FBX::Node& p, const std::string& key, in void WritePropDouble(const aiScene* scene, FBX::Node& p, const std::string& key, double defaultValue) { double value; - if (scene->mMetaData->Get(key, value)) { + if (scene->mMetaData != nullptr && scene->mMetaData->Get(key, value)) { p.AddP70double(key, value); } else { // fallback lookup float instead float floatValue; - if (scene->mMetaData->Get(key, floatValue)) { + if (scene->mMetaData != nullptr && scene->mMetaData->Get(key, floatValue)) { p.AddP70double(key, (double)floatValue); } else { p.AddP70double(key, defaultValue); @@ -431,7 +431,7 @@ void WritePropDouble(const aiScene* scene, FBX::Node& p, const std::string& key, void WritePropEnum(const aiScene* scene, FBX::Node& p, const std::string& key, int defaultValue) { int value; - if (scene->mMetaData->Get(key, value)) { + if (scene->mMetaData != nullptr && scene->mMetaData->Get(key, value)) { p.AddP70enum(key, value); } else { p.AddP70enum(key, defaultValue); @@ -441,7 +441,7 @@ void WritePropEnum(const aiScene* scene, FBX::Node& p, const std::string& key, i void WritePropColor(const aiScene* scene, FBX::Node& p, const std::string& key, const aiVector3D& defaultValue) { aiVector3D value; - if (scene->mMetaData->Get(key, value)) { + if (scene->mMetaData != nullptr && scene->mMetaData->Get(key, value)) { // ai_real can be float or double, cast to avoid warnings p.AddP70color(key, (double)value.x, (double)value.y, (double)value.z); } else { @@ -452,7 +452,7 @@ void WritePropColor(const aiScene* scene, FBX::Node& p, const std::string& key, void WritePropString(const aiScene* scene, FBX::Node& p, const std::string& key, const std::string& defaultValue) { aiString value; // MetaData doesn't hold std::string - if (scene->mMetaData->Get(key, value)) { + if (scene->mMetaData != nullptr && scene->mMetaData->Get(key, value)) { p.AddP70string(key, value.C_Str()); } else { p.AddP70string(key, defaultValue); From eaf0587dd8b8bb2e66a7c83ef142eb5990f3839b Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Thu, 30 Jul 2020 14:56:01 +0100 Subject: [PATCH 065/129] FBX Version/Size Check --- code/AssetLib/FBX/FBXBinaryTokenizer.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/code/AssetLib/FBX/FBXBinaryTokenizer.cpp b/code/AssetLib/FBX/FBXBinaryTokenizer.cpp index 719b928bc..bbb3e5434 100644 --- a/code/AssetLib/FBX/FBXBinaryTokenizer.cpp +++ b/code/AssetLib/FBX/FBXBinaryTokenizer.cpp @@ -54,6 +54,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +#include namespace Assimp { namespace FBX { @@ -456,11 +457,21 @@ void TokenizeBinary(TokenList& output_tokens, const char* input, size_t length) ASSIMP_LOG_DEBUG_F("FBX version: ", version); const bool is64bits = version >= 7500; const char *end = input + length; - while (cursor < end ) { - if (!ReadScope(output_tokens, input, cursor, input + length, is64bits)) { - break; + try + { + while (cursor < end ) { + if (!ReadScope(output_tokens, input, cursor, input + length, is64bits)) { + break; + } } } + catch (const DeadlyImportError& e) + { + if ((sizeof(size_t) > 4) && !is64bits && (length > std::numeric_limits::max())) { + throw DeadlyImportError("The FBX is invalid. This may be because the content is too big for this older version (" + to_string(version) + ") of the FBX format. (" + e.what() + ")"); + } + throw; + } } } // !FBX From 301bae3967046ba74b1fd2d2ba8b62f7cb39efac Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Thu, 30 Jul 2020 16:37:41 +0100 Subject: [PATCH 066/129] Improve message --- code/AssetLib/FBX/FBXBinaryTokenizer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/FBX/FBXBinaryTokenizer.cpp b/code/AssetLib/FBX/FBXBinaryTokenizer.cpp index bbb3e5434..82c1783cd 100644 --- a/code/AssetLib/FBX/FBXBinaryTokenizer.cpp +++ b/code/AssetLib/FBX/FBXBinaryTokenizer.cpp @@ -468,7 +468,7 @@ void TokenizeBinary(TokenList& output_tokens, const char* input, size_t length) catch (const DeadlyImportError& e) { if ((sizeof(size_t) > 4) && !is64bits && (length > std::numeric_limits::max())) { - throw DeadlyImportError("The FBX is invalid. This may be because the content is too big for this older version (" + to_string(version) + ") of the FBX format. (" + e.what() + ")"); + throw DeadlyImportError("The FBX file is invalid. This may be because the content is too big for this older version (" + to_string(version) + ") of the FBX format. (" + e.what() + ")"); } throw; } From 0282f358a4d26adc897288f1a9ee9359c8bb0ac0 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Fri, 31 Jul 2020 12:40:17 +0100 Subject: [PATCH 067/129] Remove unneeded check. --- code/AssetLib/FBX/FBXBinaryTokenizer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/FBX/FBXBinaryTokenizer.cpp b/code/AssetLib/FBX/FBXBinaryTokenizer.cpp index 82c1783cd..78f02ff96 100644 --- a/code/AssetLib/FBX/FBXBinaryTokenizer.cpp +++ b/code/AssetLib/FBX/FBXBinaryTokenizer.cpp @@ -467,7 +467,7 @@ void TokenizeBinary(TokenList& output_tokens, const char* input, size_t length) } catch (const DeadlyImportError& e) { - if ((sizeof(size_t) > 4) && !is64bits && (length > std::numeric_limits::max())) { + if (!is64bits && (length > std::numeric_limits::max())) { throw DeadlyImportError("The FBX file is invalid. This may be because the content is too big for this older version (" + to_string(version) + ") of the FBX format. (" + e.what() + ")"); } throw; From 435bba30ddf0d99b65904659c3e5d1ec76f70894 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 3 Aug 2020 09:30:02 +0200 Subject: [PATCH 068/129] Move functions into the correct preprocessor branch --- code/Common/DefaultIOStream.cpp | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/code/Common/DefaultIOStream.cpp b/code/Common/DefaultIOStream.cpp index 32f47ab07..0c26754f7 100644 --- a/code/Common/DefaultIOStream.cpp +++ b/code/Common/DefaultIOStream.cpp @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2020, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -52,27 +50,32 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; namespace { -template -size_t select_ftell(FILE *file) { - return ::ftell(file); -} - -template -int select_fseek(FILE *file, int64_t offset, int origin) { - return ::fseek(file, static_cast(offset), origin); -} #if defined _WIN32 && (!defined __GNUC__ || __MSVCRT_VERSION__ >= 0x0601) template <> -size_t select_ftell<8>(FILE *file) { +inline size_t select_ftell<8>(FILE *file) { return (size_t)::_ftelli64(file); } template <> -int select_fseek<8>(FILE *file, int64_t offset, int origin) { +inline int select_fseek<8>(FILE *file, int64_t offset, int origin) { return ::_fseeki64(file, offset, origin); } -#endif + +#else + +template +inline size_t select_ftell(FILE *file) { + return ::ftell(file); +} + +template +inline int select_fseek(FILE *file, int64_t offset, int origin) { + return ::fseek(file, static_cast(offset), origin); +} + +#endif // #if defined _WIN32 && (!defined __GNUC__ || __MSVCRT_VERSION__ >= 0x0601) + } // namespace // ---------------------------------------------------------------------------------- From e7ae576614cf7ced16c8d3cd33e893a6ea49636a Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 3 Aug 2020 15:54:19 +0200 Subject: [PATCH 069/129] undo change --- code/Common/DefaultIOStream.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/code/Common/DefaultIOStream.cpp b/code/Common/DefaultIOStream.cpp index 0c26754f7..449b6c1e1 100644 --- a/code/Common/DefaultIOStream.cpp +++ b/code/Common/DefaultIOStream.cpp @@ -51,6 +51,18 @@ using namespace Assimp; namespace { +template +inline size_t select_ftell(FILE *file) { + return ::ftell(file); +} + +template +inline int select_fseek(FILE *file, int64_t offset, int origin) { + return ::fseek(file, static_cast(offset), origin); +} + + + #if defined _WIN32 && (!defined __GNUC__ || __MSVCRT_VERSION__ >= 0x0601) template <> inline size_t select_ftell<8>(FILE *file) { @@ -62,18 +74,6 @@ inline int select_fseek<8>(FILE *file, int64_t offset, int origin) { return ::_fseeki64(file, offset, origin); } -#else - -template -inline size_t select_ftell(FILE *file) { - return ::ftell(file); -} - -template -inline int select_fseek(FILE *file, int64_t offset, int origin) { - return ::fseek(file, static_cast(offset), origin); -} - #endif // #if defined _WIN32 && (!defined __GNUC__ || __MSVCRT_VERSION__ >= 0x0601) } // namespace From 447805f01a846807991f4877ddd8cb66d22fe729 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mikrut?= Date: Mon, 3 Aug 2020 23:12:08 +0200 Subject: [PATCH 070/129] Added more undefined sanitizer flags --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b350f6e3..f053b6aa7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -321,8 +321,8 @@ ENDIF() IF (ASSIMP_UBSAN) MESSAGE(STATUS "Undefined Behavior sanitizer enabled") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined,shift,shift-exponent,integer-divide-by-zero,unreachable,vla-bound,null,return,signed-integer-overflow,bounds,float-divide-by-zero,float-cast-overflow,nonnull-attribute,returns-nonnull-attribute,bool,enum,vptr,pointer-overflow,builtin -fno-sanitize-recover=all") + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined,shift,shift-exponent,integer-divide-by-zero,unreachable,vla-bound,null,return,signed-integer-overflow,bounds,float-divide-by-zero,float-cast-overflow,nonnull-attribute,returns-nonnull-attribute,bool,enum,vptr,pointer-overflow,builtin -fno-sanitize-recover=all") ENDIF() INCLUDE (FindPkgMacros) From 855b47452e8ff1096f8bc093e2bd702cbb963c5a Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 4 Aug 2020 17:41:28 +0200 Subject: [PATCH 071/129] Export opacity is 3DS closes https://github.com/assimp/assimp/issues/3291 --- code/AssetLib/3DS/3DSExporter.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/AssetLib/3DS/3DSExporter.cpp b/code/AssetLib/3DS/3DSExporter.cpp index fed96a51f..8c258d899 100644 --- a/code/AssetLib/3DS/3DSExporter.cpp +++ b/code/AssetLib/3DS/3DSExporter.cpp @@ -290,12 +290,17 @@ void Discreet3DSExporter::WriteMaterials() { ChunkWriter curChunk(writer, Discreet3DS::CHUNK_MAT_SPECULAR); WriteColor(color); } - + if (mat.Get(AI_MATKEY_COLOR_AMBIENT, color) == AI_SUCCESS) { ChunkWriter curChunk(writer, Discreet3DS::CHUNK_MAT_AMBIENT); WriteColor(color); } + if (mat.Get(AI_MATKEY_OPACITY, f) == AI_SUCCESS) { + ChunkWriter chunk(writer, Discreet3DS::CHUNK_MAT_TRANSPARENCY); + WritePercentChunk(1.0f - f); + } + if (mat.Get(AI_MATKEY_COLOR_EMISSIVE, color) == AI_SUCCESS) { ChunkWriter curChunk(writer, Discreet3DS::CHUNK_MAT_SELF_ILLUM); WriteColor(color); From aabf12827ba516d8507793c558a67189744ea282 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 4 Aug 2020 17:52:43 +0200 Subject: [PATCH 072/129] fix typo --- code/AssetLib/3DS/3DSExporter.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/code/AssetLib/3DS/3DSExporter.cpp b/code/AssetLib/3DS/3DSExporter.cpp index 8c258d899..ab0a5dbd2 100644 --- a/code/AssetLib/3DS/3DSExporter.cpp +++ b/code/AssetLib/3DS/3DSExporter.cpp @@ -296,6 +296,7 @@ void Discreet3DSExporter::WriteMaterials() { WriteColor(color); } + float f; if (mat.Get(AI_MATKEY_OPACITY, f) == AI_SUCCESS) { ChunkWriter chunk(writer, Discreet3DS::CHUNK_MAT_TRANSPARENCY); WritePercentChunk(1.0f - f); From 1f348c5fc067bebed79fa7a8f2246984a709a1f6 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 4 Aug 2020 20:55:29 +0200 Subject: [PATCH 073/129] Remove redundant float f --- code/AssetLib/3DS/3DSExporter.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/code/AssetLib/3DS/3DSExporter.cpp b/code/AssetLib/3DS/3DSExporter.cpp index ab0a5dbd2..ad8e10afe 100644 --- a/code/AssetLib/3DS/3DSExporter.cpp +++ b/code/AssetLib/3DS/3DSExporter.cpp @@ -339,7 +339,6 @@ void Discreet3DSExporter::WriteMaterials() { writer.PutU2(static_cast(shading_mode_out)); } - float f; if (mat.Get(AI_MATKEY_SHININESS, f) == AI_SUCCESS) { ChunkWriter chunk(writer, Discreet3DS::CHUNK_MAT_SHININESS); WritePercentChunk(f); From b94183376ced40aecab78b5b5893dca8277542b9 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Wed, 5 Aug 2020 17:56:44 +0200 Subject: [PATCH 074/129] Fix possible overflow in new. --- code/PostProcessing/TriangulateProcess.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/PostProcessing/TriangulateProcess.cpp b/code/PostProcessing/TriangulateProcess.cpp index 8035b34f4..ebd35c997 100644 --- a/code/PostProcessing/TriangulateProcess.cpp +++ b/code/PostProcessing/TriangulateProcess.cpp @@ -64,6 +64,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "Common/PolyTools.h" #include +#include //#define AI_BUILD_TRIANGULATE_COLOR_FACE_WINDING //#define AI_BUILD_TRIANGULATE_DEBUG_POLYS @@ -141,7 +142,7 @@ bool TriangulateProcess::TriangulateMesh( aiMesh* pMesh) } // Find out how many output faces we'll get - unsigned int numOut = 0, max_out = 0; + uint32_t numOut = 0, max_out = 0; bool get_normals = true; for( unsigned int a = 0; a < pMesh->mNumFaces; a++) { aiFace& face = pMesh->mFaces[a]; From 13d7fad7f7a701752ceca25d52894712216e1d8c Mon Sep 17 00:00:00 2001 From: kimkulling Date: Fri, 7 Aug 2020 14:23:07 +0200 Subject: [PATCH 075/129] closes https://github.com/assimp/assimp/issues/2992: add single or double precision + missing compilers. --- code/Common/Importer.cpp | 47 ++++++++++++++++++++++++---------------- code/Common/Version.cpp | 21 +++++++++++++++++- include/assimp/version.h | 8 +++---- 3 files changed, 52 insertions(+), 24 deletions(-) diff --git a/code/Common/Importer.cpp b/code/Common/Importer.cpp index 77eb8ef8c..fc50336b4 100644 --- a/code/Common/Importer.cpp +++ b/code/Common/Importer.cpp @@ -515,46 +515,55 @@ void WriteLogOpening(const std::string& file) { // need to ask the authors of incoming bug reports for // the library version they're using - a log dump is // sufficient. - const unsigned int flags( aiGetCompileFlags() ); + const unsigned int flags = aiGetCompileFlags(); std::stringstream stream; stream << "Assimp " << aiGetVersionMajor() << "." << aiGetVersionMinor() << "." << aiGetVersionRevision() << " " #if defined(ASSIMP_BUILD_ARCHITECTURE) - << ASSIMP_BUILD_ARCHITECTURE + << ASSIMP_BUILD_ARCHITECTURE #elif defined(_M_IX86) || defined(__x86_32__) || defined(__i386__) - << "x86" + << "x86" #elif defined(_M_X64) || defined(__x86_64__) - << "amd64" + << "amd64" #elif defined(_M_IA64) || defined(__ia64__) - << "itanium" + << "itanium" #elif defined(__ppc__) || defined(__powerpc__) - << "ppc32" + << "ppc32" #elif defined(__powerpc64__) - << "ppc64" + << "ppc64" #elif defined(__arm__) - << "arm" + << "arm" #else - << "" + << "" #endif - << " " + << " " #if defined(ASSIMP_BUILD_COMPILER) - << ( ASSIMP_BUILD_COMPILER ) + << (ASSIMP_BUILD_COMPILER) #elif defined(_MSC_VER) - << "msvc" + << "msvc" #elif defined(__GNUC__) - << "gcc" + << "gcc" +#elif defined(__clang__) + << "clang" +#elif defined(__EMSCRIPTEN__) + << "emscripten" +#elif defined(__MINGW32__) + << "MinGW-w64 32bit" +#elif defined(__MINGW64__) + << "MinGW-w64 64bit" #else - << "" + << "" #endif #ifdef ASSIMP_BUILD_DEBUG - << " debug" + << " debug" #endif - << (flags & ASSIMP_CFLAGS_NOBOOST ? " noboost" : "") - << (flags & ASSIMP_CFLAGS_SHARED ? " shared" : "") - << (flags & ASSIMP_CFLAGS_SINGLETHREADED ? " singlethreaded" : ""); + << (flags & ASSIMP_CFLAGS_NOBOOST ? " noboost" : "") + << (flags & ASSIMP_CFLAGS_SHARED ? " shared" : "") + << (flags & ASSIMP_CFLAGS_SINGLETHREADED ? " singlethreaded" : "") + << (flags & ASSIMP_CFLAGS_DOUBLE_SUPPORT ? " double : " : "single : "); - ASSIMP_LOG_DEBUG(stream.str()); + ASSIMP_LOG_DEBUG(stream.str()); } // ------------------------------------------------------------------------------------------------ diff --git a/code/Common/Version.cpp b/code/Common/Version.cpp index 5698defbf..b040ab729 100644 --- a/code/Common/Version.cpp +++ b/code/Common/Version.cpp @@ -104,6 +104,9 @@ ASSIMP_API unsigned int aiGetCompileFlags() { #ifdef _STLPORT_VERSION flags |= ASSIMP_CFLAGS_STLPORT; #endif +#ifdef ASSIMP_DOUBLE_PRECISION + flags |= ASSIMP_CFLAGS_DOUBLE_SUPPORT; +#endif return flags; } @@ -113,13 +116,29 @@ ASSIMP_API unsigned int aiGetVersionRevision() { return GitVersion; } +// ------------------------------------------------------------------------------------------------ ASSIMP_API const char *aiGetBranchName() { return GitBranch; } // ------------------------------------------------------------------------------------------------ ASSIMP_API aiScene::aiScene() : - mFlags(0), mRootNode(nullptr), mNumMeshes(0), mMeshes(nullptr), mNumMaterials(0), mMaterials(nullptr), mNumAnimations(0), mAnimations(nullptr), mNumTextures(0), mTextures(nullptr), mNumLights(0), mLights(nullptr), mNumCameras(0), mCameras(nullptr), mMetaData(nullptr), mPrivate(new Assimp::ScenePrivateData()) { + mFlags(0), + mRootNode(nullptr), + mNumMeshes(0), + mMeshes(nullptr), + mNumMaterials(0), + mMaterials(nullptr), + mNumAnimations(0), + mAnimations(nullptr), + mNumTextures(0), + mTextures(nullptr), + mNumLights(0), + mLights(nullptr), + mNumCameras(0), + mCameras(nullptr), + mMetaData(nullptr), + mPrivate(new Assimp::ScenePrivateData()) { // empty } diff --git a/include/assimp/version.h b/include/assimp/version.h index 6709eaf39..16a7b1402 100644 --- a/include/assimp/version.h +++ b/include/assimp/version.h @@ -5,8 +5,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2020, assimp team - - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -91,7 +89,7 @@ ASSIMP_API unsigned int aiGetVersionMajor (void); ASSIMP_API unsigned int aiGetVersionRevision (void); // --------------------------------------------------------------------------- -/** @brief Returns the branchname of the Assimp runtime. +/** @brief Returns the branch-name of the Assimp runtime. * @return The current branch name. */ ASSIMP_API const char *aiGetBranchName(); @@ -107,12 +105,14 @@ ASSIMP_API const char *aiGetBranchName(); #define ASSIMP_CFLAGS_NOBOOST 0x8 //! Assimp was compiled with ASSIMP_BUILD_SINGLETHREADED defined #define ASSIMP_CFLAGS_SINGLETHREADED 0x10 +//! Assimp was compiled with ASSIMP_BUILD_SINGLETHREADED defined +#define ASSIMP_CFLAGS_DOUBLE_SUPPORT 0x20 // --------------------------------------------------------------------------- /** @brief Returns assimp's compile flags * @return Any bitwise combination of the ASSIMP_CFLAGS_xxx constants. */ -ASSIMP_API unsigned int aiGetCompileFlags (void); +ASSIMP_API unsigned int aiGetCompileFlags(void); #ifdef __cplusplus } // end extern "C" From aaea564cbe37b47059272a103d8581b7a71b455e Mon Sep 17 00:00:00 2001 From: kimkulling Date: Fri, 7 Aug 2020 16:14:44 +0200 Subject: [PATCH 076/129] closes https://github.com/assimp/assimp/issues/3004 : use prefix when ms_tools were found. --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0244a73ef..42161c6d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -684,7 +684,8 @@ if(WIN32) ENDIF() IF(MSVC_TOOLSET_VERSION) - set(MSVC_PREFIX "vc${MSVC_TOOLSET_VERSION}") + SET(MSVC_PREFIX "vc${MSVC_TOOLSET_VERSION}") + SET(ASSIMP_MSVC_VERSION ${MCVS_PREFIX}) ELSE() IF(MSVC12) SET(ASSIMP_MSVC_VERSION "vc120") From 29b72fe6d47daac902d084c9b7d3be4e75295de0 Mon Sep 17 00:00:00 2001 From: kimkulling Date: Fri, 7 Aug 2020 16:22:34 +0200 Subject: [PATCH 077/129] fix cmake warning --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 42161c6d2..36766c7e5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -258,7 +258,7 @@ IF ((CMAKE_C_COMPILER_ID MATCHES "GNU") AND NOT CMAKE_COMPILER_IS_MINGW) SET(LIBSTDC++_LIBRARIES -lstdc++) ELSEIF(MSVC) # enable multi-core compilation with MSVC - IF( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) # clang-cl + IF( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" ) # clang-cl ADD_COMPILE_OPTIONS(/bigobj /W4 /WX ) ELSE() # msvc ADD_COMPILE_OPTIONS(/MP /bigobj /W4 /WX) @@ -268,7 +268,7 @@ ELSEIF(MSVC) ADD_COMPILE_OPTIONS(/wd4351) ENDIF() SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /D_DEBUG /Zi /Od") -ELSEIF ( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) +ELSEIF ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" ) IF(NOT ASSIMP_HUNTER_ENABLED) SET(CMAKE_CXX_STANDARD 11) SET(CMAKE_POSITION_INDEPENDENT_CODE ON) From 30d83d40c168d7ee7d08f3a3f66f623be6b9e0a2 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Fri, 7 Aug 2020 19:15:28 +0200 Subject: [PATCH 078/129] fix brackets for template in template --- include/assimp/BaseImporter.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/include/assimp/BaseImporter.h b/include/assimp/BaseImporter.h index e6ff2e68d..06c337853 100644 --- a/include/assimp/BaseImporter.h +++ b/include/assimp/BaseImporter.h @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2020, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -40,7 +39,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ -/** @file Definition of the base class for all importer worker classes. */ +/// @file Definition of the base class for all importer worker classes. + #pragma once #ifndef INCLUDED_AI_BASEIMPORTER_H #define INCLUDED_AI_BASEIMPORTER_H @@ -87,10 +87,6 @@ class IOStream; class ASSIMP_API BaseImporter { friend class Importer; -private: - /* Pushes state into importer for the importer scale */ - virtual void UpdateImporterScale(Importer *pImp); - public: /** Constructor to be privately used by #Importer */ BaseImporter() AI_NO_EXCEPT; @@ -399,7 +395,7 @@ public: // static utilities * @param numOut The output count of elements copied. */ template AI_FORCE_INLINE static void CopyVector( - std::vector> &vec, + std::vector > &vec, T **&out, unsigned int &outLength) { outLength = unsigned(vec.size()); @@ -410,7 +406,11 @@ public: // static utilities } } -protected: +private: + /* Pushes state into importer for the importer scale */ + virtual void UpdateImporterScale(Importer *pImp); + + protected: /// Error description in case there was one. std::string m_ErrorText; /// Currently set progress handler. From 11daed69d32ba58a820d9029abd0fe12b346ffc0 Mon Sep 17 00:00:00 2001 From: Marc-Antoine Lortie Date: Fri, 7 Aug 2020 16:04:39 -0400 Subject: [PATCH 079/129] Fixed overwriting of CMake global output directory variables. --- CMakeLists.txt | 27 ++++++++++--------- code/CMakeLists.txt | 2 ++ samples/SimpleOpenGL/CMakeLists.txt | 2 ++ .../SimpleTexturedDirectx11/CMakeLists.txt | 2 ++ samples/SimpleTexturedOpenGL/CMakeLists.txt | 2 ++ test/CMakeLists.txt | 2 ++ tools/assimp_cmd/CMakeLists.txt | 2 ++ tools/assimp_view/CMakeLists.txt | 2 ++ 8 files changed, 28 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0244a73ef..0681e11a4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -333,19 +333,20 @@ ENDIF() INCLUDE (FindPkgMacros) INCLUDE (PrecompiledHeader) -# If this is an in-source build (CMAKE_SOURCE_DIR == CMAKE_BINARY_DIR), -# write the library/executable files to the respective directories in the -# source tree. During an out-of-source build, however, do not litter this -# directory, since that is probably what the user wanted to avoid. -IF ( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR ) - SET( CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_HOME_DIRECTORY}/bin" ) - SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_HOME_DIRECTORY}/lib" ) - SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_HOME_DIRECTORY}/bin" ) -ELSE() - SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib") - SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") - SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") -ENDIF () +# Set Assimp project output directory variables. +SET(ASSIMP_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") +SET(ASSIMP_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") +SET(ASSIMP_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib") + +# Macro used to set the output directories of a target to the +# respective Assimp output directories. +MACRO(TARGET_USE_COMMON_OUTPUT_DIRECTORY target) + set_target_properties(${target} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${ASSIMP_RUNTIME_OUTPUT_DIRECTORY} + LIBRARY_OUTPUT_DIRECTORY ${ASSIMP_LIBRARY_OUTPUT_DIRECTORY} + ARCHIVE_OUTPUT_DIRECTORY ${ASSIMP_ARCHIVE_OUTPUT_DIRECTORY} + ) +ENDMACRO() get_cmake_property(is_multi_config GENERATOR_IS_MULTI_CONFIG) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 7ccc6439f..9fafa4944 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1136,6 +1136,8 @@ ENDIF () ADD_LIBRARY( assimp ${assimp_src} ) ADD_LIBRARY(assimp::assimp ALIAS assimp) +TARGET_USE_COMMON_OUTPUT_DIRECTORY(assimp) + # enable warnings as errors ######################################## IF (MSVC) TARGET_COMPILE_OPTIONS(assimp PRIVATE /WX) diff --git a/samples/SimpleOpenGL/CMakeLists.txt b/samples/SimpleOpenGL/CMakeLists.txt index 6bc8e37e6..ba5deb4cf 100644 --- a/samples/SimpleOpenGL/CMakeLists.txt +++ b/samples/SimpleOpenGL/CMakeLists.txt @@ -44,6 +44,8 @@ ADD_EXECUTABLE( ${SAMPLE_PROJECT_NAME} Sample_SimpleOpenGL.c ) +TARGET_USE_COMMON_OUTPUT_DIRECTORY(${SAMPLE_PROJECT_NAME}) + SET_PROPERTY(TARGET ${SAMPLE_PROJECT_NAME} PROPERTY DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}) TARGET_LINK_LIBRARIES( ${SAMPLE_PROJECT_NAME} assimp ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES} ${M_LIB} ) diff --git a/samples/SimpleTexturedDirectx11/CMakeLists.txt b/samples/SimpleTexturedDirectx11/CMakeLists.txt index 9eec738f5..82144caa9 100644 --- a/samples/SimpleTexturedDirectx11/CMakeLists.txt +++ b/samples/SimpleTexturedDirectx11/CMakeLists.txt @@ -37,6 +37,8 @@ ADD_EXECUTABLE( assimp_simpletextureddirectx11 WIN32 ${SAMPLES_SHARED_CODE_DIR}/UTFConverter.h ) +TARGET_USE_COMMON_OUTPUT_DIRECTORY(assimp_simpletextureddirectx11) + SET_PROPERTY(TARGET assimp_simpletextureddirectx11 PROPERTY DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}) TARGET_LINK_LIBRARIES( assimp_simpletextureddirectx11 assimp comctl32.lib winmm.lib ) diff --git a/samples/SimpleTexturedOpenGL/CMakeLists.txt b/samples/SimpleTexturedOpenGL/CMakeLists.txt index 83cd2746e..1837af033 100644 --- a/samples/SimpleTexturedOpenGL/CMakeLists.txt +++ b/samples/SimpleTexturedOpenGL/CMakeLists.txt @@ -34,6 +34,8 @@ ADD_EXECUTABLE( assimp_simpletexturedogl WIN32 ${SAMPLES_SHARED_CODE_DIR}/UTFConverter.h ) +TARGET_USE_COMMON_OUTPUT_DIRECTORY(assimp_simpletexturedogl) + SET_PROPERTY(TARGET assimp_simpletexturedogl PROPERTY DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}) TARGET_LINK_LIBRARIES( assimp_simpletexturedogl assimp ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES} ) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 8e1746ce2..ff4d51d78 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -208,6 +208,8 @@ add_executable( unit ${POST_PROCESSES} ) +TARGET_USE_COMMON_OUTPUT_DIRECTORY(unit) + add_definitions(-DASSIMP_TEST_MODELS_DIR="${CMAKE_CURRENT_LIST_DIR}/models") add_definitions(-DASSIMP_TEST_MODELS_NONBSD_DIR="${CMAKE_CURRENT_LIST_DIR}/models-nonbsd") diff --git a/tools/assimp_cmd/CMakeLists.txt b/tools/assimp_cmd/CMakeLists.txt index d46d09c2b..a0eb98a89 100644 --- a/tools/assimp_cmd/CMakeLists.txt +++ b/tools/assimp_cmd/CMakeLists.txt @@ -59,6 +59,8 @@ ADD_EXECUTABLE( assimp_cmd Export.cpp ) +TARGET_USE_COMMON_OUTPUT_DIRECTORY(assimp_cmd) + SET_PROPERTY(TARGET assimp_cmd PROPERTY DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}) TARGET_LINK_LIBRARIES( assimp_cmd assimp ${ZLIB_LIBRARIES} ) diff --git a/tools/assimp_view/CMakeLists.txt b/tools/assimp_view/CMakeLists.txt index 2785bd882..222722388 100644 --- a/tools/assimp_view/CMakeLists.txt +++ b/tools/assimp_view/CMakeLists.txt @@ -86,6 +86,8 @@ ADD_EXECUTABLE( assimp_viewer WIN32 txi.bmp ) +TARGET_USE_COMMON_OUTPUT_DIRECTORY(assimp_viewer) + SET_PROPERTY(TARGET assimp_viewer PROPERTY DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}) IF ( MSVC ) From fbd9c9651dd04d4a6140402b004e6dde1c82b7e3 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sat, 8 Aug 2020 09:06:41 +0200 Subject: [PATCH 080/129] fix clang detection --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 36766c7e5..42161c6d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -258,7 +258,7 @@ IF ((CMAKE_C_COMPILER_ID MATCHES "GNU") AND NOT CMAKE_COMPILER_IS_MINGW) SET(LIBSTDC++_LIBRARIES -lstdc++) ELSEIF(MSVC) # enable multi-core compilation with MSVC - IF( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" ) # clang-cl + IF( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) # clang-cl ADD_COMPILE_OPTIONS(/bigobj /W4 /WX ) ELSE() # msvc ADD_COMPILE_OPTIONS(/MP /bigobj /W4 /WX) @@ -268,7 +268,7 @@ ELSEIF(MSVC) ADD_COMPILE_OPTIONS(/wd4351) ENDIF() SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /D_DEBUG /Zi /Od") -ELSEIF ( CMAKE_CXX_COMPILER_ID STREQUAL "Clang" ) +ELSEIF ( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) IF(NOT ASSIMP_HUNTER_ENABLED) SET(CMAKE_CXX_STANDARD 11) SET(CMAKE_POSITION_INDEPENDENT_CODE ON) From 729882debba7c01ac0c7992eb9c84a178d01511c Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 11 Aug 2020 19:57:36 +0200 Subject: [PATCH 081/129] Fix incorrect index closes https://github.com/assimp/assimp/issues/3364 --- code/Common/StandardShapes.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/Common/StandardShapes.cpp b/code/Common/StandardShapes.cpp index b30fa2e25..99029a925 100644 --- a/code/Common/StandardShapes.cpp +++ b/code/Common/StandardShapes.cpp @@ -139,7 +139,7 @@ aiMesh *StandardShapes::MakeMesh(const std::vector &positions, aiFace &f = out->mFaces[i]; f.mNumIndices = numIndices; f.mIndices = new unsigned int[numIndices]; - for (unsigned int j = 0; i < numIndices; ++i, ++a) { + for (unsigned int j = 0; j < numIndices; ++j, ++a) { f.mIndices[j] = a; } } From 153a6efecc3de7d090b577f9c0391f39e1a9a3c1 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 11 Aug 2020 20:02:14 +0200 Subject: [PATCH 082/129] Add test --- test/unit/Common/utStandardShapes.cpp | 54 +++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 test/unit/Common/utStandardShapes.cpp diff --git a/test/unit/Common/utStandardShapes.cpp b/test/unit/Common/utStandardShapes.cpp new file mode 100644 index 000000000..2a6d30651 --- /dev/null +++ b/test/unit/Common/utStandardShapes.cpp @@ -0,0 +1,54 @@ +/* +Open Asset Import Library (assimp) +---------------------------------------------------------------------- +Copyright (c) 2006-2020, assimp team +All rights reserved. +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the +following conditions are met: +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +---------------------------------------------------------------------- +*/#include "UnitTestPCH.h" +#include + +using namespace Assimp; + +class utStandardShapes : public ::testing::Test { + // empty +}; + +TEST_F( utStandardShapes, testMakeMesh ) { + // Make sphere positions + std::vector positions; + Assimp::StandardShapes::MakeSphere(1, positions); + + // Make mesh + const auto numIndicesPerPrimitive = 3; + auto aiMeshPtr = Assimp::StandardShapes::MakeMesh(positions, numIndicesPerPrimitive); + + // The mNumIndices member of the second face is now incorrect + const auto& face = aiMeshPtr->mFaces[0]; + EXPECT_EQ(face.mNumIndices, numIndicesPerPrimitive); +} + From 45f76f36f3ad1f093ce048cff0bbd135f0e35387 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 11 Aug 2020 20:03:23 +0200 Subject: [PATCH 083/129] Add test to CMakeLists --- test/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index ff4d51d78..5a150482d 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -2,8 +2,7 @@ # ---------------------------------------------------------------------- # # Copyright (c) 2006-2020, assimp team - - +# # All rights reserved. # # Redistribution and use of this software in source and binary forms, @@ -40,8 +39,8 @@ cmake_minimum_required( VERSION 3.0 ) INCLUDE_DIRECTORIES( - ${Assimp_SOURCE_DIR}/contrib/gtest/include - ${Assimp_SOURCE_DIR}/contrib/gtest/ + ${Assimp_SOURCE_DIR}/contrib/gtest/include + ${Assimp_SOURCE_DIR}/contrib/gtest/ ${Assimp_SOURCE_DIR}/test/unit ${Assimp_SOURCE_DIR}/include ${Assimp_SOURCE_DIR}/code @@ -84,6 +83,7 @@ SET( COMMON unit/utProfiler.cpp unit/utSharedPPData.cpp unit/utStringUtils.cpp + unit/Common/utStandardShapes.cpp unit/Common/uiScene.cpp unit/Common/utLineSplitter.cpp unit/Common/utSpatialSort.cpp From 9bad20e99e27bafd3574ebf998d21be40214d717 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 11 Aug 2020 20:03:30 +0200 Subject: [PATCH 084/129] Add test to CMakeLists From b1b9fa94cfcca5706bcde81a2410c81809d70e7e Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 11 Aug 2020 20:21:35 +0200 Subject: [PATCH 085/129] Update utStandardShapes.cpp --- test/unit/Common/utStandardShapes.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/unit/Common/utStandardShapes.cpp b/test/unit/Common/utStandardShapes.cpp index 2a6d30651..8b333b08d 100644 --- a/test/unit/Common/utStandardShapes.cpp +++ b/test/unit/Common/utStandardShapes.cpp @@ -29,7 +29,9 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- -*/#include "UnitTestPCH.h" +*/ +#include "UnitTestPCH.h" +#include #include using namespace Assimp; From 1bbae197792549269149a1a261d1c361cf8adcd7 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Tue, 11 Aug 2020 20:28:12 +0200 Subject: [PATCH 086/129] Fix leak --- test/unit/Common/utStandardShapes.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/unit/Common/utStandardShapes.cpp b/test/unit/Common/utStandardShapes.cpp index 8b333b08d..8469fecd6 100644 --- a/test/unit/Common/utStandardShapes.cpp +++ b/test/unit/Common/utStandardShapes.cpp @@ -47,10 +47,11 @@ TEST_F( utStandardShapes, testMakeMesh ) { // Make mesh const auto numIndicesPerPrimitive = 3; - auto aiMeshPtr = Assimp::StandardShapes::MakeMesh(positions, numIndicesPerPrimitive); + aiMesh *aiMeshPtr = Assimp::StandardShapes::MakeMesh(positions, numIndicesPerPrimitive); // The mNumIndices member of the second face is now incorrect const auto& face = aiMeshPtr->mFaces[0]; EXPECT_EQ(face.mNumIndices, numIndicesPerPrimitive); + delete aiMeshPtr; } From 0d00ff704341da5c65b6010b6af66a41e607dab0 Mon Sep 17 00:00:00 2001 From: lsliegeo Date: Sat, 15 Aug 2020 14:57:49 +0200 Subject: [PATCH 087/129] use ai_real instead of float --- code/AssetLib/NFF/NFFLoader.cpp | 12 ++++++------ code/AssetLib/NFF/NFFLoader.h | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/AssetLib/NFF/NFFLoader.cpp b/code/AssetLib/NFF/NFFLoader.cpp index 8d85b5acf..a5e6c8c7a 100644 --- a/code/AssetLib/NFF/NFFLoader.cpp +++ b/code/AssetLib/NFF/NFFLoader.cpp @@ -96,7 +96,7 @@ const aiImporterDesc *NFFImporter::GetInfo() const { // ------------------------------------------------------------------------------------------------ #define AI_NFF_PARSE_FLOAT(f) \ SkipSpaces(&sz); \ - if (!::IsLineEnd(*sz)) sz = fast_atoreal_move(sz, (float &)f); + if (!::IsLineEnd(*sz)) sz = fast_atoreal_move(sz, (ai_real &)f); // ------------------------------------------------------------------------------------------------ #define AI_NFF_PARSE_TRIPLE(v) \ @@ -233,7 +233,7 @@ void NFFImporter::InternReadFile(const std::string &pFile, // camera parameters aiVector3D camPos, camUp(0.f, 1.f, 0.f), camLookAt(0.f, 0.f, 1.f); - float angle = 45.f; + ai_real angle = 45.f; aiVector2D resolution; bool hasCam = false; @@ -262,7 +262,7 @@ void NFFImporter::InternReadFile(const std::string &pFile, // check whether this is the NFF2 file format if (TokenMatch(buffer, "nff", 3)) { - const float qnan = get_qnan(); + const ai_real qnan = get_qnan(); const aiColor4D cQNAN = aiColor4D(qnan, 0.f, 0.f, 1.f); const aiVector3D vQNAN = aiVector3D(qnan, 0.f, 0.f); @@ -706,7 +706,7 @@ void NFFImporter::InternReadFile(const std::string &pFile, } // 'f' - shading information block else if (TokenMatch(sz, "f", 1)) { - float d; + ai_real d; // read the RGB colors AI_NFF_PARSE_TRIPLE(s.color); @@ -856,7 +856,7 @@ void NFFImporter::InternReadFile(const std::string &pFile, // read the two center points and the respective radii aiVector3D center1, center2; - float radius1 = 0.f, radius2 = 0.f; + ai_real radius1 = 0.f, radius2 = 0.f; AI_NFF_PARSE_TRIPLE(center1); AI_NFF_PARSE_FLOAT(radius1); @@ -874,7 +874,7 @@ void NFFImporter::InternReadFile(const std::string &pFile, curMesh.dir = center2 - center1; curMesh.center = center1 + curMesh.dir / (ai_real)2.0; - float f; + ai_real f; if ((f = curMesh.dir.Length()) < 10e-3f) { ASSIMP_LOG_ERROR("NFF: Cone height is close to zero"); continue; diff --git a/code/AssetLib/NFF/NFFLoader.h b/code/AssetLib/NFF/NFFLoader.h index 524310b0e..84c4ed4e3 100644 --- a/code/AssetLib/NFF/NFFLoader.h +++ b/code/AssetLib/NFF/NFFLoader.h @@ -113,14 +113,14 @@ private: {} aiColor3D color,diffuse,specular,ambient,emissive; - float refracti; + ai_real refracti; std::string texFile; // For NFF2 bool twoSided; bool shaded; - float opacity, shininess; + ai_real opacity, shininess; std::string name; @@ -155,7 +155,7 @@ private: {} aiVector3D position; - float intensity; + ai_real intensity; aiColor3D color; }; From 995ab805ff31681c2dfbc2c02d0e142560ee77d2 Mon Sep 17 00:00:00 2001 From: "Arthur (fuj1n) Uzulin" Date: Mon, 17 Aug 2020 17:54:48 +1000 Subject: [PATCH 088/129] Update utf8cpp to fix use of C++17 deprecated feature --- contrib/utf8cpp/source/utf8/checked.h | 62 +++++++------- contrib/utf8cpp/source/utf8/core.h | 43 ++++++---- contrib/utf8cpp/source/utf8/cpp11.h | 103 ++++++++++++++++++++++++ contrib/utf8cpp/source/utf8/unchecked.h | 78 ++++++++++++++---- 4 files changed, 225 insertions(+), 61 deletions(-) create mode 100644 contrib/utf8cpp/source/utf8/cpp11.h diff --git a/contrib/utf8cpp/source/utf8/checked.h b/contrib/utf8cpp/source/utf8/checked.h index 133115513..648636e46 100644 --- a/contrib/utf8cpp/source/utf8/checked.h +++ b/contrib/utf8cpp/source/utf8/checked.h @@ -1,4 +1,4 @@ -// Copyright 2006 Nemanja Trifunovic +// Copyright 2006-2016 Nemanja Trifunovic /* Permission is hereby granted, free of charge, to any person or organization @@ -41,8 +41,8 @@ namespace utf8 class invalid_code_point : public exception { uint32_t cp; public: - invalid_code_point(uint32_t cp) : cp(cp) {} - virtual const char* what() const throw() { return "Invalid code point"; } + invalid_code_point(uint32_t codepoint) : cp(codepoint) {} + virtual const char* what() const NOEXCEPT OVERRIDE { return "Invalid code point"; } uint32_t code_point() const {return cp;} }; @@ -50,7 +50,7 @@ namespace utf8 uint8_t u8; public: invalid_utf8 (uint8_t u) : u8(u) {} - virtual const char* what() const throw() { return "Invalid UTF-8"; } + virtual const char* what() const NOEXCEPT OVERRIDE { return "Invalid UTF-8"; } uint8_t utf8_octet() const {return u8;} }; @@ -58,13 +58,13 @@ namespace utf8 uint16_t u16; public: invalid_utf16 (uint16_t u) : u16(u) {} - virtual const char* what() const throw() { return "Invalid UTF-16"; } + virtual const char* what() const NOEXCEPT OVERRIDE { return "Invalid UTF-16"; } uint16_t utf16_word() const {return u16;} }; class not_enough_room : public exception { public: - virtual const char* what() const throw() { return "Not enough space"; } + virtual const char* what() const NOEXCEPT OVERRIDE { return "Not enough space"; } }; /// The library API - functions intended to be called by the users @@ -107,7 +107,9 @@ namespace utf8 *out++ = *it; break; case internal::NOT_ENOUGH_ROOM: - throw not_enough_room(); + out = utf8::append (replacement, out); + start = end; + break; case internal::INVALID_LEAD: out = utf8::append (replacement, out); ++start; @@ -174,23 +176,19 @@ namespace utf8 return utf8::peek_next(it, end); } - /// Deprecated in versions that include "prior" - template - uint32_t previous(octet_iterator& it, octet_iterator pass_start) - { - octet_iterator end = it; - while (utf8::internal::is_trail(*(--it))) - if (it == pass_start) - throw invalid_utf8(*it); // error - no lead byte in the sequence - octet_iterator temp = it; - return utf8::next(temp, end); - } - template void advance (octet_iterator& it, distance_type n, octet_iterator end) { - for (distance_type i = 0; i < n; ++i) - utf8::next(it, end); + const distance_type zero(0); + if (n < zero) { + // backward + for (distance_type i = n; i < zero; ++i) + utf8::prior(it, end); + } else { + // forward + for (distance_type i = zero; i < n; ++i) + utf8::next(it, end); + } } template @@ -233,7 +231,7 @@ namespace utf8 template u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result) { - while (start != end) { + while (start < end) { uint32_t cp = utf8::next(start, end); if (cp > 0xffff) { //make a surrogate pair *result++ = static_cast((cp >> 10) + internal::LEAD_OFFSET); @@ -257,7 +255,7 @@ namespace utf8 template u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result) { - while (start != end) + while (start < end) (*result++) = utf8::next(start, end); return result; @@ -265,16 +263,21 @@ namespace utf8 // The iterator class template - class iterator : public std::iterator { + class iterator { octet_iterator it; octet_iterator range_start; octet_iterator range_end; public: + typedef uint32_t value_type; + typedef uint32_t* pointer; + typedef uint32_t& reference; + typedef std::ptrdiff_t difference_type; + typedef std::bidirectional_iterator_tag iterator_category; iterator () {} explicit iterator (const octet_iterator& octet_it, - const octet_iterator& range_start, - const octet_iterator& range_end) : - it(octet_it), range_start(range_start), range_end(range_end) + const octet_iterator& rangestart, + const octet_iterator& rangeend) : + it(octet_it), range_start(rangestart), range_end(rangeend) { if (it < range_start || it > range_end) throw std::out_of_range("Invalid utf-8 iterator position"); @@ -322,6 +325,9 @@ namespace utf8 } // namespace utf8 +#if UTF_CPP_CPLUSPLUS >= 201103L // C++ 11 or later +#include "cpp11.h" +#endif // C++ 11 or later + #endif //header guard - diff --git a/contrib/utf8cpp/source/utf8/core.h b/contrib/utf8cpp/source/utf8/core.h index 693d388c0..244e89231 100644 --- a/contrib/utf8cpp/source/utf8/core.h +++ b/contrib/utf8cpp/source/utf8/core.h @@ -30,6 +30,23 @@ DEALINGS IN THE SOFTWARE. #include +// Determine the C++ standard version. +// If the user defines UTF_CPP_CPLUSPLUS, use that. +// Otherwise, trust the unreliable predefined macro __cplusplus + +#if !defined UTF_CPP_CPLUSPLUS + #define UTF_CPP_CPLUSPLUS __cplusplus +#endif + +#if UTF_CPP_CPLUSPLUS >= 201103L // C++ 11 or later + #define OVERRIDE override + #define NOEXCEPT noexcept +#else // C++ 98/03 + #define OVERRIDE + #define NOEXCEPT throw() +#endif // C++ 11 or later + + namespace utf8 { // The typedefs for 8-bit, 16-bit and 32-bit unsigned integers @@ -49,8 +66,8 @@ namespace internal const uint16_t LEAD_SURROGATE_MAX = 0xdbffu; const uint16_t TRAIL_SURROGATE_MIN = 0xdc00u; const uint16_t TRAIL_SURROGATE_MAX = 0xdfffu; - const uint16_t LEAD_OFFSET = LEAD_SURROGATE_MIN - (0x10000 >> 10); - const uint32_t SURROGATE_OFFSET = 0x10000u - (LEAD_SURROGATE_MIN << 10) - TRAIL_SURROGATE_MIN; + const uint16_t LEAD_OFFSET = 0xd7c0u; // LEAD_SURROGATE_MIN - (0x10000 >> 10) + const uint32_t SURROGATE_OFFSET = 0xfca02400u; // 0x10000u - (LEAD_SURROGATE_MIN << 10) - TRAIL_SURROGATE_MIN // Maximum valid value for a Unicode code point const uint32_t CODE_POINT_MAX = 0x0010ffffu; @@ -142,7 +159,7 @@ namespace internal if (!utf8::internal::is_trail(*it)) return INCOMPLETE_SEQUENCE; - + return UTF8_OK; } @@ -165,7 +182,7 @@ namespace internal { if (it == end) return NOT_ENOUGH_ROOM; - + code_point = utf8::internal::mask8(*it); UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end) @@ -222,6 +239,9 @@ namespace internal template utf_error validate_next(octet_iterator& it, octet_iterator end, uint32_t& code_point) { + if (it == end) + return NOT_ENOUGH_ROOM; + // Save the original value of it so we can go back in case of failure // Of course, it does not make much sense with i.e. stream iterators octet_iterator original_it = it; @@ -234,7 +254,7 @@ namespace internal // Get trail octets and calculate the code point utf_error err = UTF8_OK; switch (length) { - case 0: + case 0: return INVALID_LEAD; case 1: err = utf8::internal::get_sequence_1(it, end, cp); @@ -310,18 +330,7 @@ namespace internal ((it != end) && (utf8::internal::mask8(*it++)) == bom[1]) && ((it != end) && (utf8::internal::mask8(*it)) == bom[2]) ); - } - - //Deprecated in release 2.3 - template - inline bool is_bom (octet_iterator it) - { - return ( - (utf8::internal::mask8(*it++)) == bom[0] && - (utf8::internal::mask8(*it++)) == bom[1] && - (utf8::internal::mask8(*it)) == bom[2] - ); - } + } } // namespace utf8 #endif // header guard diff --git a/contrib/utf8cpp/source/utf8/cpp11.h b/contrib/utf8cpp/source/utf8/cpp11.h new file mode 100644 index 000000000..d93961b04 --- /dev/null +++ b/contrib/utf8cpp/source/utf8/cpp11.h @@ -0,0 +1,103 @@ +// Copyright 2018 Nemanja Trifunovic + +/* +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +*/ + + +#ifndef UTF8_FOR_CPP_a184c22c_d012_11e8_a8d5_f2801f1b9fd1 +#define UTF8_FOR_CPP_a184c22c_d012_11e8_a8d5_f2801f1b9fd1 + +#include "checked.h" +#include + +namespace utf8 +{ + + inline void append(char32_t cp, std::string& s) + { + append(uint32_t(cp), std::back_inserter(s)); + } + + inline std::string utf16to8(const std::u16string& s) + { + std::string result; + utf16to8(s.begin(), s.end(), std::back_inserter(result)); + return result; + } + + inline std::u16string utf8to16(const std::string& s) + { + std::u16string result; + utf8to16(s.begin(), s.end(), std::back_inserter(result)); + return result; + } + + inline std::string utf32to8(const std::u32string& s) + { + std::string result; + utf32to8(s.begin(), s.end(), std::back_inserter(result)); + return result; + } + + inline std::u32string utf8to32(const std::string& s) + { + std::u32string result; + utf8to32(s.begin(), s.end(), std::back_inserter(result)); + return result; + } + + inline std::size_t find_invalid(const std::string& s) + { + std::string::const_iterator invalid = find_invalid(s.begin(), s.end()); + return (invalid == s.end()) ? std::string::npos : (invalid - s.begin()); + } + + inline bool is_valid(const std::string& s) + { + return is_valid(s.begin(), s.end()); + } + + inline std::string replace_invalid(const std::string& s, char32_t replacement) + { + std::string result; + replace_invalid(s.begin(), s.end(), std::back_inserter(result), replacement); + return result; + } + + inline std::string replace_invalid(const std::string& s) + { + std::string result; + replace_invalid(s.begin(), s.end(), std::back_inserter(result)); + return result; + } + + inline bool starts_with_bom(const std::string& s) + { + return starts_with_bom(s.begin(), s.end()); + } + +} // namespace utf8 + +#endif // header guard + diff --git a/contrib/utf8cpp/source/utf8/unchecked.h b/contrib/utf8cpp/source/utf8/unchecked.h index cb2427166..0e1b51cc7 100644 --- a/contrib/utf8cpp/source/utf8/unchecked.h +++ b/contrib/utf8cpp/source/utf8/unchecked.h @@ -32,13 +32,13 @@ DEALINGS IN THE SOFTWARE. namespace utf8 { - namespace unchecked + namespace unchecked { template octet_iterator append(uint32_t cp, octet_iterator result) { if (cp < 0x80) // one octet - *(result++) = static_cast(cp); + *(result++) = static_cast(cp); else if (cp < 0x800) { // two octets *(result++) = static_cast((cp >> 6) | 0xc0); *(result++) = static_cast((cp & 0x3f) | 0x80); @@ -57,6 +57,46 @@ namespace utf8 return result; } + template + output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement) + { + while (start != end) { + octet_iterator sequence_start = start; + internal::utf_error err_code = utf8::internal::validate_next(start, end); + switch (err_code) { + case internal::UTF8_OK : + for (octet_iterator it = sequence_start; it != start; ++it) + *out++ = *it; + break; + case internal::NOT_ENOUGH_ROOM: + out = utf8::unchecked::append (replacement, out); + start = end; + break; + case internal::INVALID_LEAD: + out = utf8::unchecked::append (replacement, out); + ++start; + break; + case internal::INCOMPLETE_SEQUENCE: + case internal::OVERLONG_SEQUENCE: + case internal::INVALID_CODE_POINT: + out = utf8::unchecked::append (replacement, out); + ++start; + // just one replacement mark for the sequence + while (start != end && utf8::internal::is_trail(*start)) + ++start; + break; + } + } + return out; + } + + template + inline output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out) + { + static const uint32_t replacement_marker = utf8::internal::mask16(0xfffd); + return utf8::unchecked::replace_invalid(start, end, out, replacement_marker); + } + template uint32_t next(octet_iterator& it) { @@ -85,13 +125,13 @@ namespace utf8 break; } ++it; - return cp; + return cp; } template uint32_t peek_next(octet_iterator it) { - return utf8::unchecked::next(it); + return utf8::unchecked::next(it); } template @@ -102,18 +142,19 @@ namespace utf8 return utf8::unchecked::next(temp); } - // Deprecated in versions that include prior, but only for the sake of consistency (see utf8::previous) - template - inline uint32_t previous(octet_iterator& it) - { - return utf8::unchecked::prior(it); - } - template void advance (octet_iterator& it, distance_type n) { - for (distance_type i = 0; i < n; ++i) - utf8::unchecked::next(it); + const distance_type zero(0); + if (n < zero) { + // backward + for (distance_type i = n; i < zero; ++i) + utf8::unchecked::prior(it); + } else { + // forward + for (distance_type i = zero; i < n; ++i) + utf8::unchecked::next(it); + } } template @@ -128,7 +169,7 @@ namespace utf8 template octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result) - { + { while (start != end) { uint32_t cp = utf8::internal::mask16(*start++); // Take care of surrogate pairs first @@ -138,7 +179,7 @@ namespace utf8 } result = utf8::unchecked::append(cp, result); } - return result; + return result; } template @@ -176,9 +217,14 @@ namespace utf8 // The iterator class template - class iterator : public std::iterator { + class iterator { octet_iterator it; public: + typedef uint32_t value_type; + typedef uint32_t* pointer; + typedef uint32_t& reference; + typedef std::ptrdiff_t difference_type; + typedef std::bidirectional_iterator_tag iterator_category; iterator () {} explicit iterator (const octet_iterator& octet_it): it(octet_it) {} // the default "big three" are OK From b1ed751b836a1613f532953e7de9c7bff9a4cc86 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Thu, 23 Jul 2020 15:07:24 +0100 Subject: [PATCH 089/129] Provide an API for accessing internal errors. --- code/Common/BaseImporter.cpp | 8 +++++++- code/Common/Importer.cpp | 14 ++++++++++++-- code/Common/Importer.h | 8 +++++++- include/assimp/BaseImporter.h | 16 ++++++++++++++-- include/assimp/Exceptional.h | 23 ++++++++++++----------- include/assimp/Importer.hpp | 11 +++++++++++ 6 files changed, 63 insertions(+), 17 deletions(-) diff --git a/code/Common/BaseImporter.cpp b/code/Common/BaseImporter.cpp index bcea076be..73e473527 100644 --- a/code/Common/BaseImporter.cpp +++ b/code/Common/BaseImporter.cpp @@ -130,11 +130,17 @@ aiScene *BaseImporter::ReadFile(Importer *pImp, const std::string &pFile, IOSyst // passes scale into ScaleProcess UpdateImporterScale(pImp); - } catch (const std::exception &err) { + } catch( const DeadlyImportError& err ) { // extract error description m_ErrorText = err.what(); ASSIMP_LOG_ERROR(m_ErrorText); return nullptr; + } catch( const std::exception& err ) { + // extract error description + m_ErrorText = "Internal error"; + ASSIMP_LOG_ERROR(err.what()); + m_internalException = std::current_exception(); + return nullptr; } // return what we gathered from the import. diff --git a/code/Common/Importer.cpp b/code/Common/Importer.cpp index fc50336b4..de72d3bc8 100644 --- a/code/Common/Importer.cpp +++ b/code/Common/Importer.cpp @@ -387,6 +387,7 @@ void Importer::FreeScene( ) { pimpl->mScene = nullptr; pimpl->mErrorString = ""; + pimpl->mInternalException = std::exception_ptr(); ASSIMP_END_EXCEPTION_REGION(void); } @@ -399,6 +400,13 @@ const char* Importer::GetErrorString() const { return pimpl->mErrorString.c_str(); } +const std::exception_ptr& Importer::GetInternalException() const { + ai_assert(nullptr != pimpl); + + // Must remain valid as long as ReadFile() or FreeFile() are not called + return pimpl->mInternalException; +} + // ------------------------------------------------------------------------------------------------ // Enable extra-verbose mode void Importer::SetExtraVerbose(bool bDo) { @@ -426,6 +434,7 @@ aiScene* Importer::GetOrphanedScene() { pimpl->mScene = nullptr; pimpl->mErrorString = ""; // reset error string + pimpl->mInternalException = std::exception_ptr(); ASSIMP_END_EXCEPTION_REGION(aiScene*); return s; @@ -502,7 +511,7 @@ const aiScene* Importer::ReadFileFromMemory( const void* pBuffer, ReadFile(fbuff,pFlags); SetIOHandler(io); - ASSIMP_END_EXCEPTION_REGION_WITH_ERROR_STRING(const aiScene*, pimpl->mErrorString); + ASSIMP_END_EXCEPTION_REGION_WITH_ERROR_STRING(const aiScene*, pimpl->mErrorString, pimpl->mInternalException); return pimpl->mScene; } @@ -709,6 +718,7 @@ const aiScene* Importer::ReadFile( const char* _pFile, unsigned int pFlags) { // if failed, extract the error string else if( !pimpl->mScene) { pimpl->mErrorString = imp->GetErrorText(); + pimpl->mInternalException = imp->GetInternalException(); } // clear any data allocated by post-process steps @@ -733,7 +743,7 @@ const aiScene* Importer::ReadFile( const char* _pFile, unsigned int pFlags) { #endif // ! ASSIMP_CATCH_GLOBAL_EXCEPTIONS // either successful or failure - the pointer expresses it anyways - ASSIMP_END_EXCEPTION_REGION_WITH_ERROR_STRING(const aiScene*, pimpl->mErrorString); + ASSIMP_END_EXCEPTION_REGION_WITH_ERROR_STRING(const aiScene*, pimpl->mErrorString, pimpl->mInternalException); return pimpl->mScene; } diff --git a/code/Common/Importer.h b/code/Common/Importer.h index eaf42e9c5..b9c223429 100644 --- a/code/Common/Importer.h +++ b/code/Common/Importer.h @@ -97,9 +97,14 @@ public: /** The imported data, if ReadFile() was successful, nullptr otherwise. */ aiScene* mScene; - /** The error description, if there was one. */ + /** The error description, if there was one. In the case of a + * failure not caused by a DeadlyImportError, mInternalException will + * carry the exception and this will be just "Internal error". */ std::string mErrorString; + /** Any exception which wasn't a DeadlyImportError */ + std::exception_ptr mInternalException; + /** List of integer properties */ IntPropertyMap mIntProperties; @@ -133,6 +138,7 @@ ImporterPimpl::ImporterPimpl() AI_NO_EXCEPT , mPostProcessingSteps() , mScene( nullptr ) , mErrorString() +, mInternalException() , mIntProperties() , mFloatProperties() , mStringProperties() diff --git a/include/assimp/BaseImporter.h b/include/assimp/BaseImporter.h index 06c337853..946a9da7c 100644 --- a/include/assimp/BaseImporter.h +++ b/include/assimp/BaseImporter.h @@ -150,6 +150,15 @@ public: return m_ErrorText; } + // ------------------------------------------------------------------- + /** Returns the exception of the last non-DeadlyImportError that occurred. + * @return A description of the last error that occurred. An empty + * string if there was no error. + */ + const std::exception_ptr& GetInternalException() const { + return m_internalException; + } + // ------------------------------------------------------------------- /** Called prior to ReadFile(). * The function is a request to the importer to update its configuration @@ -410,9 +419,12 @@ private: /* Pushes state into importer for the importer scale */ virtual void UpdateImporterScale(Importer *pImp); - protected: - /// Error description in case there was one. +protected: + /// Error description when a DeadlyImportError occurred during import. + /// In case of other errors, this will just be "Internal error" std::string m_ErrorText; + /// Any exception which wasn't due to the asset being incorrect. + std::exception_ptr m_internalException; /// Currently set progress handler. ProgressHandler *m_progress; }; diff --git a/include/assimp/Exceptional.h b/include/assimp/Exceptional.h index c10b2f982..bcd5fb7af 100644 --- a/include/assimp/Exceptional.h +++ b/include/assimp/Exceptional.h @@ -123,17 +123,18 @@ struct ExceptionSwallower { { \ try { -#define ASSIMP_END_EXCEPTION_REGION_WITH_ERROR_STRING(type, ASSIMP_END_EXCEPTION_REGION_errorString) \ - } \ - catch (const DeadlyImportError &e) { \ - ASSIMP_END_EXCEPTION_REGION_errorString = e.what(); \ - return ExceptionSwallower()(); \ - } \ - catch (...) { \ - ASSIMP_END_EXCEPTION_REGION_errorString = "Unknown exception"; \ - return ExceptionSwallower()(); \ - } \ - } +#define ASSIMP_END_EXCEPTION_REGION_WITH_ERROR_STRING(type, ASSIMP_END_EXCEPTION_REGION_errorString, ASSIMP_END_EXCEPTION_REGION_internalError) \ + } \ + catch (const DeadlyImportError &e) { \ + ASSIMP_END_EXCEPTION_REGION_errorString = e.what(); \ + return ExceptionSwallower()(); \ + } \ + catch (...) { \ + ASSIMP_END_EXCEPTION_REGION_errorString = "Internal error"; \ + ASSIMP_END_EXCEPTION_REGION_internalError = std::current_exception(); \ + return ExceptionSwallower()(); \ + } \ +} #define ASSIMP_END_EXCEPTION_REGION(type) \ } \ diff --git a/include/assimp/Importer.hpp b/include/assimp/Importer.hpp index 80eae78b3..9d1594982 100644 --- a/include/assimp/Importer.hpp +++ b/include/assimp/Importer.hpp @@ -495,6 +495,17 @@ public: * following methods is called: #ReadFile(), #FreeScene(). */ const char *GetErrorString() const; + // ------------------------------------------------------------------- + /** Returns Returns an internal exception if one occurred during import. + * + * Returns the last non-DeadlyImportError exception which occurred. + * @return The last exception which occurred which wasn't a + * DeadlyImportError. + * + * @note The returned value remains valid until one of the + * following methods is called: #ReadFile(), #FreeScene(). */ + const std::exception_ptr& GetInternalException() const; + // ------------------------------------------------------------------- /** Returns the scene loaded by the last successful call to ReadFile() * From 19cdfd12dfdf279e51fb248e013df2d3f09bef31 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Thu, 23 Jul 2020 15:58:18 +0100 Subject: [PATCH 090/129] Unit test for internal failures. --- test/unit/utImporter.cpp | 102 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/test/unit/utImporter.cpp b/test/unit/utImporter.cpp index 0be0037df..33d8cd1e0 100644 --- a/test/unit/utImporter.cpp +++ b/test/unit/utImporter.cpp @@ -279,3 +279,105 @@ TEST_F(ImporterTest, SearchFileHeaderForTokenTest) { //DefaultIOSystem ioSystem; // BaseImporter::SearchFileHeaderForToken( &ioSystem, assetPath, Token, 2 ) } + + +namespace +{ + // Description for an importer which fails in specific ways. + aiImporterDesc s_failingImporterDescription = { + "Failing importer", + "assimp team", + "", + "", + 0, + 1, + 0, + 1, + 0, + "fail" + }; + + // This importer fails in specific ways. + class FailingImporter : public Assimp::BaseImporter { + public: + virtual ~FailingImporter() = default; + virtual bool CanRead( const std::string&, Assimp::IOSystem*, bool ) const override + { + return true; + } + + protected: + virtual const aiImporterDesc* GetInfo() const { return &s_failingImporterDescription; } + + virtual void InternReadFile( const std::string& pFile, aiScene*, Assimp::IOSystem* ) override + { + if (pFile == "deadlyImportError.fail") + { + throw DeadlyImportError("Deadly import error test"); + } + else if (pFile == "stdException.fail") + { + throw std::exception("std::exception test"); + } + else if (pFile == "unexpectedException.fail") + { + throw 5; + } + } + }; +} + +TEST_F(ImporterTest, deadlyImportError) +{ + pImp->RegisterLoader(new FailingImporter); + pImp->SetIOHandler(new TestIOSystem); + const aiScene* scene = pImp->ReadFile("deadlyImportError.fail", 0); + EXPECT_EQ(scene, nullptr); + EXPECT_STREQ(pImp->GetErrorString(), "Deadly import error test"); + EXPECT_EQ(pImp->GetInternalException(), std::exception_ptr()); +} + +TEST_F(ImporterTest, stdException) +{ + pImp->RegisterLoader(new FailingImporter); + pImp->SetIOHandler(new TestIOSystem); + const aiScene* scene = pImp->ReadFile("stdException.fail", 0); + EXPECT_EQ(scene, nullptr); + EXPECT_STREQ(pImp->GetErrorString(), "Internal error"); + EXPECT_NE(pImp->GetInternalException(), std::exception_ptr()); + try + { + std::rethrow_exception(pImp->GetInternalException()); + } + catch(const std::exception& e) + { + EXPECT_STREQ(e.what(), "std::exception test"); + } + catch(...) + { + EXPECT_TRUE(false); + } +} + +TEST_F(ImporterTest, unexpectedException) +{ + pImp->RegisterLoader(new FailingImporter); + pImp->SetIOHandler(new TestIOSystem); + const aiScene* scene = pImp->ReadFile("unexpectedException.fail", 0); + + EXPECT_EQ(scene, nullptr); + EXPECT_STREQ(pImp->GetErrorString(), "Internal error"); + ASSERT_NE(pImp->GetInternalException(), std::exception_ptr()); + try + { + std::rethrow_exception(pImp->GetInternalException()); + } + catch(int x) + { + EXPECT_EQ(x, 5); + } + catch(...) + { + EXPECT_TRUE(false); + } +} From a4110a59c5ec9a016f26061b217cd7bc15bd40dc Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Thu, 23 Jul 2020 16:08:30 +0100 Subject: [PATCH 091/129] Use runtime error. --- test/unit/utImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/utImporter.cpp b/test/unit/utImporter.cpp index 33d8cd1e0..cd30333f5 100644 --- a/test/unit/utImporter.cpp +++ b/test/unit/utImporter.cpp @@ -317,7 +317,7 @@ namespace } else if (pFile == "stdException.fail") { - throw std::exception("std::exception test"); + throw std::runtime_error("std::exception test"); } else if (pFile == "unexpectedException.fail") { From 829ff1adf0b1a15eb707b065a809d9400ce8061a Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Thu, 23 Jul 2020 17:26:32 +0100 Subject: [PATCH 092/129] Maybe this will help. --- code/Common/BaseImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/Common/BaseImporter.cpp b/code/Common/BaseImporter.cpp index 73e473527..0d7057066 100644 --- a/code/Common/BaseImporter.cpp +++ b/code/Common/BaseImporter.cpp @@ -133,7 +133,7 @@ aiScene *BaseImporter::ReadFile(Importer *pImp, const std::string &pFile, IOSyst } catch( const DeadlyImportError& err ) { // extract error description m_ErrorText = err.what(); - ASSIMP_LOG_ERROR(m_ErrorText); + ASSIMP_LOG_ERROR(m_ErrorText.c_str()); return nullptr; } catch( const std::exception& err ) { // extract error description From 4f1e904ec8408b665aa34325b5bcbcea5a3f243d Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Fri, 24 Jul 2020 10:13:40 +0100 Subject: [PATCH 093/129] Fix typo. --- include/assimp/Importer.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/assimp/Importer.hpp b/include/assimp/Importer.hpp index 9d1594982..40753d4c7 100644 --- a/include/assimp/Importer.hpp +++ b/include/assimp/Importer.hpp @@ -496,7 +496,7 @@ public: const char *GetErrorString() const; // ------------------------------------------------------------------- - /** Returns Returns an internal exception if one occurred during import. + /** Returns an internal exception if one occurred during import. * * Returns the last non-DeadlyImportError exception which occurred. * @return The last exception which occurred which wasn't a From 974252bd8fd6ac24c3c4523398c9e10c6f2b0e0e Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Fri, 24 Jul 2020 11:37:15 +0100 Subject: [PATCH 094/129] Fix two warnings that annoy clang. --- test/unit/utImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/utImporter.cpp b/test/unit/utImporter.cpp index cd30333f5..05b0b1ba7 100644 --- a/test/unit/utImporter.cpp +++ b/test/unit/utImporter.cpp @@ -307,7 +307,7 @@ namespace } protected: - virtual const aiImporterDesc* GetInfo() const { return &s_failingImporterDescription; } + virtual const aiImporterDesc* GetInfo() const override { return &s_failingImporterDescription; } virtual void InternReadFile( const std::string& pFile, aiScene*, Assimp::IOSystem* ) override { From 0ffcdf160e429c5b16966ff880b526ebc8868a29 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Tue, 18 Aug 2020 16:32:34 +0100 Subject: [PATCH 095/129] Build formatting into DeadlyImportError --- code/AssetLib/BVH/BVHLoader.cpp | 33 ++++++------ code/AssetLib/BVH/BVHLoader.h | 3 +- code/AssetLib/Blender/BlenderCustomData.cpp | 2 +- code/AssetLib/Blender/BlenderDNA.cpp | 16 ++---- code/AssetLib/Blender/BlenderDNA.h | 7 +-- code/AssetLib/Blender/BlenderDNA.inl | 56 ++++++++------------ code/AssetLib/Blender/BlenderLoader.cpp | 5 +- code/AssetLib/Collada/ColladaLoader.cpp | 2 +- code/AssetLib/Collada/ColladaParser.cpp | 53 ++++++++++--------- code/AssetLib/Collada/ColladaParser.h | 6 ++- code/AssetLib/Ogre/OgreBinarySerializer.cpp | 16 +++--- code/AssetLib/Ogre/OgreStructs.cpp | 10 ++-- code/AssetLib/Ogre/OgreXmlSerializer.cpp | 36 ++++++------- code/AssetLib/X/XFileParser.cpp | 27 +++++----- code/AssetLib/X/XFileParser.h | 3 +- code/CMakeLists.txt | 1 + code/Common/Exceptional.cpp | 58 +++++++++++++++++++++ include/assimp/Exceptional.h | 33 +++++++++--- include/assimp/LogAux.h | 5 +- include/assimp/TinyFormatter.h | 3 ++ 20 files changed, 221 insertions(+), 154 deletions(-) create mode 100644 code/Common/Exceptional.cpp diff --git a/code/AssetLib/BVH/BVHLoader.cpp b/code/AssetLib/BVH/BVHLoader.cpp index 46afc5e64..94fb0b2d1 100644 --- a/code/AssetLib/BVH/BVHLoader.cpp +++ b/code/AssetLib/BVH/BVHLoader.cpp @@ -71,6 +71,13 @@ static const aiImporterDesc desc = { "bvh" }; +// ------------------------------------------------------------------------------------------------ +// Aborts the file reading with an exception +template +AI_WONT_RETURN void BVHLoader::ThrowException(T&&... args) { + throw DeadlyImportError(mFileName, ":", mLine, " - ", args...); +} + // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer BVHLoader::BVHLoader() : @@ -176,12 +183,12 @@ aiNode *BVHLoader::ReadNode() { // first token is name std::string nodeName = GetNextToken(); if (nodeName.empty() || nodeName == "{") - ThrowException(format() << "Expected node name, but found \"" << nodeName << "\"."); + ThrowException("Expected node name, but found \"", nodeName, "\"."); // then an opening brace should follow std::string openBrace = GetNextToken(); if (openBrace != "{") - ThrowException(format() << "Expected opening brace \"{\", but found \"" << openBrace << "\"."); + ThrowException("Expected opening brace \"{\", but found \"", openBrace, "\"."); // Create a node aiNode *node = new aiNode(nodeName); @@ -211,7 +218,7 @@ aiNode *BVHLoader::ReadNode() { siteToken.clear(); siteToken = GetNextToken(); if (siteToken != "Site") - ThrowException(format() << "Expected \"End Site\" keyword, but found \"" << token << " " << siteToken << "\"."); + ThrowException("Expected \"End Site\" keyword, but found \"", token, " ", siteToken, "\"."); aiNode *child = ReadEndSite(nodeName); child->mParent = node; @@ -221,7 +228,7 @@ aiNode *BVHLoader::ReadNode() { break; } else { // everything else is a parse error - ThrowException(format() << "Unknown keyword \"" << token << "\"."); + ThrowException("Unknown keyword \"", token, "\"."); } } @@ -242,7 +249,7 @@ aiNode *BVHLoader::ReadEndSite(const std::string &pParentName) { // check opening brace std::string openBrace = GetNextToken(); if (openBrace != "{") - ThrowException(format() << "Expected opening brace \"{\", but found \"" << openBrace << "\"."); + ThrowException("Expected opening brace \"{\", but found \"", openBrace, "\"."); // Create a node aiNode *node = new aiNode("EndSite_" + pParentName); @@ -261,7 +268,7 @@ aiNode *BVHLoader::ReadEndSite(const std::string &pParentName) { break; } else { // everything else is a parse error - ThrowException(format() << "Unknown keyword \"" << token << "\"."); + ThrowException("Unknown keyword \"", token, "\"."); } } @@ -307,7 +314,7 @@ void BVHLoader::ReadNodeChannels(BVHLoader::Node &pNode) { else if (channelToken == "Zrotation") pNode.mChannels.push_back(Channel_RotationZ); else - ThrowException(format() << "Invalid channel specifier \"" << channelToken << "\"."); + ThrowException("Invalid channel specifier \"", channelToken, "\"."); } } @@ -317,7 +324,7 @@ void BVHLoader::ReadMotion(aiScene * /*pScene*/) { // Read number of frames std::string tokenFrames = GetNextToken(); if (tokenFrames != "Frames:") - ThrowException(format() << "Expected frame count \"Frames:\", but found \"" << tokenFrames << "\"."); + ThrowException("Expected frame count \"Frames:\", but found \"", tokenFrames, "\"."); float numFramesFloat = GetNextTokenAsFloat(); mAnimNumFrames = (unsigned int)numFramesFloat; @@ -326,7 +333,7 @@ void BVHLoader::ReadMotion(aiScene * /*pScene*/) { std::string tokenDuration1 = GetNextToken(); std::string tokenDuration2 = GetNextToken(); if (tokenDuration1 != "Frame" || tokenDuration2 != "Time:") - ThrowException(format() << "Expected frame duration \"Frame Time:\", but found \"" << tokenDuration1 << " " << tokenDuration2 << "\"."); + ThrowException("Expected frame duration \"Frame Time:\", but found \"", tokenDuration1, " ", tokenDuration2, "\"."); mAnimTickDuration = GetNextTokenAsFloat(); @@ -393,17 +400,11 @@ float BVHLoader::GetNextTokenAsFloat() { ctoken = fast_atoreal_move(ctoken, result); if (ctoken != token.c_str() + token.length()) - ThrowException(format() << "Expected a floating point number, but found \"" << token << "\"."); + ThrowException("Expected a floating point number, but found \"", token, "\"."); return result; } -// ------------------------------------------------------------------------------------------------ -// Aborts the file reading with an exception -AI_WONT_RETURN void BVHLoader::ThrowException(const std::string &pError) { - throw DeadlyImportError(format() << mFileName << ":" << mLine << " - " << pError); -} - // ------------------------------------------------------------------------------------------------ // Constructs an animation for the motion data and stores it in the given scene void BVHLoader::CreateAnimation(aiScene *pScene) { diff --git a/code/AssetLib/BVH/BVHLoader.h b/code/AssetLib/BVH/BVHLoader.h index c2ecbd102..3af3cbb31 100644 --- a/code/AssetLib/BVH/BVHLoader.h +++ b/code/AssetLib/BVH/BVHLoader.h @@ -134,7 +134,8 @@ protected: float GetNextTokenAsFloat(); /** Aborts the file reading with an exception */ - AI_WONT_RETURN void ThrowException(const std::string &pError) AI_WONT_RETURN_SUFFIX; + template + AI_WONT_RETURN void ThrowException(T&&... args) AI_WONT_RETURN_SUFFIX; /** Constructs an animation for the motion data and stores it in the given scene */ void CreateAnimation(aiScene *pScene); diff --git a/code/AssetLib/Blender/BlenderCustomData.cpp b/code/AssetLib/Blender/BlenderCustomData.cpp index c752da4e0..c74a6bb75 100644 --- a/code/AssetLib/Blender/BlenderCustomData.cpp +++ b/code/AssetLib/Blender/BlenderCustomData.cpp @@ -149,7 +149,7 @@ bool isValidCustomDataType(const int cdtype) { bool readCustomData(std::shared_ptr &out, const int cdtype, const size_t cnt, const FileDatabase &db) { if (!isValidCustomDataType(cdtype)) { - throw Error((Formatter::format(), "CustomData.type ", cdtype, " out of index")); + throw Error("CustomData.type ", cdtype, " out of index"); } const CustomDataTypeDescription cdtd = customDataTypeDescriptions[cdtype]; diff --git a/code/AssetLib/Blender/BlenderDNA.cpp b/code/AssetLib/Blender/BlenderDNA.cpp index 920362f24..ad0760914 100644 --- a/code/AssetLib/Blender/BlenderDNA.cpp +++ b/code/AssetLib/Blender/BlenderDNA.cpp @@ -130,9 +130,7 @@ void DNAParser::Parse() { uint16_t n = stream.GetI2(); if (n >= types.size()) { - throw DeadlyImportError((format(), - "BlenderDNA: Invalid type index in structure name", n, - " (there are only ", types.size(), " entries)")); + throw DeadlyImportError("BlenderDNA: Invalid type index in structure name", n, " (there are only ", types.size(), " entries)"); } // maintain separate indexes @@ -151,9 +149,7 @@ void DNAParser::Parse() { uint16_t j = stream.GetI2(); if (j >= types.size()) { - throw DeadlyImportError((format(), - "BlenderDNA: Invalid type index in structure field ", j, - " (there are only ", types.size(), " entries)")); + throw DeadlyImportError("BlenderDNA: Invalid type index in structure field ", j, " (there are only ", types.size(), " entries)"); } s.fields.push_back(Field()); Field &f = s.fields.back(); @@ -164,9 +160,7 @@ void DNAParser::Parse() { j = stream.GetI2(); if (j >= names.size()) { - throw DeadlyImportError((format(), - "BlenderDNA: Invalid name index in structure field ", j, - " (there are only ", names.size(), " entries)")); + throw DeadlyImportError("BlenderDNA: Invalid name index in structure field ", j, " (there are only ", names.size(), " entries)"); } f.name = names[j]; @@ -188,9 +182,7 @@ void DNAParser::Parse() { if (*f.name.rbegin() == ']') { const std::string::size_type rb = f.name.find('['); if (rb == std::string::npos) { - throw DeadlyImportError((format(), - "BlenderDNA: Encountered invalid array declaration ", - f.name)); + throw DeadlyImportError("BlenderDNA: Encountered invalid array declaration ", f.name); } f.flags |= FieldFlag_Array; diff --git a/code/AssetLib/Blender/BlenderDNA.h b/code/AssetLib/Blender/BlenderDNA.h index c89b21434..a084dbdbd 100644 --- a/code/AssetLib/Blender/BlenderDNA.h +++ b/code/AssetLib/Blender/BlenderDNA.h @@ -83,9 +83,10 @@ class ObjectCache; * ancestry. */ // ------------------------------------------------------------------------------- struct Error : DeadlyImportError { - Error(const std::string &s) : - DeadlyImportError(s) { - // empty + template + explicit Error(T&&... args) + : DeadlyImportError(args...) + { } }; diff --git a/code/AssetLib/Blender/BlenderDNA.inl b/code/AssetLib/Blender/BlenderDNA.inl index 7bb9d586a..c4e84b5e0 100644 --- a/code/AssetLib/Blender/BlenderDNA.inl +++ b/code/AssetLib/Blender/BlenderDNA.inl @@ -57,9 +57,7 @@ const Field& Structure :: operator [] (const std::string& ss) const { std::map::const_iterator it = indices.find(ss); if (it == indices.end()) { - throw Error((Formatter::format(), - "BlendDNA: Did not find a field named `",ss,"` in structure `",name,"`" - )); + throw Error("BlendDNA: Did not find a field named `",ss,"` in structure `",name,"`"); } return fields[(*it).second]; @@ -76,9 +74,7 @@ const Field* Structure :: Get (const std::string& ss) const const Field& Structure :: operator [] (const size_t i) const { if (i >= fields.size()) { - throw Error((Formatter::format(), - "BlendDNA: There is no field with index `",i,"` in structure `",name,"`" - )); + throw Error("BlendDNA: There is no field with index `",i,"` in structure `",name,"`"); } return fields[i]; @@ -109,9 +105,7 @@ void Structure :: ReadFieldArray(T (& out)[M], const char* name, const FileDatab // is the input actually an array? if (!(f.flags & FieldFlag_Array)) { - throw Error((Formatter::format(),"Field `",name,"` of structure `", - this->name,"` ought to be an array of size ",M - )); + throw Error("Field `",name,"` of structure `",this->name,"` ought to be an array of size ",M); } db.reader->IncPtr(f.offset); @@ -148,9 +142,9 @@ void Structure :: ReadFieldArray2(T (& out)[M][N], const char* name, const FileD // is the input actually an array? if (!(f.flags & FieldFlag_Array)) { - throw Error((Formatter::format(),"Field `",name,"` of structure `", + throw Error("Field `",name,"` of structure `", this->name,"` ought to be an array of size ",M,"*",N - )); + ); } db.reader->IncPtr(f.offset); @@ -195,8 +189,8 @@ bool Structure :: ReadFieldPtr(TOUT& out, const char* name, const FileDatabas // sanity check, should never happen if the genblenddna script is right if (!(f->flags & FieldFlag_Pointer)) { - throw Error((Formatter::format(),"Field `",name,"` of structure `", - this->name,"` ought to be a pointer")); + throw Error("Field `",name,"` of structure `", + this->name,"` ought to be a pointer"); } db.reader->IncPtr(f->offset); @@ -241,8 +235,8 @@ bool Structure :: ReadFieldPtr(TOUT (&out)[N], const char* name, #ifdef _DEBUG // sanity check, should never happen if the genblenddna script is right if ((FieldFlag_Pointer|FieldFlag_Pointer) != (f->flags & (FieldFlag_Pointer|FieldFlag_Pointer))) { - throw Error((Formatter::format(),"Field `",name,"` of structure `", - this->name,"` ought to be a pointer AND an array")); + throw Error("Field `",name,"` of structure `", + this->name,"` ought to be a pointer AND an array"); } #endif // _DEBUG @@ -322,8 +316,8 @@ bool Structure::ReadCustomDataPtr(std::shared_ptr&out, int cdtype, con // sanity check, should never happen if the genblenddna script is right if (!(f->flags & FieldFlag_Pointer)) { - throw Error((Formatter::format(), "Field `", name, "` of structure `", - this->name, "` ought to be a pointer")); + throw Error("Field `", name, "` of structure `", + this->name, "` ought to be a pointer"); } db.reader->IncPtr(f->offset); @@ -369,8 +363,8 @@ bool Structure::ReadFieldPtrVector(vector>&out, const char* name, const // sanity check, should never happen if the genblenddna script is right if (!(f->flags & FieldFlag_Pointer)) { - throw Error((Formatter::format(), "Field `", name, "` of structure `", - this->name, "` ought to be a pointer")); + throw Error("Field `", name, "` of structure `", + this->name, "` ought to be a pointer"); } db.reader->IncPtr(f->offset); @@ -428,9 +422,9 @@ bool Structure :: ResolvePointer(TOUT& out, const Pointer & ptrval, const Fil // and check if it matches the type which we expect. const Structure& ss = db.dna[block->dna_index]; if (ss != s) { - throw Error((Formatter::format(),"Expected target to be of type `",s.name, + throw Error("Expected target to be of type `",s.name, "` but seemingly it is a `",ss.name,"` instead" - )); + ); } // try to retrieve the object from the cache @@ -614,16 +608,14 @@ const FileBlockHead* Structure :: LocateFileBlockForAddress(const Pointer & ptrv if (it == db.entries.end()) { // this is crucial, pointers may not be invalid. // this is either a corrupted file or an attempted attack. - throw DeadlyImportError((Formatter::format(),"Failure resolving pointer 0x", - std::hex,ptrval.val,", no file block falls into this address range" - )); + throw DeadlyImportError("Failure resolving pointer 0x", + std::hex,ptrval.val,", no file block falls into this address range"); } if (ptrval.val >= (*it).address.val + (*it).size) { - throw DeadlyImportError((Formatter::format(),"Failure resolving pointer 0x", + throw DeadlyImportError("Failure resolving pointer 0x", std::hex,ptrval.val,", nearest file block starting at 0x", (*it).address.val," ends at 0x", - (*it).address.val + (*it).size - )); + (*it).address.val + (*it).size); } return &*it; } @@ -676,7 +668,7 @@ template inline void ConvertDispatcher(T& out, const Structure& in, out = static_cast(db.reader->GetF8()); } else { - throw DeadlyImportError("Unknown source for conversion to primitive data type: "+in.name); + throw DeadlyImportError("Unknown source for conversion to primitive data type: ", in.name); } } @@ -784,9 +776,7 @@ const Structure& DNA :: operator [] (const std::string& ss) const { std::map::const_iterator it = indices.find(ss); if (it == indices.end()) { - throw Error((Formatter::format(), - "BlendDNA: Did not find a structure named `",ss,"`" - )); + throw Error("BlendDNA: Did not find a structure named `",ss,"`"); } return structures[(*it).second]; @@ -803,9 +793,7 @@ const Structure* DNA :: Get (const std::string& ss) const const Structure& DNA :: operator [] (const size_t i) const { if (i >= structures.size()) { - throw Error((Formatter::format(), - "BlendDNA: There is no structure with index `",i,"`" - )); + throw Error("BlendDNA: There is no structure with index `",i,"`"); } return structures[i]; diff --git a/code/AssetLib/Blender/BlenderLoader.cpp b/code/AssetLib/Blender/BlenderLoader.cpp index 508db8422..8d14d0b9b 100644 --- a/code/AssetLib/Blender/BlenderLoader.cpp +++ b/code/AssetLib/Blender/BlenderLoader.cpp @@ -748,9 +748,8 @@ void BlenderImporter::BuildMaterials(ConversionData &conv_data) { void BlenderImporter::CheckActualType(const ElemBase *dt, const char *check) { ai_assert(dt); if (strcmp(dt->dna_type, check)) { - ThrowException((format(), - "Expected object at ", std::hex, dt, " to be of type `", check, - "`, but it claims to be a `", dt->dna_type, "`instead")); + ThrowException("Expected object at ", std::hex, dt, " to be of type `", check, + "`, but it claims to be a `", dt->dna_type, "`instead"); } } diff --git a/code/AssetLib/Collada/ColladaLoader.cpp b/code/AssetLib/Collada/ColladaLoader.cpp index 7b0fdd8e0..58d413649 100644 --- a/code/AssetLib/Collada/ColladaLoader.cpp +++ b/code/AssetLib/Collada/ColladaLoader.cpp @@ -1251,7 +1251,7 @@ void ColladaLoader::CreateAnimation(aiScene *pScene, const ColladaParser &pParse // time count and value count must match if (e.mTimeAccessor->mCount != e.mValueAccessor->mCount) - throw DeadlyImportError(format() << "Time count / value count mismatch in animation channel \"" << e.mChannel->mTarget << "\"."); + throw DeadlyImportError("Time count / value count mismatch in animation channel \"", e.mChannel->mTarget, "\"."); if (e.mTimeAccessor->mCount > 0) { // find bounding times diff --git a/code/AssetLib/Collada/ColladaParser.cpp b/code/AssetLib/Collada/ColladaParser.cpp index 964851d60..54f63b8dd 100644 --- a/code/AssetLib/Collada/ColladaParser.cpp +++ b/code/AssetLib/Collada/ColladaParser.cpp @@ -66,6 +66,13 @@ using namespace Assimp; using namespace Assimp::Collada; using namespace Assimp::Formatter; +// ------------------------------------------------------------------------------------------------ +// Aborts the file reading with an exception +template +AI_WONT_RETURN void ColladaParser::ThrowException(T&&... args) const { + throw DeadlyImportError("Collada: ", mFileName, " - ", args...); +} + // ------------------------------------------------------------------------------------------------ // Constructor to be privately used by Importer ColladaParser::ColladaParser(IOSystem *pIOHandler, const std::string &pFile) : @@ -853,7 +860,7 @@ void ColladaParser::ReadControllerJoints(Collada::Controller &pController) { // local URLS always start with a '#'. We don't support global URLs if (attrSource[0] != '#') - ThrowException(format() << "Unsupported URL format in \"" << attrSource << "\" in source attribute of data element"); + ThrowException("Unsupported URL format in \"", attrSource, "\" in source attribute of data element"); attrSource++; // parse source URL to corresponding source @@ -862,7 +869,7 @@ void ColladaParser::ReadControllerJoints(Collada::Controller &pController) { else if (strcmp(attrSemantic, "INV_BIND_MATRIX") == 0) pController.mJointOffsetMatrixSource = attrSource; else - ThrowException(format() << "Unknown semantic \"" << attrSemantic << "\" in data element"); + ThrowException("Unknown semantic \"", attrSemantic, "\" in data element"); // skip inner data, if present if (!mReader->isEmptyElement()) @@ -904,7 +911,7 @@ void ColladaParser::ReadControllerWeights(Collada::Controller &pController) { // local URLS always start with a '#'. We don't support global URLs if (attrSource[0] != '#') - ThrowException(format() << "Unsupported URL format in \"" << attrSource << "\" in source attribute of data element"); + ThrowException("Unsupported URL format in \"", attrSource, "\" in source attribute of data element"); channel.mAccessor = attrSource + 1; // parse source URL to corresponding source @@ -913,7 +920,7 @@ void ColladaParser::ReadControllerWeights(Collada::Controller &pController) { else if (strcmp(attrSemantic, "WEIGHT") == 0) pController.mWeightInputWeights = channel; else - ThrowException(format() << "Unknown semantic \"" << attrSemantic << "\" in data element"); + ThrowException("Unknown semantic \"", attrSemantic, "\" in data element"); // skip inner data, if present if (!mReader->isEmptyElement()) @@ -1901,7 +1908,7 @@ void ColladaParser::ReadAccessor(const std::string &pID) { int attrSource = GetAttribute("source"); const char *source = mReader->getAttributeValue(attrSource); if (source[0] != '#') - ThrowException(format() << "Unknown reference format in url \"" << source << "\" in source attribute of element."); + ThrowException("Unknown reference format in url \"", source, "\" in source attribute of element."); int attrCount = GetAttribute("count"); unsigned int count = (unsigned int)mReader->getAttributeValueAsInt(attrCount); int attrOffset = TestAttribute("offset"); @@ -1968,7 +1975,7 @@ void ColladaParser::ReadAccessor(const std::string &pID) { else if (name == "V") acc.mSubOffset[1] = acc.mParams.size(); //else - // DefaultLogger::get()->warn( format() << "Unknown accessor parameter \"" << name << "\". Ignoring data channel." ); + // DefaultLogger::get()->warn( "Unknown accessor parameter \"", name, "\". Ignoring data channel." ); } // read data type @@ -1989,7 +1996,7 @@ void ColladaParser::ReadAccessor(const std::string &pID) { // skip remaining stuff of this element, if any SkipElement(); } else { - ThrowException(format() << "Unexpected sub element <" << mReader->getNodeName() << "> in tag "); + ThrowException("Unexpected sub element <", mReader->getNodeName(), "> in tag "); } } else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { if (strcmp(mReader->getNodeName(), "accessor") != 0) @@ -2012,7 +2019,7 @@ void ColladaParser::ReadVertexData(Mesh &pMesh) { if (IsElement("input")) { ReadInputChannel(pMesh.mPerVertexData); } else { - ThrowException(format() << "Unexpected sub element <" << mReader->getNodeName() << "> in tag "); + ThrowException("Unexpected sub element <", mReader->getNodeName(), "> in tag "); } } else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { if (strcmp(mReader->getNodeName(), "vertices") != 0) @@ -2096,11 +2103,11 @@ void ColladaParser::ReadIndexData(Mesh &pMesh) { } else if (IsElement("ph")) { SkipElement("ph"); } else { - ThrowException(format() << "Unexpected sub element <" << mReader->getNodeName() << "> in tag <" << elementName << ">"); + ThrowException("Unexpected sub element <", mReader->getNodeName(), "> in tag <", elementName, ">"); } } else if (mReader->getNodeType() == irr::io::EXN_ELEMENT_END) { if (mReader->getNodeName() != elementName) - ThrowException(format() << "Expected end of <" << elementName << "> element."); + ThrowException("Expected end of <", elementName, "> element."); break; } @@ -2132,7 +2139,7 @@ void ColladaParser::ReadInputChannel(std::vector &poChannels) { int attrSource = GetAttribute("source"); const char *source = mReader->getAttributeValue(attrSource); if (source[0] != '#') - ThrowException(format() << "Unknown reference format in url \"" << source << "\" in source attribute of element."); + ThrowException("Unknown reference format in url \"", source, "\" in source attribute of element."); channel.mAccessor = source + 1; // skipping the leading #, hopefully the remaining text is the accessor ID only // read index offset, if per-index @@ -2146,7 +2153,7 @@ void ColladaParser::ReadInputChannel(std::vector &poChannels) { if (attrSet > -1) { attrSet = mReader->getAttributeValueAsInt(attrSet); if (attrSet < 0) - ThrowException(format() << "Invalid index \"" << (attrSet) << "\" in set attribute of element"); + ThrowException("Invalid index \"", (attrSet), "\" in set attribute of element"); channel.mIndex = attrSet; } @@ -2369,7 +2376,7 @@ void ColladaParser::ExtractDataObjectFromChannel(const InputChannel &pInput, siz const Accessor &acc = *pInput.mResolved; if (pLocalIndex >= acc.mCount) - ThrowException(format() << "Invalid data index (" << pLocalIndex << "/" << acc.mCount << ") in primitive specification"); + ThrowException("Invalid data index (", pLocalIndex, "/", acc.mCount, ") in primitive specification"); // get a pointer to the start of the data object referred to by the accessor and the local index const ai_real *dataObject = &(acc.mData->mValues[0]) + acc.mOffset + pLocalIndex * acc.mStride; @@ -2781,12 +2788,6 @@ void ColladaParser::ReadScene() { } } -// ------------------------------------------------------------------------------------------------ -// Aborts the file reading with an exception -AI_WONT_RETURN void ColladaParser::ThrowException(const std::string &pError) const { - throw DeadlyImportError(format() << "Collada: " << mFileName << " - " << pError); -} - void ColladaParser::ReportWarning(const char *msg, ...) { ai_assert(nullptr != msg); @@ -2833,17 +2834,17 @@ void ColladaParser::SkipElement(const char *pElement) { void ColladaParser::TestOpening(const char *pName) { // read element start if (!mReader->read()) { - ThrowException(format() << "Unexpected end of file while beginning of <" << pName << "> element."); + ThrowException("Unexpected end of file while beginning of <", pName, "> element."); } // whitespace in front is ok, just read again if found if (mReader->getNodeType() == irr::io::EXN_TEXT) { if (!mReader->read()) { - ThrowException(format() << "Unexpected end of file while reading beginning of <" << pName << "> element."); + ThrowException("Unexpected end of file while reading beginning of <", pName, "> element."); } } if (mReader->getNodeType() != irr::io::EXN_ELEMENT || strcmp(mReader->getNodeName(), pName) != 0) { - ThrowException(format() << "Expected start of <" << pName << "> element."); + ThrowException("Expected start of <", pName, "> element."); } } @@ -2862,18 +2863,18 @@ void ColladaParser::TestClosing(const char *pName) { // if not, read some more if (!mReader->read()) { - ThrowException(format() << "Unexpected end of file while reading end of <" << pName << "> element."); + ThrowException("Unexpected end of file while reading end of <", pName, "> element."); } // whitespace in front is ok, just read again if found if (mReader->getNodeType() == irr::io::EXN_TEXT) { if (!mReader->read()) { - ThrowException(format() << "Unexpected end of file while reading end of <" << pName << "> element."); + ThrowException("Unexpected end of file while reading end of <", pName, "> element."); } } // but this has the be the closing tag, or we're lost if (mReader->getNodeType() != irr::io::EXN_ELEMENT_END || strcmp(mReader->getNodeName(), pName) != 0) { - ThrowException(format() << "Expected end of <" << pName << "> element."); + ThrowException("Expected end of <", pName, "> element."); } } @@ -2882,7 +2883,7 @@ void ColladaParser::TestClosing(const char *pName) { int ColladaParser::GetAttribute(const char *pAttr) const { int index = TestAttribute(pAttr); if (index == -1) { - ThrowException(format() << "Expected attribute \"" << pAttr << "\" for element <" << mReader->getNodeName() << ">."); + ThrowException("Expected attribute \"", pAttr, "\" for element <", mReader->getNodeName(), ">."); } // attribute not found -> throw an exception diff --git a/code/AssetLib/Collada/ColladaParser.h b/code/AssetLib/Collada/ColladaParser.h index f6056abcc..bb2f2e247 100644 --- a/code/AssetLib/Collada/ColladaParser.h +++ b/code/AssetLib/Collada/ColladaParser.h @@ -242,7 +242,9 @@ protected: protected: /** Aborts the file reading with an exception */ - AI_WONT_RETURN void ThrowException(const std::string &pError) const AI_WONT_RETURN_SUFFIX; + template + AI_WONT_RETURN void ThrowException(T&&... args) const AI_WONT_RETURN_SUFFIX; + void ReportWarning(const char *msg, ...); /** Skips all data until the end node of the current element */ @@ -383,7 +385,7 @@ template const Type &ColladaParser::ResolveLibraryReference(const std::map &pLibrary, const std::string &pURL) const { typename std::map::const_iterator it = pLibrary.find(pURL); if (it == pLibrary.end()) - ThrowException(Formatter::format() << "Unable to resolve library reference \"" << pURL << "\"."); + ThrowException("Unable to resolve library reference \"", pURL, "\"."); return it->second; } diff --git a/code/AssetLib/Ogre/OgreBinarySerializer.cpp b/code/AssetLib/Ogre/OgreBinarySerializer.cpp index 360da898f..7ce00471f 100644 --- a/code/AssetLib/Ogre/OgreBinarySerializer.cpp +++ b/code/AssetLib/Ogre/OgreBinarySerializer.cpp @@ -187,8 +187,8 @@ Mesh *OgreBinarySerializer::ImportMesh(MemoryStreamReader *stream) { /// @todo Check what we can actually support. std::string version = serializer.ReadLine(); if (version != MESH_VERSION_1_8) { - throw DeadlyExportError(Formatter::format() << "Mesh version " << version << " not supported by this importer. Run OgreMeshUpgrader tool on the file and try again." - << " Supported versions: " << MESH_VERSION_1_8); + throw DeadlyExportError("Mesh version ", version, " not supported by this importer. Run OgreMeshUpgrader tool on the file and try again.", + " Supported versions: ", MESH_VERSION_1_8); } Mesh *mesh = new Mesh(); @@ -471,7 +471,7 @@ void OgreBinarySerializer::ReadSubMeshNames(Mesh *mesh) { uint16_t submeshIndex = Read(); SubMesh *submesh = mesh->GetSubMesh(submeshIndex); if (!submesh) { - throw DeadlyImportError(Formatter::format() << "Ogre Mesh does not include submesh " << submeshIndex << " referenced in M_SUBMESH_NAME_TABLE_ELEMENT. Invalid mesh file."); + throw DeadlyImportError("Ogre Mesh does not include submesh ", submeshIndex, " referenced in M_SUBMESH_NAME_TABLE_ELEMENT. Invalid mesh file."); } submesh->name = ReadLine(); @@ -803,8 +803,8 @@ void OgreBinarySerializer::ReadSkeleton(Skeleton *skeleton) { // This deserialization supports both versions of the skeleton spec std::string version = ReadLine(); if (version != SKELETON_VERSION_1_8 && version != SKELETON_VERSION_1_1) { - throw DeadlyExportError(Formatter::format() << "Skeleton version " << version << " not supported by this importer." - << " Supported versions: " << SKELETON_VERSION_1_8 << " and " << SKELETON_VERSION_1_1); + throw DeadlyExportError("Skeleton version ", version, " not supported by this importer.", + " Supported versions: ", SKELETON_VERSION_1_8, " and ", SKELETON_VERSION_1_1); } ASSIMP_LOG_VERBOSE_DEBUG("Reading Skeleton"); @@ -871,7 +871,7 @@ void OgreBinarySerializer::ReadBone(Skeleton *skeleton) { // Bone indexes need to start from 0 and be contiguous if (bone->id != skeleton->bones.size()) { - throw DeadlyImportError(Formatter::format() << "Ogre Skeleton bone indexes not contiguous. Error at bone index " << bone->id); + throw DeadlyImportError("Ogre Skeleton bone indexes not contiguous. Error at bone index ", bone->id); } ASSIMP_LOG_VERBOSE_DEBUG_F(" ", bone->id, " ", bone->name); @@ -889,7 +889,7 @@ void OgreBinarySerializer::ReadBoneParent(Skeleton *skeleton) { if (child && parent) parent->AddChild(child); else - throw DeadlyImportError(Formatter::format() << "Failed to find bones for parenting: Child id " << childId << " for parent id " << parentId); + throw DeadlyImportError("Failed to find bones for parenting: Child id ", childId, " for parent id ", parentId); } void OgreBinarySerializer::ReadSkeletonAnimation(Skeleton *skeleton) { @@ -926,7 +926,7 @@ void OgreBinarySerializer::ReadSkeletonAnimationTrack(Skeleton * /*skeleton*/, A uint16_t boneId = Read(); Bone *bone = dest->parentSkeleton->BoneById(boneId); if (!bone) { - throw DeadlyImportError(Formatter::format() << "Cannot read animation track, target bone " << boneId << " not in target Skeleton"); + throw DeadlyImportError("Cannot read animation track, target bone ", boneId, " not in target Skeleton"); } VertexAnimationTrack track; diff --git a/code/AssetLib/Ogre/OgreStructs.cpp b/code/AssetLib/Ogre/OgreStructs.cpp index 4a4f9479e..b915c742f 100644 --- a/code/AssetLib/Ogre/OgreStructs.cpp +++ b/code/AssetLib/Ogre/OgreStructs.cpp @@ -476,7 +476,7 @@ void SubMesh::Reset(){ aiMesh *SubMesh::ConvertToAssimpMesh(Mesh *parent) { if (operationType != OT_TRIANGLE_LIST) { - throw DeadlyImportError(Formatter::format() << "Only mesh operation type OT_TRIANGLE_LIST is supported. Found " << operationType); + throw DeadlyImportError("Only mesh operation type OT_TRIANGLE_LIST is supported. Found ", operationType); } aiMesh *dest = new aiMesh(); @@ -944,7 +944,7 @@ void Bone::AddChild(Bone *bone) { if (!bone) return; if (bone->IsParented()) - throw DeadlyImportError("Attaching child Bone that is already parented: " + bone->name); + throw DeadlyImportError("Attaching child Bone that is already parented: ", bone->name); bone->parent = this; bone->parentId = id; @@ -963,7 +963,7 @@ void Bone::CalculateWorldMatrixAndDefaultPose(Skeleton *skeleton) { for (auto boneId : children) { Bone *child = skeleton->BoneById(boneId); if (!child) { - throw DeadlyImportError(Formatter::format() << "CalculateWorldMatrixAndDefaultPose: Failed to find child bone " << boneId << " for parent " << id << " " << name); + throw DeadlyImportError("CalculateWorldMatrixAndDefaultPose: Failed to find child bone ", boneId, " for parent ", id, " ", name); } child->CalculateWorldMatrixAndDefaultPose(skeleton); } @@ -983,7 +983,7 @@ aiNode *Bone::ConvertToAssimpNode(Skeleton *skeleton, aiNode *parentNode) { for (size_t i = 0, len = children.size(); i < len; ++i) { Bone *child = skeleton->BoneById(children[i]); if (!child) { - throw DeadlyImportError(Formatter::format() << "ConvertToAssimpNode: Failed to find child bone " << children[i] << " for parent " << id << " " << name); + throw DeadlyImportError("ConvertToAssimpNode: Failed to find child bone ", children[i], " for parent ", id, " ", name); } node->mChildren[i] = child->ConvertToAssimpNode(skeleton, node); } @@ -1022,7 +1022,7 @@ aiNodeAnim *VertexAnimationTrack::ConvertToAssimpAnimationNode(Skeleton *skeleto Bone *bone = skeleton->BoneByName(boneName); if (!bone) { - throw DeadlyImportError("VertexAnimationTrack::ConvertToAssimpAnimationNode: Failed to find bone " + boneName + " from parent Skeleton"); + throw DeadlyImportError("VertexAnimationTrack::ConvertToAssimpAnimationNode: Failed to find bone ", boneName, " from parent Skeleton"); } // Keyframes diff --git a/code/AssetLib/Ogre/OgreXmlSerializer.cpp b/code/AssetLib/Ogre/OgreXmlSerializer.cpp index 31c2ee74e..d3a6a5529 100644 --- a/code/AssetLib/Ogre/OgreXmlSerializer.cpp +++ b/code/AssetLib/Ogre/OgreXmlSerializer.cpp @@ -59,9 +59,9 @@ namespace Ogre { AI_WONT_RETURN void ThrowAttibuteError(const XmlReader *reader, const std::string &name, const std::string &error = "") AI_WONT_RETURN_SUFFIX; AI_WONT_RETURN void ThrowAttibuteError(const XmlReader *reader, const std::string &name, const std::string &error) { if (!error.empty()) { - throw DeadlyImportError(error + " in node '" + std::string(reader->getNodeName()) + "' and attribute '" + name + "'"); + throw DeadlyImportError(error, " in node '", std::string(reader->getNodeName()), "' and attribute '", name, "'"); } else { - throw DeadlyImportError("Attribute '" + name + "' does not exist in node '" + std::string(reader->getNodeName()) + "'"); + throw DeadlyImportError("Attribute '", name, "' does not exist in node '", std::string(reader->getNodeName()), "'"); } } @@ -265,7 +265,7 @@ MeshXml *OgreXmlSerializer::ImportMesh(XmlReader *reader) { void OgreXmlSerializer::ReadMesh(MeshXml *mesh) { if (NextNode() != nnMesh) { - throw DeadlyImportError("Root node is <" + m_currentNodeName + "> expecting "); + throw DeadlyImportError("Root node is <", m_currentNodeName, "> expecting "); } ASSIMP_LOG_VERBOSE_DEBUG("Reading Mesh"); @@ -430,18 +430,18 @@ void OgreXmlSerializer::ReadGeometryVertexBuffer(VertexDataXml *dest) { // Sanity checks if (dest->positions.size() != dest->count) { - throw DeadlyImportError(Formatter::format() << "Read only " << dest->positions.size() << " positions when should have read " << dest->count); + throw DeadlyImportError("Read only ", dest->positions.size(), " positions when should have read ", dest->count); } if (normals && dest->normals.size() != dest->count) { - throw DeadlyImportError(Formatter::format() << "Read only " << dest->normals.size() << " normals when should have read " << dest->count); + throw DeadlyImportError("Read only ", dest->normals.size(), " normals when should have read ", dest->count); } if (tangents && dest->tangents.size() != dest->count) { - throw DeadlyImportError(Formatter::format() << "Read only " << dest->tangents.size() << " tangents when should have read " << dest->count); + throw DeadlyImportError("Read only ", dest->tangents.size(), " tangents when should have read ", dest->count); } for (unsigned int i = 0; i < dest->uvs.size(); ++i) { if (dest->uvs[i].size() != dest->count) { - throw DeadlyImportError(Formatter::format() << "Read only " << dest->uvs[i].size() - << " uvs for uv index " << i << " when should have read " << dest->count); + throw DeadlyImportError("Read only ", dest->uvs[i].size(), + " uvs for uv index ", i, " when should have read ", dest->count); } } } @@ -507,7 +507,7 @@ void OgreXmlSerializer::ReadSubMesh(MeshXml *mesh) { if (submesh->indexData->faces.size() == submesh->indexData->faceCount) { ASSIMP_LOG_VERBOSE_DEBUG_F(" - Faces ", submesh->indexData->faceCount); } else { - throw DeadlyImportError(Formatter::format() << "Read only " << submesh->indexData->faces.size() << " faces when should have read " << submesh->indexData->faceCount); + throw DeadlyImportError("Read only ", submesh->indexData->faces.size(), " faces when should have read ", submesh->indexData->faceCount); } } else if (m_currentNodeName == nnGeometry) { if (submesh->usesSharedVertexData) { @@ -632,20 +632,20 @@ XmlReaderPtr OgreXmlSerializer::OpenReader(Assimp::IOSystem *pIOHandler, const s std::unique_ptr file(pIOHandler->Open(filename)); if (!file.get()) { - throw DeadlyImportError("Failed to open skeleton file " + filename); + throw DeadlyImportError("Failed to open skeleton file ", filename); } std::unique_ptr stream(new CIrrXML_IOStreamReader(file.get())); XmlReaderPtr reader = XmlReaderPtr(irr::io::createIrrXMLReader(stream.get())); if (!reader.get()) { - throw DeadlyImportError("Failed to create XML reader for skeleton file " + filename); + throw DeadlyImportError("Failed to create XML reader for skeleton file ", filename); } return reader; } void OgreXmlSerializer::ReadSkeleton(Skeleton *skeleton) { if (NextNode() != nnSkeleton) { - throw DeadlyImportError("Root node is <" + m_currentNodeName + "> expecting "); + throw DeadlyImportError("Root node is <", m_currentNodeName, "> expecting "); } ASSIMP_LOG_VERBOSE_DEBUG("Reading Skeleton"); @@ -687,7 +687,7 @@ void OgreXmlSerializer::ReadAnimations(Skeleton *skeleton) { anim->length = ReadAttribute("length"); if (NextNode() != nnTracks) { - throw DeadlyImportError(Formatter::format() << "No found in " << anim->name); + throw DeadlyImportError("No found in ", anim->name); } ReadAnimationTracks(anim); @@ -705,7 +705,7 @@ void OgreXmlSerializer::ReadAnimationTracks(Animation *dest) { track.boneName = ReadAttribute("bone"); if (NextNode() != nnKeyFrames) { - throw DeadlyImportError(Formatter::format() << "No found in " << dest->name); + throw DeadlyImportError("No found in ", dest->name); } ReadAnimationKeyFrames(dest, &track); @@ -732,7 +732,7 @@ void OgreXmlSerializer::ReadAnimationKeyFrames(Animation *anim, VertexAnimationT float angle = ReadAttribute("angle"); if (NextNode() != nnAxis) { - throw DeadlyImportError("No axis specified for keyframe rotation in animation " + anim->name); + throw DeadlyImportError("No axis specified for keyframe rotation in animation ", anim->name); } aiVector3D axis; @@ -774,7 +774,7 @@ void OgreXmlSerializer::ReadBoneHierarchy(Skeleton *skeleton) { if (bone && parent) parent->AddChild(bone); else - throw DeadlyImportError("Failed to find bones for parenting: Child " + name + " for parent " + parentName); + throw DeadlyImportError("Failed to find bones for parenting: Child ", name, " for parent ", parentName); } // Calculate bone matrices for root bones. Recursively calculates their children. @@ -813,7 +813,7 @@ void OgreXmlSerializer::ReadBones(Skeleton *skeleton) { float angle = ReadAttribute("angle"); if (NextNode() != nnAxis) { - throw DeadlyImportError(Formatter::format() << "No axis specified for bone rotation in bone " << bone->id); + throw DeadlyImportError("No axis specified for bone rotation in bone ", bone->id); } aiVector3D axis; @@ -854,7 +854,7 @@ void OgreXmlSerializer::ReadBones(Skeleton *skeleton) { ASSIMP_LOG_VERBOSE_DEBUG_F(" ", b->id, " ", b->name); if (b->id != static_cast(i)) { - throw DeadlyImportError(Formatter::format() << "Bone ids are not in sequence starting from 0. Missing index " << i); + throw DeadlyImportError("Bone ids are not in sequence starting from 0. Missing index ", i); } } } diff --git a/code/AssetLib/X/XFileParser.cpp b/code/AssetLib/X/XFileParser.cpp index f0b751498..276d46b2e 100644 --- a/code/AssetLib/X/XFileParser.cpp +++ b/code/AssetLib/X/XFileParser.cpp @@ -82,6 +82,17 @@ static void dummy_free(void * /*opaque*/, void *address) { #endif // !! ASSIMP_BUILD_NO_COMPRESSED_X +// ------------------------------------------------------------------------------------------------ +// Throws an exception with a line number and the given text. +template +AI_WONT_RETURN void XFileParser::ThrowException(T&&... args) { + if (mIsBinaryFormat) { + throw DeadlyImportError(args...); + } else { + throw DeadlyImportError("Line ", mLineNumber, ": ", args...); + } +} + // ------------------------------------------------------------------------------------------------ // Constructor. Creates a data structure out of the XFile given in the memory block. XFileParser::XFileParser(const std::vector &pBuffer) : @@ -122,13 +133,13 @@ XFileParser::XFileParser(const std::vector &pBuffer) : mIsBinaryFormat = true; compressed = true; } else - ThrowException(format() << "Unsupported xfile format '" << mP[8] << mP[9] << mP[10] << mP[11] << "'"); + ThrowException("Unsupported xfile format '", mP[8], mP[9], mP[10], mP[11], "'"); // float size mBinaryFloatSize = (unsigned int)(mP[12] - 48) * 1000 + (unsigned int)(mP[13] - 48) * 100 + (unsigned int)(mP[14] - 48) * 10 + (unsigned int)(mP[15] - 48); if (mBinaryFloatSize != 32 && mBinaryFloatSize != 64) - ThrowException(format() << "Unknown float size " << mBinaryFloatSize << " specified in xfile header."); + ThrowException("Unknown float size ", mBinaryFloatSize, " specified in xfile header."); // The x format specifies size in bits, but we work in bytes mBinaryFloatSize /= 8; @@ -864,7 +875,7 @@ void XFileParser::ParseDataObjectAnimationKey(AnimBone *pAnimBone) { } default: - ThrowException(format() << "Unknown key type " << keyType << " in animation."); + ThrowException("Unknown key type ", keyType, " in animation."); break; } // end switch @@ -1355,16 +1366,6 @@ aiColor3D XFileParser::ReadRGB() { return color; } -// ------------------------------------------------------------------------------------------------ -// Throws an exception with a line number and the given text. -AI_WONT_RETURN void XFileParser::ThrowException(const std::string &pText) { - if (mIsBinaryFormat) { - throw DeadlyImportError(pText); - } else { - throw DeadlyImportError(format() << "Line " << mLineNumber << ": " << pText); - } -} - // ------------------------------------------------------------------------------------------------ // Filters the imported hierarchy for some degenerated cases that some exporters produce. void XFileParser::FilterHierarchy(XFile::Node *pNode) { diff --git a/code/AssetLib/X/XFileParser.h b/code/AssetLib/X/XFileParser.h index 41abe2286..bda904172 100644 --- a/code/AssetLib/X/XFileParser.h +++ b/code/AssetLib/X/XFileParser.h @@ -133,7 +133,8 @@ protected: aiColor4D ReadRGBA(); /** Throws an exception with a line number and the given text. */ - AI_WONT_RETURN void ThrowException( const std::string& pText) AI_WONT_RETURN_SUFFIX; + template + AI_WONT_RETURN void ThrowException(T&&... args) AI_WONT_RETURN_SUFFIX; /** * @brief Filters the imported hierarchy for some degenerated cases that some exporters produce. diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 9fafa4944..7bcb2d58a 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -200,6 +200,7 @@ SET( Common_SRCS Common/simd.cpp Common/material.cpp Common/AssertHandler.cpp + Common/Exceptional.cpp ) SOURCE_GROUP(Common FILES ${Common_SRCS}) diff --git a/code/Common/Exceptional.cpp b/code/Common/Exceptional.cpp new file mode 100644 index 000000000..e3e3b535b --- /dev/null +++ b/code/Common/Exceptional.cpp @@ -0,0 +1,58 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2020, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ + +/** @file Exceptional.cpp + +Implementations of the exception classes. + +*/ + +#include +#include + +DeadlyErrorBase::DeadlyErrorBase(const std::string& errorText) + : runtime_error(errorText) +{} + +DeadlyErrorBase::DeadlyErrorBase(Assimp::Formatter::format f) + : DeadlyErrorBase(std::string(f)) +{ +} diff --git a/include/assimp/Exceptional.h b/include/assimp/Exceptional.h index bcd5fb7af..7d010142c 100644 --- a/include/assimp/Exceptional.h +++ b/include/assimp/Exceptional.h @@ -47,6 +47,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #endif #include +#include #include using std::runtime_error; @@ -55,25 +56,41 @@ using std::runtime_error; #pragma warning(disable : 4275) #endif +class ASSIMP_API DeadlyErrorBase : public runtime_error { +protected: + /** Constructor with arguments */ + explicit DeadlyErrorBase(const std::string& errorText); + + explicit DeadlyErrorBase(Assimp::Formatter::format f); + + template + explicit DeadlyErrorBase(Assimp::Formatter::format f, U&& u, T&&... args) + : DeadlyErrorBase(std::move(f << u), args...) + { + } +}; + // --------------------------------------------------------------------------- /** FOR IMPORTER PLUGINS ONLY: Simple exception class to be thrown if an * unrecoverable error occurs while importing. Loading APIs return * nullptr instead of a valid aiScene then. */ -class DeadlyImportError : public runtime_error { +class ASSIMP_API DeadlyImportError : public DeadlyErrorBase { public: /** Constructor with arguments */ - explicit DeadlyImportError(const std::string &errorText) : - runtime_error(errorText) { - // empty + template + explicit DeadlyImportError(T&&... args) + : DeadlyErrorBase(Assimp::Formatter::format(), args...) + { } }; -class DeadlyExportError : public runtime_error { +class ASSIMP_API DeadlyExportError : public DeadlyErrorBase { public: /** Constructor with arguments */ - explicit DeadlyExportError(const std::string &errorText) : - runtime_error(errorText) { - // empty + template + explicit DeadlyExportError(T&&... args) + : DeadlyErrorBase(Assimp::Formatter::format(), args...) + { } }; diff --git a/include/assimp/LogAux.h b/include/assimp/LogAux.h index 330c5e93e..407820aac 100644 --- a/include/assimp/LogAux.h +++ b/include/assimp/LogAux.h @@ -61,9 +61,10 @@ template class LogFunctions { public: // ------------------------------------------------------------------------------------------------ - static void ThrowException(const std::string& msg) + template + static void ThrowException(T&&... args) { - throw DeadlyImportError(Prefix()+msg); + throw DeadlyImportError(Prefix(), args...); } // ------------------------------------------------------------------------------------------------ diff --git a/include/assimp/TinyFormatter.h b/include/assimp/TinyFormatter.h index 3c6ca66c6..0f2cf6362 100644 --- a/include/assimp/TinyFormatter.h +++ b/include/assimp/TinyFormatter.h @@ -88,6 +88,9 @@ public: underlying << sin; } + basic_formatter(basic_formatter&& other) + : underlying(std::move(other.underlying)) { + } // The problem described here: // https://sourceforge.net/tracker/?func=detail&atid=1067632&aid=3358562&group_id=226462 From b7c789da676dda20a097b60c2f31b6de61fc01b9 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Tue, 18 Aug 2020 17:35:08 +0100 Subject: [PATCH 096/129] Stop concatenating std::strings. Use formatter. --- code/AssetLib/3DS/3DSLoader.cpp | 4 +- code/AssetLib/3MF/D3MFOpcPackage.cpp | 4 +- code/AssetLib/AC/ACLoader.cpp | 2 +- code/AssetLib/AMF/AMFImporter.cpp | 20 +++---- code/AssetLib/ASE/ASELoader.cpp | 2 +- code/AssetLib/B3D/B3DImporter.cpp | 4 +- code/AssetLib/BVH/BVHLoader.cpp | 4 +- code/AssetLib/COB/COBLoader.cpp | 2 +- code/AssetLib/CSM/CSMLoader.cpp | 2 +- code/AssetLib/Collada/ColladaParser.cpp | 2 +- code/AssetLib/DXF/DXFLoader.cpp | 2 +- code/AssetLib/FBX/FBXBinaryTokenizer.cpp | 2 +- code/AssetLib/FBX/FBXDocumentUtil.cpp | 2 +- code/AssetLib/FBX/FBXParser.cpp | 2 +- code/AssetLib/HMP/HMPLoader.cpp | 6 +- code/AssetLib/Irr/IRRLoader.cpp | 2 +- code/AssetLib/Irr/IRRMeshLoader.cpp | 2 +- code/AssetLib/LWO/LWOLoader.cpp | 6 +- code/AssetLib/LWS/LWSLoader.cpp | 2 +- code/AssetLib/M3D/M3DImporter.cpp | 10 ++-- code/AssetLib/MD2/MD2Loader.cpp | 2 +- code/AssetLib/MD3/MD3Loader.cpp | 2 +- code/AssetLib/MD5/MD5Loader.cpp | 2 +- code/AssetLib/MDC/MDCLoader.cpp | 2 +- code/AssetLib/MDL/HalfLife/HL1MDLLoader.h | 4 +- code/AssetLib/MDL/MDLLoader.cpp | 6 +- code/AssetLib/MMD/MMDImporter.cpp | 4 +- code/AssetLib/MMD/MMDPmxParser.cpp | 2 +- code/AssetLib/MS3D/MS3DLoader.cpp | 2 +- code/AssetLib/NFF/NFFLoader.cpp | 2 +- code/AssetLib/OFF/OFFLoader.cpp | 2 +- code/AssetLib/Obj/ObjFileImporter.cpp | 2 +- code/AssetLib/Ogre/OgreBinarySerializer.cpp | 2 +- code/AssetLib/Ogre/OgreImporter.cpp | 2 +- code/AssetLib/OpenGEX/OpenGEXImporter.cpp | 2 +- code/AssetLib/Ply/PlyLoader.cpp | 4 +- code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp | 2 +- code/AssetLib/Q3D/Q3DLoader.cpp | 5 +- code/AssetLib/Raw/RawLoader.cpp | 2 +- code/AssetLib/SIB/SIBImporter.cpp | 2 +- code/AssetLib/SMD/SMDLoader.cpp | 2 +- code/AssetLib/STL/STLLoader.cpp | 4 +- code/AssetLib/Terragen/TerragenLoader.cpp | 2 +- code/AssetLib/X/XFileImporter.cpp | 2 +- code/AssetLib/X3D/FIReader.cpp | 14 ++--- code/AssetLib/X3D/X3DImporter.cpp | 60 +++++++++---------- code/AssetLib/X3D/X3DImporter_Postprocess.cpp | 22 +++---- code/AssetLib/XGL/XGLLoader.cpp | 2 +- code/AssetLib/glTF/glTFAsset.inl | 58 +++++++++--------- code/AssetLib/glTF/glTFImporter.cpp | 2 +- code/AssetLib/glTF2/glTF2Asset.h | 2 +- code/AssetLib/glTF2/glTF2Asset.inl | 30 +++++----- code/AssetLib/glTF2/glTF2Importer.cpp | 2 +- code/PostProcessing/ValidateDataStructure.cpp | 2 +- doc/dox.h | 2 +- include/assimp/irrXMLWrapper.h | 2 +- 56 files changed, 171 insertions(+), 172 deletions(-) diff --git a/code/AssetLib/3DS/3DSLoader.cpp b/code/AssetLib/3DS/3DSLoader.cpp index e1a6d0f89..4c24394fb 100644 --- a/code/AssetLib/3DS/3DSLoader.cpp +++ b/code/AssetLib/3DS/3DSLoader.cpp @@ -147,7 +147,7 @@ void Discreet3DSImporter::InternReadFile(const std::string &pFile, // We should have at least one chunk if (theStream.GetRemainingSize() < 16) { - throw DeadlyImportError("3DS file is either empty or corrupt: " + pFile); + throw DeadlyImportError("3DS file is either empty or corrupt: ", pFile); } this->stream = &theStream; @@ -178,7 +178,7 @@ void Discreet3DSImporter::InternReadFile(const std::string &pFile, // file. for (auto &mesh : mScene->mMeshes) { if (mesh.mFaces.size() > 0 && mesh.mPositions.size() == 0) { - throw DeadlyImportError("3DS file contains faces but no vertices: " + pFile); + throw DeadlyImportError("3DS file contains faces but no vertices: ", pFile); } CheckIndices(mesh); MakeUnique(mesh); diff --git a/code/AssetLib/3MF/D3MFOpcPackage.cpp b/code/AssetLib/3MF/D3MFOpcPackage.cpp index e8e1e2f5e..7094ea3ae 100644 --- a/code/AssetLib/3MF/D3MFOpcPackage.cpp +++ b/code/AssetLib/3MF/D3MFOpcPackage.cpp @@ -118,7 +118,7 @@ D3MFOpcPackage::D3MFOpcPackage(IOSystem *pIOHandler, const std::string &rFile) : mRootStream(nullptr), mZipArchive() { mZipArchive.reset(new ZipArchiveIOSystem(pIOHandler, rFile)); if (!mZipArchive->isOpen()) { - throw DeadlyImportError("Failed to open file " + rFile + "."); + throw DeadlyImportError("Failed to open file ", rFile, "."); } std::vector fileList; @@ -192,7 +192,7 @@ std::string D3MFOpcPackage::ReadPackageRootRelationship(IOStream *stream) { }); if (itr == reader.m_relationShips.end()) { - throw DeadlyImportError("Cannot find " + XmlTag::PACKAGE_START_PART_RELATIONSHIP_TYPE); + throw DeadlyImportError("Cannot find ", XmlTag::PACKAGE_START_PART_RELATIONSHIP_TYPE); } return (*itr)->target; diff --git a/code/AssetLib/AC/ACLoader.cpp b/code/AssetLib/AC/ACLoader.cpp index 4291ce8d1..bf2828655 100644 --- a/code/AssetLib/AC/ACLoader.cpp +++ b/code/AssetLib/AC/ACLoader.cpp @@ -762,7 +762,7 @@ void AC3DImporter::InternReadFile(const std::string &pFile, // Check whether we can read from the file if (file.get() == nullptr) { - throw DeadlyImportError("Failed to open AC3D file " + pFile + "."); + throw DeadlyImportError("Failed to open AC3D file ", pFile, "."); } // allocate storage and copy the contents of the file to a memory buffer diff --git a/code/AssetLib/AMF/AMFImporter.cpp b/code/AssetLib/AMF/AMFImporter.cpp index 0b76b2652..fed259a9b 100644 --- a/code/AssetLib/AMF/AMFImporter.cpp +++ b/code/AssetLib/AMF/AMFImporter.cpp @@ -143,23 +143,23 @@ bool AMFImporter::Find_ConvertedMaterial(const std::string &pID, const SPP_Mater /*********************************************************************************************************************************************/ void AMFImporter::Throw_CloseNotFound(const std::string &pNode) { - throw DeadlyImportError("Close tag for node <" + pNode + "> not found. Seems file is corrupt."); + throw DeadlyImportError("Close tag for node <", pNode, "> not found. Seems file is corrupt."); } void AMFImporter::Throw_IncorrectAttr(const std::string &pAttrName) { - throw DeadlyImportError("Node <" + std::string(mReader->getNodeName()) + "> has incorrect attribute \"" + pAttrName + "\"."); + throw DeadlyImportError("Node <", std::string(mReader->getNodeName()), "> has incorrect attribute \"", pAttrName, "\"."); } void AMFImporter::Throw_IncorrectAttrValue(const std::string &pAttrName) { - throw DeadlyImportError("Attribute \"" + pAttrName + "\" in node <" + std::string(mReader->getNodeName()) + "> has incorrect value."); + throw DeadlyImportError("Attribute \"", pAttrName, "\" in node <", std::string(mReader->getNodeName()), "> has incorrect value."); } void AMFImporter::Throw_MoreThanOnceDefined(const std::string &pNodeType, const std::string &pDescription) { - throw DeadlyImportError("\"" + pNodeType + "\" node can be used only once in " + mReader->getNodeName() + ". Description: " + pDescription); + throw DeadlyImportError("\"", pNodeType, "\" node can be used only once in ", mReader->getNodeName(), ". Description: ", pDescription); } void AMFImporter::Throw_ID_NotFound(const std::string &pID) const { - throw DeadlyImportError("Not found node with name \"" + pID + "\"."); + throw DeadlyImportError("Not found node with name \"", pID, "\"."); } /*********************************************************************************************************************************************/ @@ -167,7 +167,7 @@ void AMFImporter::Throw_ID_NotFound(const std::string &pID) const { /*********************************************************************************************************************************************/ void AMFImporter::XML_CheckNode_MustHaveChildren() { - if (mReader->isEmptyElement()) throw DeadlyImportError(std::string("Node <") + mReader->getNodeName() + "> must have children."); + if (mReader->isEmptyElement()) throw DeadlyImportError("Node <", mReader->getNodeName(), "> must have children."); } void AMFImporter::XML_CheckNode_SkipUnsupported(const std::string &pParentNodeName) { @@ -202,7 +202,7 @@ void AMFImporter::XML_CheckNode_SkipUnsupported(const std::string &pParentNodeNa casu_cres: - if (!found) throw DeadlyImportError("Unknown node \"" + nn + "\" in " + pParentNodeName + "."); + if (!found) throw DeadlyImportError("Unknown node \"", nn, "\" in ", pParentNodeName, "."); if (!close_found) Throw_CloseNotFound(nn); if (!skipped_before[sk_idx]) { @@ -227,7 +227,7 @@ bool AMFImporter::XML_ReadNode_GetAttrVal_AsBool(const int pAttrIdx) { else if ((val == "true") || (val == "1")) return true; else - throw DeadlyImportError("Bool attribute value can contain \"false\"/\"0\" or \"true\"/\"1\" not the \"" + val + "\""); + throw DeadlyImportError("Bool attribute value can contain \"false\"/\"0\" or \"true\"/\"1\" not the \"", val, "\""); } float AMFImporter::XML_ReadNode_GetAttrVal_AsFloat(const int pAttrIdx) { @@ -367,13 +367,13 @@ void AMFImporter::ParseFile(const std::string &pFile, IOSystem *pIOHandler) { // Check whether we can read from the file if (file.get() == nullptr) { - throw DeadlyImportError("Failed to open AMF file " + pFile + "."); + throw DeadlyImportError("Failed to open AMF file ", pFile, "."); } // generate a XML reader for it std::unique_ptr mIOWrapper(new CIrrXML_IOStreamReader(file.get())); mReader = irr::io::createIrrXMLReader(mIOWrapper.get()); - if (!mReader) throw DeadlyImportError("Failed to create XML reader for file" + pFile + "."); + if (!mReader) throw DeadlyImportError("Failed to create XML reader for file", pFile, "."); // // start reading // search for root tag diff --git a/code/AssetLib/ASE/ASELoader.cpp b/code/AssetLib/ASE/ASELoader.cpp index a27767229..057272c91 100644 --- a/code/AssetLib/ASE/ASELoader.cpp +++ b/code/AssetLib/ASE/ASELoader.cpp @@ -137,7 +137,7 @@ void ASEImporter::InternReadFile(const std::string &pFile, // Check whether we can read from the file if (file.get() == nullptr) { - throw DeadlyImportError("Failed to open ASE file " + pFile + "."); + throw DeadlyImportError("Failed to open ASE file ", pFile, "."); } // Allocate storage and copy the contents of the file to a memory buffer diff --git a/code/AssetLib/B3D/B3DImporter.cpp b/code/AssetLib/B3D/B3DImporter.cpp index ff595aaf1..25e484e02 100644 --- a/code/AssetLib/B3D/B3DImporter.cpp +++ b/code/AssetLib/B3D/B3DImporter.cpp @@ -119,7 +119,7 @@ void B3DImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy // Check whether we can read from the file if (file.get() == nullptr) { - throw DeadlyImportError("Failed to open B3D file " + pFile + "."); + throw DeadlyImportError("Failed to open B3D file ", pFile, "."); } // check whether the .b3d file is large enough to contain @@ -147,7 +147,7 @@ AI_WONT_RETURN void B3DImporter::Fail(string str) { #ifdef DEBUG_B3D ASSIMP_LOG_ERROR_F("Error in B3D file data: ", str); #endif - throw DeadlyImportError("B3D Importer - error in B3D file data: " + str); + throw DeadlyImportError("B3D Importer - error in B3D file data: ", str); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/BVH/BVHLoader.cpp b/code/AssetLib/BVH/BVHLoader.cpp index 94fb0b2d1..3bea70c95 100644 --- a/code/AssetLib/BVH/BVHLoader.cpp +++ b/code/AssetLib/BVH/BVHLoader.cpp @@ -125,7 +125,7 @@ void BVHLoader::InternReadFile(const std::string &pFile, aiScene *pScene, IOSyst // read file into memory std::unique_ptr file(pIOHandler->Open(pFile)); if (file.get() == nullptr) { - throw DeadlyImportError("Failed to open file " + pFile + "."); + throw DeadlyImportError("Failed to open file ", pFile, "."); } size_t fileSize = file->FileSize(); @@ -454,7 +454,7 @@ void BVHLoader::CreateAnimation(aiScene *pScene) { std::map::iterator mapIter = channelMap.find(channel); if (mapIter == channelMap.end()) - throw DeadlyImportError("Missing position channel in node " + nodeName); + throw DeadlyImportError("Missing position channel in node ", nodeName); else { int channelIdx = mapIter->second; switch (channel) { diff --git a/code/AssetLib/COB/COBLoader.cpp b/code/AssetLib/COB/COBLoader.cpp index 86550e776..80b41143e 100644 --- a/code/AssetLib/COB/COBLoader.cpp +++ b/code/AssetLib/COB/COBLoader.cpp @@ -125,7 +125,7 @@ void COBImporter::SetupProperties(const Importer * /*pImp*/) { // ------------------------------------------------------------------------------------------------ /*static*/ AI_WONT_RETURN void COBImporter::ThrowException(const std::string &msg) { - throw DeadlyImportError("COB: " + msg); + throw DeadlyImportError("COB: ", msg); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/CSM/CSMLoader.cpp b/code/AssetLib/CSM/CSMLoader.cpp index c455bb3a4..a90bc4b89 100644 --- a/code/AssetLib/CSM/CSMLoader.cpp +++ b/code/AssetLib/CSM/CSMLoader.cpp @@ -128,7 +128,7 @@ void CSMImporter::InternReadFile( const std::string& pFile, // Check whether we can read from the file if( file.get() == nullptr) { - throw DeadlyImportError( "Failed to open CSM file " + pFile + "."); + throw DeadlyImportError( "Failed to open CSM file ", pFile, "."); } // allocate storage and copy the contents of the file to a memory buffer diff --git a/code/AssetLib/Collada/ColladaParser.cpp b/code/AssetLib/Collada/ColladaParser.cpp index 54f63b8dd..90157f63c 100644 --- a/code/AssetLib/Collada/ColladaParser.cpp +++ b/code/AssetLib/Collada/ColladaParser.cpp @@ -123,7 +123,7 @@ ColladaParser::ColladaParser(IOSystem *pIOHandler, const std::string &pFile) : // attempt to open the file directly daefile.reset(pIOHandler->Open(pFile)); if (daefile.get() == nullptr) { - throw DeadlyImportError("Failed to open file '" + pFile + "'."); + throw DeadlyImportError("Failed to open file '", pFile, "'."); } } diff --git a/code/AssetLib/DXF/DXFLoader.cpp b/code/AssetLib/DXF/DXFLoader.cpp index 97b0d19dd..cda391fb8 100644 --- a/code/AssetLib/DXF/DXFLoader.cpp +++ b/code/AssetLib/DXF/DXFLoader.cpp @@ -152,7 +152,7 @@ void DXFImporter::InternReadFile( const std::string& filename, aiScene* pScene, // Check whether we can read the file if( file.get() == nullptr ) { - throw DeadlyImportError( "Failed to open DXF file " + filename + ""); + throw DeadlyImportError( "Failed to open DXF file ", filename, ""); } // Check whether this is a binary DXF file - we can't read binary DXF files :-( diff --git a/code/AssetLib/FBX/FBXBinaryTokenizer.cpp b/code/AssetLib/FBX/FBXBinaryTokenizer.cpp index 78f02ff96..2ed41ccdb 100644 --- a/code/AssetLib/FBX/FBXBinaryTokenizer.cpp +++ b/code/AssetLib/FBX/FBXBinaryTokenizer.cpp @@ -468,7 +468,7 @@ void TokenizeBinary(TokenList& output_tokens, const char* input, size_t length) catch (const DeadlyImportError& e) { if (!is64bits && (length > std::numeric_limits::max())) { - throw DeadlyImportError("The FBX file is invalid. This may be because the content is too big for this older version (" + to_string(version) + ") of the FBX format. (" + e.what() + ")"); + throw DeadlyImportError("The FBX file is invalid. This may be because the content is too big for this older version (", to_string(version), ") of the FBX format. (", e.what(), ")"); } throw; } diff --git a/code/AssetLib/FBX/FBXDocumentUtil.cpp b/code/AssetLib/FBX/FBXDocumentUtil.cpp index 16235645c..9bbc39e00 100644 --- a/code/AssetLib/FBX/FBXDocumentUtil.cpp +++ b/code/AssetLib/FBX/FBXDocumentUtil.cpp @@ -70,7 +70,7 @@ void DOMError(const std::string& message, const Element* element /*= nullptr*/) if(element) { DOMError(message,element->KeyToken()); } - throw DeadlyImportError("FBX-DOM " + message); + throw DeadlyImportError("FBX-DOM ", message); } diff --git a/code/AssetLib/FBX/FBXParser.cpp b/code/AssetLib/FBX/FBXParser.cpp index 3c9137ccc..cfd2a5830 100644 --- a/code/AssetLib/FBX/FBXParser.cpp +++ b/code/AssetLib/FBX/FBXParser.cpp @@ -83,7 +83,7 @@ namespace { if(element) { ParseError(message,element->KeyToken()); } - throw DeadlyImportError("FBX-Parser " + message); + throw DeadlyImportError("FBX-Parser ", message); } diff --git a/code/AssetLib/HMP/HMPLoader.cpp b/code/AssetLib/HMP/HMPLoader.cpp index 33460cc73..8ccba2ea4 100644 --- a/code/AssetLib/HMP/HMPLoader.cpp +++ b/code/AssetLib/HMP/HMPLoader.cpp @@ -115,7 +115,7 @@ void HMPImporter::InternReadFile(const std::string &pFile, // Check whether we can read from the file if (file.get() == nullptr) { - throw DeadlyImportError("Failed to open HMP file " + pFile + "."); + throw DeadlyImportError("Failed to open HMP file ", pFile, "."); } // Check whether the HMP file is large enough to contain @@ -159,8 +159,8 @@ void HMPImporter::InternReadFile(const std::string &pFile, szBuffer[4] = '\0'; // We're definitely unable to load this file - throw DeadlyImportError("Unknown HMP subformat " + pFile + - ". Magic word (" + szBuffer + ") is not known"); + throw DeadlyImportError("Unknown HMP subformat ", pFile, + ". Magic word (", szBuffer, ") is not known"); } // Set the AI_SCENE_FLAGS_TERRAIN bit diff --git a/code/AssetLib/Irr/IRRLoader.cpp b/code/AssetLib/Irr/IRRLoader.cpp index 5d5253516..c26ee40ba 100644 --- a/code/AssetLib/Irr/IRRLoader.cpp +++ b/code/AssetLib/Irr/IRRLoader.cpp @@ -867,7 +867,7 @@ void IRRImporter::InternReadFile(const std::string &pFile, // Check whether we can read from the file if (file.get() == nullptr) { - throw DeadlyImportError("Failed to open IRR file " + pFile + ""); + throw DeadlyImportError("Failed to open IRR file ", pFile, ""); } // Construct the irrXML parser diff --git a/code/AssetLib/Irr/IRRMeshLoader.cpp b/code/AssetLib/Irr/IRRMeshLoader.cpp index d07ff87ea..48bd06b3e 100644 --- a/code/AssetLib/Irr/IRRMeshLoader.cpp +++ b/code/AssetLib/Irr/IRRMeshLoader.cpp @@ -140,7 +140,7 @@ void IRRMeshImporter::InternReadFile( const std::string& pFile, // Check whether we can read from the file if (file.get() == nullptr) { - throw DeadlyImportError("Failed to open IRRMESH file " + pFile + "."); + throw DeadlyImportError("Failed to open IRRMESH file ", pFile, "."); } // Construct the irrXML parser diff --git a/code/AssetLib/LWO/LWOLoader.cpp b/code/AssetLib/LWO/LWOLoader.cpp index ef11f2d15..149360559 100644 --- a/code/AssetLib/LWO/LWOLoader.cpp +++ b/code/AssetLib/LWO/LWOLoader.cpp @@ -145,7 +145,7 @@ void LWOImporter::InternReadFile(const std::string &pFile, // Check whether we can read from the file if (file.get() == nullptr) { - throw DeadlyImportError("Failed to open LWO file " + pFile + "."); + throw DeadlyImportError("Failed to open LWO file ", pFile, "."); } if ((this->fileSize = (unsigned int)file->FileSize()) < 12) { @@ -212,7 +212,7 @@ void LWOImporter::InternReadFile(const std::string &pFile, szBuff[2] = (char)(fileType >> 8u); szBuff[3] = (char)(fileType); szBuff[4] = '\0'; - throw DeadlyImportError(std::string("Unknown LWO sub format: ") + szBuff); + throw DeadlyImportError("Unknown LWO sub format: ", szBuff); } if (AI_LWO_FOURCC_LWOB != fileType) { @@ -232,7 +232,7 @@ void LWOImporter::InternReadFile(const std::string &pFile, } if (configLayerName.length() && !hasNamedLayer) { - throw DeadlyImportError("LWO2: Unable to find the requested layer: " + configLayerName); + throw DeadlyImportError("LWO2: Unable to find the requested layer: ", configLayerName); } } diff --git a/code/AssetLib/LWS/LWSLoader.cpp b/code/AssetLib/LWS/LWSLoader.cpp index 38b44f842..7d67c86d6 100644 --- a/code/AssetLib/LWS/LWSLoader.cpp +++ b/code/AssetLib/LWS/LWSLoader.cpp @@ -502,7 +502,7 @@ void LWSImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy // Check whether we can read from the file if (file.get() == nullptr) { - throw DeadlyImportError("Failed to open LWS file " + pFile + "."); + throw DeadlyImportError("Failed to open LWS file ", pFile, "."); } // Allocate storage and copy the contents of the file to a memory buffer diff --git a/code/AssetLib/M3D/M3DImporter.cpp b/code/AssetLib/M3D/M3DImporter.cpp index d6fe678ec..05b75148b 100644 --- a/code/AssetLib/M3D/M3DImporter.cpp +++ b/code/AssetLib/M3D/M3DImporter.cpp @@ -160,21 +160,21 @@ void M3DImporter::InternReadFile(const std::string &file, aiScene *pScene, IOSys // Read file into memory std::unique_ptr pStream(pIOHandler->Open(file, "rb")); if (!pStream.get()) { - throw DeadlyImportError("Failed to open file " + file + "."); + throw DeadlyImportError("Failed to open file ", file, "."); } // Get the file-size and validate it, throwing an exception when fails size_t fileSize = pStream->FileSize(); if (fileSize < 8) { - throw DeadlyImportError("M3D-file " + file + " is too small."); + throw DeadlyImportError("M3D-file ", file, " is too small."); } std::vector buffer(fileSize); if (fileSize != pStream->Read(buffer.data(), 1, fileSize)) { - throw DeadlyImportError("Failed to read the file " + file + "."); + throw DeadlyImportError("Failed to read the file ", file, "."); } // extra check for binary format's first 8 bytes. Not done for the ASCII variant if (!memcmp(buffer.data(), "3DMO", 4) && memcmp(buffer.data() + 4, &fileSize, 4)) { - throw DeadlyImportError("Bad binary header in file " + file + "."); + throw DeadlyImportError("Bad binary header in file ", file, "."); } #ifdef M3D_ASCII // make sure there's a terminator zero character, as input must be ASCIIZ @@ -200,7 +200,7 @@ void M3DImporter::InternReadFile(const std::string &file, aiScene *pScene, IOSys M3DWrapper m3d(pIOHandler, buffer); if (!m3d) { - throw DeadlyImportError("Unable to parse " + file + " as M3D."); + throw DeadlyImportError("Unable to parse ", file, " as M3D."); } // create the root node diff --git a/code/AssetLib/MD2/MD2Loader.cpp b/code/AssetLib/MD2/MD2Loader.cpp index abc5f06ff..87b7a5609 100644 --- a/code/AssetLib/MD2/MD2Loader.cpp +++ b/code/AssetLib/MD2/MD2Loader.cpp @@ -222,7 +222,7 @@ void MD2Importer::InternReadFile( const std::string& pFile, // Check whether we can read from the file if (file.get() == nullptr) { - throw DeadlyImportError("Failed to open MD2 file " + pFile + ""); + throw DeadlyImportError("Failed to open MD2 file ", pFile, ""); } // check whether the md3 file is large enough to contain diff --git a/code/AssetLib/MD3/MD3Loader.cpp b/code/AssetLib/MD3/MD3Loader.cpp index 92d567801..9c31a7b20 100644 --- a/code/AssetLib/MD3/MD3Loader.cpp +++ b/code/AssetLib/MD3/MD3Loader.cpp @@ -715,7 +715,7 @@ void MD3Importer::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy // Check whether we can read from the file if (file.get() == nullptr) { - throw DeadlyImportError("Failed to open MD3 file " + pFile + "."); + throw DeadlyImportError("Failed to open MD3 file ", pFile, "."); } // Check whether the md3 file is large enough to contain the header diff --git a/code/AssetLib/MD5/MD5Loader.cpp b/code/AssetLib/MD5/MD5Loader.cpp index 5428a9c74..1741f4472 100644 --- a/code/AssetLib/MD5/MD5Loader.cpp +++ b/code/AssetLib/MD5/MD5Loader.cpp @@ -675,7 +675,7 @@ void MD5Importer::LoadMD5CameraFile() { // Check whether we can read from the file if (!file.get() || !file->FileSize()) { - throw DeadlyImportError("Failed to read MD5CAMERA file: " + pFile); + throw DeadlyImportError("Failed to read MD5CAMERA file: ", pFile); } mHadMD5Camera = true; LoadFileIntoMemory(file.get()); diff --git a/code/AssetLib/MDC/MDCLoader.cpp b/code/AssetLib/MDC/MDCLoader.cpp index 5748fba0b..0e917171c 100644 --- a/code/AssetLib/MDC/MDCLoader.cpp +++ b/code/AssetLib/MDC/MDCLoader.cpp @@ -219,7 +219,7 @@ void MDCImporter::InternReadFile( // Check whether we can read from the file if (file.get() == nullptr) { - throw DeadlyImportError("Failed to open MDC file " + pFile + "."); + throw DeadlyImportError("Failed to open MDC file ", pFile, "."); } // check whether the mdc file is large enough to contain the file header diff --git a/code/AssetLib/MDL/HalfLife/HL1MDLLoader.h b/code/AssetLib/MDL/HalfLife/HL1MDLLoader.h index 2891ddb1e..2fa1fd0e4 100644 --- a/code/AssetLib/MDL/HalfLife/HL1MDLLoader.h +++ b/code/AssetLib/MDL/HalfLife/HL1MDLLoader.h @@ -218,12 +218,12 @@ private: template void HL1MDLLoader::load_file_into_buffer(const std::string &file_path, unsigned char *&buffer) { if (!io_->Exists(file_path)) - throw DeadlyImportError("Missing file " + DefaultIOSystem::fileName(file_path) + "."); + throw DeadlyImportError("Missing file ", DefaultIOSystem::fileName(file_path), "."); std::unique_ptr file(io_->Open(file_path)); if (file.get() == nullptr) { - throw DeadlyImportError("Failed to open MDL file " + DefaultIOSystem::fileName(file_path) + "."); + throw DeadlyImportError("Failed to open MDL file ", DefaultIOSystem::fileName(file_path), "."); } const size_t file_size = file->FileSize(); diff --git a/code/AssetLib/MDL/MDLLoader.cpp b/code/AssetLib/MDL/MDLLoader.cpp index e917e3b5e..4e28f1a2f 100644 --- a/code/AssetLib/MDL/MDLLoader.cpp +++ b/code/AssetLib/MDL/MDLLoader.cpp @@ -167,7 +167,7 @@ void MDLImporter::InternReadFile(const std::string &pFile, // Check whether we can read from the file if (file.get() == nullptr) { - throw DeadlyImportError("Failed to open MDL file " + pFile + "."); + throw DeadlyImportError("Failed to open MDL file ", pFile, "."); } // This should work for all other types of MDL files, too ... @@ -251,8 +251,8 @@ void MDLImporter::InternReadFile(const std::string &pFile, } } else { // print the magic word to the log file - throw DeadlyImportError("Unknown MDL subformat " + pFile + - ". Magic word (" + std::string((char *)&iMagicWord, 4) + ") is not known"); + throw DeadlyImportError("Unknown MDL subformat ", pFile, + ". Magic word (", std::string((char *)&iMagicWord, 4), ") is not known"); } // Now rotate the whole scene 90 degrees around the x axis to convert to internal coordinate system diff --git a/code/AssetLib/MMD/MMDImporter.cpp b/code/AssetLib/MMD/MMDImporter.cpp index 0814f4813..d1912d2fe 100644 --- a/code/AssetLib/MMD/MMDImporter.cpp +++ b/code/AssetLib/MMD/MMDImporter.cpp @@ -111,7 +111,7 @@ void MMDImporter::InternReadFile(const std::string &file, aiScene *pScene, // Read file by istream std::filebuf fb; if (!fb.open(file, std::ios::in | std::ios::binary)) { - throw DeadlyImportError("Failed to open file " + file + "."); + throw DeadlyImportError("Failed to open file ", file, "."); } std::istream fileStream(&fb); @@ -122,7 +122,7 @@ void MMDImporter::InternReadFile(const std::string &file, aiScene *pScene, fileStream.seekg(0, fileStream.beg); if (fileSize < sizeof(pmx::PmxModel)) { - throw DeadlyImportError(file + " is too small."); + throw DeadlyImportError(file, " is too small."); } pmx::PmxModel model; diff --git a/code/AssetLib/MMD/MMDPmxParser.cpp b/code/AssetLib/MMD/MMDPmxParser.cpp index 7ac5ac399..bbeeef4b8 100644 --- a/code/AssetLib/MMD/MMDPmxParser.cpp +++ b/code/AssetLib/MMD/MMDPmxParser.cpp @@ -524,7 +524,7 @@ namespace pmx if (version != 2.0f && version != 2.1f) { std::cerr << "this is not ver2.0 or ver2.1 but " << version << "." << std::endl; - throw DeadlyImportError("MMD: this is not ver2.0 or ver2.1 but " + to_string(version)); + throw DeadlyImportError("MMD: this is not ver2.0 or ver2.1 but ", to_string(version)); } this->setting.Read(stream); diff --git a/code/AssetLib/MS3D/MS3DLoader.cpp b/code/AssetLib/MS3D/MS3DLoader.cpp index b5b6673f3..7edbd91f2 100644 --- a/code/AssetLib/MS3D/MS3DLoader.cpp +++ b/code/AssetLib/MS3D/MS3DLoader.cpp @@ -229,7 +229,7 @@ void MS3DImporter::InternReadFile( const std::string& pFile, stream.CopyAndAdvance(head,10); stream >> version; if (strncmp(head,"MS3D000000",10)) { - throw DeadlyImportError("Not a MS3D file, magic string MS3D000000 not found: "+pFile); + throw DeadlyImportError("Not a MS3D file, magic string MS3D000000 not found: ", pFile); } if (version != 4) { diff --git a/code/AssetLib/NFF/NFFLoader.cpp b/code/AssetLib/NFF/NFFLoader.cpp index a5e6c8c7a..1a4a65982 100644 --- a/code/AssetLib/NFF/NFFLoader.cpp +++ b/code/AssetLib/NFF/NFFLoader.cpp @@ -214,7 +214,7 @@ void NFFImporter::InternReadFile(const std::string &pFile, // Check whether we can read from the file if (!file.get()) - throw DeadlyImportError("Failed to open NFF file " + pFile + "."); + throw DeadlyImportError("Failed to open NFF file ", pFile, "."); // allocate storage and copy the contents of the file to a memory buffer // (terminate it with zero) diff --git a/code/AssetLib/OFF/OFFLoader.cpp b/code/AssetLib/OFF/OFFLoader.cpp index 79f006fca..fa981e439 100644 --- a/code/AssetLib/OFF/OFFLoader.cpp +++ b/code/AssetLib/OFF/OFFLoader.cpp @@ -123,7 +123,7 @@ void OFFImporter::InternReadFile( const std::string& pFile, aiScene* pScene, IOS // Check whether we can read from the file if( file.get() == nullptr) { - throw DeadlyImportError( "Failed to open OFF file " + pFile + "."); + throw DeadlyImportError( "Failed to open OFF file ", pFile, "."); } // allocate storage and copy the contents of the file to a memory buffer diff --git a/code/AssetLib/Obj/ObjFileImporter.cpp b/code/AssetLib/Obj/ObjFileImporter.cpp index b6e1f9061..fafc7a6c8 100644 --- a/code/AssetLib/Obj/ObjFileImporter.cpp +++ b/code/AssetLib/Obj/ObjFileImporter.cpp @@ -109,7 +109,7 @@ void ObjFileImporter::InternReadFile(const std::string &file, aiScene *pScene, I static const std::string mode = "rb"; std::unique_ptr fileStream(pIOHandler->Open(file, mode)); if (!fileStream.get()) { - throw DeadlyImportError("Failed to open file " + file + "."); + throw DeadlyImportError("Failed to open file ", file, "."); } // Get the file-size and validate it, throwing an exception when fails diff --git a/code/AssetLib/Ogre/OgreBinarySerializer.cpp b/code/AssetLib/Ogre/OgreBinarySerializer.cpp index 7ce00471f..6f6a19bd9 100644 --- a/code/AssetLib/Ogre/OgreBinarySerializer.cpp +++ b/code/AssetLib/Ogre/OgreBinarySerializer.cpp @@ -788,7 +788,7 @@ MemoryStreamReaderPtr OgreBinarySerializer::OpenReader(Assimp::IOSystem *pIOHand IOStream *f = pIOHandler->Open(filename, "rb"); if (!f) { - throw DeadlyImportError("Failed to open skeleton file " + filename); + throw DeadlyImportError("Failed to open skeleton file ", filename); } return MemoryStreamReaderPtr(new MemoryStreamReader(f)); diff --git a/code/AssetLib/Ogre/OgreImporter.cpp b/code/AssetLib/Ogre/OgreImporter.cpp index 9d85a0a96..636c903d5 100644 --- a/code/AssetLib/Ogre/OgreImporter.cpp +++ b/code/AssetLib/Ogre/OgreImporter.cpp @@ -100,7 +100,7 @@ void OgreImporter::InternReadFile(const std::string &pFile, aiScene *pScene, Ass // Open source file IOStream *f = pIOHandler->Open(pFile, "rb"); if (!f) { - throw DeadlyImportError("Failed to open file " + pFile); + throw DeadlyImportError("Failed to open file ", pFile); } // Binary .mesh import diff --git a/code/AssetLib/OpenGEX/OpenGEXImporter.cpp b/code/AssetLib/OpenGEX/OpenGEXImporter.cpp index 880303065..ff6af63f6 100644 --- a/code/AssetLib/OpenGEX/OpenGEXImporter.cpp +++ b/code/AssetLib/OpenGEX/OpenGEXImporter.cpp @@ -302,7 +302,7 @@ void OpenGEXImporter::InternReadFile( const std::string &filename, aiScene *pSce // open source file IOStream *file = pIOHandler->Open( filename, "rb" ); if( !file ) { - throw DeadlyImportError( "Failed to open file " + filename ); + throw DeadlyImportError( "Failed to open file ", filename ); } std::vector buffer; diff --git a/code/AssetLib/Ply/PlyLoader.cpp b/code/AssetLib/Ply/PlyLoader.cpp index b8dbf2598..4a8aaf17b 100644 --- a/code/AssetLib/Ply/PlyLoader.cpp +++ b/code/AssetLib/Ply/PlyLoader.cpp @@ -151,13 +151,13 @@ void PLYImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy const std::string mode = "rb"; std::unique_ptr fileStream(pIOHandler->Open(pFile, mode)); if (!fileStream.get()) { - throw DeadlyImportError("Failed to open file " + pFile + "."); + throw DeadlyImportError("Failed to open file ", pFile, "."); } // Get the file-size const size_t fileSize(fileStream->FileSize()); if (0 == fileSize) { - throw DeadlyImportError("File " + pFile + " is empty."); + throw DeadlyImportError("File ", pFile, " is empty."); } IOStreamBuffer streamedBuffer(1024 * 1024); diff --git a/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp b/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp index 52a2b7503..e9de3f5b3 100644 --- a/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp +++ b/code/AssetLib/Q3BSP/Q3BSPFileImporter.cpp @@ -180,7 +180,7 @@ const aiImporterDesc *Q3BSPFileImporter::GetInfo() const { void Q3BSPFileImporter::InternReadFile(const std::string &rFile, aiScene *scene, IOSystem *ioHandler) { ZipArchiveIOSystem Archive(ioHandler, rFile); if (!Archive.isOpen()) { - throw DeadlyImportError("Failed to open file " + rFile + "."); + throw DeadlyImportError("Failed to open file ", rFile, "."); } std::string archiveName(""), mapName(""); diff --git a/code/AssetLib/Q3D/Q3DLoader.cpp b/code/AssetLib/Q3D/Q3DLoader.cpp index 717b5702e..786f96e8a 100644 --- a/code/AssetLib/Q3D/Q3DLoader.cpp +++ b/code/AssetLib/Q3D/Q3DLoader.cpp @@ -110,13 +110,12 @@ void Q3DImporter::InternReadFile(const std::string &pFile, // The header is 22 bytes large if (stream.GetRemainingSize() < 22) - throw DeadlyImportError("File is either empty or corrupt: " + pFile); + throw DeadlyImportError("File is either empty or corrupt: ", pFile); // Check the file's signature if (ASSIMP_strincmp((const char *)stream.GetPtr(), "quick3Do", 8) && ASSIMP_strincmp((const char *)stream.GetPtr(), "quick3Ds", 8)) { - throw DeadlyImportError("Not a Quick3D file. Signature string is: " + - std::string((const char *)stream.GetPtr(), 8)); + throw DeadlyImportError("Not a Quick3D file. Signature string is: ", std::string((const char *)stream.GetPtr(), 8)); } // Print the file format version diff --git a/code/AssetLib/Raw/RawLoader.cpp b/code/AssetLib/Raw/RawLoader.cpp index 1363e29c1..f9812bfe5 100644 --- a/code/AssetLib/Raw/RawLoader.cpp +++ b/code/AssetLib/Raw/RawLoader.cpp @@ -101,7 +101,7 @@ void RAWImporter::InternReadFile(const std::string &pFile, // Check whether we can read from the file if (file.get() == nullptr) { - throw DeadlyImportError("Failed to open RAW file " + pFile + "."); + throw DeadlyImportError("Failed to open RAW file ", pFile, "."); } // allocate storage and copy the contents of the file to a memory buffer diff --git a/code/AssetLib/SIB/SIBImporter.cpp b/code/AssetLib/SIB/SIBImporter.cpp index 33beb0087..8edcd50fa 100644 --- a/code/AssetLib/SIB/SIBImporter.cpp +++ b/code/AssetLib/SIB/SIBImporter.cpp @@ -808,7 +808,7 @@ void SIBImporter::InternReadFile(const std::string &pFile, // We should have at least one chunk if (stream.GetRemainingSize() < 16) - throw DeadlyImportError("SIB file is either empty or corrupt: " + pFile); + throw DeadlyImportError("SIB file is either empty or corrupt: ", pFile); SIB sib; diff --git a/code/AssetLib/SMD/SMDLoader.cpp b/code/AssetLib/SMD/SMDLoader.cpp index 8a7625f93..ea6135fd2 100644 --- a/code/AssetLib/SMD/SMDLoader.cpp +++ b/code/AssetLib/SMD/SMDLoader.cpp @@ -695,7 +695,7 @@ void SMDImporter::ReadSmd(const std::string &pFile, IOSystem* pIOHandler) { // Check whether we can read from the file if (file.get() == nullptr) { - throw DeadlyImportError("Failed to open SMD/VTA file " + pFile + "."); + throw DeadlyImportError("Failed to open SMD/VTA file ", pFile, "."); } iFileSize = (unsigned int)file->FileSize(); diff --git a/code/AssetLib/STL/STLLoader.cpp b/code/AssetLib/STL/STLLoader.cpp index 2d710b084..592ec6b77 100644 --- a/code/AssetLib/STL/STLLoader.cpp +++ b/code/AssetLib/STL/STLLoader.cpp @@ -181,7 +181,7 @@ void STLImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy // Check whether we can read from the file if (file.get() == nullptr) { - throw DeadlyImportError("Failed to open STL file " + pFile + "."); + throw DeadlyImportError("Failed to open STL file ", pFile, "."); } mFileSize = (unsigned int)file->FileSize(); @@ -207,7 +207,7 @@ void STLImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy } else if (IsAsciiSTL(mBuffer, mFileSize)) { LoadASCIIFile(mScene->mRootNode); } else { - throw DeadlyImportError("Failed to determine STL storage representation for " + pFile + "."); + throw DeadlyImportError("Failed to determine STL storage representation for ", pFile, "."); } // create a single default material, using a white diffuse color for consistency with diff --git a/code/AssetLib/Terragen/TerragenLoader.cpp b/code/AssetLib/Terragen/TerragenLoader.cpp index 0d0a140c3..3c57de4fb 100644 --- a/code/AssetLib/Terragen/TerragenLoader.cpp +++ b/code/AssetLib/Terragen/TerragenLoader.cpp @@ -121,7 +121,7 @@ void TerragenImporter::InternReadFile(const std::string &pFile, // Check whether we can read from the file if (file == nullptr) - throw DeadlyImportError("Failed to open TERRAGEN TERRAIN file " + pFile + "."); + throw DeadlyImportError("Failed to open TERRAGEN TERRAIN file ", pFile, "."); // Construct a stream reader to read all data in the correct endianness StreamReaderLE reader(file); diff --git a/code/AssetLib/X/XFileImporter.cpp b/code/AssetLib/X/XFileImporter.cpp index 6c57c9dd2..44c3b375d 100644 --- a/code/AssetLib/X/XFileImporter.cpp +++ b/code/AssetLib/X/XFileImporter.cpp @@ -114,7 +114,7 @@ void XFileImporter::InternReadFile( const std::string& pFile, aiScene* pScene, I // read file into memory std::unique_ptr file( pIOHandler->Open( pFile)); if ( file.get() == nullptr ) { - throw DeadlyImportError( "Failed to open file " + pFile + "." ); + throw DeadlyImportError( "Failed to open file ", pFile, "." ); } static const size_t MinSize = 16; diff --git a/code/AssetLib/X3D/FIReader.cpp b/code/AssetLib/X3D/FIReader.cpp index c1b439bda..2bee9789e 100644 --- a/code/AssetLib/X3D/FIReader.cpp +++ b/code/AssetLib/X3D/FIReader.cpp @@ -997,18 +997,18 @@ private: if (index < 32) { FIDecoder *decoder = defaultDecoder[index]; if (!decoder) { - throw DeadlyImportError("Invalid encoding algorithm index " + to_string(index)); + throw DeadlyImportError("Invalid encoding algorithm index ", to_string(index)); } return decoder->decode(dataP, len); } else { if (index - 32 >= vocabulary.encodingAlgorithmTable.size()) { - throw DeadlyImportError("Invalid encoding algorithm index " + to_string(index)); + throw DeadlyImportError("Invalid encoding algorithm index ", to_string(index)); } std::string uri = vocabulary.encodingAlgorithmTable[index - 32]; auto it = decoderMap.find(uri); if (it == decoderMap.end()) { - throw DeadlyImportError("Unsupported encoding algorithm " + uri); + throw DeadlyImportError("Unsupported encoding algorithm ", uri); } else { return it->second->decode(dataP, len); @@ -1027,12 +1027,12 @@ private: alphabet = "0123456789-:TZ "; break; default: - throw DeadlyImportError("Invalid restricted alphabet index " + to_string(index)); + throw DeadlyImportError("Invalid restricted alphabet index ", to_string(index)); } } else { if (index - 16 >= vocabulary.restrictedAlphabetTable.size()) { - throw DeadlyImportError("Invalid restricted alphabet index " + to_string(index)); + throw DeadlyImportError("Invalid restricted alphabet index ", to_string(index)); } alphabet = vocabulary.restrictedAlphabetTable[index - 16]; } @@ -1040,7 +1040,7 @@ private: utf8::utf8to32(alphabet.begin(), alphabet.end(), back_inserter(alphabetUTF32)); std::string::size_type alphabetLength = alphabetUTF32.size(); if (alphabetLength < 2) { - throw DeadlyImportError("Invalid restricted alphabet length " + to_string(alphabetLength)); + throw DeadlyImportError("Invalid restricted alphabet length ", to_string(alphabetLength)); } std::string::size_type bitsPerCharacter = 1; while ((1ull << bitsPerCharacter) <= alphabetLength) { @@ -1442,7 +1442,7 @@ private: std::string uri = parseNonEmptyOctetString2(); auto it = vocabularyMap.find(uri); if (it == vocabularyMap.end()) { - throw DeadlyImportError("Unknown vocabulary " + uri); + throw DeadlyImportError("Unknown vocabulary ", uri); } const FIVocabulary *externalVocabulary = it->second; if (externalVocabulary->restrictedAlphabetTable) { diff --git a/code/AssetLib/X3D/X3DImporter.cpp b/code/AssetLib/X3D/X3DImporter.cpp index c9f9a6b6d..94b11dee2 100644 --- a/code/AssetLib/X3D/X3DImporter.cpp +++ b/code/AssetLib/X3D/X3DImporter.cpp @@ -233,48 +233,48 @@ bool X3DImporter::FindNodeElement(const std::string& pID, const CX3DImporter_Nod void X3DImporter::Throw_ArgOutOfRange(const std::string& pArgument) { - throw DeadlyImportError("Argument value is out of range for: \"" + pArgument + "\"."); + throw DeadlyImportError("Argument value is out of range for: \"", pArgument, "\"."); } void X3DImporter::Throw_CloseNotFound(const std::string& pNode) { - throw DeadlyImportError("Close tag for node <" + pNode + "> not found. Seems file is corrupt."); + throw DeadlyImportError("Close tag for node <", pNode, "> not found. Seems file is corrupt."); } void X3DImporter::Throw_ConvertFail_Str2ArrF(const std::string& pAttrValue) { - throw DeadlyImportError("In <" + std::string(mReader->getNodeName()) + "> failed to convert attribute value \"" + pAttrValue + + throw DeadlyImportError("In <", std::string(mReader->getNodeName()), "> failed to convert attribute value \"", pAttrValue, "\" from string to array of floats."); } void X3DImporter::Throw_DEF_And_USE() { - throw DeadlyImportError("\"DEF\" and \"USE\" can not be defined both in <" + std::string(mReader->getNodeName()) + ">."); + throw DeadlyImportError("\"DEF\" and \"USE\" can not be defined both in <", std::string(mReader->getNodeName()), ">."); } void X3DImporter::Throw_IncorrectAttr(const std::string& pAttrName) { - throw DeadlyImportError("Node <" + std::string(mReader->getNodeName()) + "> has incorrect attribute \"" + pAttrName + "\"."); + throw DeadlyImportError("Node <", std::string(mReader->getNodeName()), "> has incorrect attribute \"", pAttrName, "\"."); } void X3DImporter::Throw_IncorrectAttrValue(const std::string& pAttrName) { - throw DeadlyImportError("Attribute \"" + pAttrName + "\" in node <" + std::string(mReader->getNodeName()) + "> has incorrect value."); + throw DeadlyImportError("Attribute \"", pAttrName, "\" in node <", std::string(mReader->getNodeName()), "> has incorrect value."); } void X3DImporter::Throw_MoreThanOnceDefined(const std::string& pNodeType, const std::string& pDescription) { - throw DeadlyImportError("\"" + pNodeType + "\" node can be used only once in " + mReader->getNodeName() + ". Description: " + pDescription); + throw DeadlyImportError("\"", pNodeType, "\" node can be used only once in ", mReader->getNodeName(), ". Description: ", pDescription); } void X3DImporter::Throw_TagCountIncorrect(const std::string& pNode) { - throw DeadlyImportError("Count of open and close tags for node <" + pNode + "> are not equivalent. Seems file is corrupt."); + throw DeadlyImportError("Count of open and close tags for node <", pNode, "> are not equivalent. Seems file is corrupt."); } void X3DImporter::Throw_USE_NotFound(const std::string& pAttrValue) { - throw DeadlyImportError("Not found node with name \"" + pAttrValue + "\" in <" + std::string(mReader->getNodeName()) + ">."); + throw DeadlyImportError("Not found node with name \"", pAttrValue, "\" in <", std::string(mReader->getNodeName()), ">."); } /*********************************************************************************************************************************************/ @@ -283,7 +283,7 @@ void X3DImporter::Throw_USE_NotFound(const std::string& pAttrValue) void X3DImporter::XML_CheckNode_MustBeEmpty() { - if(!mReader->isEmptyElement()) throw DeadlyImportError(std::string("Node <") + mReader->getNodeName() + "> must be empty."); + if(!mReader->isEmptyElement()) throw DeadlyImportError("Node <", mReader->getNodeName(), "> must be empty."); } void X3DImporter::XML_CheckNode_SkipUnsupported(const std::string& pParentNodeName) @@ -395,7 +395,7 @@ void X3DImporter::XML_CheckNode_SkipUnsupported(const std::string& pParentNodeNa casu_cres: - if(!found) throw DeadlyImportError("Unknown node \"" + nn + "\" in " + pParentNodeName + "."); + if(!found) throw DeadlyImportError("Unknown node \"", nn, "\" in ", pParentNodeName, "."); if(close_found) LogInfo("Skipping node \"" + nn + "\" in " + pParentNodeName + "."); @@ -430,7 +430,7 @@ bool X3DImporter::XML_ReadNode_GetAttrVal_AsBool(const int pAttrIdx) else if(val == "true") return true; else - throw DeadlyImportError("Bool attribute value can contain \"false\" or \"true\" not the \"" + val + "\""); + throw DeadlyImportError("Bool attribute value can contain \"false\" or \"true\" not the \"", val, "\""); } } @@ -971,8 +971,8 @@ void X3DImporter::MeshGeometry_AddColor(aiMesh& pMesh, const std::list= norm_arr_copy.size()) - throw DeadlyImportError("MeshGeometry_AddNormal. Normal index(" + to_string(tind[i]) + - ") is out of range. Normals count: " + to_string(norm_arr_copy.size()) + "."); + throw DeadlyImportError("MeshGeometry_AddNormal. Normal index(", to_string(tind[i]), + ") is out of range. Normals count: ", to_string(norm_arr_copy.size()), "."); pMesh.mNormals[i] = norm_arr_copy[tind[i]]; } @@ -1268,7 +1268,7 @@ void X3DImporter::MeshGeometry_AddTexCoord(aiMesh& pMesh, const std::vectorregisterVocabulary("urn:web3d:x3d:fi-vocabulary-3.2", &X3D_vocabulary_3_2); mReader->registerVocabulary("urn:web3d:x3d:fi-vocabulary-3.3", &X3D_vocabulary_3_3); @@ -1519,7 +1519,7 @@ void X3DImporter::ParseNode_Scene() auto GroupCounter_Increase = [](size_t& pCounter, const char* pGroupName) -> void { pCounter++; - if(pCounter == 0) throw DeadlyImportError("Group counter overflow. Too much groups with type: " + std::string(pGroupName) + "."); + if(pCounter == 0) throw DeadlyImportError("Group counter overflow. Too much groups with type: ", std::string(pGroupName), "."); }; auto GroupCounter_Decrease = [&](size_t& pCounter, const char* pGroupName) -> void diff --git a/code/AssetLib/X3D/X3DImporter_Postprocess.cpp b/code/AssetLib/X3D/X3DImporter_Postprocess.cpp index 993aff02c..a8bf332e5 100644 --- a/code/AssetLib/X3D/X3DImporter_Postprocess.cpp +++ b/code/AssetLib/X3D/X3DImporter_Postprocess.cpp @@ -178,7 +178,7 @@ void X3DImporter::Postprocess_BuildLight(const CX3DImporter_NodeElement& pNodeEl break; default: - throw DeadlyImportError("Postprocess_BuildLight. Unknown type of light: " + to_string(pNodeElement.Type) + "."); + throw DeadlyImportError("Postprocess_BuildLight. Unknown type of light: ", to_string(pNodeElement.Type), "."); } pSceneLightList.push_back(new_light); @@ -300,7 +300,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle else if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_TextureCoordinate) MeshGeometry_AddTexCoord(**pMesh, ((CX3DImporter_NodeElement_TextureCoordinate*)*ch_it)->Value); else - throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of ElevationGrid: " + to_string((*ch_it)->Type) + "."); + throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of ElevationGrid: ", to_string((*ch_it)->Type), "."); }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) return;// mesh is build, nothing to do anymore. @@ -337,7 +337,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle else if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_TextureCoordinate) MeshGeometry_AddTexCoord(**pMesh, tnemesh.CoordIndex, tnemesh.TexCoordIndex, ((CX3DImporter_NodeElement_TextureCoordinate*)*ch_it)->Value); else - throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of IndexedFaceSet: " + to_string((*ch_it)->Type) + "."); + throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of IndexedFaceSet: ", to_string((*ch_it)->Type), "."); }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) return;// mesh is build, nothing to do anymore. @@ -368,7 +368,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle else if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Coordinate) {} // skip because already read when mesh created. else - throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of IndexedLineSet: " + to_string((*ch_it)->Type) + "."); + throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of IndexedLineSet: ", to_string((*ch_it)->Type), "."); }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) return;// mesh is build, nothing to do anymore. @@ -458,7 +458,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle else if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Coordinate) {} // skip because already read when mesh created. else - throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of PointSet: " + to_string((*ch_it)->Type) + "."); + throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of PointSet: ", to_string((*ch_it)->Type), "."); }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) return;// mesh is build, nothing to do anymore. @@ -488,7 +488,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle else if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_Coordinate) {} // skip because already read when mesh created. else - throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of LineSet: " + to_string((*ch_it)->Type) + "."); + throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of LineSet: ", to_string((*ch_it)->Type), "."); }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) return;// mesh is build, nothing to do anymore. @@ -525,7 +525,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle else if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_TextureCoordinate) MeshGeometry_AddTexCoord(**pMesh, tnemesh.CoordIndex, tnemesh.TexCoordIndex, ((CX3DImporter_NodeElement_TextureCoordinate*)*ch_it)->Value); else - throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of TrianlgeFanSet: " + to_string((*ch_it)->Type) + "."); + throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of TriangleFanSet: ", to_string((*ch_it)->Type), "."); }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) return;// mesh is build, nothing to do anymore. @@ -569,7 +569,7 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle else if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_TextureCoordinate) MeshGeometry_AddTexCoord(**pMesh, tnemesh.CoordIndex, tnemesh.TexCoordIndex, ((CX3DImporter_NodeElement_TextureCoordinate*)*ch_it)->Value); else - throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of TrianlgeSet: " + to_string((*ch_it)->Type) + "."); + throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of TrianlgeSet: ", to_string((*ch_it)->Type), "."); }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) return;// mesh is build, nothing to do anymore. @@ -604,13 +604,13 @@ void X3DImporter::Postprocess_BuildMesh(const CX3DImporter_NodeElement& pNodeEle else if((*ch_it)->Type == CX3DImporter_NodeElement::ENET_TextureCoordinate) MeshGeometry_AddTexCoord(**pMesh, tnemesh.CoordIndex, tnemesh.TexCoordIndex, ((CX3DImporter_NodeElement_TextureCoordinate*)*ch_it)->Value); else - throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of TriangleStripSet: " + to_string((*ch_it)->Type) + "."); + throw DeadlyImportError("Postprocess_BuildMesh. Unknown child of TriangleStripSet: ", to_string((*ch_it)->Type), "."); }// for(std::list::iterator ch_it = tnemesh.Child.begin(); ch_it != tnemesh.Child.end(); ++ch_it) return;// mesh is build, nothing to do anymore. }// if(pNodeElement.Type == CX3DImporter_NodeElement::ENET_TriangleStripSet) - throw DeadlyImportError("Postprocess_BuildMesh. Unknown mesh type: " + to_string(pNodeElement.Type) + "."); + throw DeadlyImportError("Postprocess_BuildMesh. Unknown mesh type: ", to_string(pNodeElement.Type), "."); } void X3DImporter::Postprocess_BuildNode(const CX3DImporter_NodeElement& pNodeElement, aiNode& pSceneNode, std::list& pSceneMeshList, @@ -672,7 +672,7 @@ void X3DImporter::Postprocess_BuildNode(const CX3DImporter_NodeElement& pNodeEle } else if(!PostprocessHelper_ElementIsMetadata((*it)->Type))// skip metadata { - throw DeadlyImportError("Postprocess_BuildNode. Unknown type: " + to_string((*it)->Type) + "."); + throw DeadlyImportError("Postprocess_BuildNode. Unknown type: ", to_string((*it)->Type), "."); } }// for(std::list::const_iterator it = chit_begin; it != chit_end; it++) diff --git a/code/AssetLib/XGL/XGLLoader.cpp b/code/AssetLib/XGL/XGLLoader.cpp index 938f2a321..7af5aab94 100644 --- a/code/AssetLib/XGL/XGLLoader.cpp +++ b/code/AssetLib/XGL/XGLLoader.cpp @@ -144,7 +144,7 @@ void XGLImporter::InternReadFile(const std::string &pFile, // check whether we can read from the file if (stream.get() == nullptr) { - throw DeadlyImportError("Failed to open XGL/ZGL file " + pFile + ""); + throw DeadlyImportError("Failed to open XGL/ZGL file ", pFile, ""); } // see if its compressed, if so uncompress it diff --git a/code/AssetLib/glTF/glTFAsset.inl b/code/AssetLib/glTF/glTFAsset.inl index 472be41cf..217bc8d47 100644 --- a/code/AssetLib/glTF/glTFAsset.inl +++ b/code/AssetLib/glTF/glTFAsset.inl @@ -235,15 +235,15 @@ Ref LazyDict::Get(const char *id) { // read it from the JSON object if (!mDict) { - throw DeadlyImportError("GLTF: Missing section \"" + std::string(mDictId) + "\""); + throw DeadlyImportError("GLTF: Missing section \"", std::string(mDictId), "\""); } Value::MemberIterator obj = mDict->FindMember(id); if (obj == mDict->MemberEnd()) { - throw DeadlyImportError("GLTF: Missing object with id \"" + std::string(id) + "\" in \"" + mDictId + "\""); + throw DeadlyImportError("GLTF: Missing object with id \"", std::string(id), "\" in \"", mDictId, "\""); } if (!obj->value.IsObject()) { - throw DeadlyImportError("GLTF: Object with id \"" + std::string(id) + "\" is not a JSON object"); + throw DeadlyImportError("GLTF: Object with id \"", std::string(id), "\" is not a JSON object"); } // create an instance of the given type @@ -317,13 +317,13 @@ inline void Buffer::Read(Value &obj, Asset &r) { this->mData.reset(data, std::default_delete()); if (statedLength > 0 && this->byteLength != statedLength) { - throw DeadlyImportError("GLTF: buffer \"" + id + "\", expected " + to_string(statedLength) + - " bytes, but found " + to_string(dataURI.dataLength)); + throw DeadlyImportError("GLTF: buffer \"", id, "\", expected ", to_string(statedLength), + " bytes, but found ", to_string(dataURI.dataLength)); } } else { // assume raw data if (statedLength != dataURI.dataLength) { - throw DeadlyImportError("GLTF: buffer \"" + id + "\", expected " + to_string(statedLength) + - " bytes, but found " + to_string(dataURI.dataLength)); + throw DeadlyImportError("GLTF: buffer \"", id, "\", expected ", to_string(statedLength), + " bytes, but found ", to_string(dataURI.dataLength)); } this->mData.reset(new uint8_t[dataURI.dataLength], std::default_delete()); @@ -339,9 +339,9 @@ inline void Buffer::Read(Value &obj, Asset &r) { delete file; if (!ok) - throw DeadlyImportError("GLTF: error while reading referenced file \"" + std::string(uri) + "\""); + throw DeadlyImportError("GLTF: error while reading referenced file \"", std::string(uri), "\""); } else { - throw DeadlyImportError("GLTF: could not open referenced file \"" + std::string(uri) + "\""); + throw DeadlyImportError("GLTF: could not open referenced file \"", std::string(uri), "\""); } } } @@ -373,7 +373,7 @@ inline void Buffer::EncodedRegion_Mark(const size_t pOffset, const size_t pEncod char val[val_size]; ai_snprintf(val, val_size, AI_SIZEFMT, pOffset); - throw DeadlyImportError(std::string("GLTF: incorrect offset value (") + val + ") for marking encoded region."); + throw DeadlyImportError("GLTF: incorrect offset value (", val, ") for marking encoded region."); } // Check length @@ -383,7 +383,7 @@ inline void Buffer::EncodedRegion_Mark(const size_t pOffset, const size_t pEncod char val[val_size]; ai_snprintf(val, val_size, AI_SIZEFMT "/" AI_SIZEFMT, pOffset, pEncodedData_Length); - throw DeadlyImportError(std::string("GLTF: encoded region with offset/length (") + val + ") is out of range."); + throw DeadlyImportError("GLTF: encoded region with offset/length (", val, ") is out of range."); } // Add new region @@ -403,7 +403,7 @@ inline void Buffer::EncodedRegion_SetCurrent(const std::string &pID) { } } - throw DeadlyImportError("GLTF: EncodedRegion with ID: \"" + pID + "\" not found."); + throw DeadlyImportError("GLTF: EncodedRegion with ID: \"", pID, "\" not found."); } inline bool Buffer::ReplaceData(const size_t pBufferData_Offset, const size_t pBufferData_Count, const uint8_t *pReplace_Data, const size_t pReplace_Count) { @@ -851,7 +851,7 @@ inline void Mesh::Read(Value &pJSON_Object, Asset &pAsset_Root) { /************** Read data from JSON-document **************/ #define MESH_READ_COMPRESSEDDATA_MEMBER(pFieldName, pOut) \ if (!ReadMember(*comp_data, pFieldName, pOut)) { \ - throw DeadlyImportError(std::string("GLTF: \"compressedData\" must has \"") + pFieldName + "\"."); \ + throw DeadlyImportError("GLTF: \"compressedData\" must has \"", pFieldName, "\"."); \ } const char *mode_str; @@ -880,7 +880,7 @@ inline void Mesh::Read(Value &pJSON_Object, Asset &pAsset_Root) { else if (strcmp(mode_str, "ascii") == 0) ext_o3dgc->Binary = false; else - throw DeadlyImportError(std::string("GLTF: for compressed data supported modes is: \"ascii\", \"binary\". Not the: \"") + mode_str + "\"."); + throw DeadlyImportError("GLTF: for compressed data supported modes is: \"ascii\", \"binary\". Not the: \"", mode_str, "\"."); /************************ Decoding ************************/ Decode_O3DGC(*ext_o3dgc, pAsset_Root); @@ -888,7 +888,7 @@ inline void Mesh::Read(Value &pJSON_Object, Asset &pAsset_Root) { } // if(it_memb->name.GetString() == "Open3DGC-compression") else { - throw DeadlyImportError(std::string("GLTF: Unknown mesh extension: \"") + it_memb->name.GetString() + "\"."); + throw DeadlyImportError("GLTF: Unknown mesh extension: \"", it_memb->name.GetString(), "\"."); } } // for(Value::MemberIterator it_memb = json_extensions->MemberBegin(); it_memb != json_extensions->MemberEnd(); json_extensions++) #endif @@ -923,24 +923,24 @@ inline void Mesh::Decode_O3DGC(const SCompression_Open3DGC &pCompression_Open3DG size_t size_coordindex = ifs.GetNCoordIndex() * 3; // See float attributes note. if (primitives[0].indices->count != size_coordindex) - throw DeadlyImportError("GLTF: Open3DGC. Compressed indices count (" + to_string(size_coordindex) + - ") not equal to uncompressed (" + to_string(primitives[0].indices->count) + ")."); + throw DeadlyImportError("GLTF: Open3DGC. Compressed indices count (", to_string(size_coordindex), + ") not equal to uncompressed (", to_string(primitives[0].indices->count), ")."); size_coordindex *= sizeof(IndicesType); // Coordinates size_t size_coord = ifs.GetNCoord(); // See float attributes note. if (primitives[0].attributes.position[0]->count != size_coord) - throw DeadlyImportError("GLTF: Open3DGC. Compressed positions count (" + to_string(size_coord) + - ") not equal to uncompressed (" + to_string(primitives[0].attributes.position[0]->count) + ")."); + throw DeadlyImportError("GLTF: Open3DGC. Compressed positions count (", to_string(size_coord), + ") not equal to uncompressed (", to_string(primitives[0].attributes.position[0]->count), ")."); size_coord *= 3 * sizeof(float); // Normals size_t size_normal = ifs.GetNNormal(); // See float attributes note. if (primitives[0].attributes.normal[0]->count != size_normal) - throw DeadlyImportError("GLTF: Open3DGC. Compressed normals count (" + to_string(size_normal) + - ") not equal to uncompressed (" + to_string(primitives[0].attributes.normal[0]->count) + ")."); + throw DeadlyImportError("GLTF: Open3DGC. Compressed normals count (", to_string(size_normal), + ") not equal to uncompressed (", to_string(primitives[0].attributes.normal[0]->count), ")."); size_normal *= 3 * sizeof(float); // Additional attributes. @@ -961,8 +961,8 @@ inline void Mesh::Decode_O3DGC(const SCompression_Open3DGC &pCompression_Open3DG // Check situation when encoded data contain texture coordinates but primitive not. if (idx_texcoord < primitives[0].attributes.texcoord.size()) { if (primitives[0].attributes.texcoord[idx]->count != tval) - throw DeadlyImportError("GLTF: Open3DGC. Compressed texture coordinates count (" + to_string(tval) + - ") not equal to uncompressed (" + to_string(primitives[0].attributes.texcoord[idx]->count) + ")."); + throw DeadlyImportError("GLTF: Open3DGC. Compressed texture coordinates count (", to_string(tval), + ") not equal to uncompressed (", to_string(primitives[0].attributes.texcoord[idx]->count), ")."); idx_texcoord++; } else { @@ -971,7 +971,7 @@ inline void Mesh::Decode_O3DGC(const SCompression_Open3DGC &pCompression_Open3DG break; default: - throw DeadlyImportError("GLTF: Open3DGC. Unsupported type of float attribute: " + to_string(ifs.GetFloatAttributeType(static_cast(idx)))); + throw DeadlyImportError("GLTF: Open3DGC. Unsupported type of float attribute: ", to_string(ifs.GetFloatAttributeType(static_cast(idx)))); } tval *= ifs.GetFloatAttributeDim(static_cast(idx)) * sizeof(o3dgc::Real); // After checking count of objects we can get size of array. @@ -990,7 +990,7 @@ inline void Mesh::Decode_O3DGC(const SCompression_Open3DGC &pCompression_Open3DG break; default: - throw DeadlyImportError("GLTF: Open3DGC. Unsupported type of int attribute: " + to_string(ifs.GetIntAttributeType(static_cast(idx)))); + throw DeadlyImportError("GLTF: Open3DGC. Unsupported type of int attribute: ", to_string(ifs.GetIntAttributeType(static_cast(idx)))); } tval *= ifs.GetIntAttributeDim(static_cast(idx)) * sizeof(long); // See float attributes note. @@ -1025,7 +1025,7 @@ inline void Mesh::Decode_O3DGC(const SCompression_Open3DGC &pCompression_Open3DG break; default: - throw DeadlyImportError("GLTF: Open3DGC. Unsupported type of float attribute: " + to_string(ifs.GetFloatAttributeType(static_cast(idx)))); + throw DeadlyImportError("GLTF: Open3DGC. Unsupported type of float attribute: ", to_string(ifs.GetFloatAttributeType(static_cast(idx)))); } } @@ -1039,7 +1039,7 @@ inline void Mesh::Decode_O3DGC(const SCompression_Open3DGC &pCompression_Open3DG // ifs.SetIntAttribute(idx, (long* const)(decoded_data + get_buf_offset(primitives[0].attributes.joint))); default: - throw DeadlyImportError("GLTF: Open3DGC. Unsupported type of int attribute: " + to_string(ifs.GetIntAttributeType(static_cast(idx)))); + throw DeadlyImportError("GLTF: Open3DGC. Unsupported type of int attribute: ", to_string(ifs.GetIntAttributeType(static_cast(idx)))); } } @@ -1231,7 +1231,7 @@ inline void AssetMetadata::Read(Document &doc) { } if (version.empty() || version[0] != '1') { - throw DeadlyImportError("GLTF: Unsupported glTF version: " + version); + throw DeadlyImportError("GLTF: Unsupported glTF version: ", version); } } @@ -1309,7 +1309,7 @@ inline void Asset::Load(const std::string &pFile, bool isBinary) { if (doc.HasParseError()) { char buffer[32]; ai_snprintf(buffer, 32, "%d", static_cast(doc.GetErrorOffset())); - throw DeadlyImportError(std::string("GLTF: JSON parse error, offset ") + buffer + ": " + GetParseError_En(doc.GetParseError())); + throw DeadlyImportError("GLTF: JSON parse error, offset ", buffer, ": ", GetParseError_En(doc.GetParseError())); } if (!doc.IsObject()) { diff --git a/code/AssetLib/glTF/glTFImporter.cpp b/code/AssetLib/glTF/glTFImporter.cpp index c106acf21..512a4334b 100644 --- a/code/AssetLib/glTF/glTFImporter.cpp +++ b/code/AssetLib/glTF/glTFImporter.cpp @@ -234,7 +234,7 @@ void glTFImporter::ImportMeshes(glTF::Asset &r) { buf->EncodedRegion_SetCurrent(mesh.id); } else { - throw DeadlyImportError("GLTF: Can not import mesh: unknown mesh extension (code: \"" + to_string(cur_ext->Type) + + throw DeadlyImportError("GLTF: Can not import mesh: unknown mesh extension (code: \"", to_string(cur_ext->Type), "\"), only Open3DGC is supported."); } } diff --git a/code/AssetLib/glTF2/glTF2Asset.h b/code/AssetLib/glTF2/glTF2Asset.h index 763a6ac37..403ac8174 100644 --- a/code/AssetLib/glTF2/glTF2Asset.h +++ b/code/AssetLib/glTF2/glTF2Asset.h @@ -202,7 +202,7 @@ inline unsigned int ComponentTypeSize(ComponentType t) { case ComponentType_UNSIGNED_BYTE: return 1; default: - throw DeadlyImportError("GLTF: Unsupported Component Type " + to_string(t)); + throw DeadlyImportError("GLTF: Unsupported Component Type ", to_string(t)); } } diff --git a/code/AssetLib/glTF2/glTF2Asset.inl b/code/AssetLib/glTF2/glTF2Asset.inl index 2dfe2f41e..be23673ad 100644 --- a/code/AssetLib/glTF2/glTF2Asset.inl +++ b/code/AssetLib/glTF2/glTF2Asset.inl @@ -269,21 +269,21 @@ Ref LazyDict::Retrieve(unsigned int i) { // read it from the JSON object if (!mDict) { - throw DeadlyImportError("GLTF: Missing section \"" + std::string(mDictId) + "\""); + throw DeadlyImportError("GLTF: Missing section \"", std::string(mDictId), "\""); } if (!mDict->IsArray()) { - throw DeadlyImportError("GLTF: Field is not an array \"" + std::string(mDictId) + "\""); + throw DeadlyImportError("GLTF: Field is not an array \"", std::string(mDictId), "\""); } Value &obj = (*mDict)[i]; if (!obj.IsObject()) { - throw DeadlyImportError("GLTF: Object at index \"" + to_string(i) + "\" is not a JSON object"); + throw DeadlyImportError("GLTF: Object at index \"", to_string(i), "\" is not a JSON object"); } if (mRecursiveReferenceCheck.find(i) != mRecursiveReferenceCheck.end()) { - throw DeadlyImportError("GLTF: Object at index \"" + to_string(i) + "\" has recursive reference to itself"); + throw DeadlyImportError("GLTF: Object at index \"", to_string(i), "\" has recursive reference to itself"); } mRecursiveReferenceCheck.insert(i); @@ -381,13 +381,13 @@ inline void Buffer::Read(Value &obj, Asset &r) { this->mData.reset(data, std::default_delete()); if (statedLength > 0 && this->byteLength != statedLength) { - throw DeadlyImportError("GLTF: buffer \"" + id + "\", expected " + to_string(statedLength) + - " bytes, but found " + to_string(dataURI.dataLength)); + throw DeadlyImportError("GLTF: buffer \"", id, "\", expected ", to_string(statedLength), + " bytes, but found ", to_string(dataURI.dataLength)); } } else { // assume raw data if (statedLength != dataURI.dataLength) { - throw DeadlyImportError("GLTF: buffer \"" + id + "\", expected " + to_string(statedLength) + - " bytes, but found " + to_string(dataURI.dataLength)); + throw DeadlyImportError("GLTF: buffer \"", id, "\", expected ", to_string(statedLength), + " bytes, but found ", to_string(dataURI.dataLength)); } this->mData.reset(new uint8_t[dataURI.dataLength], std::default_delete()); @@ -403,9 +403,9 @@ inline void Buffer::Read(Value &obj, Asset &r) { delete file; if (!ok) - throw DeadlyImportError("GLTF: error while reading referenced file \"" + std::string(uri) + "\""); + throw DeadlyImportError("GLTF: error while reading referenced file \"", std::string(uri), "\""); } else { - throw DeadlyImportError("GLTF: could not open referenced file \"" + std::string(uri) + "\""); + throw DeadlyImportError("GLTF: could not open referenced file \"", std::string(uri), "\""); } } } @@ -437,7 +437,7 @@ inline void Buffer::EncodedRegion_Mark(const size_t pOffset, const size_t pEncod char val[val_size]; ai_snprintf(val, val_size, AI_SIZEFMT, pOffset); - throw DeadlyImportError(std::string("GLTF: incorrect offset value (") + val + ") for marking encoded region."); + throw DeadlyImportError("GLTF: incorrect offset value (", val, ") for marking encoded region."); } // Check length @@ -447,7 +447,7 @@ inline void Buffer::EncodedRegion_Mark(const size_t pOffset, const size_t pEncod char val[val_size]; ai_snprintf(val, val_size, AI_SIZEFMT "/" AI_SIZEFMT, pOffset, pEncodedData_Length); - throw DeadlyImportError(std::string("GLTF: encoded region with offset/length (") + val + ") is out of range."); + throw DeadlyImportError("GLTF: encoded region with offset/length (", val, ") is out of range."); } // Add new region @@ -467,7 +467,7 @@ inline void Buffer::EncodedRegion_SetCurrent(const std::string &pID) { } } - throw DeadlyImportError("GLTF: EncodedRegion with ID: \"" + pID + "\" not found."); + throw DeadlyImportError("GLTF: EncodedRegion with ID: \"", pID, "\" not found."); } inline bool Buffer::ReplaceData(const size_t pBufferData_Offset, const size_t pBufferData_Count, const uint8_t *pReplace_Data, const size_t pReplace_Count) { @@ -1458,7 +1458,7 @@ inline void AssetMetadata::Read(Document &doc) { } if (version.empty() || version[0] != '2') { - throw DeadlyImportError("GLTF: Unsupported glTF version: " + version); + throw DeadlyImportError("GLTF: Unsupported glTF version: ", version); } } @@ -1570,7 +1570,7 @@ inline void Asset::Load(const std::string &pFile, bool isBinary) { if (doc.HasParseError()) { char buffer[32]; ai_snprintf(buffer, 32, "%d", static_cast(doc.GetErrorOffset())); - throw DeadlyImportError(std::string("GLTF: JSON parse error, offset ") + buffer + ": " + GetParseError_En(doc.GetParseError())); + throw DeadlyImportError("GLTF: JSON parse error, offset ", buffer, ": ", GetParseError_En(doc.GetParseError())); } if (!doc.IsObject()) { diff --git a/code/AssetLib/glTF2/glTF2Importer.cpp b/code/AssetLib/glTF2/glTF2Importer.cpp index 00c647ed2..972154b5f 100644 --- a/code/AssetLib/glTF2/glTF2Importer.cpp +++ b/code/AssetLib/glTF2/glTF2Importer.cpp @@ -668,7 +668,7 @@ void glTF2Importer::ImportMeshes(glTF2::Asset &r) { } if (actualNumFaces == 0) { - throw DeadlyImportError(std::string("Mesh \"") + aim->mName.C_Str() + "\" has no faces"); + throw DeadlyImportError("Mesh \"", aim->mName.C_Str(), "\" has no faces"); } aim->mNumFaces = actualNumFaces; ai_assert(CheckValidFacesIndices(faces, actualNumFaces, aim->mNumVertices)); diff --git a/code/PostProcessing/ValidateDataStructure.cpp b/code/PostProcessing/ValidateDataStructure.cpp index a288e397d..e7392d9e5 100644 --- a/code/PostProcessing/ValidateDataStructure.cpp +++ b/code/PostProcessing/ValidateDataStructure.cpp @@ -85,7 +85,7 @@ AI_WONT_RETURN void ValidateDSProcess::ReportError(const char *msg, ...) { va_end(args); - throw DeadlyImportError("Validation failed: " + std::string(szBuffer, iLen)); + throw DeadlyImportError("Validation failed: ", std::string(szBuffer, iLen)); } // ------------------------------------------------------------------------------------------------ void ValidateDSProcess::ReportWarning(const char *msg, ...) { diff --git a/doc/dox.h b/doc/dox.h index 910e77eae..a4516dc7a 100644 --- a/doc/dox.h +++ b/doc/dox.h @@ -1626,7 +1626,7 @@ void xxxxImporter::InternReadFile( const std::string& pFile, // Check whether we can read from the file if( file.get() == NULL) { - throw DeadlyImportError( "Failed to open xxxx file " + pFile + "."); + throw DeadlyImportError( "Failed to open xxxx file ", pFile, "."); } // Your task: fill pScene diff --git a/include/assimp/irrXMLWrapper.h b/include/assimp/irrXMLWrapper.h index 52c174791..ef2b336ac 100644 --- a/include/assimp/irrXMLWrapper.h +++ b/include/assimp/irrXMLWrapper.h @@ -64,7 +64,7 @@ namespace Assimp { * // open the file * std::unique_ptr file( pIOHandler->Open( pFile)); * if( file.get() == nullptr ) { - * throw DeadlyImportError( "Failed to open file " + pFile + "."); + * throw DeadlyImportError( "Failed to open file ", pFile, "."); * } * * // generate a XML reader for it From e1a0163e7e54f9d139d3af1831977cf1bd15710d Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Tue, 18 Aug 2020 18:14:51 +0100 Subject: [PATCH 097/129] Make all exceptions available. --- code/Common/BaseImporter.cpp | 4 ++-- code/Common/Importer.cpp | 14 +++++++------- code/Common/Importer.h | 8 ++++---- include/assimp/BaseImporter.h | 13 ++++++------- include/assimp/Exceptional.h | 5 +++-- include/assimp/Importer.hpp | 8 +++----- test/unit/utImporter.cpp | 10 +++++----- 7 files changed, 30 insertions(+), 32 deletions(-) diff --git a/code/Common/BaseImporter.cpp b/code/Common/BaseImporter.cpp index 0d7057066..1b8f9927a 100644 --- a/code/Common/BaseImporter.cpp +++ b/code/Common/BaseImporter.cpp @@ -134,12 +134,12 @@ aiScene *BaseImporter::ReadFile(Importer *pImp, const std::string &pFile, IOSyst // extract error description m_ErrorText = err.what(); ASSIMP_LOG_ERROR(m_ErrorText.c_str()); + m_exception = std::current_exception(); return nullptr; } catch( const std::exception& err ) { - // extract error description m_ErrorText = "Internal error"; ASSIMP_LOG_ERROR(err.what()); - m_internalException = std::current_exception(); + m_exception = std::current_exception(); return nullptr; } diff --git a/code/Common/Importer.cpp b/code/Common/Importer.cpp index de72d3bc8..38eb63f40 100644 --- a/code/Common/Importer.cpp +++ b/code/Common/Importer.cpp @@ -387,7 +387,7 @@ void Importer::FreeScene( ) { pimpl->mScene = nullptr; pimpl->mErrorString = ""; - pimpl->mInternalException = std::exception_ptr(); + pimpl->mException = std::exception_ptr(); ASSIMP_END_EXCEPTION_REGION(void); } @@ -400,11 +400,11 @@ const char* Importer::GetErrorString() const { return pimpl->mErrorString.c_str(); } -const std::exception_ptr& Importer::GetInternalException() const { +const std::exception_ptr& Importer::GetException() const { ai_assert(nullptr != pimpl); // Must remain valid as long as ReadFile() or FreeFile() are not called - return pimpl->mInternalException; + return pimpl->mException; } // ------------------------------------------------------------------------------------------------ @@ -434,7 +434,7 @@ aiScene* Importer::GetOrphanedScene() { pimpl->mScene = nullptr; pimpl->mErrorString = ""; // reset error string - pimpl->mInternalException = std::exception_ptr(); + pimpl->mException = std::exception_ptr(); ASSIMP_END_EXCEPTION_REGION(aiScene*); return s; @@ -511,7 +511,7 @@ const aiScene* Importer::ReadFileFromMemory( const void* pBuffer, ReadFile(fbuff,pFlags); SetIOHandler(io); - ASSIMP_END_EXCEPTION_REGION_WITH_ERROR_STRING(const aiScene*, pimpl->mErrorString, pimpl->mInternalException); + ASSIMP_END_EXCEPTION_REGION_WITH_ERROR_STRING(const aiScene*, pimpl->mErrorString, pimpl->mException); return pimpl->mScene; } @@ -718,7 +718,7 @@ const aiScene* Importer::ReadFile( const char* _pFile, unsigned int pFlags) { // if failed, extract the error string else if( !pimpl->mScene) { pimpl->mErrorString = imp->GetErrorText(); - pimpl->mInternalException = imp->GetInternalException(); + pimpl->mException = imp->GetException(); } // clear any data allocated by post-process steps @@ -743,7 +743,7 @@ const aiScene* Importer::ReadFile( const char* _pFile, unsigned int pFlags) { #endif // ! ASSIMP_CATCH_GLOBAL_EXCEPTIONS // either successful or failure - the pointer expresses it anyways - ASSIMP_END_EXCEPTION_REGION_WITH_ERROR_STRING(const aiScene*, pimpl->mErrorString, pimpl->mInternalException); + ASSIMP_END_EXCEPTION_REGION_WITH_ERROR_STRING(const aiScene*, pimpl->mErrorString, pimpl->mException); return pimpl->mScene; } diff --git a/code/Common/Importer.h b/code/Common/Importer.h index b9c223429..df3686613 100644 --- a/code/Common/Importer.h +++ b/code/Common/Importer.h @@ -99,11 +99,11 @@ public: /** The error description, if there was one. In the case of a * failure not caused by a DeadlyImportError, mInternalException will - * carry the exception and this will be just "Internal error". */ + * carry the full details and this will be just "Internal error". */ std::string mErrorString; - /** Any exception which wasn't a DeadlyImportError */ - std::exception_ptr mInternalException; + /** Any exception which occurred */ + std::exception_ptr mException; /** List of integer properties */ IntPropertyMap mIntProperties; @@ -138,7 +138,7 @@ ImporterPimpl::ImporterPimpl() AI_NO_EXCEPT , mPostProcessingSteps() , mScene( nullptr ) , mErrorString() -, mInternalException() +, mException() , mIntProperties() , mFloatProperties() , mStringProperties() diff --git a/include/assimp/BaseImporter.h b/include/assimp/BaseImporter.h index 946a9da7c..114531385 100644 --- a/include/assimp/BaseImporter.h +++ b/include/assimp/BaseImporter.h @@ -151,12 +151,11 @@ public: } // ------------------------------------------------------------------- - /** Returns the exception of the last non-DeadlyImportError that occurred. - * @return A description of the last error that occurred. An empty - * string if there was no error. + /** Returns the exception of the last exception that occurred. + * @return The last exception that occurred. */ - const std::exception_ptr& GetInternalException() const { - return m_internalException; + const std::exception_ptr& GetException() const { + return m_exception; } // ------------------------------------------------------------------- @@ -423,8 +422,8 @@ protected: /// Error description when a DeadlyImportError occurred during import. /// In case of other errors, this will just be "Internal error" std::string m_ErrorText; - /// Any exception which wasn't due to the asset being incorrect. - std::exception_ptr m_internalException; + /// An exception which occurred. + std::exception_ptr m_exception; /// Currently set progress handler. ProgressHandler *m_progress; }; diff --git a/include/assimp/Exceptional.h b/include/assimp/Exceptional.h index 7d010142c..2e02b72e6 100644 --- a/include/assimp/Exceptional.h +++ b/include/assimp/Exceptional.h @@ -140,15 +140,16 @@ struct ExceptionSwallower { { \ try { -#define ASSIMP_END_EXCEPTION_REGION_WITH_ERROR_STRING(type, ASSIMP_END_EXCEPTION_REGION_errorString, ASSIMP_END_EXCEPTION_REGION_internalError) \ +#define ASSIMP_END_EXCEPTION_REGION_WITH_ERROR_STRING(type, ASSIMP_END_EXCEPTION_REGION_errorString, ASSIMP_END_EXCEPTION_REGION_exception) \ } \ catch (const DeadlyImportError &e) { \ ASSIMP_END_EXCEPTION_REGION_errorString = e.what(); \ + ASSIMP_END_EXCEPTION_REGION_exception = std::current_exception(); \ return ExceptionSwallower()(); \ } \ catch (...) { \ ASSIMP_END_EXCEPTION_REGION_errorString = "Internal error"; \ - ASSIMP_END_EXCEPTION_REGION_internalError = std::current_exception(); \ + ASSIMP_END_EXCEPTION_REGION_exception = std::current_exception(); \ return ExceptionSwallower()(); \ } \ } diff --git a/include/assimp/Importer.hpp b/include/assimp/Importer.hpp index 40753d4c7..9078fbfe6 100644 --- a/include/assimp/Importer.hpp +++ b/include/assimp/Importer.hpp @@ -496,15 +496,13 @@ public: const char *GetErrorString() const; // ------------------------------------------------------------------- - /** Returns an internal exception if one occurred during import. + /** Returns an exception if one occurred during import. * - * Returns the last non-DeadlyImportError exception which occurred. - * @return The last exception which occurred which wasn't a - * DeadlyImportError. + * @return The last exception which occurred. * * @note The returned value remains valid until one of the * following methods is called: #ReadFile(), #FreeScene(). */ - const std::exception_ptr& GetInternalException() const; + const std::exception_ptr& GetException() const; // ------------------------------------------------------------------- /** Returns the scene loaded by the last successful call to ReadFile() diff --git a/test/unit/utImporter.cpp b/test/unit/utImporter.cpp index 05b0b1ba7..3d57461a5 100644 --- a/test/unit/utImporter.cpp +++ b/test/unit/utImporter.cpp @@ -334,7 +334,7 @@ TEST_F(ImporterTest, deadlyImportError) const aiScene* scene = pImp->ReadFile("deadlyImportError.fail", 0); EXPECT_EQ(scene, nullptr); EXPECT_STREQ(pImp->GetErrorString(), "Deadly import error test"); - EXPECT_EQ(pImp->GetInternalException(), std::exception_ptr()); + EXPECT_NE(pImp->GetException(), std::exception_ptr()); } TEST_F(ImporterTest, stdException) @@ -344,10 +344,10 @@ TEST_F(ImporterTest, stdException) const aiScene* scene = pImp->ReadFile("stdException.fail", 0); EXPECT_EQ(scene, nullptr); EXPECT_STREQ(pImp->GetErrorString(), "Internal error"); - EXPECT_NE(pImp->GetInternalException(), std::exception_ptr()); + EXPECT_NE(pImp->GetException(), std::exception_ptr()); try { - std::rethrow_exception(pImp->GetInternalException()); + std::rethrow_exception(pImp->GetException()); } catch(const std::exception& e) { @@ -367,10 +367,10 @@ TEST_F(ImporterTest, unexpectedException) EXPECT_EQ(scene, nullptr); EXPECT_STREQ(pImp->GetErrorString(), "Internal error"); - ASSERT_NE(pImp->GetInternalException(), std::exception_ptr()); + ASSERT_NE(pImp->GetException(), std::exception_ptr()); try { - std::rethrow_exception(pImp->GetInternalException()); + std::rethrow_exception(pImp->GetException()); } catch(int x) { From 0f6127e90ec0a3ea5e76f8eeed7d8635686cb58f Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Tue, 18 Aug 2020 18:21:20 +0100 Subject: [PATCH 098/129] No need to build strings. --- code/AssetLib/AMF/AMFImporter.cpp | 4 ++-- code/AssetLib/Ogre/OgreXmlSerializer.cpp | 4 ++-- code/AssetLib/X3D/X3DImporter.cpp | 12 ++++++------ code/AssetLib/glTF/glTFAsset.inl | 10 +++++----- code/AssetLib/glTF2/glTF2Asset.inl | 8 ++++---- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/code/AssetLib/AMF/AMFImporter.cpp b/code/AssetLib/AMF/AMFImporter.cpp index fed259a9b..556dbb30b 100644 --- a/code/AssetLib/AMF/AMFImporter.cpp +++ b/code/AssetLib/AMF/AMFImporter.cpp @@ -147,11 +147,11 @@ void AMFImporter::Throw_CloseNotFound(const std::string &pNode) { } void AMFImporter::Throw_IncorrectAttr(const std::string &pAttrName) { - throw DeadlyImportError("Node <", std::string(mReader->getNodeName()), "> has incorrect attribute \"", pAttrName, "\"."); + throw DeadlyImportError("Node <", mReader->getNodeName(), "> has incorrect attribute \"", pAttrName, "\"."); } void AMFImporter::Throw_IncorrectAttrValue(const std::string &pAttrName) { - throw DeadlyImportError("Attribute \"", pAttrName, "\" in node <", std::string(mReader->getNodeName()), "> has incorrect value."); + throw DeadlyImportError("Attribute \"", pAttrName, "\" in node <", mReader->getNodeName(), "> has incorrect value."); } void AMFImporter::Throw_MoreThanOnceDefined(const std::string &pNodeType, const std::string &pDescription) { diff --git a/code/AssetLib/Ogre/OgreXmlSerializer.cpp b/code/AssetLib/Ogre/OgreXmlSerializer.cpp index d3a6a5529..c1a9245aa 100644 --- a/code/AssetLib/Ogre/OgreXmlSerializer.cpp +++ b/code/AssetLib/Ogre/OgreXmlSerializer.cpp @@ -59,9 +59,9 @@ namespace Ogre { AI_WONT_RETURN void ThrowAttibuteError(const XmlReader *reader, const std::string &name, const std::string &error = "") AI_WONT_RETURN_SUFFIX; AI_WONT_RETURN void ThrowAttibuteError(const XmlReader *reader, const std::string &name, const std::string &error) { if (!error.empty()) { - throw DeadlyImportError(error, " in node '", std::string(reader->getNodeName()), "' and attribute '", name, "'"); + throw DeadlyImportError(error, " in node '", reader->getNodeName(), "' and attribute '", name, "'"); } else { - throw DeadlyImportError("Attribute '", name, "' does not exist in node '", std::string(reader->getNodeName()), "'"); + throw DeadlyImportError("Attribute '", name, "' does not exist in node '", reader->getNodeName(), "'"); } } diff --git a/code/AssetLib/X3D/X3DImporter.cpp b/code/AssetLib/X3D/X3DImporter.cpp index 94b11dee2..d521dcd9c 100644 --- a/code/AssetLib/X3D/X3DImporter.cpp +++ b/code/AssetLib/X3D/X3DImporter.cpp @@ -243,23 +243,23 @@ void X3DImporter::Throw_CloseNotFound(const std::string& pNode) void X3DImporter::Throw_ConvertFail_Str2ArrF(const std::string& pAttrValue) { - throw DeadlyImportError("In <", std::string(mReader->getNodeName()), "> failed to convert attribute value \"", pAttrValue, + throw DeadlyImportError("In <", mReader->getNodeName(), "> failed to convert attribute value \"", pAttrValue, "\" from string to array of floats."); } void X3DImporter::Throw_DEF_And_USE() { - throw DeadlyImportError("\"DEF\" and \"USE\" can not be defined both in <", std::string(mReader->getNodeName()), ">."); + throw DeadlyImportError("\"DEF\" and \"USE\" can not be defined both in <", mReader->getNodeName(), ">."); } void X3DImporter::Throw_IncorrectAttr(const std::string& pAttrName) { - throw DeadlyImportError("Node <", std::string(mReader->getNodeName()), "> has incorrect attribute \"", pAttrName, "\"."); + throw DeadlyImportError("Node <", mReader->getNodeName(), "> has incorrect attribute \"", pAttrName, "\"."); } void X3DImporter::Throw_IncorrectAttrValue(const std::string& pAttrName) { - throw DeadlyImportError("Attribute \"", pAttrName, "\" in node <", std::string(mReader->getNodeName()), "> has incorrect value."); + throw DeadlyImportError("Attribute \"", pAttrName, "\" in node <", mReader->getNodeName(), "> has incorrect value."); } void X3DImporter::Throw_MoreThanOnceDefined(const std::string& pNodeType, const std::string& pDescription) @@ -274,7 +274,7 @@ void X3DImporter::Throw_TagCountIncorrect(const std::string& pNode) void X3DImporter::Throw_USE_NotFound(const std::string& pAttrValue) { - throw DeadlyImportError("Not found node with name \"", pAttrValue, "\" in <", std::string(mReader->getNodeName()), ">."); + throw DeadlyImportError("Not found node with name \"", pAttrValue, "\" in <", mReader->getNodeName(), ">."); } /*********************************************************************************************************************************************/ @@ -1519,7 +1519,7 @@ void X3DImporter::ParseNode_Scene() auto GroupCounter_Increase = [](size_t& pCounter, const char* pGroupName) -> void { pCounter++; - if(pCounter == 0) throw DeadlyImportError("Group counter overflow. Too much groups with type: ", std::string(pGroupName), "."); + if(pCounter == 0) throw DeadlyImportError("Group counter overflow. Too much groups with type: ", pGroupName, "."); }; auto GroupCounter_Decrease = [&](size_t& pCounter, const char* pGroupName) -> void diff --git a/code/AssetLib/glTF/glTFAsset.inl b/code/AssetLib/glTF/glTFAsset.inl index 217bc8d47..41bdc508a 100644 --- a/code/AssetLib/glTF/glTFAsset.inl +++ b/code/AssetLib/glTF/glTFAsset.inl @@ -235,15 +235,15 @@ Ref LazyDict::Get(const char *id) { // read it from the JSON object if (!mDict) { - throw DeadlyImportError("GLTF: Missing section \"", std::string(mDictId), "\""); + throw DeadlyImportError("GLTF: Missing section \"", mDictId, "\""); } Value::MemberIterator obj = mDict->FindMember(id); if (obj == mDict->MemberEnd()) { - throw DeadlyImportError("GLTF: Missing object with id \"", std::string(id), "\" in \"", mDictId, "\""); + throw DeadlyImportError("GLTF: Missing object with id \"", id, "\" in \"", mDictId, "\""); } if (!obj->value.IsObject()) { - throw DeadlyImportError("GLTF: Object with id \"", std::string(id), "\" is not a JSON object"); + throw DeadlyImportError("GLTF: Object with id \"", id, "\" is not a JSON object"); } // create an instance of the given type @@ -339,9 +339,9 @@ inline void Buffer::Read(Value &obj, Asset &r) { delete file; if (!ok) - throw DeadlyImportError("GLTF: error while reading referenced file \"", std::string(uri), "\""); + throw DeadlyImportError("GLTF: error while reading referenced file \"", uri, "\""); } else { - throw DeadlyImportError("GLTF: could not open referenced file \"", std::string(uri), "\""); + throw DeadlyImportError("GLTF: could not open referenced file \"", uri, "\""); } } } diff --git a/code/AssetLib/glTF2/glTF2Asset.inl b/code/AssetLib/glTF2/glTF2Asset.inl index be23673ad..8ea621911 100644 --- a/code/AssetLib/glTF2/glTF2Asset.inl +++ b/code/AssetLib/glTF2/glTF2Asset.inl @@ -269,11 +269,11 @@ Ref LazyDict::Retrieve(unsigned int i) { // read it from the JSON object if (!mDict) { - throw DeadlyImportError("GLTF: Missing section \"", std::string(mDictId), "\""); + throw DeadlyImportError("GLTF: Missing section \"", mDictId, "\""); } if (!mDict->IsArray()) { - throw DeadlyImportError("GLTF: Field is not an array \"", std::string(mDictId), "\""); + throw DeadlyImportError("GLTF: Field is not an array \"", mDictId, "\""); } Value &obj = (*mDict)[i]; @@ -403,9 +403,9 @@ inline void Buffer::Read(Value &obj, Asset &r) { delete file; if (!ok) - throw DeadlyImportError("GLTF: error while reading referenced file \"", std::string(uri), "\""); + throw DeadlyImportError("GLTF: error while reading referenced file \"", uri, "\""); } else { - throw DeadlyImportError("GLTF: could not open referenced file \"", std::string(uri), "\""); + throw DeadlyImportError("GLTF: could not open referenced file \"", uri, "\""); } } } From 3ccf503d3eef19dbe47e235e619c43a9d35d4d11 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Wed, 19 Aug 2020 11:31:32 +0100 Subject: [PATCH 099/129] Forward template arguments. --- include/assimp/Exceptional.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/assimp/Exceptional.h b/include/assimp/Exceptional.h index 2e02b72e6..139201085 100644 --- a/include/assimp/Exceptional.h +++ b/include/assimp/Exceptional.h @@ -65,7 +65,7 @@ protected: template explicit DeadlyErrorBase(Assimp::Formatter::format f, U&& u, T&&... args) - : DeadlyErrorBase(std::move(f << u), args...) + : DeadlyErrorBase(std::move(f << std::forward(u)), std::forward(args)...) { } }; @@ -79,7 +79,7 @@ public: /** Constructor with arguments */ template explicit DeadlyImportError(T&&... args) - : DeadlyErrorBase(Assimp::Formatter::format(), args...) + : DeadlyErrorBase(Assimp::Formatter::format(), std::forward(args)...) { } }; @@ -89,7 +89,7 @@ public: /** Constructor with arguments */ template explicit DeadlyExportError(T&&... args) - : DeadlyErrorBase(Assimp::Formatter::format(), args...) + : DeadlyErrorBase(Assimp::Formatter::format(), std::forward(args)...) { } }; From d7c65c36cde0df3e0e26ec4ab74ab177e8fb923a Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Wed, 19 Aug 2020 11:31:46 +0100 Subject: [PATCH 100/129] Add unit test for formatting. --- test/unit/utImporter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unit/utImporter.cpp b/test/unit/utImporter.cpp index 3d57461a5..189b22bae 100644 --- a/test/unit/utImporter.cpp +++ b/test/unit/utImporter.cpp @@ -313,7 +313,7 @@ namespace { if (pFile == "deadlyImportError.fail") { - throw DeadlyImportError("Deadly import error test"); + throw DeadlyImportError("Deadly import error test. Details: ", 42, " More Details: ", "Failure"); } else if (pFile == "stdException.fail") { @@ -333,7 +333,7 @@ TEST_F(ImporterTest, deadlyImportError) pImp->SetIOHandler(new TestIOSystem); const aiScene* scene = pImp->ReadFile("deadlyImportError.fail", 0); EXPECT_EQ(scene, nullptr); - EXPECT_STREQ(pImp->GetErrorString(), "Deadly import error test"); + EXPECT_STREQ(pImp->GetErrorString(), "Deadly import error test. Details: 42 More Details: Failure"); EXPECT_NE(pImp->GetException(), std::exception_ptr()); } From 6c2ceb55f844ab355db48c1220368b8d05018d70 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Wed, 19 Aug 2020 17:20:57 +0100 Subject: [PATCH 101/129] Simplify some FBX error code. --- code/AssetLib/FBX/FBXBinaryTokenizer.cpp | 2 +- code/AssetLib/FBX/FBXDocumentUtil.cpp | 4 ++-- code/AssetLib/FBX/FBXParser.cpp | 2 +- code/AssetLib/FBX/FBXTokenizer.cpp | 2 +- code/AssetLib/FBX/FBXUtil.cpp | 20 +++++++++----------- code/AssetLib/FBX/FBXUtil.h | 21 +++++++-------------- 6 files changed, 21 insertions(+), 30 deletions(-) diff --git a/code/AssetLib/FBX/FBXBinaryTokenizer.cpp b/code/AssetLib/FBX/FBXBinaryTokenizer.cpp index 2ed41ccdb..419750e2c 100644 --- a/code/AssetLib/FBX/FBXBinaryTokenizer.cpp +++ b/code/AssetLib/FBX/FBXBinaryTokenizer.cpp @@ -127,7 +127,7 @@ namespace { AI_WONT_RETURN void TokenizeError(const std::string& message, size_t offset) AI_WONT_RETURN_SUFFIX; AI_WONT_RETURN void TokenizeError(const std::string& message, size_t offset) { - throw DeadlyImportError(Util::AddOffset("FBX-Tokenize",message,offset)); + throw DeadlyImportError("FBX-Tokenize", Util::GetOffsetText(offset), message); } diff --git a/code/AssetLib/FBX/FBXDocumentUtil.cpp b/code/AssetLib/FBX/FBXDocumentUtil.cpp index 9bbc39e00..42c056628 100644 --- a/code/AssetLib/FBX/FBXDocumentUtil.cpp +++ b/code/AssetLib/FBX/FBXDocumentUtil.cpp @@ -61,7 +61,7 @@ namespace Util { // signal DOM construction error, this is always unrecoverable. Throws DeadlyImportError. void DOMError(const std::string& message, const Token& token) { - throw DeadlyImportError(Util::AddTokenText("FBX-DOM",message,&token)); + throw DeadlyImportError("FBX-DOM", Util::GetTokenText(&token), message); } // ------------------------------------------------------------------------------------------------ @@ -79,7 +79,7 @@ void DOMError(const std::string& message, const Element* element /*= nullptr*/) void DOMWarning(const std::string& message, const Token& token) { if(DefaultLogger::get()) { - ASSIMP_LOG_WARN(Util::AddTokenText("FBX-DOM",message,&token)); + ASSIMP_LOG_WARN_F("FBX-DOM", Util::GetTokenText(&token), message); } } diff --git a/code/AssetLib/FBX/FBXParser.cpp b/code/AssetLib/FBX/FBXParser.cpp index cfd2a5830..f93f69d4d 100644 --- a/code/AssetLib/FBX/FBXParser.cpp +++ b/code/AssetLib/FBX/FBXParser.cpp @@ -73,7 +73,7 @@ namespace { AI_WONT_RETURN void ParseError(const std::string& message, const Token& token) AI_WONT_RETURN_SUFFIX; AI_WONT_RETURN void ParseError(const std::string& message, const Token& token) { - throw DeadlyImportError(Util::AddTokenText("FBX-Parser",message,&token)); + throw DeadlyImportError("FBX-Parser", Util::GetTokenText(&token), message); } // ------------------------------------------------------------------------------------------------ diff --git a/code/AssetLib/FBX/FBXTokenizer.cpp b/code/AssetLib/FBX/FBXTokenizer.cpp index bd3ee7ad1..2bb054d8e 100644 --- a/code/AssetLib/FBX/FBXTokenizer.cpp +++ b/code/AssetLib/FBX/FBXTokenizer.cpp @@ -90,7 +90,7 @@ namespace { AI_WONT_RETURN void TokenizeError(const std::string& message, unsigned int line, unsigned int column) AI_WONT_RETURN_SUFFIX; AI_WONT_RETURN void TokenizeError(const std::string& message, unsigned int line, unsigned int column) { - throw DeadlyImportError(Util::AddLineAndColumn("FBX-Tokenize",message,line,column)); + throw DeadlyImportError("FBX-Tokenize", Util::GetLineAndColumnText(line,column), message); } diff --git a/code/AssetLib/FBX/FBXUtil.cpp b/code/AssetLib/FBX/FBXUtil.cpp index 50dd78a4c..983730011 100644 --- a/code/AssetLib/FBX/FBXUtil.cpp +++ b/code/AssetLib/FBX/FBXUtil.cpp @@ -86,32 +86,30 @@ const char* TokenTypeString(TokenType t) // ------------------------------------------------------------------------------------------------ -std::string AddOffset(const std::string& prefix, const std::string& text, size_t offset) +std::string GetOffsetText(size_t offset) { - return static_cast( (Formatter::format() << prefix << " (offset 0x" << std::hex << offset << ") " << text) ); + return static_cast( Formatter::format() << " (offset 0x" << std::hex << offset << ") " ); } // ------------------------------------------------------------------------------------------------ -std::string AddLineAndColumn(const std::string& prefix, const std::string& text, unsigned int line, unsigned int column) +std::string GetLineAndColumnText(unsigned int line, unsigned int column) { - return static_cast( (Formatter::format() << prefix << " (line " << line << " << col " << column << ") " << text) ); + return static_cast( Formatter::format() << " (line " << line << " << col " << column << ") " ); } // ------------------------------------------------------------------------------------------------ -std::string AddTokenText(const std::string& prefix, const std::string& text, const Token* tok) +std::string GetTokenText(const Token* tok) { if(tok->IsBinary()) { - return static_cast( (Formatter::format() << prefix << + return static_cast( Formatter::format() << " (" << TokenTypeString(tok->Type()) << - ", offset 0x" << std::hex << tok->Offset() << ") " << - text) ); + ", offset 0x" << std::hex << tok->Offset() << ") " ); } - return static_cast( (Formatter::format() << prefix << + return static_cast( Formatter::format() << " (" << TokenTypeString(tok->Type()) << ", line " << tok->Line() << - ", col " << tok->Column() << ") " << - text) ); + ", col " << tok->Column() << ") " ); } // Generated by this formula: T["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[i]] = i; diff --git a/code/AssetLib/FBX/FBXUtil.h b/code/AssetLib/FBX/FBXUtil.h index 77bb0ad30..82d53eea1 100644 --- a/code/AssetLib/FBX/FBXUtil.h +++ b/code/AssetLib/FBX/FBXUtil.h @@ -73,31 +73,24 @@ const char* TokenTypeString(TokenType t); /** Format log/error messages using a given offset in the source binary file * - * @param prefix Message prefix to be preprended to the location info. - * @param text Message text - * @param line Line index, 1-based - * @param column Column index, 1-based - * @return A string of the following format: {prefix} (offset 0x{offset}) {text}*/ -std::string AddOffset(const std::string& prefix, const std::string& text, size_t offset); + * @param offset offset within the file + * @return A string of the following format: " (offset 0x{offset}) "*/ +std::string GetOffsetText(size_t offset); /** Format log/error messages using a given line location in the source file. * - * @param prefix Message prefix to be preprended to the location info. - * @param text Message text * @param line Line index, 1-based * @param column Column index, 1-based - * @return A string of the following format: {prefix} (line {line}, col {column}) {text}*/ -std::string AddLineAndColumn(const std::string& prefix, const std::string& text, unsigned int line, unsigned int column); + * @return A string of the following format: " (line {line}, col {column}) "*/ +std::string GetLineAndColumnText(unsigned int line, unsigned int column); /** Format log/error messages using a given cursor token. * - * @param prefix Message prefix to be preprended to the location info. - * @param text Message text * @param tok Token where parsing/processing stopped - * @return A string of the following format: {prefix} ({token-type}, line {line}, col {column}) {text}*/ -std::string AddTokenText(const std::string& prefix, const std::string& text, const Token* tok); + * @return A string of the following format: " ({token-type}, line {line}, col {column}) "*/ +std::string GetTokenText(const Token* tok); /** Decode a single Base64-encoded character. * From 6f9c61e157f9bc17ec2e191e5625f0c1799b8c82 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Wed, 19 Aug 2020 17:57:25 +0100 Subject: [PATCH 102/129] Use case which matches surrounding code. --- code/Common/BaseImporter.cpp | 4 ++-- include/assimp/BaseImporter.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/Common/BaseImporter.cpp b/code/Common/BaseImporter.cpp index 1b8f9927a..6f5e744a0 100644 --- a/code/Common/BaseImporter.cpp +++ b/code/Common/BaseImporter.cpp @@ -134,12 +134,12 @@ aiScene *BaseImporter::ReadFile(Importer *pImp, const std::string &pFile, IOSyst // extract error description m_ErrorText = err.what(); ASSIMP_LOG_ERROR(m_ErrorText.c_str()); - m_exception = std::current_exception(); + m_Exception = std::current_exception(); return nullptr; } catch( const std::exception& err ) { m_ErrorText = "Internal error"; ASSIMP_LOG_ERROR(err.what()); - m_exception = std::current_exception(); + m_Exception = std::current_exception(); return nullptr; } diff --git a/include/assimp/BaseImporter.h b/include/assimp/BaseImporter.h index 114531385..3aaa80f69 100644 --- a/include/assimp/BaseImporter.h +++ b/include/assimp/BaseImporter.h @@ -155,7 +155,7 @@ public: * @return The last exception that occurred. */ const std::exception_ptr& GetException() const { - return m_exception; + return m_Exception; } // ------------------------------------------------------------------- @@ -423,7 +423,7 @@ protected: /// In case of other errors, this will just be "Internal error" std::string m_ErrorText; /// An exception which occurred. - std::exception_ptr m_exception; + std::exception_ptr m_Exception; /// Currently set progress handler. ProgressHandler *m_progress; }; From 9b5e758bddcecab119a89344e65448cd8673636e Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Wed, 19 Aug 2020 17:59:13 +0100 Subject: [PATCH 103/129] Even simpler DeadlyErrorBase --- code/Common/Exceptional.cpp | 6 +----- include/assimp/Exceptional.h | 7 ++----- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/code/Common/Exceptional.cpp b/code/Common/Exceptional.cpp index e3e3b535b..660b54b27 100644 --- a/code/Common/Exceptional.cpp +++ b/code/Common/Exceptional.cpp @@ -48,11 +48,7 @@ Implementations of the exception classes. #include #include -DeadlyErrorBase::DeadlyErrorBase(const std::string& errorText) - : runtime_error(errorText) -{} - DeadlyErrorBase::DeadlyErrorBase(Assimp::Formatter::format f) - : DeadlyErrorBase(std::string(f)) + : runtime_error(std::string(f)) { } diff --git a/include/assimp/Exceptional.h b/include/assimp/Exceptional.h index 139201085..0704d0bbc 100644 --- a/include/assimp/Exceptional.h +++ b/include/assimp/Exceptional.h @@ -58,13 +58,10 @@ using std::runtime_error; class ASSIMP_API DeadlyErrorBase : public runtime_error { protected: - /** Constructor with arguments */ - explicit DeadlyErrorBase(const std::string& errorText); - - explicit DeadlyErrorBase(Assimp::Formatter::format f); + DeadlyErrorBase(Assimp::Formatter::format f); template - explicit DeadlyErrorBase(Assimp::Formatter::format f, U&& u, T&&... args) + DeadlyErrorBase(Assimp::Formatter::format f, U&& u, T&&... args) : DeadlyErrorBase(std::move(f << std::forward(u)), std::forward(args)...) { } From 8f893e36530d4868e2ff28b93381e54e535806d5 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Thu, 20 Aug 2020 14:32:15 +0100 Subject: [PATCH 104/129] Actually, just keep the old behaviour for now. --- code/Common/BaseImporter.cpp | 7 +------ code/Common/Importer.h | 5 ++--- include/assimp/BaseImporter.h | 9 ++++++--- test/unit/utImporter.cpp | 2 +- 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/code/Common/BaseImporter.cpp b/code/Common/BaseImporter.cpp index 6f5e744a0..efeae03b1 100644 --- a/code/Common/BaseImporter.cpp +++ b/code/Common/BaseImporter.cpp @@ -130,14 +130,9 @@ aiScene *BaseImporter::ReadFile(Importer *pImp, const std::string &pFile, IOSyst // passes scale into ScaleProcess UpdateImporterScale(pImp); - } catch( const DeadlyImportError& err ) { + } catch( const std::exception &err ) { // extract error description m_ErrorText = err.what(); - ASSIMP_LOG_ERROR(m_ErrorText.c_str()); - m_Exception = std::current_exception(); - return nullptr; - } catch( const std::exception& err ) { - m_ErrorText = "Internal error"; ASSIMP_LOG_ERROR(err.what()); m_Exception = std::current_exception(); return nullptr; diff --git a/code/Common/Importer.h b/code/Common/Importer.h index df3686613..32a1780da 100644 --- a/code/Common/Importer.h +++ b/code/Common/Importer.h @@ -97,9 +97,8 @@ public: /** The imported data, if ReadFile() was successful, nullptr otherwise. */ aiScene* mScene; - /** The error description, if there was one. In the case of a - * failure not caused by a DeadlyImportError, mInternalException will - * carry the full details and this will be just "Internal error". */ + /** The error description, if there was one. In the case of an exception, + * mException will carry the full details. */ std::string mErrorString; /** Any exception which occurred */ diff --git a/include/assimp/BaseImporter.h b/include/assimp/BaseImporter.h index 3aaa80f69..a8239be8d 100644 --- a/include/assimp/BaseImporter.h +++ b/include/assimp/BaseImporter.h @@ -143,6 +143,8 @@ public: // ------------------------------------------------------------------- /** Returns the error description of the last error that occurred. + * If the error is due to a std::exception, this will return the message. + * Exceptions can also be accessed with GetException(). * @return A description of the last error that occurred. An empty * string if there was no error. */ @@ -152,6 +154,8 @@ public: // ------------------------------------------------------------------- /** Returns the exception of the last exception that occurred. + * Note: Exceptions are not the only source of error details, so GetErrorText + * should be consulted too. * @return The last exception that occurred. */ const std::exception_ptr& GetException() const { @@ -419,10 +423,9 @@ private: virtual void UpdateImporterScale(Importer *pImp); protected: - /// Error description when a DeadlyImportError occurred during import. - /// In case of other errors, this will just be "Internal error" + /// Error description in case there was one. std::string m_ErrorText; - /// An exception which occurred. + /// The exception, in case there was one. std::exception_ptr m_Exception; /// Currently set progress handler. ProgressHandler *m_progress; diff --git a/test/unit/utImporter.cpp b/test/unit/utImporter.cpp index 189b22bae..258d36fe5 100644 --- a/test/unit/utImporter.cpp +++ b/test/unit/utImporter.cpp @@ -343,7 +343,7 @@ TEST_F(ImporterTest, stdException) pImp->SetIOHandler(new TestIOSystem); const aiScene* scene = pImp->ReadFile("stdException.fail", 0); EXPECT_EQ(scene, nullptr); - EXPECT_STREQ(pImp->GetErrorString(), "Internal error"); + EXPECT_STREQ(pImp->GetErrorString(), "std::exception test"); EXPECT_NE(pImp->GetException(), std::exception_ptr()); try { From 16c227e27c9f66b01c24dbf122a397f3df35c586 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Thu, 20 Aug 2020 14:53:00 +0100 Subject: [PATCH 105/129] Undo one other small change. --- include/assimp/Exceptional.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/assimp/Exceptional.h b/include/assimp/Exceptional.h index 0704d0bbc..0228258b3 100644 --- a/include/assimp/Exceptional.h +++ b/include/assimp/Exceptional.h @@ -56,7 +56,7 @@ using std::runtime_error; #pragma warning(disable : 4275) #endif -class ASSIMP_API DeadlyErrorBase : public runtime_error { +class DeadlyErrorBase : public runtime_error { protected: DeadlyErrorBase(Assimp::Formatter::format f); @@ -145,7 +145,7 @@ struct ExceptionSwallower { return ExceptionSwallower()(); \ } \ catch (...) { \ - ASSIMP_END_EXCEPTION_REGION_errorString = "Internal error"; \ + ASSIMP_END_EXCEPTION_REGION_errorString = "Unknown exception"; \ ASSIMP_END_EXCEPTION_REGION_exception = std::current_exception(); \ return ExceptionSwallower()(); \ } \ From fa93ba76febf8cafe415003ba5ab3f1985943cc6 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Thu, 20 Aug 2020 15:01:24 +0100 Subject: [PATCH 106/129] Do need to export base class. --- include/assimp/Exceptional.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/assimp/Exceptional.h b/include/assimp/Exceptional.h index 0228258b3..71566ae4f 100644 --- a/include/assimp/Exceptional.h +++ b/include/assimp/Exceptional.h @@ -56,7 +56,7 @@ using std::runtime_error; #pragma warning(disable : 4275) #endif -class DeadlyErrorBase : public runtime_error { +class ASSIMP_API DeadlyErrorBase : public runtime_error { protected: DeadlyErrorBase(Assimp::Formatter::format f); @@ -145,7 +145,7 @@ struct ExceptionSwallower { return ExceptionSwallower()(); \ } \ catch (...) { \ - ASSIMP_END_EXCEPTION_REGION_errorString = "Unknown exception"; \ + ASSIMP_END_EXCEPTION_REGION_errorString = "Unknown exception"; \ ASSIMP_END_EXCEPTION_REGION_exception = std::current_exception(); \ return ExceptionSwallower()(); \ } \ From 962fe7cd4df0bf256c5930e00bb8d1a06e65eeb2 Mon Sep 17 00:00:00 2001 From: Malcolm Tyrrell Date: Thu, 20 Aug 2020 15:10:11 +0100 Subject: [PATCH 107/129] Oops. Fix string to match restored error text. --- test/unit/utImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/utImporter.cpp b/test/unit/utImporter.cpp index 258d36fe5..5e84b2ae4 100644 --- a/test/unit/utImporter.cpp +++ b/test/unit/utImporter.cpp @@ -366,7 +366,7 @@ TEST_F(ImporterTest, unexpectedException) const aiScene* scene = pImp->ReadFile("unexpectedException.fail", 0); EXPECT_EQ(scene, nullptr); - EXPECT_STREQ(pImp->GetErrorString(), "Internal error"); + EXPECT_STREQ(pImp->GetErrorString(), "Unknown exception"); ASSERT_NE(pImp->GetException(), std::exception_ptr()); try { From 5087348a372d1e2abc4c7266ddbef5018d558c5c Mon Sep 17 00:00:00 2001 From: Rahul Sheth Date: Tue, 25 Aug 2020 11:30:46 -0400 Subject: [PATCH 108/129] Build tests and tools with Hunter --- Dockerfile | 26 ++++++++++++++++++++++++++ test/CMakeLists.txt | 22 +++++++++++++++++----- 2 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..fa6837d29 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,26 @@ +FROM ubuntu:20.04 + +ARG TOOLCHAIN_NAME=gcc-9-cxx17-fpic +ARG BUILD_TYPE=RelWithDebInfo + +RUN apt-get update && apt-get install -y --no-install-recommends \ + cmake \ + gcc-9 \ + g++-9 \ + ca-certificates \ + make + +WORKDIR /root/assimp +COPY ./cmake ./cmake +COPY ./cmake-modules ./cmake-modules +COPY ./code ./code +COPY ./include ./include +COPY ./samples ./samples +COPY ./test ./test +COPY ./tools ./tools +COPY ./*.in ./ +COPY CMakeLists.txt ./ + +RUN cmake -DBUILD_SHARED_LIBS=OFF -DASSIMP_BUILD_ASSIMP_TOOLS=ON -DASSIMP_BUILD_SAMPLES=OFF -DASSIMP_BUILD_TESTS=ON -DASSIMP_INSTALL_PDB=OFF -DASSIMP_IGNORE_GIT_HASH=ON -DASSIMP_HUNTER_ENABLED=ON -H. -B_builds/${TOOLCHAIN_NAME}-${BUILD_TYPE} -DCMAKE_TOOLCHAIN_FILE=./cmake/polly/${TOOLCHAIN_NAME}.cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE} + +RUN make -C _builds/${TOOLCHAIN_NAME}-${BUILD_TYPE} -j 4 diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 5a150482d..0d038943e 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -39,12 +39,18 @@ cmake_minimum_required( VERSION 3.0 ) INCLUDE_DIRECTORIES( - ${Assimp_SOURCE_DIR}/contrib/gtest/include - ${Assimp_SOURCE_DIR}/contrib/gtest/ ${Assimp_SOURCE_DIR}/test/unit ${Assimp_SOURCE_DIR}/include ${Assimp_SOURCE_DIR}/code ) + +if(NOT ASSIMP_HUNTER_ENABLED) + INCLUDE_DIRECTORIES( + ${Assimp_SOURCE_DIR}/contrib/gtest/include + ${Assimp_SOURCE_DIR}/contrib/gtest/ + ) +endif() + if (MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING") endif() @@ -197,7 +203,6 @@ SOURCE_GROUP( UnitTests\\Math FILES ${MATH} ) SOURCE_GROUP( UnitTests\\PostProcess FILES ${POST_PROCESSES}) add_executable( unit - ../contrib/gtest/src/gtest-all.cc unit/CCompilerTest.c unit/Main.cpp ../code/Common/Version.cpp @@ -208,6 +213,14 @@ add_executable( unit ${POST_PROCESSES} ) +if(ASSIMP_HUNTER_ENABLED) + hunter_add_package(GTest) + find_package(GTest CONFIG REQUIRED) + target_link_libraries(unit GTest::gtest_main GTest::gmock) +else() + target_sources(unit PUBLIC ../contrib/gtest/src/gtest-all.cc) +endif() + TARGET_USE_COMMON_OUTPUT_DIRECTORY(unit) add_definitions(-DASSIMP_TEST_MODELS_DIR="${CMAKE_CURRENT_LIST_DIR}/models") @@ -222,7 +235,7 @@ ELSE() ENDIF() IF(MSVC) - add_definitions(-D_CRT_SECURE_NO_WARNINGS) + add_definitions(-D_CRT_SECURE_NO_WARNINGS) ENDIF() target_link_libraries( unit assimp ${platform_libs} ) @@ -230,4 +243,3 @@ target_link_libraries( unit assimp ${platform_libs} ) add_subdirectory(headercheck) add_test( unittests unit ) - From 59c8b4ed84d4d8bd4897e1c2c36556b7c7d68320 Mon Sep 17 00:00:00 2001 From: Rahul Sheth Date: Thu, 27 Aug 2020 11:25:29 -0400 Subject: [PATCH 109/129] Move RapidJSON definitions to CMake --- CMakeLists.txt | 4 ++-- code/AssetLib/glTF/glTFAsset.h | 8 -------- code/AssetLib/glTF/glTFCommon.h | 2 -- code/AssetLib/glTF2/glTF2Asset.h | 8 -------- code/CMakeLists.txt | 2 ++ 5 files changed, 4 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2e21ee8e4..936f83421 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,8 +45,8 @@ option(ASSIMP_HUNTER_ENABLED "Enable Hunter package manager support" OFF) IF(ASSIMP_HUNTER_ENABLED) include("cmake/HunterGate.cmake") HunterGate( - URL "https://github.com/cpp-pm/hunter/archive/v0.23.261.tar.gz" - SHA1 "1540dad7b97c849784a09e8c452ba811c9f71ba2" + URL "https://github.com/cpp-pm/hunter/archive/v0.23.268.tar.gz" + SHA1 "40ae51ce014380289bad5ec6b6e207660f69e804" ) add_definitions(-DASSIMP_USE_HUNTER) diff --git a/code/AssetLib/glTF/glTFAsset.h b/code/AssetLib/glTF/glTFAsset.h index 15947c8c6..189cf1da8 100644 --- a/code/AssetLib/glTF/glTFAsset.h +++ b/code/AssetLib/glTF/glTFAsset.h @@ -60,19 +60,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#ifndef RAPIDJSON_HAS_STDSTRING -#define RAPIDJSON_HAS_STDSTRING 1 -#endif - #if (__GNUC__ == 8 && __GNUC_MINOR__ >= 0) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wclass-memaccess" #endif -#ifndef RAPIDJSON_NOMEMBERITERATORCLASS -#define RAPIDJSON_NOMEMBERITERATORCLASS -#endif - #include #include #include diff --git a/code/AssetLib/glTF/glTFCommon.h b/code/AssetLib/glTF/glTFCommon.h index f70780ed4..977fc0da4 100644 --- a/code/AssetLib/glTF/glTFCommon.h +++ b/code/AssetLib/glTF/glTFCommon.h @@ -52,8 +52,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#define RAPIDJSON_HAS_STDSTRING 1 -#define RAPIDJSON_NOMEMBERITERATORCLASS #include #include #include diff --git a/code/AssetLib/glTF2/glTF2Asset.h b/code/AssetLib/glTF2/glTF2Asset.h index 763a6ac37..67c066219 100644 --- a/code/AssetLib/glTF2/glTF2Asset.h +++ b/code/AssetLib/glTF2/glTF2Asset.h @@ -62,19 +62,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#ifndef RAPIDJSON_HAS_STDSTRING -#define RAPIDJSON_HAS_STDSTRING 1 -#endif - #if (__GNUC__ == 8 && __GNUC_MINOR__ >= 0) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wclass-memaccess" #endif -#ifndef RAPIDJSON_NOMEMBERITERATORCLASS -#define RAPIDJSON_NOMEMBERITERATORCLASS -#endif - #include #include #include diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 9fafa4944..a727736df 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1054,6 +1054,8 @@ IF(ASSIMP_HUNTER_ENABLED) ELSE() INCLUDE_DIRECTORIES( "../contrib/rapidjson/include" ) INCLUDE_DIRECTORIES( "../contrib" ) + ADD_DEFINITIONS( -DRAPIDJSON_HAS_STDSTRING=1 ) + ADD_DEFINITIONS( -DRAPIDJSON_NOMEMBERITERATORCLASS ) ENDIF() # VC2010 fixes From 5f19c8890bcd2ae4e779ecfe8f69b17bb880c7a0 Mon Sep 17 00:00:00 2001 From: Rahul Sheth Date: Thu, 27 Aug 2020 16:31:42 -0400 Subject: [PATCH 110/129] Update to the latest Hunter --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 936f83421..f87f3e742 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,8 +45,8 @@ option(ASSIMP_HUNTER_ENABLED "Enable Hunter package manager support" OFF) IF(ASSIMP_HUNTER_ENABLED) include("cmake/HunterGate.cmake") HunterGate( - URL "https://github.com/cpp-pm/hunter/archive/v0.23.268.tar.gz" - SHA1 "40ae51ce014380289bad5ec6b6e207660f69e804" + URL "https://github.com/cpp-pm/hunter/archive/v0.23.269.tar.gz" + SHA1 "64024b7b95b4c86d50ae05b926814448c93a70a0" ) add_definitions(-DASSIMP_USE_HUNTER) From b15c111805526ce82f53f15571ef934326c964ff Mon Sep 17 00:00:00 2001 From: Rahul Sheth Date: Thu, 27 Aug 2020 13:14:08 -0400 Subject: [PATCH 111/129] Try Hunter-based Github Actions --- .github/workflows/ccpp.yml | 52 +++++++++++++++++++++++++++++++------- Dockerfile | 26 ------------------- cmake/HunterGate.cmake | 31 +++++++++++------------ test/unit/UnitTestPCH.h | 3 +++ 4 files changed, 61 insertions(+), 51 deletions(-) delete mode 100644 Dockerfile diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml index e542821e8..65be5ee96 100644 --- a/.github/workflows/ccpp.yml +++ b/.github/workflows/ccpp.yml @@ -8,12 +8,12 @@ on: jobs: job: - name: ${{ matrix.os }}-${{ matrix.cxx }}-build-and-test + name: ${{ matrix.name }}-build-and-test runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: - name: [ubuntu-gcc, macos-clang, windows-msvc, ubuntu-clang] + name: [ubuntu-gcc, macos-clang, windows-msvc, ubuntu-clang, ubuntu-gcc-hunter, macos-clang-hunter, windows-msvc-hunter] # For Windows msvc, for Linux and macOS let's use the clang compiler, use gcc for Linux. include: - name: windows-msvc @@ -32,6 +32,15 @@ jobs: os: ubuntu-latest cxx: g++ cc: gcc + - name: ubuntu-gcc-hunter + os: ubuntu-latest + toolchain: ninja-gcc-cxx17-fpic + - name: macos-clang-hunter + os: macos-latest + toolchain: ninja-clang-cxx17-fpic + - name: windows-msvc-hunter + os: windows-latest + toolchain: ninja-vs-win64-cxx17 steps: - uses: actions/checkout@v2 @@ -40,14 +49,29 @@ jobs: - uses: ilammy/msvc-dev-cmd@v1 - - uses: lukka/set-shell-env@v1 + - name: Set Compiler Environment + if: "!endsWith(matrix.name, 'hunter')" + uses: lukka/set-shell-env@v1 with: CXX: ${{ matrix.cxx }} CC: ${{ matrix.cc }} + - name: Set Compiler Environment for Hunter on Windows + if: startsWith(matrix.name, 'windows') && endsWith(matrix.name, 'hunter') + uses: lukka/set-shell-env@v1 + with: + VS160COMNTOOLS: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools + + - name: Checkout Hunter toolchains + if: endsWith(matrix.name, 'hunter') + uses: actions/checkout@v2 + with: + repository: cpp-pm/polly + path: cmake/polly + - name: Cache DX SDK id: dxcache - if: matrix.name == 'windows-msvc' + if: contains(matrix.name, 'windows') uses: actions/cache@v2 with: path: '${{ github.workspace }}/DX_SDK' @@ -56,16 +80,21 @@ jobs: ${{ runner.os }}-DX_SDK - name: Download DXSetup - if: matrix.name == 'windows-msvc' && steps.dxcache.outputs.cache-hit != 'true' + if: contains(matrix.name, 'windows') && steps.dxcache.outputs.cache-hit != 'true' run: | curl -s -o DXSDK_Jun10.exe --location https://download.microsoft.com/download/A/E/7/AE743F1F-632B-4809-87A9-AA1BB3458E31/DXSDK_Jun10.exe cmd.exe /c start /wait .\DXSDK_Jun10.exe /U /O /F /S /P "${{ github.workspace }}\DX_SDK" - name: Set Windows specific CMake arguments - if: matrix.name == 'windows-msvc' + if: contains(matrix.name, 'windows') id: windows_extra_cmake_args - run: echo "::set-output name=args::'-DASSIMP_BUILD_ASSIMP_TOOLS=1 -DASSIMP_BUILD_ASSIMP_VIEW=1'" + run: echo "::set-output name=args::-DASSIMP_BUILD_ASSIMP_TOOLS=1 -DASSIMP_BUILD_ASSIMP_VIEW=1" + - name: Set Hunter specific CMake arguments + if: contains(matrix.name, 'hunter') + id: hunter_extra_cmake_args + run: echo "::set-output name=args::-DBUILD_SHARED_LIBS=OFF -DASSIMP_HUNTER_ENABLED=ON -DCMAKE_TOOLCHAIN_FILE=${{ github.workspace }}/cmake/polly/${{ matrix.toolchain }}.cmake" + - name: configure and build uses: lukka/run-cmake@v2 env: @@ -74,12 +103,17 @@ jobs: with: cmakeListsOrSettingsJson: CMakeListsTxtAdvanced cmakeListsTxtPath: '${{ github.workspace }}/CMakeLists.txt' - cmakeAppendedArgs: '-GNinja -DCMAKE_BUILD_TYPE=Release ${{ steps.windows_extra_cmake_args.outputs.args }}' + cmakeAppendedArgs: '-GNinja -DCMAKE_BUILD_TYPE=Release ${{ steps.windows_extra_cmake_args.outputs.args }} ${{ steps.hunter_extra_cmake_args.outputs.args }}' buildWithCMakeArgs: '-- -v' buildDirectory: '${{ github.workspace }}/build/' + - name: Exclude certain tests in Hunter specific builds + if: contains(matrix.name, 'hunter') + id: hunter_extra_test_args + run: echo "::set-output name=args::--gtest_filter=-utOpenGEXImportExport.Importissue1340_EmptyCameraObject:utColladaZaeImportExport.importBlenFromFileTest" + - name: test - run: cd build/bin && ./unit + run: cd build/bin && ./unit ${{ steps.hunter_extra_test_args.outputs.args }} shell: bash - uses: actions/upload-artifact@v2 diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index fa6837d29..000000000 --- a/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM ubuntu:20.04 - -ARG TOOLCHAIN_NAME=gcc-9-cxx17-fpic -ARG BUILD_TYPE=RelWithDebInfo - -RUN apt-get update && apt-get install -y --no-install-recommends \ - cmake \ - gcc-9 \ - g++-9 \ - ca-certificates \ - make - -WORKDIR /root/assimp -COPY ./cmake ./cmake -COPY ./cmake-modules ./cmake-modules -COPY ./code ./code -COPY ./include ./include -COPY ./samples ./samples -COPY ./test ./test -COPY ./tools ./tools -COPY ./*.in ./ -COPY CMakeLists.txt ./ - -RUN cmake -DBUILD_SHARED_LIBS=OFF -DASSIMP_BUILD_ASSIMP_TOOLS=ON -DASSIMP_BUILD_SAMPLES=OFF -DASSIMP_BUILD_TESTS=ON -DASSIMP_INSTALL_PDB=OFF -DASSIMP_IGNORE_GIT_HASH=ON -DASSIMP_HUNTER_ENABLED=ON -H. -B_builds/${TOOLCHAIN_NAME}-${BUILD_TYPE} -DCMAKE_TOOLCHAIN_FILE=./cmake/polly/${TOOLCHAIN_NAME}.cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE} - -RUN make -C _builds/${TOOLCHAIN_NAME}-${BUILD_TYPE} -j 4 diff --git a/cmake/HunterGate.cmake b/cmake/HunterGate.cmake index 887557a58..6d9cc2401 100644 --- a/cmake/HunterGate.cmake +++ b/cmake/HunterGate.cmake @@ -1,4 +1,4 @@ -# Copyright (c) 2013-2018, Ruslan Baratov +# Copyright (c) 2013-2019, Ruslan Baratov # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -60,7 +60,7 @@ option(HUNTER_STATUS_PRINT "Print working status" ON) option(HUNTER_STATUS_DEBUG "Print a lot info" OFF) option(HUNTER_TLS_VERIFY "Enable/disable TLS certificate checking on downloads" ON) -set(HUNTER_WIKI "https://github.com/ruslo/hunter/wiki") +set(HUNTER_ERROR_PAGE "https://docs.hunter.sh/en/latest/reference/errors") function(hunter_gate_status_print) if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG) @@ -79,9 +79,9 @@ function(hunter_gate_status_debug) endif() endfunction() -function(hunter_gate_wiki wiki_page) - message("------------------------------ WIKI -------------------------------") - message(" ${HUNTER_WIKI}/${wiki_page}") +function(hunter_gate_error_page error_page) + message("------------------------------ ERROR ------------------------------") + message(" ${HUNTER_ERROR_PAGE}/${error_page}.html") message("-------------------------------------------------------------------") message("") message(FATAL_ERROR "") @@ -94,14 +94,13 @@ function(hunter_gate_internal_error) endforeach() message("[hunter ** INTERNAL **] [Directory:${CMAKE_CURRENT_LIST_DIR}]") message("") - hunter_gate_wiki("error.internal") + hunter_gate_error_page("error.internal") endfunction() function(hunter_gate_fatal_error) - cmake_parse_arguments(hunter "" "WIKI" "" "${ARGV}") - string(COMPARE EQUAL "${hunter_WIKI}" "" have_no_wiki) - if(have_no_wiki) - hunter_gate_internal_error("Expected wiki") + cmake_parse_arguments(hunter "" "ERROR_PAGE" "" "${ARGV}") + if("${hunter_ERROR_PAGE}" STREQUAL "") + hunter_gate_internal_error("Expected ERROR_PAGE") endif() message("") foreach(x ${hunter_UNPARSED_ARGUMENTS}) @@ -109,11 +108,11 @@ function(hunter_gate_fatal_error) endforeach() message("[hunter ** FATAL ERROR **] [Directory:${CMAKE_CURRENT_LIST_DIR}]") message("") - hunter_gate_wiki("${hunter_WIKI}") + hunter_gate_error_page("${hunter_ERROR_PAGE}") endfunction() function(hunter_gate_user_error) - hunter_gate_fatal_error(${ARGV} WIKI "error.incorrect.input.data") + hunter_gate_fatal_error(${ARGV} ERROR_PAGE "error.incorrect.input.data") endfunction() function(hunter_gate_self root version sha1 result) @@ -195,7 +194,7 @@ function(hunter_gate_detect_root) hunter_gate_fatal_error( "Can't detect HUNTER_ROOT" - WIKI "error.detect.hunter.root" + ERROR_PAGE "error.detect.hunter.root" ) endfunction() @@ -214,7 +213,7 @@ function(hunter_gate_download dir) "Settings:" " HUNTER_ROOT: ${HUNTER_GATE_ROOT}" " HUNTER_SHA1: ${HUNTER_GATE_SHA1}" - WIKI "error.run.install" + ERROR_PAGE "error.run.install" ) endif() string(COMPARE EQUAL "${dir}" "" is_bad) @@ -400,7 +399,7 @@ macro(HunterGate) hunter_gate_fatal_error( "Please set HunterGate *before* 'project' command. " "Detected project: ${PROJECT_NAME}" - WIKI "error.huntergate.before.project" + ERROR_PAGE "error.huntergate.before.project" ) endif() @@ -470,7 +469,7 @@ macro(HunterGate) "HUNTER_ROOT (${HUNTER_GATE_ROOT}) contains spaces." "Set HUNTER_ALLOW_SPACES_IN_PATH=ON to skip this error" "(Use at your own risk!)" - WIKI "error.spaces.in.hunter.root" + ERROR_PAGE "error.spaces.in.hunter.root" ) endif() endif() diff --git a/test/unit/UnitTestPCH.h b/test/unit/UnitTestPCH.h index d47371292..d4fdfc4a7 100644 --- a/test/unit/UnitTestPCH.h +++ b/test/unit/UnitTestPCH.h @@ -43,7 +43,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // We need to be sure to have the same STL settings as Assimp #include +#pragma warning(push) +#pragma warning(disable:4389) #include +#pragma warning(pop) #include #include #include "UTLogStream.h" From 6b32f34fc22ce082a38678c2f35e82e20f536357 Mon Sep 17 00:00:00 2001 From: Rahul Sheth Date: Thu, 27 Aug 2020 17:02:42 -0400 Subject: [PATCH 112/129] Try disabling C4389 for GTest only for MSVC --- test/unit/UnitTestPCH.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/test/unit/UnitTestPCH.h b/test/unit/UnitTestPCH.h index d4fdfc4a7..4570dce81 100644 --- a/test/unit/UnitTestPCH.h +++ b/test/unit/UnitTestPCH.h @@ -43,10 +43,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // We need to be sure to have the same STL settings as Assimp #include -#pragma warning(push) -#pragma warning(disable:4389) +#ifdef _MSC_VER +# pragma warning(push) +# pragma warning(disable : 4389) +#endif #include -#pragma warning(pop) +#ifdef _MSC_VER +# pragma warning(pop) +#endif #include #include #include "UTLogStream.h" From 3c98197be069e74bea1081ada3fb4471e83fee4a Mon Sep 17 00:00:00 2001 From: crocdialer Date: Fri, 28 Aug 2020 16:09:15 +0200 Subject: [PATCH 113/129] set aiAnimation->mTicksPerSecond to 1000.0. this is analog to the behaviour of gltf2-importer --- code/AssetLib/Collada/ColladaLoader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/Collada/ColladaLoader.cpp b/code/AssetLib/Collada/ColladaLoader.cpp index 7b0fdd8e0..c66a114c7 100644 --- a/code/AssetLib/Collada/ColladaLoader.cpp +++ b/code/AssetLib/Collada/ColladaLoader.cpp @@ -1468,7 +1468,7 @@ void ColladaLoader::CreateAnimation(aiScene *pScene, const ColladaParser &pParse for (size_t a = 0; a < morphAnims.size(); ++a) { anim->mDuration = std::max(anim->mDuration, morphAnims[a]->mKeys[morphAnims[a]->mNumKeys - 1].mTime); } - anim->mTicksPerSecond = 1; + anim->mTicksPerSecond = 1000.0; mAnims.push_back(anim); } } From c769f8d4ad3b671f2e824fa3d9142e4f7e9a2ae4 Mon Sep 17 00:00:00 2001 From: Joshua Hyatt Date: Sat, 29 Aug 2020 22:21:34 -0600 Subject: [PATCH 114/129] Replace unique_ptr with raw pointer to avoid destructing stream --- code/AssetLib/Obj/ObjFileImporter.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/code/AssetLib/Obj/ObjFileImporter.cpp b/code/AssetLib/Obj/ObjFileImporter.cpp index b6e1f9061..794cb8ec0 100644 --- a/code/AssetLib/Obj/ObjFileImporter.cpp +++ b/code/AssetLib/Obj/ObjFileImporter.cpp @@ -107,8 +107,8 @@ const aiImporterDesc *ObjFileImporter::GetInfo() const { void ObjFileImporter::InternReadFile(const std::string &file, aiScene *pScene, IOSystem *pIOHandler) { // Read file into memory static const std::string mode = "rb"; - std::unique_ptr fileStream(pIOHandler->Open(file, mode)); - if (!fileStream.get()) { + IOStream *fileStream = pIOHandler->Open(file, mode); + if (!fileStream) { throw DeadlyImportError("Failed to open file " + file + "."); } @@ -119,10 +119,10 @@ void ObjFileImporter::InternReadFile(const std::string &file, aiScene *pScene, I } IOStreamBuffer streamedBuffer; - streamedBuffer.open(fileStream.get()); + streamedBuffer.open(fileStream); // Allocate buffer and read file into it - //TextFileToBuffer( fileStream.get(),m_Buffer); + //TextFileToBuffer( fileStream,m_Buffer); // Get the model name std::string modelName, folderName; @@ -145,6 +145,8 @@ void ObjFileImporter::InternReadFile(const std::string &file, aiScene *pScene, I streamedBuffer.close(); + pIOHandler->Close(fileStream); + // Clean up allocated storage for the next import m_Buffer.clear(); From cc2613f2644fd7ccb8730be871aba1de25128d49 Mon Sep 17 00:00:00 2001 From: Joshua Hyatt Date: Sat, 29 Aug 2020 23:06:33 -0600 Subject: [PATCH 115/129] Replace unique_ptr with raw pointer --- code/AssetLib/FBX/FBXImporter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/AssetLib/FBX/FBXImporter.cpp b/code/AssetLib/FBX/FBXImporter.cpp index 8c908be40..61f67b382 100644 --- a/code/AssetLib/FBX/FBXImporter.cpp +++ b/code/AssetLib/FBX/FBXImporter.cpp @@ -141,7 +141,7 @@ void FBXImporter::SetupProperties(const Importer *pImp) { // ------------------------------------------------------------------------------------------------ // Imports the given file into the given scene structure. void FBXImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler) { - std::unique_ptr stream(pIOHandler->Open(pFile, "rb")); + IOStream* stream = pIOHandler->Open(pFile, "rb"); if (!stream) { ThrowException("Could not open file for reading"); } From 953e976de6f7c771cef880c7537407a76fb64d64 Mon Sep 17 00:00:00 2001 From: Joshua Hyatt Date: Sat, 29 Aug 2020 23:56:50 -0600 Subject: [PATCH 116/129] Close stream when finished --- code/AssetLib/FBX/FBXImporter.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/AssetLib/FBX/FBXImporter.cpp b/code/AssetLib/FBX/FBXImporter.cpp index 61f67b382..564317afe 100644 --- a/code/AssetLib/FBX/FBXImporter.cpp +++ b/code/AssetLib/FBX/FBXImporter.cpp @@ -159,6 +159,8 @@ void FBXImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy contents[contents.size() - 1] = 0; const char *const begin = &*contents.begin(); + pIOHandler->Close(stream); + // broadphase tokenizing pass in which we identify the core // syntax elements of FBX (brackets, commas, key:value mappings) TokenList tokens; From dcf9a7b2d8b2955f3594c43be9bd9a85c3f0db3d Mon Sep 17 00:00:00 2001 From: Joshua Hyatt Date: Sat, 29 Aug 2020 23:58:31 -0600 Subject: [PATCH 117/129] Conform variable names to code standards --- code/AssetLib/FBX/FBXImporter.cpp | 10 +++++----- code/AssetLib/Obj/ObjFileImporter.cpp | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/code/AssetLib/FBX/FBXImporter.cpp b/code/AssetLib/FBX/FBXImporter.cpp index 564317afe..0ecb10daa 100644 --- a/code/AssetLib/FBX/FBXImporter.cpp +++ b/code/AssetLib/FBX/FBXImporter.cpp @@ -141,8 +141,8 @@ void FBXImporter::SetupProperties(const Importer *pImp) { // ------------------------------------------------------------------------------------------------ // Imports the given file into the given scene structure. void FBXImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler) { - IOStream* stream = pIOHandler->Open(pFile, "rb"); - if (!stream) { + IOStream* pStream = pIOHandler->Open(pFile, "rb"); + if (!pStream) { ThrowException("Could not open file for reading"); } @@ -154,12 +154,12 @@ void FBXImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy // streaming for its output data structures so the net win with // streaming input data would be very low. std::vector contents; - contents.resize(stream->FileSize() + 1); - stream->Read(&*contents.begin(), 1, contents.size() - 1); + contents.resize(pStream->FileSize() + 1); + pStream->Read(&*contents.begin(), 1, contents.size() - 1); contents[contents.size() - 1] = 0; const char *const begin = &*contents.begin(); - pIOHandler->Close(stream); + pIOHandler->Close(pStream); // broadphase tokenizing pass in which we identify the core // syntax elements of FBX (brackets, commas, key:value mappings) diff --git a/code/AssetLib/Obj/ObjFileImporter.cpp b/code/AssetLib/Obj/ObjFileImporter.cpp index 794cb8ec0..2f330b729 100644 --- a/code/AssetLib/Obj/ObjFileImporter.cpp +++ b/code/AssetLib/Obj/ObjFileImporter.cpp @@ -107,22 +107,22 @@ const aiImporterDesc *ObjFileImporter::GetInfo() const { void ObjFileImporter::InternReadFile(const std::string &file, aiScene *pScene, IOSystem *pIOHandler) { // Read file into memory static const std::string mode = "rb"; - IOStream *fileStream = pIOHandler->Open(file, mode); - if (!fileStream) { + IOStream *pFileStream = pIOHandler->Open(file, mode); + if (!pFileStream) { throw DeadlyImportError("Failed to open file " + file + "."); } // Get the file-size and validate it, throwing an exception when fails - size_t fileSize = fileStream->FileSize(); + size_t fileSize = pFileStream->FileSize(); if (fileSize < ObjMinSize) { throw DeadlyImportError("OBJ-file is too small."); } IOStreamBuffer streamedBuffer; - streamedBuffer.open(fileStream); + streamedBuffer.open(pFileStream); // Allocate buffer and read file into it - //TextFileToBuffer( fileStream,m_Buffer); + //TextFileToBuffer( pFileStream,m_Buffer); // Get the model name std::string modelName, folderName; @@ -145,7 +145,7 @@ void ObjFileImporter::InternReadFile(const std::string &file, aiScene *pScene, I streamedBuffer.close(); - pIOHandler->Close(fileStream); + pIOHandler->Close(pFileStream); // Clean up allocated storage for the next import m_Buffer.clear(); From 638499a2783aa5a2fd494aebbb404147dcc964e4 Mon Sep 17 00:00:00 2001 From: Joshua Hyatt Date: Tue, 1 Sep 2020 10:30:31 -0600 Subject: [PATCH 118/129] Replace unique_ptr and add custom deleter --- code/AssetLib/FBX/FBXImporter.cpp | 13 +++++++------ code/AssetLib/Obj/ObjFileImporter.cpp | 15 ++++++++------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/code/AssetLib/FBX/FBXImporter.cpp b/code/AssetLib/FBX/FBXImporter.cpp index 0ecb10daa..f80b65cd4 100644 --- a/code/AssetLib/FBX/FBXImporter.cpp +++ b/code/AssetLib/FBX/FBXImporter.cpp @@ -141,8 +141,11 @@ void FBXImporter::SetupProperties(const Importer *pImp) { // ------------------------------------------------------------------------------------------------ // Imports the given file into the given scene structure. void FBXImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler) { - IOStream* pStream = pIOHandler->Open(pFile, "rb"); - if (!pStream) { + auto streamCloser = [&](IOStream *pStream) { + pIOHandler->Close(pStream); + }; + std::unique_ptr stream(pIOHandler->Open(pFile, "rb"), streamCloser); + if (!stream) { ThrowException("Could not open file for reading"); } @@ -154,13 +157,11 @@ void FBXImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSy // streaming for its output data structures so the net win with // streaming input data would be very low. std::vector contents; - contents.resize(pStream->FileSize() + 1); - pStream->Read(&*contents.begin(), 1, contents.size() - 1); + contents.resize(stream->FileSize() + 1); + stream->Read(&*contents.begin(), 1, contents.size() - 1); contents[contents.size() - 1] = 0; const char *const begin = &*contents.begin(); - pIOHandler->Close(pStream); - // broadphase tokenizing pass in which we identify the core // syntax elements of FBX (brackets, commas, key:value mappings) TokenList tokens; diff --git a/code/AssetLib/Obj/ObjFileImporter.cpp b/code/AssetLib/Obj/ObjFileImporter.cpp index 2f330b729..4fa122c45 100644 --- a/code/AssetLib/Obj/ObjFileImporter.cpp +++ b/code/AssetLib/Obj/ObjFileImporter.cpp @@ -107,22 +107,25 @@ const aiImporterDesc *ObjFileImporter::GetInfo() const { void ObjFileImporter::InternReadFile(const std::string &file, aiScene *pScene, IOSystem *pIOHandler) { // Read file into memory static const std::string mode = "rb"; - IOStream *pFileStream = pIOHandler->Open(file, mode); - if (!pFileStream) { + auto streamCloser = [&](IOStream *pStream) { + pIOHandler->Close(pStream); + }; + std::unique_ptr fileStream(pIOHandler->Open(file, mode), streamCloser); + if (!fileStream.get()) { throw DeadlyImportError("Failed to open file " + file + "."); } // Get the file-size and validate it, throwing an exception when fails - size_t fileSize = pFileStream->FileSize(); + size_t fileSize = fileStream->FileSize(); if (fileSize < ObjMinSize) { throw DeadlyImportError("OBJ-file is too small."); } IOStreamBuffer streamedBuffer; - streamedBuffer.open(pFileStream); + streamedBuffer.open(fileStream.get()); // Allocate buffer and read file into it - //TextFileToBuffer( pFileStream,m_Buffer); + //TextFileToBuffer( fileStream.get(),m_Buffer); // Get the model name std::string modelName, folderName; @@ -145,8 +148,6 @@ void ObjFileImporter::InternReadFile(const std::string &file, aiScene *pScene, I streamedBuffer.close(); - pIOHandler->Close(pFileStream); - // Clean up allocated storage for the next import m_Buffer.clear(); From 542d784457e591014a3fe244b552c7885f958a33 Mon Sep 17 00:00:00 2001 From: Chananya Freiman Date: Wed, 2 Sep 2020 02:52:56 +0300 Subject: [PATCH 119/129] Update Jassimp's AiTextureType.java The newer PBR enums are missing, making it impossible to import many models. --- .../jassimp/src/jassimp/AiTextureType.java | 190 +++++++++--------- 1 file changed, 98 insertions(+), 92 deletions(-) diff --git a/port/jassimp/jassimp/src/jassimp/AiTextureType.java b/port/jassimp/jassimp/src/jassimp/AiTextureType.java index 6b3e642e0..9b236ee94 100644 --- a/port/jassimp/jassimp/src/jassimp/AiTextureType.java +++ b/port/jassimp/jassimp/src/jassimp/AiTextureType.java @@ -56,109 +56,115 @@ package jassimp; * regardless which 3D tool they're using. */ public enum AiTextureType { - /** - * The texture is combined with the result of the diffuse - * lighting equation. + /** Dummy value. + * + * No texture, but the value to be used as 'texture semantic' + * (#aiMaterialProperty::mSemantic) for all material properties + * *not* related to textures. + */ + NONE(0), + + /** LEGACY API MATERIALS + * Legacy refers to materials which + * Were originally implemented in the specifications around 2000. + * These must never be removed, as most engines support them. + */ + + /** The texture is combined with the result of the diffuse + * lighting equation. + */ + DIFFUSE(1), + + /** The texture is combined with the result of the specular + * lighting equation. + */ + SPECULAR(2), + + /** The texture is combined with the result of the ambient + * lighting equation. + */ + AMBIENT(3), + + /** The texture is added to the result of the lighting + * calculation. It isn't influenced by incoming light. + */ + EMISSIVE(4), + + /** The texture is a height map. + * + * By convention, higher gray-scale values stand for + * higher elevations from the base height. + */ + HEIGHT(5), + + /** The texture is a (tangent space) normal-map. + * + * Again, there are several conventions for tangent-space + * normal maps. Assimp does (intentionally) not + * distinguish here. + */ + NORMALS(6), + + /** The texture defines the glossiness of the material. + * + * The glossiness is in fact the exponent of the specular + * (phong) lighting equation. Usually there is a conversion + * function defined to map the linear color values in the + * texture to a suitable exponent. Have fun. */ - DIFFUSE(0x1), + SHININESS(7), - - /** - * The texture is combined with the result of the specular - * lighting equation. + /** The texture defines per-pixel opacity. + * + * Usually 'white' means opaque and 'black' means + * 'transparency'. Or quite the opposite. Have fun. */ - SPECULAR(0x2), + OPACITY(8), - - /** - * The texture is combined with the result of the ambient - * lighting equation. + /** Displacement texture + * + * The exact purpose and format is application-dependent. + * Higher color values stand for higher vertex displacements. */ - AMBIENT(0x3), + DISPLACEMENT(9), - - /** - * The texture is added to the result of the lighting - * calculation. It isn't influenced by incoming light. + /** Lightmap texture (aka Ambient Occlusion) + * + * Both 'Lightmaps' and dedicated 'ambient occlusion maps' are + * covered by this material property. The texture contains a + * scaling value for the final color value of a pixel. Its + * intensity is not affected by incoming light. */ - EMISSIVE(0x4), + LIGHTMAP(10), - - /** - * The texture is a height map.

- * - * By convention, higher gray-scale values stand for - * higher elevations from the base height. + /** Reflection texture + * + * Contains the color of a perfect mirror reflection. + * Rarely used, almost never for real-time applications. */ - HEIGHT(0x5), + REFLECTION(11), - - /** - * The texture is a (tangent space) normal-map.

- * - * Again, there are several conventions for tangent-space - * normal maps. Assimp does (intentionally) not distinguish here. + /** PBR Materials + * PBR definitions from maya and other modelling packages now use this standard. + * This was originally introduced around 2012. + * Support for this is in game engines like Godot, Unreal or Unity3D. + * Modelling packages which use this are very common now. + */ + + BASE_COLOR(12), + NORMAL_CAMERA(13), + EMISSION_COLOR(14), + METALNESS(15), + DIFFUSE_ROUGHNESS(16), + AMBIENT_OCCLUSION(17), + + /** Unknown texture + * + * A texture reference that does not match any of the definitions + * above is considered to be 'unknown'. It is still imported, + * but is excluded from any further post-processing. */ - NORMALS(0x6), - - - /** - * The texture defines the glossiness of the material.

- * - * The glossiness is in fact the exponent of the specular - * (phong) lighting equation. Usually there is a conversion - * function defined to map the linear color values in the - * texture to a suitable exponent. Have fun. - */ - SHININESS(0x7), - - - /** - * The texture defines per-pixel opacity.

- * - * Usually 'white' means opaque and 'black' means - * 'transparency'. Or quite the opposite. Have fun. - */ - OPACITY(0x8), - - - /** - * Displacement texture.

- * - * The exact purpose and format is application-dependent. - * Higher color values stand for higher vertex displacements. - */ - DISPLACEMENT(0x9), - - - /** - * Lightmap texture (aka Ambient Occlusion).

- * - * Both 'Lightmaps' and dedicated 'ambient occlusion maps' are - * covered by this material property. The texture contains a - * scaling value for the final color value of a pixel. Its - * intensity is not affected by incoming light. - */ - LIGHTMAP(0xA), - - - /** - * Reflection texture.

- * - * Contains the color of a perfect mirror reflection. - * Rarely used, almost never for real-time applications. - */ - REFLECTION(0xB), - - - /** - * Unknown texture.

- * - * A texture reference that does not match any of the definitions - * above is considered to be 'unknown'. It is still imported, - * but is excluded from any further postprocessing. - */ - UNKNOWN(0xC); + UNKNOWN(18); /** From 9053dfea05d149a54ae291327ebb12f2372ffc38 Mon Sep 17 00:00:00 2001 From: Gargaj Date: Wed, 2 Sep 2020 16:28:12 +0200 Subject: [PATCH 120/129] add missing define to glTF importer --- code/AssetLib/glTF/glTFCommon.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/AssetLib/glTF/glTFCommon.cpp b/code/AssetLib/glTF/glTFCommon.cpp index 2c46a46e3..6bea18a0a 100644 --- a/code/AssetLib/glTF/glTFCommon.cpp +++ b/code/AssetLib/glTF/glTFCommon.cpp @@ -38,6 +38,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ +#ifndef ASSIMP_BUILD_NO_GLTF_IMPORTER + #include "AssetLib/glTF/glTFCommon.h" namespace glTFCommon { @@ -187,3 +189,5 @@ bool ParseDataURI(const char *const_uri, size_t uriLen, DataURI &out) { } // namespace Util } // namespace glTFCommon + +#endif From 56a3759925585142a2713232467a864bfe48100f Mon Sep 17 00:00:00 2001 From: Rahul Sheth Date: Thu, 3 Sep 2020 08:41:08 -0400 Subject: [PATCH 121/129] Dummy commit 1 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f87f3e742..1fdb8a38b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -# Open Asset Import Library (assimp) +# Open Asset Import Library (assimp) # ---------------------------------------------------------------------- # Copyright (c) 2006-2020, assimp team # From df56a97794553c10d8892e892c7eac21d9ab9439 Mon Sep 17 00:00:00 2001 From: Rahul Sheth Date: Thu, 3 Sep 2020 08:41:22 -0400 Subject: [PATCH 122/129] Dummy commit 2 to trigger Github Actions --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1fdb8a38b..f87f3e742 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -# Open Asset Import Library (assimp) +# Open Asset Import Library (assimp) # ---------------------------------------------------------------------- # Copyright (c) 2006-2020, assimp team # From f3b25b999be1589e47d914258f3bd76306abbe6c Mon Sep 17 00:00:00 2001 From: Denis Blank Date: Sat, 5 Sep 2020 23:17:11 +0200 Subject: [PATCH 123/129] Fix an unreferenced formal parameter warning on MSVC when no exporter is built --- code/Common/Exporter.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/Common/Exporter.cpp b/code/Common/Exporter.cpp index 6b3a50346..207b93fc7 100644 --- a/code/Common/Exporter.cpp +++ b/code/Common/Exporter.cpp @@ -140,6 +140,8 @@ void ExportAssimp2Json(const char* , IOSystem*, const aiScene* , const Assimp::E #endif static void setupExporterArray(std::vector &exporters) { + (void)exporters; + #ifndef ASSIMP_BUILD_NO_COLLADA_EXPORTER exporters.push_back(Exporter::ExportFormatEntry("collada", "COLLADA - Digital Asset Exchange Schema", "dae", &ExportSceneCollada)); #endif From 615ffdf93ffdf088939541787f3ab526c6b4182b Mon Sep 17 00:00:00 2001 From: Max Vollmer Date: Thu, 10 Sep 2020 10:47:58 +0100 Subject: [PATCH 124/129] What: Throw instead of assert when input file is invalid. Why: Assimp shouldn't crash on invalid files. Asserts are disabled on Release builds. --- code/AssetLib/glTF2/glTF2Asset.inl | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/code/AssetLib/glTF2/glTF2Asset.inl b/code/AssetLib/glTF2/glTF2Asset.inl index 2dfe2f41e..ef39d6a6b 100644 --- a/code/AssetLib/glTF2/glTF2Asset.inl +++ b/code/AssetLib/glTF2/glTF2Asset.inl @@ -731,8 +731,14 @@ void Accessor::ExtractData(T *&outData) { const size_t stride = bufferView && bufferView->byteStride ? bufferView->byteStride : elemSize; const size_t targetElemSize = sizeof(T); - ai_assert(elemSize <= targetElemSize); - ai_assert(count * stride <= (bufferView ? bufferView->byteLength : sparse->data.size())); + + if (elemSize > targetElemSize) { + throw DeadlyImportError("GLTF: elemSize > targetElemSize"); + } + + if (count*stride > (bufferView ? bufferView->byteLength : sparse->data.size())) { + throw DeadlyImportError("GLTF: count*stride out of range"); + } outData = new T[count]; if (stride == elemSize && targetElemSize == elemSize) { From 1ff9e2b522c9604ab73fa63e5471ab56365535eb Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 14 Sep 2020 08:40:21 +0200 Subject: [PATCH 125/129] Adapt code style. --- code/Common/Exceptional.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/code/Common/Exceptional.cpp b/code/Common/Exceptional.cpp index 660b54b27..ae5257c19 100644 --- a/code/Common/Exceptional.cpp +++ b/code/Common/Exceptional.cpp @@ -48,7 +48,5 @@ Implementations of the exception classes. #include #include -DeadlyErrorBase::DeadlyErrorBase(Assimp::Formatter::format f) - : runtime_error(std::string(f)) -{ -} +DeadlyErrorBase::DeadlyErrorBase(Assimp::Formatter::format f) : + runtime_error(std::string(f)){} From 0e9621012c242c6a8413db35ce50386a7f976cde Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 14 Sep 2020 08:43:31 +0200 Subject: [PATCH 126/129] Adapt code style - finally :-). --- code/Common/Importer.h | 43 ++++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/code/Common/Importer.h b/code/Common/Importer.h index 32a1780da..eb70bc38f 100644 --- a/code/Common/Importer.h +++ b/code/Common/Importer.h @@ -4,7 +4,6 @@ Open Asset Import Library (assimp) Copyright (c) 2006-2020, assimp team - All rights reserved. Redistribution and use of this software in source and binary forms, @@ -128,27 +127,26 @@ public: }; inline -ImporterPimpl::ImporterPimpl() AI_NO_EXCEPT -: mIOHandler( nullptr ) -, mIsDefaultHandler( false ) -, mProgressHandler( nullptr ) -, mIsDefaultProgressHandler( false ) -, mImporter() -, mPostProcessingSteps() -, mScene( nullptr ) -, mErrorString() -, mException() -, mIntProperties() -, mFloatProperties() -, mStringProperties() -, mMatrixProperties() -, bExtraVerbose( false ) -, mPPShared( nullptr ) { +ImporterPimpl::ImporterPimpl() AI_NO_EXCEPT : + mIOHandler( nullptr ), + mIsDefaultHandler( false ), + mProgressHandler( nullptr ), + mIsDefaultProgressHandler( false ), + mImporter(), + mPostProcessingSteps(), + mScene( nullptr ), + mErrorString(), + mException(), + mIntProperties(), + mFloatProperties(), + mStringProperties(), + mMatrixProperties(), + bExtraVerbose( false ), + mPPShared( nullptr ) { // empty } //! @endcond - struct BatchData; // --------------------------------------------------------------------------- @@ -159,17 +157,13 @@ struct BatchData; * could, this has not yet been implemented at the moment). * * @note The class may not be used by more than one thread*/ -class ASSIMP_API BatchLoader -{ - // friend of Importer - +class ASSIMP_API BatchLoader { public: //! @cond never // ------------------------------------------------------------------- /** Wraps a full list of configuration properties for an importer. * Properties can be set using SetGenericProperty */ - struct PropertyMap - { + struct PropertyMap { ImporterPimpl::IntPropertyMap ints; ImporterPimpl::FloatPropertyMap floats; ImporterPimpl::StringPropertyMap strings; @@ -186,7 +180,6 @@ public: }; //! @endcond -public: // ------------------------------------------------------------------- /** Construct a batch loader from a given IO system to be used * to access external files From 2901f686683e23258ec6bbc5dd83c770effa0c0d Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Mon, 14 Sep 2020 08:45:18 +0200 Subject: [PATCH 127/129] Adapt code style. --- include/assimp/Exceptional.h | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/include/assimp/Exceptional.h b/include/assimp/Exceptional.h index 71566ae4f..6c184383d 100644 --- a/include/assimp/Exceptional.h +++ b/include/assimp/Exceptional.h @@ -61,10 +61,8 @@ protected: DeadlyErrorBase(Assimp::Formatter::format f); template - DeadlyErrorBase(Assimp::Formatter::format f, U&& u, T&&... args) - : DeadlyErrorBase(std::move(f << std::forward(u)), std::forward(args)...) - { - } + DeadlyErrorBase(Assimp::Formatter::format f, U&& u, T&&... args) : + DeadlyErrorBase(std::move(f << std::forward(u)), std::forward(args)...) {} }; // --------------------------------------------------------------------------- @@ -75,20 +73,16 @@ class ASSIMP_API DeadlyImportError : public DeadlyErrorBase { public: /** Constructor with arguments */ template - explicit DeadlyImportError(T&&... args) - : DeadlyErrorBase(Assimp::Formatter::format(), std::forward(args)...) - { - } + explicit DeadlyImportError(T&&... args) : + DeadlyErrorBase(Assimp::Formatter::format(), std::forward(args)...) {} }; class ASSIMP_API DeadlyExportError : public DeadlyErrorBase { public: /** Constructor with arguments */ template - explicit DeadlyExportError(T&&... args) - : DeadlyErrorBase(Assimp::Formatter::format(), std::forward(args)...) - { - } + explicit DeadlyExportError(T&&... args) : + DeadlyErrorBase(Assimp::Formatter::format(), std::forward(args)...) {} }; #ifdef _MSC_VER From aa125c48ab03cf73e6620816a0667628ce969c9f Mon Sep 17 00:00:00 2001 From: Rahul Sheth Date: Thu, 17 Sep 2020 14:38:49 -0400 Subject: [PATCH 128/129] Try fixing required action names --- .github/workflows/ccpp.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ccpp.yml b/.github/workflows/ccpp.yml index 65be5ee96..6a8c1f774 100644 --- a/.github/workflows/ccpp.yml +++ b/.github/workflows/ccpp.yml @@ -13,22 +13,22 @@ jobs: strategy: fail-fast: false matrix: - name: [ubuntu-gcc, macos-clang, windows-msvc, ubuntu-clang, ubuntu-gcc-hunter, macos-clang-hunter, windows-msvc-hunter] + name: [ubuntu-latest-g++, macos-latest-clang++, windows-latest-cl.exe, ubuntu-latest-clang++, ubuntu-gcc-hunter, macos-clang-hunter, windows-msvc-hunter] # For Windows msvc, for Linux and macOS let's use the clang compiler, use gcc for Linux. include: - - name: windows-msvc + - name: windows-latest-cl.exe os: windows-latest cxx: cl.exe cc: cl.exe - - name: ubuntu-clang + - name: ubuntu-latest-clang++ os: ubuntu-latest cxx: clang++ cc: clang - - name: macos-clang + - name: macos-latest-clang++ os: macos-latest cxx: clang++ cc: clang - - name: ubuntu-gcc + - name: ubuntu-latest-g++ os: ubuntu-latest cxx: g++ cc: gcc From 3e025cdc8d3ef06db0b67289b7d1d41bc2e041a8 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Sun, 20 Sep 2020 18:33:02 +0200 Subject: [PATCH 129/129] Update Readme.md --- Readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Readme.md b/Readme.md index 3f2edd402..87d5b40d8 100644 --- a/Readme.md +++ b/Readme.md @@ -70,7 +70,7 @@ The source code is organized in the following way: For more information, visit [our website](http://assimp.org/). Or check out the `./doc`- folder, which contains the official documentation in HTML format. (CHMs for Windows are included in some release packages and should be located right here in the root folder). -If the docs don't solve your problem, ask on [StackOverflow](http://stackoverflow.com/questions/tagged/assimp?sort=newest). If you think you found a bug, please open an issue on Github. +If the docs don't solve your problem, ask on [StackOverflow with the assimp-tag](http://stackoverflow.com/questions/tagged/assimp?sort=newest). If you think you found a bug, please open an issue on Github. For development discussions, there is also a (very low-volume) mailing list, _assimp-discussions_ [(subscribe here)]( https://lists.sourceforge.net/lists/listinfo/assimp-discussions)