void akBLoader::convertObjectMesh(Blender::Object *bobj) { if(!bobj->data) return; akEntity* entity = new akEntity(); m_demo->addEntity(AKB_IDNAME(bobj), entity); float* bmat = (float*)bobj->obmat; akMatrix4 mat(akVector4(bmat[4*0+0], bmat[4*0+1], bmat[4*0+2], bmat[4*0+3]), akVector4(bmat[4*1+0], bmat[4*1+1], bmat[4*1+2], bmat[4*1+3]), akVector4(bmat[4*2+0], bmat[4*2+1], bmat[4*2+2], bmat[4*2+3]), akVector4(bmat[4*3+0], bmat[4*3+1], bmat[4*3+2], bmat[4*3+3])); akTransformState trans; akMathUtils::extractTransform(mat, trans.loc, trans.rot,trans.scale ); entity->setTransformState(trans); Blender::Mesh* bmesh = (Blender::Mesh*)bobj->data; if (!m_demo->getMesh(AKB_IDNAME(bmesh))) { akMesh* mesh = new akMesh(); akMeshLoader meconv(m_demo, mesh, bobj, bmesh); meconv.convert(false, true); m_demo->addMesh(AKB_IDNAME(bmesh), mesh); } akMesh* mesh = m_demo->getMesh(AKB_IDNAME(bmesh)); entity->setMesh(mesh); if(mesh && bobj->parent != 0 && bobj->parent->type == OB_ARMATURE) { Blender::bArmature* bskel = (Blender::bArmature*)bobj->parent->data; if(!m_demo->getSkeleton(AKB_IDNAME(bskel))) convertSkeleton(bskel); akSkeleton* skel = m_demo->getSkeleton(AKB_IDNAME(bskel)); entity->setSkeleton(skel); if(bskel->deformflag & BLENDER_ARM_DEF_QUATERNION) entity->setUseDualQuatSkinning(true); mesh->generateBoneWeightsFromVertexGroups(skel, true); } }
void gkBlenderSceneConverter::convertObjectMesh(gkGameObject* gobj, Blender::Object* bobj) { GK_ASSERT(gobj->getType() == GK_ENTITY && bobj->data); gkEntity* obj = static_cast<gkEntity*>(gobj); gkEntityProperties& props = obj->getEntityProperties(); Blender::Mesh* me = (Blender::Mesh*)bobj->data; // this is shared for faster conversion times // and better efficiency if (!m_gscene->hasMesh(GKB_IDNAME(me))) { props.m_mesh = m_gscene->createMesh(GKB_IDNAME(me)); gkBlenderMeshConverter meconv(props.m_mesh, bobj, me); meconv.convert(); } else props.m_mesh = m_gscene->getMesh(GKB_IDNAME(me)); props.m_casts = gobj->getProperties().m_physics.isRigidOrDynamic() || !gobj->getProperties().isPhysicsObject(); Blender::Material* matr = BlenderMaterial(bobj, 0); if (matr) props.m_casts = (matr->mode & MA_SHADBUF) != 0; // if it has an action save the initial pose / animation name if (bobj->parent) { Blender::Object* par = bobj->parent; Blender::bAction* act = par->action; if (!act && par->proxy_from) act = par->proxy_from->action; if (act) props.m_startPose = (GKB_IDNAME(act)); } }