CSEngine
Loading...
Searching...
No Matches
SPrefab.cpp
1//
2// Created by ounols on 19. 2. 10.
3//
4
5#include "../Manager/SCloneFactory.h"
6#include "../Manager/ResMgr.h"
7#include "SPrefab.h"
8#include "SGameObject.h"
9#include "../Util/Loader/DAE/DAELoader.h"
10#include "../Util/AssetsDef.h"
11#include "SGameObjectFromSPrefab.h"
12
13using namespace CSE;
14
15RESOURCE_CONSTRUCTOR(SPrefab) {}
16
17SPrefab::~SPrefab() = default;
18
19void SPrefab::Exterminate() {
20}
21
22SGameObject* SPrefab::Clone(const vec3& position, SGameObject* parent) {
23 SGameObject* clone = SCloneFactory::Clone(m_root, parent);
24
25 clone->GetTransform()->m_position = vec3(position);
26 clone->SetIsPrefab(false);
27 clone->SetUndestroyable(false);
28
29 return clone;
30}
31
32
33SGameObject* SPrefab::Clone(const vec3& position, const vec3& scale, Quaternion rotation, SGameObject* parent) {
34 SGameObject* clone = SCloneFactory::Clone(m_root, parent);
35
36 clone->GetTransform()->m_position = vec3(position);
37 clone->GetTransform()->m_scale = vec3(scale);
38 clone->GetTransform()->m_rotation = Quaternion(rotation);
39 clone->SetIsPrefab(false);
40 clone->SetUndestroyable(false);
41
42 return clone;
43}
44
45bool SPrefab::SetGameObject(SGameObject* obj) {
46 if (m_root != nullptr) return false;
47
48 m_root = obj;
49 m_root->SetUndestroyable(true);
50 m_root->SetIsPrefab(true);
51 m_root->SetResourceID(GetHash(), true);
52
53 return true;
54}
55
56void SPrefab::Init(const AssetMgr::AssetReference* asset) {
57 AssetMgr::TYPE type = asset->type;
58 std::string path = asset->name_path;
59
60 switch (type) {
61 case AssetMgr::DAE:
62 DAELoader::GeneratePrefab(path.c_str(), nullptr, nullptr, nullptr, this);
63 break;
64 }
65
66 std::string hashRaw = AssetMgr::LoadAssetFile(path + ".meta");
67 if(!hashRaw.empty()) {
68 const XNode* root = XFILE().loadBuffer(hashRaw);
69 const auto& hashData = root->getNode("hash-data");
70 std::string hash = hashData.getAttribute("hash").value;
71 SetHash(hash);
72 const auto& hashChildren = hashData.children;
73
74 if(hashData.children.size() <= 0) {
75 hashRaw = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
76 "<CSEMETA version=\"1.0.0\">\n"
77 "<hash-data hash=\"" + m_hash + "\">\n"
78 + GenerateObjectMeta(*m_root) +
79 "\n</hash-data>\n</CSEMETA>";
80 SaveTxtFile(path + ".meta", hashRaw);
81 }
82 else {
83 for(const auto& child : hashChildren) {
84 const auto& id = child.getAttribute("id").value;
85 std::string hash = child.value;
86 const auto& obj = static_cast<SGameObjectFromSPrefab*>(m_root->FindLocalByID(id));
87 if(obj == nullptr) continue;
88 obj->SetHash(hash);
89 obj->SetRefHash(hash);
90 }
91 }
92 SAFE_DELETE(root);
93 }
94 GenerateResourceID();
95}
96
97void SPrefab::GenerateResourceID(SGameObject* obj) {
98 if (obj == nullptr) {
99 obj = m_root;
100 obj->SetResourceID(GetHash());
101 } else {
102 std::string resultID = obj->GetID();
103 resultID = resultID.substr(resultID.find('/') + 1);
104 obj->SetResourceID(std::string(GetHash()) + "*" + resultID);
105 }
106
107 for (auto child : obj->GetChildren()) {
108 GenerateResourceID(child);
109 }
110}
111
112std::string SPrefab::GetMetaString(const SGameObject& object, unsigned int startIndex) {
113 std::string&& id = object.GetID().substr(startIndex);
114 std::string&& hash = object.GetHash();
115
116 std::string result = "<hash id=\"" + std::move(id) + "\">" + std::move(hash) + "</hash>";
117
118 const auto& children = object.GetChildren();
119 for (const auto& child: children) {
120 result += '\n' + GetMetaString(*child, startIndex);
121 }
122 return result;
123}
124
125std::string SPrefab::GenerateObjectMeta(const SGameObject& obj) {
126 unsigned int startIndex = obj.GetID().size() - obj.GetName().size();
127 return GetMetaString(obj, startIndex);
128}
129
130void SPrefab::SetValue(std::string name_str, VariableBinder::Arguments value) {
131
132}
133
134std::string SPrefab::PrintValue() const {
135 return {};
136}
void SetValue(std::string name_str, Arguments value) override
Definition SPrefab.cpp:130
Definition XML.h:77
Definition XML.h:43