您的位置:首页 > 其它

蔡军生先生第二人生的源码分析(十六)保存人物角色的XML文件

2008-05-10 10:43 996 查看
前面介绍怎么样从文件里读取Mesh数据,那么怎么样知道数据从那里读取回来呢?这些信息又是记录在那里呢?现在就来分析这方面的问题。
其实在第二人生里把这些信息保存在XML文件里的,可以在第二人生的目录character里找到文件avatar_lad.xml,这个文件就记录了人物角色组成信息。比如每个部位的组成文件名称,就可以通过下面XML片段可以找到:
<mesh
type="hairMesh"
lod="1"
file_name="avatar_hair_1.llm"
min_pixel_width="160"
reference="avatar_hair.llm">
</mesh>

<mesh
type="hairMesh"
lod="2"
file_name="avatar_hair_2.llm"
min_pixel_width="80"
reference="avatar_hair.llm">
</mesh>

<mesh
type="hairMesh"
lod="3"
file_name="avatar_hair_3.llm"
min_pixel_width="40"
reference="avatar_hair.llm">
</mesh>

<mesh
type="hairMesh"
lod="4"
file_name="avatar_hair_4.llm"
min_pixel_width="20"
reference="avatar_hair.llm">
</mesh>

<mesh
type="hairMesh"
lod="5"
file_name="avatar_hair_5.llm"
min_pixel_width="0"
reference="avatar_hair.llm">
</mesh>

<mesh
type="headMesh"
lod="0"
file_name="avatar_head.llm"
min_pixel_width="320">

分析这个XML文件的代码函数LLVOAvatar::initClass(),如下:
#001 void LLVOAvatar::initClass()
#002 {
#003 LLVOAvatar::sMaxOtherAvatarsToComposite = gSavedSettings.getS32("AvatarCompositeLimit");
#004
#005 char xmlFile[MAX_PATH]; /* Flawfinder: ignore */
#006
#007 snprintf(xmlFile, MAX_PATH, "%s_lad.xml", gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,***ATAR_DEFAULT_CHAR).c_str()); /* Flawfinder:
#008 ignore */
获取文件路径名称。

#009 BOOL success = sXMLTree.parseFile( xmlFile, FALSE );
分析这个XML文件数据。

#010 if (!success)
#011 {
#012 llerrs << "Problem reading avatar configuration file:" << xmlFile << llendl;
#013 }
#014
#015 // now sanity check xml file
#016 LLXmlTreeNode* root = sXMLTree.getRoot();
#017 if (!root)
#018 {
#019 llerrs << "No root node found in avatar configuration file: " << xmlFile << llendl;
#020 return;
#021 }
#022
#023 //-------------------------------------------------------------------------
#024 // <linden_avatar version="1.0"> (root)
#025 //-------------------------------------------------------------------------
#026 if( !root->hasName( "linden_avatar" ) )
#027 {
#028 llerrs << "Invalid avatar file header: " << xmlFile << llendl;
#029 }
#030
#031 LLString version;
#032 static LLStdStringHandle version_string = LLXmlTree::addAttributeString("version");
#033 if( !root->getFastAttributeString( version_string, version ) || (version != "1.0") )
#034 {
#035 llerrs << "Invalid avatar file version: " << version << " in file: " << xmlFile << llendl;
#036 }
#037
#038 S32 wearable_def_version = 1;
#039 static LLStdStringHandle wearable_definition_version_string = LLXmlTree::addAttributeString("wearable_definition_version");
#040 root->getFastAttributeS32( wearable_definition_version_string, wearable_def_version );
#041 LLWearable::setCurrentDefinitionVersion( wearable_def_version );
#042
#043 LLString mesh_file_name;
#044
#045 LLXmlTreeNode* skeleton_node = root->getChildByName( "skeleton" );
#046 if (!skeleton_node)
#047 {
#048 llerrs << "No skeleton in avatar configuration file: " << xmlFile << llendl;
#049 return;
#050 }
#051
#052 LLString skeleton_file_name;
#053 static LLStdStringHandle file_name_string = LLXmlTree::addAttributeString("file_name");
#054 if (!skeleton_node->getFastAttributeString(file_name_string, skeleton_file_name))
#055 {
#056 llerrs << "No file name in skeleton node in avatar config file: " << xmlFile << llendl;
#057 }
#058
#059 std::string skeleton_path;
#060 skeleton_path = gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,skeleton_file_name);
#061 if (!parseSkeletonFile(skeleton_path))
#062 {
#063 llerrs << "Error parsing skeleton file: " << skeleton_path << llendl;
#064 }
#065
#066 // Process XML data
#067
#068 // avatar_skeleton.xml
#069 llassert(!sSkeletonInfo);
#070 sSkeletonInfo = new LLVOAvatarSkeletonInfo;
#071 if (!sSkeletonInfo->parseXml(sSkeletonXMLTree.getRoot()))
#072 {
#073 llerrs << "Error parsing skeleton XML file: " << skeleton_path << llendl;
#074 }
#075 // parse avatar_lad.xml
#076 llassert(!sAvatarInfo);
#077 sAvatarInfo = new LLVOAvatarInfo;
#078 if (!sAvatarInfo->parseXmlSkeletonNode(root))
#079 {
#080 llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl;
#081 }
#082 if (!sAvatarInfo->parseXmlMeshNodes(root))
#083 {
#084 llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl;
#085 }
#086 if (!sAvatarInfo->parseXmlColorNodes(root))
#087 {
#088 llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl;
#089 }
#090 if (!sAvatarInfo->parseXmlLayerNodes(root))
#091 {
#092 llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl;
#093 }
#094 if (!sAvatarInfo->parseXmlDriverNodes(root))
#095 {
#096 llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl;
#097 }
#098 }






蔡军生 2008/01/16 QQ:9073204 深圳
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐