Example #1
0
void ExtractMaterials(SModel* model)
{
	MItDependencyNodes itDep(MFn::kLambert);

	// count materials
	model->numMaterials = 0;
	while (!itDep.isDone()) 
	{
		model->numMaterials++;
		itDep.next();
	}

	// extract each material data
	if ( model->numMaterials > 0 )
	{
		model->materials = (SMaterial*)calloc(model->numMaterials, sizeof(SMaterial));
		unsigned int count = 0;
		itDep.reset(MFn::kLambert);
		while (!itDep.isDone()) 
		{
			SMaterial* mat = &model->materials[ count ];
			mat->type = MATERIAL_LAMBERT;
			MFnLambertShader fnLambert( itDep.item() );
			strcpy_s( mat->name, fnLambert.name().asChar() );
			g_MaterialToID_Map.insert( std::make_pair( mat->name, ++g_MatID_gen ) );
			mat->materialID = g_MatID_gen;

			ExtractAttribute(fnLambert, "ambientColor",  mat->ambient);
			ExtractAttribute(fnLambert, "color",		 mat->diffuse);
			ExtractAttribute(fnLambert, "incandescence", mat->incandescence);
			ExtractAttribute(fnLambert, "transparency",  mat->transparency);

			ExtractNormalMap(fnLambert, &mat->normalmapTex);

			switch(itDep.item().apiType()) 
			{
				case MFn::kPhong:
					{
						MFnPhongShader fnPhong( itDep.item() );
						mat->type = MATERIAL_PHONG;
						ExtractAttribute(fnPhong, "specularColor", mat->specular);
						mat->shininess = (float)(fnPhong.cosPower());
					}
					break;
				case MFn::kBlinn:
					{
						MFnBlinnShader fnBlinn( itDep.item() );
						mat->type = MATERIAL_BLINN;
						ExtractAttribute(fnBlinn, "specularColor", mat->specular);
						mat->eccentricity = (float)(fnBlinn.eccentricity()); 
						mat->specularRollOff = (float)(fnBlinn.specularRollOff()); 
					}
					break;
			}

			itDep.next();
			count++;
		}
	}
}
Example #2
0
void TransformExport::Export()
{
	ModelExporter & modelExporter = ModelExporter::GetExporter();

	modelExporter.ResetTimeline();


	MStatus stat;
	MItDependencyNodes itDep(MFn::kTransform,&stat);


	while (!itDep.isDone()) 
	{
		MObject obj = itDep.item();
		MFnTransform transform(obj, &stat);
		err_code(stat);
		
		MString cmd = MString("reference -q -f ") + transform.name();
		MString file_id;
		stat = MGlobal::executeCommand( cmd, file_id );
		if( stat == MS::kSuccess ) 
		{ 
			itDep.next();
			continue;
		}

		MString transformName = transform.name(&stat);
		err_code(stat);
	
		unsigned int parentCount = transform.parentCount(&stat);
		err_code(stat);
		
		unsigned int childCount = transform.childCount(&stat);
		err_code(stat);

		bool doExport = false;
		if (childCount == 0)
		{
			doExport = true; // Tip JOINTS
		}
	
		for (unsigned int child = 0 ; child < childCount ; child++)
		{
			MObject childObj = transform.child(child,&stat);
			err_code(stat);

			MFn::Type childType = childObj.apiType();

			if ( modelExporter.CheckChildType(childType) )				
			{
				doExport = true;
				break;
			}
		}

		if (!doExport)
		{
			itDep.next();
			continue;
		}

		TransformData * pTransformData = new TransformData();
		pTransformData->name = transformName.asChar();

		MObject parentObj = transform.parent(0,&stat);
		MFn::Type parentType = parentObj.apiType();

		if ( modelExporter.CheckParentType(parentType) )
		{
			MFnDagNode parentDagNode(parentObj, &stat);
			MString parentName = parentDagNode.name(&stat);
		
			if (parentName.length() > 0)
				pTransformData->parentName = parentName.asChar();
		}

		if (parentType != MFn::kJoint && obj.apiType() == MFn::kJoint)
		{
			modelExporter.mSkeletonRoot = transform.name().asChar();
		}

		MVector translate = transform.getTranslation(MSpace::kTransform, &stat);
		err_code(stat);

		MVector pivot = transform.rotatePivotTranslation(MSpace::kTransform, &stat);
		err_code(stat);

		pTransformData->tx = (float)translate.x;
		pTransformData->ty = (float)translate.y;
		pTransformData->tz = (float)translate.z;

		pTransformData->px = (float)pivot.x;
		pTransformData->py = (float)pivot.y;
		pTransformData->pz = (float)pivot.z;

		//double rx,ry,rz,rw;
		MQuaternion quat;
		stat = transform.getRotation(quat);
		err_code(stat);

		if (transform.object().hasFn(MFn::kJoint))
		{
			err_code(stat);

			MFnIkJoint joint(transform.object(), &stat);
			err_code(stat);

			MQuaternion RO;
			MQuaternion R;
			MQuaternion JO;
			MQuaternion IS; // We dont have time for this.

			stat = joint.getScaleOrientation(RO);
			err_code(stat);
			stat = joint.getRotation(R); 
			err_code(stat);
			stat = joint.getOrientation(JO); 
			err_code(stat);
						
			quat = RO*R*JO;
		}

		//stat = transform.getRotationQuaternion(rx,ry,rz,rw, MSpace::kTransform);
		//err_code(stat);

		pTransformData->rx = -(float)quat.x;
		pTransformData->ry = -(float)quat.y;
		pTransformData->rz = -(float)quat.z;
		pTransformData->rw = (float)quat.w;

		double scale[3];
		stat = transform.getScale(scale);
		err_code(stat);

		pTransformData->sx = (float)scale[0];
		pTransformData->sy = (float)scale[1];
		pTransformData->sz = (float)scale[2];
		
		pTransformData->index = modelExporter.mTransformCount;
		modelExporter.mSceneTransforms.push_back(pTransformData);

	
		modelExporter.mSceneTransformsTable[transformName.asChar()] = modelExporter.mTransformCount;
		modelExporter.mTransformCount++;
		
		stat = itDep.next();
		err_code(stat);
	}

	
	vector<TransformData*>::iterator nodesIter = modelExporter.mSceneTransforms.begin();

	while (nodesIter != modelExporter.mSceneTransforms.end())
	{
		TransformData * pTransformData = *nodesIter;
		if (pTransformData->parentName.length() > 0)
			pTransformData->parent = modelExporter.mSceneTransformsTable[pTransformData->parentName];
		nodesIter++;
	}
	
	WriteTransforms();
}