void FBXParser::FillParaXModelData(CParaXModel *pMesh, const aiScene *pFbxScene) { pMesh->m_objNum.nVertices = m_vertices.size(); pMesh->m_objNum.nBones = m_bones.size(); pMesh->m_objNum.nTextures = m_textures.size(); pMesh->m_objNum.nAnimations = m_bones.size() > 0 ? m_anims.size() : 0; pMesh->m_objNum.nIndices = m_indices.size(); pMesh->m_header.minExtent = m_minExtent; pMesh->m_header.maxExtent = m_maxExtent; pMesh->m_vNeckYawAxis = m_modelInfo.m_vNeckYawAxis; pMesh->m_vNeckPitchAxis = m_modelInfo.m_vNeckPitchAxis; pMesh->initVertices(m_vertices.size(), &(m_vertices[0])); pMesh->initIndices(m_indices.size(), &(m_indices[0])); if (m_bones.size() > 0) { pMesh->bones = new ParaEngine::Bone[m_bones.size()]; for (int i = 0; i < (int)m_bones.size(); ++i) { m_bones[i].RemoveRedundentKeys(); pMesh->bones[i] = m_bones[i]; if (m_bones[i].nBoneID > 0) pMesh->m_boneLookup[m_bones[i].nBoneID] = i; else if (m_bones[i].IsAttachment()) { // TODO: pivot point pMesh->NewAttachment(true, m_bones[i].GetAttachmentId(), i, Vector3::ZERO); } } } if (m_anims.size() > 0 && m_bones.size() > 0) { pMesh->anims = new ModelAnimation[m_anims.size()]; memcpy(pMesh->anims, &(m_anims[0]), sizeof(ModelAnimation)*m_anims.size()); pMesh->animBones = true; pMesh->animated = true; } else { pMesh->animBones = false; pMesh->animated = false; } if (m_textures.size() > 0) { pMesh->textures = new asset_ptr<TextureEntity>[m_textures.size()]; for (int i = 0; i < (int)m_textures.size(); i++) { if (m_textureContentMapping.find(m_textures[i]) != m_textureContentMapping.end()) { int nSize = m_textureContentMapping[m_textures[i]].size(); if (nSize > 0) { TextureEntity *texEntity = CGlobals::GetAssetManager()->GetTextureManager().NewEntity(m_textures[i]); char* bufferCpy = new char[nSize]; memcpy(bufferCpy, m_textureContentMapping[m_textures[i]].c_str(), nSize); texEntity->SetRawData(bufferCpy, nSize); pMesh->textures[i] = texEntity; } } else if (CParaFile::DoesAssetFileExist(m_textures[i].GetFileName().c_str())) { pMesh->textures[i] = CGlobals::GetAssetManager()->LoadTexture("", m_textures[i], TextureEntity::StaticTexture); } // for replaceable textures if (m_textures[i].nIsReplaceableIndex > 0 && i < 32) { pMesh->specialTextures[i] = m_textures[i].nIsReplaceableIndex; } } } if (pMesh->geosets.size() > 0) { pMesh->showGeosets = new bool[pMesh->geosets.size()]; memset(pMesh->showGeosets, true, pMesh->geosets.size()*sizeof(bool)); } pMesh->m_radius = (m_maxExtent - m_minExtent).length() / 2; AddDefaultColors(pMesh); AddDefaultTransparency(pMesh); pMesh->m_RenderMethod = pMesh->HasAnimation() ? CParaXModel::SOFT_ANIM : CParaXModel::NO_ANIM; // only enable bmax model, if there are vertex color channel. if (m_beUsedVertexColor) pMesh->SetBmaxModel(); }