Variant Deserializer::ReadVariant(VariantType type) { switch (type) { case VAR_INT: return Variant(ReadInt()); case VAR_BOOL: return Variant(ReadBool()); case VAR_FLOAT: return Variant(ReadFloat()); case VAR_VECTOR2: return Variant(ReadVector2()); case VAR_VECTOR3: return Variant(ReadVector3()); case VAR_VECTOR4: return Variant(ReadVector4()); case VAR_QUATERNION: return Variant(ReadQuaternion()); case VAR_COLOR: return Variant(ReadColor()); case VAR_STRING: return Variant(ReadString()); case VAR_BUFFER: return Variant(ReadBuffer()); case VAR_PTR: ReadUInt(); return Variant((void*)0); case VAR_RESOURCEREF: return Variant(ReadResourceRef()); case VAR_RESOURCEREFLIST: return Variant(ReadResourceRefList()); case VAR_VARIANTVECTOR: return Variant(ReadVariantVector()); case VAR_VARIANTMAP: return Variant(ReadVariantMap()); case VAR_INTRECT: return Variant(ReadIntRect()); case VAR_INTVECTOR2: return Variant(ReadIntVector2()); default: return Variant(); } }
bool ParticleEffect2D::Load(Deserializer& source) { XMLFile xmlFile(context_); if (!xmlFile.Load(source)) return false; XMLElement rootElem = xmlFile.GetRoot("particleEmitterConfig"); if (!rootElem) return false; String texture = rootElem.GetChild("texture").GetAttribute("name"); ResourceCache* cache = GetSubsystem<ResourceCache>(); sprite_= cache->GetResource<Sprite2D>(texture, false); // If sprite not found, try get in current directory if (!sprite_) sprite_= cache->GetResource<Sprite2D>(GetParentPath(GetName()) + texture); if (!sprite_) return false; sourcePositionVariance_ = ReadVector2(rootElem.GetChild("sourcePositionVariance")); speed_ = rootElem.GetChild("speed").GetFloat("value"); speedVariance_ = rootElem.GetChild("speedVariance").GetFloat("value"); particleLifeSpan_ = Max(0.01f, rootElem.GetChild("particleLifeSpan").GetFloat("value")); particleLifespanVariance_ = rootElem.GetChild("particleLifespanVariance").GetFloat("value"); angle_ = rootElem.GetChild("angle").GetFloat("value"); angleVariance_ = rootElem.GetChild("angleVariance").GetFloat("value"); gravity_ = ReadVector2(rootElem.GetChild("gravity")); radialAcceleration_ = rootElem.GetChild("radialAcceleration").GetFloat("value"); tangentialAcceleration_ = rootElem.GetChild("tangentialAcceleration").GetFloat("value"); radialAccelVariance_ = rootElem.GetChild("radialAccelVariance").GetFloat("value"); tangentialAccelVariance_ = rootElem.GetChild("tangentialAccelVariance").GetFloat("value"); startColor_ = ReadColor(rootElem.GetChild("startColor")); startColorVariance_ = ReadColor(rootElem.GetChild("startColorVariance")); finishColor_ = ReadColor(rootElem.GetChild("finishColor")); finishColorVariance_ = ReadColor(rootElem.GetChild("finishColorVariance")); maxParticles_ = rootElem.GetChild("maxParticles").GetInt("value"); startParticleSize_ = rootElem.GetChild("startParticleSize").GetFloat("value"); startParticleSizeVariance_ = rootElem.GetChild("startParticleSizeVariance").GetFloat("value"); finishParticleSize_ = rootElem.GetChild("finishParticleSize").GetFloat("value"); FinishParticleSizeVariance_ = rootElem.GetChild("FinishParticleSizeVariance").GetFloat("value"); duration_ = M_INFINITY; if (rootElem.HasChild("duration")) { float duration = rootElem.GetChild("duration").GetFloat("value"); if (duration > 0.0f) duration_ = duration; } emitterType_ = (EmitterType2D)rootElem.GetChild("emitterType").GetInt("value"); maxRadius_ = rootElem.GetChild("maxRadius").GetFloat("value"); maxRadiusVariance_ = rootElem.GetChild("maxRadiusVariance").GetFloat("value"); minRadius_ = rootElem.GetChild("minRadius").GetFloat("value"); rotatePerSecond_ = rootElem.GetChild("rotatePerSecond").GetFloat("value"); rotatePerSecondVariance_ = rootElem.GetChild("rotatePerSecondVariance").GetFloat("value"); int blendFuncSource = rootElem.GetChild("blendFuncSource").GetInt("value"); int blendFuncDestination = rootElem.GetChild("blendFuncDestination").GetInt("value"); blendMode_ = BLEND_ALPHA; for (int i = 0; i < MAX_BLENDMODES; ++i) { if (blendFuncSource == srcBlendFuncs[i] && blendFuncDestination == destBlendFuncs[i]) { blendMode_ = (BlendMode)i; break; } } rotationStart_ = rootElem.GetChild("rotationStart").GetFloat("value"); rotationStartVariance_ = rootElem.GetChild("rotationStartVariance").GetFloat("value"); rotationEnd_ = rootElem.GetChild("rotationEnd").GetFloat("value"); rotationEndVariance_ = rootElem.GetChild("rotationEndVariance").GetFloat("value"); return true; }
Variant Deserializer::ReadVariant(VariantType type) { switch (type) { case VAR_INT: return Variant(ReadInt()); case VAR_BOOL: return Variant(ReadBool()); case VAR_FLOAT: return Variant(ReadFloat()); case VAR_VECTOR2: return Variant(ReadVector2()); case VAR_VECTOR3: return Variant(ReadVector3()); case VAR_VECTOR4: return Variant(ReadVector4()); case VAR_QUATERNION: return Variant(ReadQuaternion()); case VAR_COLOR: return Variant(ReadColor()); case VAR_STRING: return Variant(ReadString()); case VAR_BUFFER: return Variant(ReadBuffer()); // Deserializing pointers is not supported. Return null case VAR_VOIDPTR: case VAR_PTR: ReadUInt(); return Variant((void*)0); case VAR_RESOURCEREF: return Variant(ReadResourceRef()); case VAR_RESOURCEREFLIST: return Variant(ReadResourceRefList()); case VAR_VARIANTVECTOR: return Variant(ReadVariantVector()); case VAR_STRINGVECTOR: return Variant(ReadStringVector()); case VAR_VARIANTMAP: return Variant(ReadVariantMap()); case VAR_INTRECT: return Variant(ReadIntRect()); case VAR_INTVECTOR2: return Variant(ReadIntVector2()); case VAR_MATRIX3: return Variant(ReadMatrix3()); case VAR_MATRIX3X4: return Variant(ReadMatrix3x4()); case VAR_MATRIX4: return Variant(ReadMatrix4()); case VAR_DOUBLE: return Variant(ReadDouble()); default: return Variant(); } }
bool ParticleEffect2D::BeginLoad(Deserializer& source) { loadSpriteName_.Clear(); XMLFile xmlFile(context_); if (!xmlFile.Load(source)) return false; XMLElement rootElem = xmlFile.GetRoot("particleEmitterConfig"); if (!rootElem) return false; String texture = rootElem.GetChild("texture").GetAttribute("name"); loadSpriteName_ = GetParentPath(GetName()) + texture; // If async loading, request the sprite beforehand if (GetAsyncLoadState() == ASYNC_LOADING) GetSubsystem<ResourceCache>()->BackgroundLoadResource<Sprite2D>(loadSpriteName_, true, this); sourcePositionVariance_ = ReadVector2(rootElem, "sourcePositionVariance"); speed_ = ReadFloat(rootElem, "speed"); speedVariance_ = ReadFloat(rootElem, "speedVariance"); particleLifeSpan_ = Max(0.01f, ReadFloat(rootElem, "particleLifeSpan")); particleLifespanVariance_ = ReadFloat(rootElem, "particleLifespanVariance"); angle_ = ReadFloat(rootElem, "angle"); angleVariance_ = ReadFloat(rootElem, "angleVariance"); gravity_ = ReadVector2(rootElem, "gravity"); radialAcceleration_ = ReadFloat(rootElem, "radialAcceleration"); tangentialAcceleration_ = ReadFloat(rootElem, "tangentialAcceleration"); radialAccelVariance_ = ReadFloat(rootElem, "radialAccelVariance"); tangentialAccelVariance_ = ReadFloat(rootElem, "tangentialAccelVariance"); startColor_ = ReadColor(rootElem, "startColor"); startColorVariance_ = ReadColor(rootElem, "startColorVariance"); finishColor_ = ReadColor(rootElem, "finishColor"); finishColorVariance_ = ReadColor(rootElem, "finishColorVariance"); maxParticles_ = ReadInt(rootElem, "maxParticles"); startParticleSize_ = ReadFloat(rootElem, "startParticleSize"); startParticleSizeVariance_ = ReadFloat(rootElem, "startParticleSizeVariance"); finishParticleSize_ = ReadFloat(rootElem, "finishParticleSize"); // Typo in pex file FinishParticleSizeVariance_ = ReadFloat(rootElem, "FinishParticleSizeVariance"); duration_ = M_INFINITY; if (rootElem.HasChild("duration")) { float duration = ReadFloat(rootElem, "duration"); if (duration > 0.0f) duration_ = duration; } emitterType_ = (EmitterType2D)ReadInt(rootElem, "emitterType"); maxRadius_ = ReadFloat(rootElem, "maxRadius"); maxRadiusVariance_ = ReadFloat(rootElem, "maxRadiusVariance"); minRadius_ = ReadFloat(rootElem, "minRadius"); minRadiusVariance_ = ReadFloat(rootElem, "minRadiusVariance"); rotatePerSecond_ = ReadFloat(rootElem, "rotatePerSecond"); rotatePerSecondVariance_ = ReadFloat(rootElem, "rotatePerSecondVariance"); int blendFuncSource = ReadInt(rootElem, "blendFuncSource"); int blendFuncDestination = ReadInt(rootElem, "blendFuncDestination"); blendMode_ = BLEND_ALPHA; for (int i = 0; i < MAX_BLENDMODES; ++i) { if (blendFuncSource == srcBlendFuncs[i] && blendFuncDestination == destBlendFuncs[i]) { blendMode_ = (BlendMode)i; break; } } rotationStart_ = ReadFloat(rootElem, "rotationStart"); rotationStartVariance_ = ReadFloat(rootElem, "rotationStartVariance"); rotationEnd_ = ReadFloat(rootElem, "rotationEnd"); rotationEndVariance_ = ReadFloat(rootElem, "rotationEndVariance"); return true; }