コード例 #1
0
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();
                }
            }
        }
    }
}
コード例 #2
0
ファイル: akBLoader.cpp プロジェクト: Kelloggs/experiments
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);
}
コード例 #3
0
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);
	}
}
コード例 #4
0
ファイル: akBLoader.cpp プロジェクト: Kelloggs/experiments
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);
		}
	}
}
コード例 #5
0
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++;
            }
        }
    }
}