bool SGMExporter::ExportPositionKeys(IGameNode *gNode, IGameControl *gControl, BinaryWriter *bw) { if (!gControl ->IsAnimated(IGAME_POS)) { bw ->Write((int)0); return false; } IGameControl::MaxControlType controlType = gControl ->GetControlType(IGAME_POS); IGameKeyTab keys; if (controlType == IGameControl::IGAME_MAXSTD && gControl ->GetTCBKeys(keys, IGAME_POS)) { bw ->Write(keys.Count()); for (int i = 0; i < keys.Count(); i++) { bw ->Write(TicksToSec(keys[i].t)); bw ->Write(keys[i].tcbKey.pval.x); bw ->Write(keys[i].tcbKey.pval.y); bw ->Write(keys[i].tcbKey.pval.z); } return keys.Count() > 0; } else { /*log ->AddLog(sb() + "warning: node '" + gNode ->GetName() + "' doesn't have TCB controller for position, animation won't be exported");*/ bw ->Write((int)0); return false; } }
void MeshExporter::_dumpAnimation(IGameControl * pGameControl, int boneId) { int start = ExportConfig::Instance()->GetFrameRange().x; int end = ExportConfig::Instance()->GetFrameRange().y; start *= GetTicksPerFrame(); end *= GetTicksPerFrame(); if ((pGameControl->IsAnimated(IGAME_POS)) || pGameControl->IsAnimated(IGAME_ROT) || pGameControl->IsAnimated(IGAME_SCALE)) { IGameKeyTab Key; if(pGameControl->GetFullSampledKeys(Key, 1, IGAME_TM, true) ) { SkeletonAnimation * skelAnim = new SkeletonAnimation(boneId); int count = Key.Count(); for(int i=0;i<count;i++) { if (Key[i].t >= start && Key[i].t <= end) { float time = (float)Key[i].t / (float)GetTicksPerFrame() / (float)GetFrameRate(); SkeletonAnimation::KeyFrame * kf = skelAnim->CreateKeyFrame(time); kf->position = Utility::ToFloat3(Key[i].sampleKey.gval.Translation()); kf->rotation = Utility::ToQuat(Key[i].sampleKey.gval.Rotation()); kf->scale = Utility::ToFloat3(Key[i].sampleKey.gval.Scaling()); } } skelAnim->Optimize(); _getAnimation()->AddSkeletonAnimation(skelAnim); } } }
int maxProject2::DoExport(const TCHAR *name,ExpInterface *ei,Interface *i, BOOL suppressPrompts, DWORD options) { //TODO: Implement the actual file Export here and // return TRUE If the file is exported properly AllocConsole(); _cprintf( "Export Begin\n" );//¼ÇµÃ#include <conio.h> IGameConversionManager * cm = GetConversionManager(); cm->SetCoordSystem( IGameConversionManager::IGAME_D3D ); IGameScene* pSce=GetIGameInterface(); pSce->InitialiseIGame(false); pSce->SetStaticFrame(0); int num=pSce->GetTopLevelNodeCount(); // _cprintf("node count %d \n",num); // _cprintf("%s \n",name); TSTR outBuf; int matCount = pSce->GetRootMaterialCount(); // _cprintf("MaterialCount count %d \n",matCount); FILE* file=freopen(name, "w", stdout); if(!file) { return FALSE; } /*cout<<"MatreialRootList Num: "<<matCount<<endl; for(int j =0;j<matCount;j++){ IGameMaterial* rootmat=pSce->GetRootMaterial(j); int num=rootmat->GetSubMaterialCount(); TCHAR* name= rootmat->GetMaterialName(); cout<<"\tMatrial mutiType :"<<rootmat->IsMultiType()<<endl; cout<<"\ttMatreialRoot name : "<<name<<endl; cout<<"\t\tMatreialRoot #"<<j<<" ----SubMatNum : "<<num<<endl; for(int i=0;i<num;i++){ IGameMaterial* submat=rootmat->GetSubMaterial(i); cout<<"\t\tMatrial mutiType"<<submat->IsMultiType()<<endl; cout<<"\t\tSubMatName : "<<submat->GetMaterialName()<<endl; cout<<"\t\tSubMatSubNum : "<<submat->GetSubMaterialCount()<<endl; } }*/ int nodecount=pSce->GetTopLevelNodeCount(); int frame=pSce->GetSceneStartTime(); /* cout<<pSce->GetSceneStartTime()<<endl; cout<<pSce->GetSceneEndTime()<<endl; cout<<GetFrameRate()<<endl;*/ // cout<<"top level node count:"<<nodecount<<endl; for(int i=0;i<nodecount;i++) { IGameNode* topnode=pSce->GetTopLevelNode(i); IGameObject* obj=topnode->GetIGameObject(); // cout<<"\tnode #:"<<i<<endl; if(obj->GetIGameType()==IGameObject::IGAME_BONE) { /* cout<<"\t\t bone"<<endl; IGameSupportObject * hO = (IGameSupportObject*)obj; IGameMesh * hm = hO->GetMeshObject(); if(hm->InitializeData()) { int num = hm->GetNumberOfVerts(); cout<<"\t\t number of vertex : "<<num<<endl; cout<<"\t\t number of texcoord : "<<hm->GetNumberOfTexVerts()<<endl; cout<<"\t\t number of normals : "<<hm->GetNumberOfNormals()<<endl; } if(obj->GetIGameSkin()){ cout<<"\t\tHAS SKIN"<<endl; } */ IGameControl* con=topnode->GetIGameControl(); IGameKeyTab keys; con->get con->GetFullSampledKeys(keys,GetFrameRate(),IGAME_ROT); int num=keys.Count(); _cprintf( "keys count %d \n",keys.Count());//¼ÇµÃ#include <conio.h> // if(num>1) // num=1; for(int i=0;i<num;i++){ Matrix3 t=keys[i].sampleKey.gval.ExtractMatrix3(); _cprintf("\tkey frame time : %d\n",keys[i].t); _cprintf("\tkey frame pos : %d\n",keys[i].t/pSce->GetSceneTicks()); AffineParts ap; float rotAngle; Point3 rotAxis; float scaleAxAngle; Point3 scaleAxis; decomp_affine(t, &ap); // Quaternions are dumped as angle axis. AngAxisFromQ(ap.q, &rotAngle, rotAxis); AngAxisFromQ(ap.u, &scaleAxAngle, scaleAxis); /*_cprintf("\ttrans%f %f %f\n",ap.t.x,ap.t.y,ap.t.z); _cprintf("\trot%f %f %f %f\n",rotAxis.x, rotAxis.y, rotAxis.z, rotAngle); _cprintf("%f %f %f %f %f %f %f\n", ap.k.x, ap.k.y, ap.k.z, scaleAxis.x,scaleAxis.y,scaleAxis.z, scaleAxAngle);*/ } }else if(obj->GetIGameType()==IGameObject::IGAME_MESH){ // cout<<"\t\t mesh"<<endl; IGameMesh * hm = (IGameMesh*)obj; IGameSkin* skin=obj->GetIGameSkin(); /* if(skin){ cout<<"\t\tHAS SKIN"<<endl; if(skin->GetSkinType()== IGameSkin::IGAME_PHYSIQUE) cout<<"\t\t\tPhysique"<<endl; else cout<<"\t\t\tmaxskin"<<endl; int bn=skin->GetNumberOfBones(0); cout<<"\t\t\t number of bones for 0 :"<<skin->GetNumberOfBones(0)<<endl; for(int i=0;i<bn;i++){ cout<<"\t\t\t"<<skin->GetBone(0,i)->GetName()<<endl; cout<<"\t\t\t"<<skin->GetWeight(0,i)<<endl; } cout<<"\t\t\t total number of bones :"<<skin->GetTotalBoneCount()<<endl; }*/ if(hm->InitializeData()) { cout<<"m"<<endl; int num = hm->GetNumberOfVerts(); /* cout<<"\t\t number of vertex : "<<num<<endl; cout<<"\t\t number of texcoord : "<<hm->GetNumberOfTexVerts()<<endl; cout<<"\t\t number of normals : "<<hm->GetNumberOfNormals()<<endl;*/ for(int iv=0;iv<num;iv++){ Point3 v=hm->GetVertex(iv); cout<<"v "<<v.x<<" "<<v.y<<" "<<v.z<<endl; if(skin) { int bonenum=skin->GetNumberOfBones(iv); for(int bi=0;bi<bonenum;bi++) { INode* bone=skin->GetBone(iv,bi); int boneid=skin->GetBoneID(iv,bi); bone->GetNodeTM(0); cout<<"\t bone ID : "<<boneid<<" bone weight : "<<skin->GetWeight(iv,bi)<<endl; } } } cout<<"mi"<<endl; int tn=hm->GetNumberOfFaces(); for(int tv=0;tv<tn;tv++){ FaceEx* f=hm->GetFace(tv); cout<<"i "<<f->vert[0]<<" "<<f->vert[1]<<" "<<f->vert[2]<<endl; } } }else{ // cout<<"\t\t else"<<endl; } } /*if(!suppressPrompts) DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_PANEL), GetActiveWindow(), maxProject2OptionsDlgProc, (LPARAM)this);*/ fclose(file); return TRUE; }
void SGMExporter::CollectProperties(Scene3DMesh *mesh, IGameMesh *gMesh) { IPropertyContainer *propsContainer = gMesh->GetIPropertyContainer(); if (propsContainer == NULL || propsContainer->GetNumberOfProperties() == 0) { Log::LogT("Mesh %s has no properties", mesh->name.c_str()); return; } Log::LogT("properties count: %d", propsContainer->GetNumberOfProperties()); for (int i = 0; i < propsContainer->GetNumberOfProperties(); i++) { IGameProperty *gProp = propsContainer->GetProperty(i); if (gProp == NULL) continue; int propType = gProp->GetType(); std::string propName = StringUtils::ToNarrow(gProp->GetName()); Log::LogT("eporting %s with type %d", propName.c_str(), propType); if (propType == IGAME_UNKNOWN_PROP) { Log::LogT("property %s has unknown type", propName.c_str()); continue; } Property::AnimationType propAnimType = Property::AnimationType_None; Property *prop = NULL; if (!gProp->IsPropAnimated()) { Log::LogT("property %s has no animation", propName.c_str()); prop = new Property(propName, PropTypeConv(propType), Property::AnimationType_None); switch (propType) { case IGAME_FLOAT_PROP: { float val; gProp->GetPropertyValue(val); prop->SetValue(val); } break; case IGAME_INT_PROP: { int val; gProp->GetPropertyValue(val); prop->SetValue(val); } break; case IGAME_POINT3_PROP: { Point3 val; gProp->GetPropertyValue(val); prop->SetValue(sm::Vec3(val.x, val.y, val.z)); } break; } } else { IGameControl *ctrl = gProp->GetIGameControl(); if (ctrl == NULL) { Log::LogT("%s IGameControl is NULL", propName.c_str()); continue; } switch (propType) { case IGAME_FLOAT_PROP: { Control *maxControl = ctrl->GetMaxControl(IGAME_FLOAT); if (maxControl != NULL && maxControl->IsAnimated()) { if (maxControl->ClassID() == Class_ID(LININTERP_FLOAT_CLASS_ID, 0)) { Log::LogT("%s float liniowe scierwo", propName.c_str()); prop = new Property(propName, Property::PropertyType_Float, Property::AnimationType_Linear); IGameKeyTab keys; if (ctrl->GetLinearKeys(keys, IGAME_FLOAT)) { for (int j = 0; j < keys.Count(); j++) { prop->SetValue(keys[j].linearKey.fval, TicksToSec(keys[j].t)); } } } if (maxControl->ClassID() == Class_ID(TCBINTERP_FLOAT_CLASS_ID, 0)) { Log::LogT("%s float tcb scierwo", propName.c_str()); prop = new Property(propName, Property::PropertyType_Float, Property::AnimationType_TCB); IGameKeyTab keys; if (ctrl->GetTCBKeys(keys, IGAME_FLOAT)) { for (int j = 0; j < keys.Count(); j++) { prop->SetValue(keys[j].tcbKey.fval, TicksToSec(keys[j].t)); } } } } } break; case IGAME_INT_PROP: { Control *maxControl = ctrl->GetMaxControl(IGAME_FLOAT); if (maxControl != NULL && maxControl->IsAnimated()) { if (maxControl->ClassID() == Class_ID(LININTERP_FLOAT_CLASS_ID, 0)) { Log::LogT("%s int liniowe scierwo", propName.c_str()); //prop = new Property(propName, Property::PropertyType_Int, Property::AnimationType_Linear); // it should be always state interpolator for int prop = new Property(propName, Property::PropertyType_Int, Property::AnimationType_State); IGameKeyTab keys; if (ctrl->GetLinearKeys(keys, IGAME_FLOAT)) { Log::LogT("eksportowanie %d keyframow", keys.Count()); for (int j = 0; j < keys.Count(); j++) { prop->SetValue((int)keys[j].linearKey.fval, TicksToSec(keys[j].t)); } } } if (maxControl->ClassID() == Class_ID(TCBINTERP_FLOAT_CLASS_ID, 0)) { Log::LogT("%s int tcb scierwo", propName.c_str()); //prop = new Property(propName, Property::PropertyType_Int, Property::AnimationType_TCB); // it should be always state interpolator for int prop = new Property(propName, Property::PropertyType_Int, Property::AnimationType_State); IGameKeyTab keys; if (ctrl->GetTCBKeys(keys, IGAME_FLOAT)) { for (int j = 0; j < keys.Count(); j++) { prop->SetValue((int)keys[j].linearKey.fval, TicksToSec(keys[j].t)); } } } } else { } } break; } } if (prop != NULL) mesh->properties.push_back(prop); } }
void SGMExporter::ExportCam(IGameNode *node, BinaryWriter *bw) { IGameObject *gameObject = node ->GetIGameObject(); assert(gameObject != NULL); if (gameObject ->GetIGameType() == IGameObject::IGAME_CAMERA) { camsCount++; IGameCamera *gameCam = (IGameCamera*)gameObject; bw->Write((int)node->GetNodeID()); bw->Write(StringUtils::ToNarrow(node->GetName())); GMatrix viewMatrix = gameCam->GetIGameObjectTM().Inverse(); SaveMatrix(bw, viewMatrix); IGameProperty *fov = gameCam->GetCameraFOV(); IGameProperty *trgDist = gameCam->GetCameraTargetDist(); IGameProperty *nearClip = gameCam->GetCameraNearClip(); IGameProperty *farClip = gameCam->GetCameraFarClip(); // FOV if (fov != NULL && fov->IsPropAnimated()) { IGameControl *gameCtrl = fov->GetIGameControl(); IGameKeyTab keys; if (gameCtrl->GetTCBKeys(keys, IGAME_FLOAT)) { bw->Write((bool)true); bw->Write(keys.Count()); for (int i = 0; i < keys.Count(); i++) { bw->Write(TicksToSec(keys[i].t)); bw->Write(keys[i].tcbKey.fval); } } else { Log::LogT("warning: node '%s' doesn't have TCB controller for FOV, animation won't be exported", StringUtils::ToNarrow(node->GetName()).c_str()); bw->Write((bool)false); float fovVal; fov->GetPropertyValue(fovVal); bw->Write(fovVal); } } else { bw->Write((bool)false); float fovVal; fov->GetPropertyValue(fovVal); bw->Write(fovVal); } ///////DISTANCE if (trgDist != NULL && trgDist->IsPropAnimated()) { IGameControl *gameCtrl = trgDist->GetIGameControl(); IGameKeyTab keys; if (gameCtrl->GetTCBKeys(keys, IGAME_FLOAT)) { bw->Write((bool)true); bw->Write(keys.Count()); for (int i = 0; i < keys.Count(); i++) { bw->Write(TicksToSec(keys[i].t)); bw->Write(keys[i].tcbKey.fval); } } else { Log::LogT("warning: node '%s' doesn't have TCB controller for target distance, animation won't be exported", StringUtils::ToNarrow(node->GetName()).c_str()); bw->Write((bool)false); float val; trgDist->GetPropertyValue(val); bw->Write(val); } } else { bw->Write((bool)false); float fovVal; //trgDist->GetPropertyValue(fovVal); bw->Write(10.0f); } float nearClipValue; if (nearClip != NULL) nearClip->GetPropertyValue(nearClipValue); else nearClipValue = 0.1f; float farClipValue; if (farClip != NULL) farClip->GetPropertyValue(farClipValue); else farClipValue = 0.1f; bw->Write(nearClipValue); bw->Write(farClipValue); } node ->ReleaseIGameObject(); for (int i = 0; i < node ->GetChildCount(); i++) ExportCam(node ->GetNodeChild(i), bw); }