| 455 | } |
| 456 | |
| 457 | bool JsonAsset::CreateInstance() |
| 458 | { |
| 459 | ScopeLock lock(Locker); |
| 460 | if (Instance) |
| 461 | return false; |
| 462 | PROFILE_MEM(ContentAssets); |
| 463 | |
| 464 | // Try to scripting type for this data |
| 465 | const StringAsANSI<> dataTypeNameAnsi(DataTypeName.Get(), DataTypeName.Length()); |
| 466 | const auto typeHandle = Scripting::FindScriptingType(StringAnsiView(dataTypeNameAnsi.Get(), DataTypeName.Length())); |
| 467 | if (typeHandle) |
| 468 | { |
| 469 | auto& type = typeHandle.GetType(); |
| 470 | |
| 471 | // Ensure that object can deserialized |
| 472 | const ScriptingType::InterfaceImplementation* interface = type.GetInterface(ISerializable::TypeInitializer); |
| 473 | if (!interface) |
| 474 | { |
| 475 | LOG(Warning, "Cannot deserialize {0} from Json Asset because it doesn't implement ISerializable interface.", type.ToString()); |
| 476 | return false; |
| 477 | } |
| 478 | auto modifier = Cache::ISerializeModifier.Get(); |
| 479 | modifier->EngineBuild = DataEngineBuild; |
| 480 | |
| 481 | // Create object |
| 482 | switch (type.Type) |
| 483 | { |
| 484 | case ScriptingTypes::Class: |
| 485 | case ScriptingTypes::Structure: |
| 486 | { |
| 487 | const auto instance = Allocator::Allocate(type.Size); |
| 488 | if (!instance) |
| 489 | return true; |
| 490 | Instance = instance; |
| 491 | if (type.Type == ScriptingTypes::Class) |
| 492 | { |
| 493 | _dtor = type.Class.Dtor; |
| 494 | type.Class.Ctor(instance); |
| 495 | } |
| 496 | else |
| 497 | { |
| 498 | _dtor = type.Struct.Dtor; |
| 499 | type.Struct.Ctor(instance); |
| 500 | } |
| 501 | |
| 502 | // Deserialize object |
| 503 | ((ISerializable*)((byte*)instance + interface->VTableOffset))->Deserialize(*Data, modifier.Value); |
| 504 | break; |
| 505 | } |
| 506 | case ScriptingTypes::Script: |
| 507 | { |
| 508 | const ScriptingObjectSpawnParams params(Guid::New(), typeHandle); |
| 509 | const auto instance = type.Script.Spawn(params); |
| 510 | if (!instance) |
| 511 | return true; |
| 512 | Instance = instance; |
| 513 | _dtor = nullptr; |
| 514 |
no test coverage detected