bool Node::LoadXML(const XMLElement& source, SceneResolver& resolver, bool readChildren, bool rewriteIDs, CreateMode mode) { // Remove all children and components first in case this is not a fresh load RemoveAllChildren(); RemoveAllComponents(); if (!Serializable::LoadXML(source)) return false; XMLElement compElem = source.GetChild("component"); while (compElem) { String typeName = compElem.GetAttribute("type"); unsigned compID = compElem.GetInt("id"); Component* newComponent = CreateComponent(ShortStringHash(typeName), (mode == REPLICATED && compID < FIRST_LOCAL_ID) ? REPLICATED : LOCAL, rewriteIDs ? 0 : compID); if (newComponent) { resolver.AddComponent(compID, newComponent); if (!newComponent->LoadXML(compElem)) return false; } compElem = compElem.GetNext("component"); } if (!readChildren) return true; XMLElement childElem = source.GetChild("node"); while (childElem) { unsigned nodeID = childElem.GetInt("id"); Node* newNode = CreateChild(rewriteIDs ? 0 : nodeID, (mode == REPLICATED && nodeID < FIRST_LOCAL_ID) ? REPLICATED : LOCAL); resolver.AddNode(nodeID, newNode); if (!newNode->LoadXML(childElem, resolver, readChildren, rewriteIDs, mode)) return false; childElem = childElem.GetNext("node"); } return true; }
static String GenerateNameFromType(ShortStringHash typeHash) { if (unknownTypeToName.Contains(typeHash)) return unknownTypeToName[typeHash]; String test; // Begin brute-force search unsigned numLetters = letters.Length(); unsigned combinations = numLetters; bool found = false; for (unsigned i = 1; i < 6; ++i) { test.Resize(i); for (unsigned j = 0; j < combinations; ++j) { unsigned current = j; for (unsigned k = 0; k < i; ++k) { test[k] = letters[current % numLetters]; current /= numLetters; } if (ShortStringHash(test) == typeHash) { found = true; break; } } if (found) break; combinations *= numLetters; } unknownTypeToName[typeHash] = test; return test; }
ShortStringHash Deserializer::ReadShortStringHash() { return ShortStringHash(ReadUShort()); }
void Variant::FromString(VariantType type, const char* value) { switch (type) { case VAR_INT: *this = ToInt(value); break; case VAR_BOOL: *this = ToBool(value); break; case VAR_FLOAT: *this = ToFloat(value); break; case VAR_VECTOR2: *this = ToVector2(value); break; case VAR_VECTOR3: *this = ToVector3(value); break; case VAR_VECTOR4: *this = ToVector4(value); break; case VAR_QUATERNION: *this = ToQuaternion(value); break; case VAR_COLOR: *this = ToColor(value); break; case VAR_STRING: *this = value; break; case VAR_BUFFER: { SetType(VAR_BUFFER); PODVector<unsigned char>& buffer = *(reinterpret_cast<PODVector<unsigned char>*>(&value_)); Vector<String> values = String::Split(value, ' '); buffer.Resize(values.Size()); for (unsigned i = 0; i < values.Size(); ++i) buffer[i] = ToInt(values[i]); } break; case VAR_PTR: *this = (void*)0; break; case VAR_RESOURCEREF: { Vector<String> values = String::Split(value, ';'); if (values.Size() == 2) { SetType(VAR_RESOURCEREF); ResourceRef& ref = *(reinterpret_cast<ResourceRef*>(&value_)); ref.type_ = ShortStringHash(values[0]); ref.id_ = StringHash(values[1]); } } break; case VAR_RESOURCEREFLIST: { Vector<String> values = String::Split(value, ';'); if (values.Size() >= 1) { SetType(VAR_RESOURCEREFLIST); ResourceRefList& refList = *(reinterpret_cast<ResourceRefList*>(&value_)); refList.type_ = ShortStringHash(values[0]); refList.ids_.Resize(values.Size() - 1); for (unsigned i = 1; i < values.Size(); ++i) refList.ids_[i - 1] = StringHash(values[i]); } } break; case VAR_INTRECT: *this = ToIntRect(value); break; case VAR_INTVECTOR2: *this = ToIntVector2(value); break; default: SetType(VAR_NONE); } }