bool bNewBoneScaleMethod = g_pA3DConfig->GetFlagNewBoneScale();
sprintf(szLine, _format_new_scale, bNewBoneScaleMethod);
file.WriteLine(szLine);
if (bNewBoneScaleMethod)
{
sprintf(szLine, _format_bone_num, m_BoneScaleExArr.size());
file.WriteLine(szLine);
for (i = 0; i < m_BoneScaleExArr.size(); i++)
{
BoneScaleEx* pScale = m_BoneScaleExArr[i];
sprintf(szLine, _format_bone_index, pScale->m_nIndex);
file.WriteLine(szLine);
sprintf(szLine, _format_bone_scale, pScale->m_fLenFactor, pScale->m_fThickFactor, pScale->m_fWholeFactor);
file.WriteLine(szLine);
}
}
else
{
sprintf(szLine, _format_bone_num, m_BoneScales.size());
file.WriteLine(szLine);
for (i = 0; i < m_BoneScales.size(); i++)
{
BoneScale* pScale = m_BoneScales[i];
sprintf(szLine, _format_bone_index, pScale->m_nIndex);
file.WriteLine(szLine);
sprintf(szLine, _format_bone_scl_type, pScale->m_nType);
file.WriteLine(szLine);
sprintf(szLine, _format_bone_scale, VECTOR_XYZ(pScale->m_vScale));
file.WriteLine(szLine);
}
}
file.WriteLine(m_strScaleBaseBone);
sprintf(szLine, _format_def_speed, m_fDefPlaySpeed);
file.WriteLine(szLine);
sprintf(szLine, _format_can_castshadow, (int)m_bCanCastShadow);
file.WriteLine(szLine);
sprintf(szLine, _format_render_model, (int)m_bRenderSkinModel);
file.WriteLine(szLine);
sprintf(szLine, _format_render_edge, (int)m_bRenderEdge);
file.WriteLine(szLine);
g_GfxSavePixelShaderConsts(&file, m_strPixelShader, m_strShaderTex, m_vecPSConsts);
int channel_count = 0;
for (i = 0; i < A3DSkinModel::ACTCHA_MAX; i++)
{
ActChannelInfo* pChannel = m_ChannelInfoArr[i];
if (pChannel && pChannel->bone_names.size())
channel_count++;
}
sprintf(szLine, _format_channel_count, channel_count);
file.WriteLine(szLine);
for (i = 0; i < A3DSkinModel::ACTCHA_MAX; i++)
{
ActChannelInfo* pChannel = m_ChannelInfoArr[i];
if (pChannel && pChannel->bone_names.size())
{
sprintf(szLine, _format_channel, i);
file.WriteLine(szLine);
sprintf(szLine, _format_bone_num, (int)pChannel->bone_names.size());
file.WriteLine(szLine);
for (size_t j = 0; j < pChannel->bone_names.size(); j++)
{
file.WriteLine(pChannel->bone_names[j]);
}
}
}
sprintf(szLine, _format_channel_count, A3DSkinModel::ACTCHA_MAX);
file.WriteLine(szLine);
for (i = 0; i < A3DSkinModel::ACTCHA_MAX; i++)
{
sprintf(szLine, _format_channel_mask, m_EventMasks[i]);
file.WriteLine(szLine);
}
sprintf(szLine, _format_cogfx_num, m_CoGfxMap.size());
file.WriteLine(szLine);
sprintf(szLine, _format_comact_count, m_ActionMap.size());
file.WriteLine(szLine);
for (CoGfxMap::iterator it = m_CoGfxMap.begin(); it != m_CoGfxMap.end(); ++it)
it->second->Save(&file);
abase::vector<A3DCombinedAction*> act_sort;
for (CombinedActMap::iterator it_act = m_ActionMap.begin(); it_act != m_ActionMap.end(); ++it_act)
act_sort.push_back(it_act->second);
qsort(act_sort.begin(), act_sort.size(), sizeof(int), _str_compare);
for (i = 0; i < act_sort.size(); i++)
act_sort[i]->Save(&file);
int nScriptCount = 0;
for (i = 0; i < enumECMScriptCount; i++)
if (!m_Scripts[i].IsEmpty())
nScriptCount++;
sprintf(szLine, _format_script_count, nScriptCount);
file.WriteLine(szLine);
for (i = 0; i < enumECMScriptCount; i++)
{
if (!m_Scripts[i].IsEmpty())
{
sprintf(szLine, _format_id, i);
file.WriteLine(szLine);
AString& str = m_Scripts[i];
int nBufLen = (str.GetLength() + 3) / 3 * 4 + 32;
char* pBuf = new char[nBufLen];
int len = base64_encode((unsigned char*)(const char*)str, str.GetLength()+1, pBuf);
int nLines = len / 1500;
if (len > nLines * 1500)
nLines++;
sprintf(szLine, _format_script_lines, nLines);
file.WriteLine(szLine);
const char* pWrite = pBuf;
while (len)
{
int nWrite = len > 1500 ? 1500 : len;
len -= nWrite;
AString s(pWrite, nWrite);
file.WriteLine(s);
pWrite += nWrite;
}
delete[] pBuf;
}
}
SaveAdditionalSkin(&file);
if (pModel)
{
sprintf(szLine, _format_child_count, pModel->m_ChildModels.size());
file.WriteLine(szLine);
for (ECModelMap::iterator it_child = pModel->m_ChildModels.begin(); it_child != pModel->m_ChildModels.end(); ++it_child)
{
sprintf(szLine, _format_child_name, it_child->first);
file.WriteLine(szLine);
sprintf(szLine, _format_child_path, it_child->second->m_pMapModel->m_strFilePath);
file.WriteLine(szLine);
sprintf(szLine, _format_hh_name, it_child->second->m_strHookName);
file.WriteLine(szLine);
sprintf(szLine, _format_cc_name, it_child->second->m_strCC);
file.WriteLine(szLine);
}
}
else
{
sprintf(szLine, _format_child_count, m_ChildInfoArray.size());
file.WriteLine(szLine);
for (i = 0; i < m_ChildInfoArray.size(); i++)
{
const ChildInfo* pChildInfo = m_ChildInfoArray[i];
sprintf(szLine, _format_child_name, (const char*)pChildInfo->m_strName);
file.WriteLine(szLine);
sprintf(szLine, _format_child_path, (const char*)pChildInfo->m_strPath);
file.WriteLine(szLine);
sprintf(szLine, _format_hh_name, (const char*)pChildInfo->m_strHHName);
file.WriteLine(szLine);
sprintf(szLine, _format_cc_name, (const char*)pChildInfo->m_strCCName);
file.WriteLine(szLine);
}
}
sprintf(szLine, _format_phys_file, m_pPhysSyncData ? m_strPhysFileName : "");
file.WriteLine(szLine);
_snprintf(szLine, AFILE_LINEMAXLEN, _format_ecmhook_count, m_ECModelHookMap.size());
file.WriteLine(szLine);
for (ECModelHookMap::iterator it_ecmhook = m_ECModelHookMap.begin(); it_ecmhook != m_ECModelHookMap.end(); ++it_ecmhook)
{
CECModelHook* pHook = it_ecmhook->second;
if (!pHook)
continue;
pHook->Save(&file);
}
}
file.Close();