bool Serializer::WriteBoundingBox(const BoundingBox& value) { bool success = true; success &= WriteVector3(value.min_); success &= WriteVector3(value.max_); return success; }
QDomElement LegacyAvatarSerializer::WriteBone(QDomDocument& dest, const BoneModifier& bone) { QDomElement elem = dest.createElement("bone"); SetAttribute(elem, "name", bone.bone_name_); QDomElement rotation = dest.createElement("rotation"); SetAttribute(rotation, "start", WriteEulerAngles(bone.start_.orientation_)); SetAttribute(rotation, "end", WriteEulerAngles(bone.end_.orientation_)); SetAttribute(rotation, "mode", modifier_mode[bone.orientation_mode_]); QDomElement translation = dest.createElement("translation"); SetAttribute(translation, "start", WriteVector3(bone.start_.position_)); SetAttribute(translation, "end", WriteVector3(bone.end_.position_)); SetAttribute(translation, "mode", modifier_mode[bone.position_mode_]); QDomElement scale = dest.createElement("scale"); SetAttribute(scale, "start", WriteVector3(bone.start_.scale_)); SetAttribute(scale, "end", WriteVector3(bone.end_.scale_)); elem.appendChild(rotation); elem.appendChild(translation); elem.appendChild(scale); return elem; }
QDomElement LegacyAvatarSerializer::WriteAttachment(QDomDocument& dest, const AvatarAttachment& attachment, const AvatarAsset& mesh) { QDomElement elem = dest.createElement("attachment"); QDomElement name_elem = dest.createElement("name"); SetAttribute(name_elem, "value", attachment.name_); elem.appendChild(name_elem); QDomElement mesh_elem = dest.createElement("mesh"); SetAttribute(mesh_elem, "name", attachment.mesh_.name_); int link = 0; if (attachment.link_skeleton_) link = 1; SetAttribute(mesh_elem, "linkskeleton", link); elem.appendChild(mesh_elem); QDomElement category_elem = dest.createElement("category"); SetAttribute(category_elem, "name", attachment.category_); elem.appendChild(category_elem); QDomElement avatar_elem = dest.createElement("avatar"); SetAttribute(avatar_elem, "name", mesh.name_); { std::string bonename = attachment.bone_name_; if (bonename.empty()) bonename = "None"; QDomElement bone_elem = dest.createElement("bone"); SetAttribute(bone_elem, "name", bonename); SetAttribute(bone_elem, "offset", WriteVector3(attachment.transform_.position_)); SetAttribute(bone_elem, "rotation", WriteQuaternion(attachment.transform_.orientation_)); SetAttribute(bone_elem, "scale", WriteVector3(attachment.transform_.scale_)); avatar_elem.appendChild(bone_elem); for (uint i = 0; i < attachment.vertices_to_hide_.size(); ++i) { QDomElement polygon_elem = dest.createElement("avatar_polygon"); SetAttribute(polygon_elem, "idx", (int)attachment.vertices_to_hide_[i]); avatar_elem.appendChild(polygon_elem); } } elem.appendChild(avatar_elem); return elem; }
bool Serializer::WriteVariantData(const Variant& value) { switch (value.GetType()) { case VAR_NONE: return true; case VAR_INT: return WriteInt(value.GetInt()); case VAR_BOOL: return WriteBool(value.GetBool()); case VAR_FLOAT: return WriteFloat(value.GetFloat()); case VAR_VECTOR2: return WriteVector2(value.GetVector2()); case VAR_VECTOR3: return WriteVector3(value.GetVector3()); case VAR_VECTOR4: return WriteVector4(value.GetVector4()); case VAR_QUATERNION: return WriteQuaternion(value.GetQuaternion()); case VAR_COLOR: return WriteColor(value.GetColor()); case VAR_STRING: return WriteString(value.GetString()); case VAR_BUFFER: return WriteBuffer(value.GetBuffer()); // Serializing pointers is not supported. Write null case VAR_VOIDPTR: case VAR_PTR: return WriteUInt(0); case VAR_RESOURCEREF: return WriteResourceRef(value.GetResourceRef()); case VAR_RESOURCEREFLIST: return WriteResourceRefList(value.GetResourceRefList()); case VAR_VARIANTVECTOR: return WriteVariantVector(value.GetVariantVector()); case VAR_VARIANTMAP: return WriteVariantMap(value.GetVariantMap()); case VAR_INTRECT: return WriteIntRect(value.GetIntRect()); case VAR_INTVECTOR2: return WriteIntVector2(value.GetIntVector2()); case VAR_MATRIX3: return WriteMatrix3(value.GetMatrix3()); case VAR_MATRIX3X4: return WriteMatrix3x4(value.GetMatrix3x4()); case VAR_MATRIX4: return WriteMatrix4(value.GetMatrix4()); default: return false; } }
void LegacyAvatarSerializer::WriteAvatarAppearance(QDomDocument& dest, const EC_AvatarAppearance& source, bool write_assetmap) { // Avatar element QDomElement avatar = dest.createElement("avatar"); // Version element { QDomElement version = dest.createElement("version"); QDomText text = dest.createTextNode("0.2"); version.appendChild(text); avatar.appendChild(version); } // Mesh element { QDomElement mesh = dest.createElement("base"); mesh.setAttribute("name", "default"); SetAttribute(mesh, "mesh", source.GetMesh().name_); avatar.appendChild(mesh); } // Skeleton element { QDomElement skeleton = dest.createElement("skeleton"); SetAttribute(skeleton, "name", source.GetSkeleton().name_); avatar.appendChild(skeleton); } // Material elements const AvatarMaterialVector& materials = source.GetMaterials(); for (uint i = 0; i < materials.size(); ++i) { // Append elements in submesh order QDomElement material = dest.createElement("material"); std::string mat_name = materials[i].asset_.name_; // Strip away the file extension if exists std::size_t idx = (mat_name.find(".material")); if (idx != std::string::npos) mat_name = mat_name.substr(0, idx); SetAttribute(material, "name", mat_name); avatar.appendChild(material); } // Texture override elements // Do not write these, they impose limitations on the materials //if (materials.size() >= 2) //{ // if (materials[1].textures_.size() && (!materials[1].textures_[0].name_.empty())) // { // QDomElement texture_face = dest.createElement("texture_face"); // SetAttribute(texture_face, "name", materials[1].textures_[0].name_); // avatar.appendChild(texture_face); // } //} //// Body //if (materials.size() >= 1) //{ // if (materials[0].textures_.size() && (!materials[0].textures_[0].name_.empty())) // { // QDomElement texture_body = dest.createElement("texture_body"); // SetAttribute(texture_body, "name", materials[0].textures_[0].name_); // avatar.appendChild(texture_body); // } //} // Transformation element { QDomElement transformation = dest.createElement("transformation"); const Transform& transform = source.GetTransform(); SetAttribute(transformation, "position", WriteVector3(transform.position_)); SetAttribute(transformation, "rotation", WriteQuaternion(transform.orientation_)); SetAttribute(transformation, "scale", WriteVector3(transform.scale_)); avatar.appendChild(transformation); } // Attachments const AvatarAttachmentVector& attachments = source.GetAttachments(); for (uint i = 0; i < attachments.size(); ++i) { QDomElement attachment = WriteAttachment(dest, attachments[i], source.GetMesh()); avatar.appendChild(attachment); } // Bone modifiers const BoneModifierSetVector& bone_modifiers = source.GetBoneModifiers(); for (uint i = 0; i < bone_modifiers.size(); ++i) { WriteBoneModifierSet(dest, avatar, bone_modifiers[i]); } // Morph modifiers const MorphModifierVector& morph_modifiers = source.GetMorphModifiers(); for (uint i = 0; i < morph_modifiers.size(); ++i) { QDomElement morph = WriteMorphModifier(dest, morph_modifiers[i]); avatar.appendChild(morph); } // Master modifiers const MasterModifierVector& master_modifiers = source.GetMasterModifiers(); for (uint i = 0; i < master_modifiers.size(); ++i) { QDomElement master = WriteMasterModifier(dest, master_modifiers[i]); avatar.appendChild(master); } // Animations const AnimationDefinitionMap& animations = source.GetAnimations(); { AnimationDefinitionMap::const_iterator i = animations.begin(); while (i != animations.end()) { QDomElement anim = WriteAnimationDefinition(dest, i->second); avatar.appendChild(anim); ++i; } } // Properties const AvatarPropertyMap& properties = source.GetProperties(); { AvatarPropertyMap::const_iterator i = properties.begin(); while (i != properties.end()) { QDomElement prop = dest.createElement("property"); SetAttribute(prop, "name", i->first); SetAttribute(prop, "value", i->second); avatar.appendChild(prop); ++i; } } // Asset map if (write_assetmap) { const AvatarAssetMap& assets = source.GetAssetMap(); { QDomElement map_elem = dest.createElement("assetmap"); AvatarAssetMap::const_iterator i = assets.begin(); while (i != assets.end()) { QDomElement asset_elem = dest.createElement("asset"); SetAttribute(asset_elem, "name", i->first); SetAttribute(asset_elem, "id", i->second); map_elem.appendChild(asset_elem); ++i; } avatar.appendChild(map_elem); } } dest.appendChild(avatar); }