diff --git a/stb_image_write.h b/stb_image_write.h index ebaa0c5..7510c17 100644 --- a/stb_image_write.h +++ b/stb_image_write.h @@ -736,11 +736,11 @@ static int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, f char header[] = "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n"; s->func(s->context, header, sizeof(header)-1); -#ifdef STBI_MSC_SECURE_CRT +//#ifdef STBI_MSC_SECURE_CRT len = sprintf_s(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); -#else - len = sprintf(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); -#endif +//#else + //len = sprintf(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); +//#endif s->func(s->context, buffer, len); for(i=0; i < y; i++) diff --git a/tiny_gltf.h b/tiny_gltf.h index 5b7e69b..2b2bba2 100644 --- a/tiny_gltf.h +++ b/tiny_gltf.h @@ -1650,33 +1650,52 @@ class TinyGLTF { namespace { #ifdef TINYGLTF_USE_RAPIDJSON + +#ifdef TINYGLTF_USE_RAPIDJSON_CRTALLOCATOR + // This uses the RapidJSON CRTAllocator. It is thread safe and multiple + // documents may be active at once. + using json = rapidjson::GenericValue, rapidjson::CrtAllocator>; + using json_const_iterator = json::ConstMemberIterator; + using json_const_array_iterator = json const *; + using JsonDocument = + rapidjson::GenericDocument, rapidjson::CrtAllocator>; + rapidjson::CrtAllocator s_CrtAllocator; //stateless and thread safe + rapidjson::CrtAllocator &GetAllocator() { return s_CrtAllocator; } +#else + // This uses the default RapidJSON MemoryPoolAllocator. It is very fast, but + // not thread safe. Only a single JsonDocument may be active at any one time, + // meaning only a single gltf load/save can be active any one time. using json = rapidjson::Value; using json_const_iterator = json::ConstMemberIterator; - using json_const_array_iterator = json const*; - - rapidjson::Document* s_pActiveDocument = nullptr; - - struct JsonDocument : public rapidjson::Document - { + using json_const_array_iterator = json const *; + rapidjson::Document *s_pActiveDocument = nullptr; + rapidjson::Document::AllocatorType &GetAllocator() { + assert(s_pActiveDocument); //Root json node must be JsonDocument type + return s_pActiveDocument->GetAllocator(); + } + struct JsonDocument : public rapidjson::Document { JsonDocument() { - assert(s_pActiveDocument == nullptr); //Code assumes only one document is active at a time + assert(s_pActiveDocument == + nullptr); // When using default allocator, only one document can be active at a time, if you need + // multiple active at once, define TINYGLTF_USE_RAPIDJSON_CRTALLOCATOR s_pActiveDocument = this; } - JsonDocument(const JsonDocument&) = delete; - JsonDocument(JsonDocument&& rhs) noexcept : rapidjson::Document(std::move(rhs)) - { + JsonDocument(const JsonDocument &) = delete; + JsonDocument(JsonDocument &&rhs) noexcept + : rapidjson::Document(std::move(rhs)) { s_pActiveDocument = this; rhs.isNil = true; } ~JsonDocument() { - if (!isNil) - { + if (!isNil) { s_pActiveDocument = nullptr; } } + private: bool isNil = false; }; +#endif // TINYGLTF_USE_RAPIDJSON_CRTALLOCATOR #else using nlohmann::json; using json_const_iterator = json::const_iterator; @@ -5674,7 +5693,7 @@ namespace json JsonFromString(const char* s) { #ifdef TINYGLTF_USE_RAPIDJSON - return json(s, s_pActiveDocument->GetAllocator()); + return json(s, GetAllocator()); #else return json(s); #endif @@ -5705,7 +5724,7 @@ namespace void JsonAssign(json& dest, const json& src) { #ifdef TINYGLTF_USE_RAPIDJSON - dest.CopyFrom(src, s_pActiveDocument->GetAllocator()); + dest.CopyFrom(src, GetAllocator()); #else dest = src; #endif @@ -5718,7 +5737,7 @@ namespace { o.SetObject(); } - o.AddMember(json(key, s_pActiveDocument->GetAllocator()), std::move(value), s_pActiveDocument->GetAllocator()); + o.AddMember(json(key, GetAllocator()), std::move(value), GetAllocator()); #else o[key] = std::move(value); #endif @@ -5727,7 +5746,7 @@ namespace void JsonPushBack(json& o, json&& value) { #ifdef TINYGLTF_USE_RAPIDJSON - o.PushBack(std::move(value), s_pActiveDocument->GetAllocator()); + o.PushBack(std::move(value), GetAllocator()); #else o.push_back(std::move(value)); #endif @@ -5755,7 +5774,7 @@ namespace { #ifdef TINYGLTF_USE_RAPIDJSON o.SetArray(); - o.Reserve(static_cast(s), s_pActiveDocument->GetAllocator()); + o.Reserve(static_cast(s), GetAllocator()); #endif (void)(o); (void)(s); @@ -5820,16 +5839,16 @@ static bool ValueToJson(const Value &value, json *ret) { obj.SetBool(value.Get()); break; case STRING_TYPE: - obj.SetString(value.Get().c_str(), s_pActiveDocument->GetAllocator()); + obj.SetString(value.Get().c_str(), GetAllocator()); break; case ARRAY_TYPE: { obj.SetArray(); - obj.Reserve(static_cast(value.ArrayLen()), s_pActiveDocument->GetAllocator()); + obj.Reserve(static_cast(value.ArrayLen()), GetAllocator()); for (unsigned int i = 0; i < value.ArrayLen(); ++i) { Value elementValue = value.Get(int(i)); json elementJson; if (ValueToJson(value.Get(int(i)), &elementJson)) - obj.PushBack(std::move(elementJson), s_pActiveDocument->GetAllocator()); + obj.PushBack(std::move(elementJson), GetAllocator()); } break; } @@ -5844,7 +5863,7 @@ static bool ValueToJson(const Value &value, json *ret) { for (auto &it : objMap) { json elementJson; if (ValueToJson(it.second, &elementJson)) { - obj.AddMember(json(it.first.c_str(), s_pActiveDocument->GetAllocator()), std::move(elementJson), s_pActiveDocument->GetAllocator()); + obj.AddMember(json(it.first.c_str(), GetAllocator()), std::move(elementJson), GetAllocator()); } } break; diff --git a/x64/Debug/Tester.ilk b/x64/Debug/Tester.ilk new file mode 100644 index 0000000..4c0105b Binary files /dev/null and b/x64/Debug/Tester.ilk differ diff --git a/x64/Debug/Tester.pdb b/x64/Debug/Tester.pdb new file mode 100644 index 0000000..b590163 Binary files /dev/null and b/x64/Debug/Tester.pdb differ