void akMeshLoader::convertTextureFace(akSubMeshPair* subpair) { akMaterial& ma = subpair->item->getMaterial(); akSubMeshHashKey& hk = subpair->test; Blender::Image** imas = subpair->test.m_images; ma.m_mode = hk.m_mode; if (imas && ma.m_mode & akMaterial::MA_HASFACETEX) { // ma.m_name = "TextureFace"; ma.m_totaltex = 0; for (int i = 0; i < 8; i++) { if (imas[i] != 0) { akTexture tex; // tex.m_name = AKB_IDNAME(imas[i]); tex.m_image = AKB_IDNAME(imas[i]); tex.m_layer = i; ma.m_textures.push_back(tex); ma.m_totaltex++; if (!m_demo->getTexture(AKB_IDNAME(imas[i]))) { akTextureLoader teconv(m_demo, imas[i]); teconv.load(); } } } } }
void akBLoader::convertSkeleton(Blender::bArmature *bskel) { akSkeleton* skel = new akSkeleton(); btAlignedObjectArray<akMatrix4> bind; Blender::Bone* bone = static_cast<Blender::Bone*>(bskel->bonebase.first); while (bone) { // only process root bones if (bone->parent == 0) buildBoneTree(skel, bind, bone, AK_JOINT_NO_PARENT); bone = bone->next; } akSkeletonPose* bindPose = new akSkeletonPose(skel, akSkeletonPose::SP_MODEL_SPACE); for(int i=0; i<skel->getNumJoints(); i++) { akTransformState t; akMathUtils::extractTransform(bind[i], t.loc, t.rot,t.scale ); *bindPose->getJointPose(i) = t; } skel->setBindingPose(bindPose); m_demo->addSkeleton(AKB_IDNAME(bskel), skel); }
void akBLoader::convertObjectMesh(Blender::Object *bobj) { if(!bobj->data) return; akEntity* entity = new akEntity(AKB_IDNAME(bobj)); 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_engine->getMesh(AKB_IDNAME(bmesh))) { akMesh* mesh = new akMesh(); akMeshLoader meconv(m_demo, mesh, bobj, bmesh); meconv.convert(false, true); m_engine->addMesh(AKB_IDNAME(bmesh), mesh); } akMesh* mesh = m_engine->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_engine->getSkeleton(AKB_IDNAME(bskel))) convertSkeleton(bskel); akSkeleton* skel = m_engine->getSkeleton(AKB_IDNAME(bskel)); entity->setSkeleton(skel); if(bskel->deformflag & BLENDER_ARM_DEF_QUATERNION) entity->setUseDualQuatSkinning(true); mesh->generateBoneWeightsFromVertexGroups(skel, true); } }
void akBLoader::loadFile(const utString &filename, bool sortByMat, bool openglVertexColor) { fbtBlend fp; if (fp.parse(filename.c_str(), fbtFile::PM_COMPRESSED) != fbtFile::FS_OK) { return; } // current scne Blender::Scene* bscene = fp.m_fg->curscene; //animations akAnimationLoader animLoader(m_demo); animLoader.convertActions(fp.m_action, fp.getVersion() <= 249, bscene->r.frs_sec); //convert camera convertCameraObject(bscene->camera); //objects of the active scene for (Blender::Base* base = (Blender::Base*)bscene->base.first; base; base = base->next) { if (!base->object) continue; Blender::Object* bobj = base->object; // test for usable object type if(bobj->type == OB_MESH) { convertObjectMesh(bobj); akEntity* entity = m_demo->getEntity(AKB_IDNAME(bobj)); animLoader.convertObject(entity, bobj, fp.getVersion() <= 249, bscene->r.frs_sec); } } }
void akMeshLoader::convertMaterial(Blender::Material* bma, akSubMeshPair* subpair) { akMaterial& ma = subpair->item->getMaterial(); akSubMeshHashKey& hk = subpair->test; ma.m_mode = hk.m_mode; // ma.m_name = GKB_IDNAME(bma); ma.m_hardness = bma->har / 4.f; ma.m_refraction = bma->ref; ma.m_emissive = bma->emit; ma.m_ambient = bma->amb; ma.m_spec = bma->spec; ma.m_alpha = bma->alpha; ma.m_diffuse = akColor(bma->r, bma->g, bma->b); ma.m_specular = akColor(bma->specr, bma->specg, bma->specb); ma.m_blend = akMeshLoaderUtils_getRampBlendType(bma->rampblend_col); if (bma->mode & MA_ZTRA) ma.m_mode |= akMaterial::MA_DEPTHWRITE; if (bma->mode & MA_SHADOW) ma.m_mode |= akMaterial::MA_RECEIVESHADOWS; if (bma->mode & MA_WIRE) ma.m_mode |= akMaterial::MA_WIREFRAME; if (!(bma->mode & MA_SHLESS)) ma.m_mode |= akMaterial::MA_LIGHTINGENABLED; if (bma->alpha <= 0.f) ma.m_mode |= akMaterial::MA_INVISIBLE; if (bma->mode & MA_RAMP_COL) ma.m_mode |= akMaterial::MA_HASRAMPBLEND; // textures if (bma->mtex != 0) { ma.m_totaltex = 0; for (int i = 0; i < MAX_MTEX; i++) { if (!bma->mtex[i] || !bma->mtex[i]->tex) continue; if (bma->mtex[i]->tex->type == TEX_IMAGE) { Blender::MTex* mtex = bma->mtex[i]; Blender::Image* ima = mtex->tex->ima; if (!ima) continue; akTexture tex; // tex.m_name = AKB_IDNAME(ima); tex.m_image = AKB_IDNAME(ima); if (mtex->texflag & MTEX_STENCIL) { tex.m_mode |= akTexture::TM_SPLAT; tex.m_texmode |= akTexture::TX_STENCIL; } if (mtex->texflag & MTEX_NEGATIVE) tex.m_texmode |= akTexture::TX_NEGATIVE; if (mtex->texflag & MTEX_RGBTOINT) tex.m_texmode |= akTexture::TX_RGBTOINTEN; if (mtex->mapto & MAP_ALPHA) { tex.m_mode |= akTexture::TM_ALPHA; ma.m_mode |= akMaterial::MA_ALPHABLEND; } if ((mtex->mapto & MAP_NORM) || (mtex->maptoneg & MAP_NORM)) tex.m_mode |= akTexture::TM_NORMAL; if ((mtex->mapto & MAP_SPEC) || (mtex->maptoneg & MAP_SPEC)) tex.m_mode |= akTexture::TM_SPECULAR; if ((mtex->mapto & MAP_REF) || (mtex->maptoneg & MAP_REF)) tex.m_mode |= akTexture::TM_REFRACTION; if ((mtex->mapto & MAP_EMIT) || (mtex->maptoneg & MAP_EMIT)) tex.m_mode |= akTexture::TM_EMMISIVE; if (mtex->normapspace == MTEX_NSPACE_OBJECT) //else set to tagent space. tex.m_texmode |= akTexture::TX_OBJ_SPACE; tex.m_blend = akMeshLoaderUtils_getTexBlendType(mtex->blendtype); tex.m_layer = findTextureLayer(mtex); tex.m_mix = mtex->colfac; tex.m_normalFactor = mtex->norfac; tex.m_diffuseColorFactor = mtex->colfac; tex.m_diffuseAlphaFactor = mtex->alphafac; tex.m_specularColorFactor = mtex->colspecfac; tex.m_specularHardFactor = mtex->hardfac; ma.m_textures.push_back(tex); ma.m_totaltex++; } } } }