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;
 }
Exemple #2
0
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);
    }