//DSGmaker a tool to traverse the the inventory of a Pure3d file and creates //DSGchucks and bundles mesh,phys,BV,instance chunk together. Supports multiple objects in a file. #pragma warning(disable:4786) #include #include #include #include #include <..\..\..\tools\artchecker\artobject.h> #include <..\..\..\tools\artchecker\artlimits.h> #include <..\..\..\tools\artchecker\badlist.hpp> #include <..\..\..\tools\artchecker\outputbuffer.hpp> #include #include #include #include #include <..\constants\srrchunks.h> #include <..\..\..\tools\dsgmaker\DSGList.hpp> using namespace std; //function that strips all the extra crap(prefixes and appended junk) //and returns actual object name in output pointer. unsigned int rootname(const char* input,char* output); int main(int argc, char* argv[]) { //char* arguements [4]; char* filename; char querybuffer [1000]; bool badart = false; bool showall= false; Result::iterator sql_iterator; DSGList* p_dsglist =new DSGList(); bool mbIgnoreMissingInstanceChunk = false; tlDataChunk::RegisterDefaultChunks(); //processes arguements //no options if (argc ==1) { cout<<"Usage:Dsgmaker filename \n"; exit (1); } filename= argv[1]; if ( argc ==3) { if (strcmp( argv[2],"-nI") == 0) { mbIgnoreMissingInstanceChunk = true; //printf("Ignoring Missing Chunks!\n"); } else { printf("Error: unknown arguement %s \n",argv[2]); } } /* for (i=2;iSubChunkCount(); ch++) { // create the next sub-chunk tlDataChunk* sub = inchunk->GetSubChunk(ch); // look at the id of the subchunk to decide if we // want to do something with it or not switch(sub->ID()) { case Pure3D::Mesh::MESH: { //printf("\n"); tlMeshChunk* p_mesh = (tlMeshChunk* ) sub; char mesh_name[max_length]; //get object name and remove extra appended crap ::rootname(p_mesh->GetName(),mesh_name); //query ArtDB for info on this mesh sprintf(querybuffer, "SELECT * FROM objects WHERE name = '%s' ",mesh_name); query<< querybuffer; Result myresult = query.store ( ); //check results, //if not found in ArtDB make it a into a StaticEntityDSG as a default. if (myresult.size ( ) ==0 ) { //create StaticEntityDSG chunk and append mesh printf("%s : Mesh not found in ArtDB creating EntityDSGChunk !\n",mesh_name); tlEntityDSGChunk* p_entitydsg =new tlEntityDSGChunk(); p_entitydsg->SetName(p_mesh->GetName()); p_entitydsg->AppendSubChunk(sub,FALSE); outchunk->AppendSubChunk(p_entitydsg,FALSE); } // its found in the ArtDB, need to determine what kind of DSG to make. else { for (sql_iterator=myresult.begin ( ); sql_iterator!= myresult.end ( ); sql_iterator++) { row =*sql_iterator; char classtypeID [max_length]; strcpy(classtypeID, row["ClassType"]); printf("Found %s meshchunk \n",p_mesh->GetName()); //printf("Classtype ID: %s \n",classtypeID); //make the correct DSG chunktype if ( (strcmp(classtypeID,"PROP_MOVEABLE")==0) || (strcmp(classtypeID,"PROP_BREAKABLE")==0) || (strcmp(classtypeID,"PROP_ONETIME_MOVEABLE")==0) ) { printf(" %s is of type %s creating DynaPhysDSGChunk \n",mesh_name,classtypeID); tlDynaPhysDSGChunk* p_dynaphysdsg =new tlDynaPhysDSGChunk (); p_dynaphysdsg->SetName(p_mesh->GetName()); p_dynaphysdsg->AppendSubChunk(sub,FALSE); outchunk->AppendSubChunk(p_dynaphysdsg,FALSE); p_dsglist->AddDSG(p_dynaphysdsg); //printf(" Finished making chunk\n"); } else if (strcmp(classtypeID,"PROP_STATIC")==0) { printf(" %s is of type %s creating InstaStaticPhysDSGChunk \n",mesh_name,classtypeID); tlInstaStaticPhysDSGChunk* p_instaphysdsg =new tlInstaStaticPhysDSGChunk (); p_instaphysdsg->SetName(p_mesh->GetName()); p_instaphysdsg->AppendSubChunk(sub,FALSE); outchunk->AppendSubChunk(p_instaphysdsg,FALSE); p_dsglist->AddDSG(p_instaphysdsg); } else if (strcmp(classtypeID,"PROP_DRAWABLE")==0) { printf(" %s is of type %s creating InstaEntityDSGChunk \n",mesh_name,classtypeID); tlInstaEntityDSGChunk* p_instaentitydsg =new tlInstaEntityDSGChunk(); p_instaentitydsg->SetName(p_mesh->GetName()); p_instaentitydsg->AppendSubChunk(sub,FALSE); outchunk->AppendSubChunk(p_instaentitydsg,FALSE); p_dsglist->AddDSG(p_instaentitydsg); } else if (strcmp(classtypeID,"STATIC")==0) { printf(" %s is of type %s creating EntityDSGChunk \n",mesh_name,classtypeID); tlEntityDSGChunk* p_entitydsg =new tlEntityDSGChunk(); p_entitydsg->SetName(p_mesh->GetName()); p_entitydsg->AppendSubChunk(sub,FALSE); outchunk->AppendSubChunk(p_entitydsg,FALSE); } else if (strcmp(classtypeID,"DRAWABLE")==0) { printf(" %s is of type %s creating EntityDSGChunk \n",mesh_name,classtypeID); tlEntityDSGChunk* p_entitydsg =new tlEntityDSGChunk(); p_entitydsg->SetName(p_mesh->GetName()); p_entitydsg->AppendSubChunk(sub,FALSE); outchunk->AppendSubChunk(p_entitydsg,FALSE); } else if (strcmp(classtypeID,"ANIMATED_BV")==0) { printf(" %s is of type %s creating AnimatedBvDSGChunk \n",mesh_name,classtypeID); //Need to finalize class specs with Greg, Devin and Trav TBD still //tlDynaPhysDSGChunk* p_dynaphysdsg =new tlDynaPhysDSGChunk (); //p_dynaphysdsg->SetName(p_mesh->GetName()); //p_dynaphysdsg->AppendSubChunk(sub,FALSE); outchunk->AppendSubChunk(sub,FALSE); } else { printf("\n===================================================\n"); printf("\n=\tError unknown %s ClasstypeID \n",classtypeID); printf("\n===================================================\n"); } }//end for loop }//end else //printf("exiting Mesh case\n"); break; } case Simulation::Physics::OBJECT: { tlPhysicsObjectChunk *p_physobject = (tlPhysicsObjectChunk*) sub; tlDataChunk* p_dsg=NULL; char name[max_length]; ::rootname(p_physobject->GetName(),name); printf("\n"); printf("Phys Chunk: %s \n",p_physobject->GetName()); p_dsg =p_dsglist->GetDSG(p_physobject->GetName()); if( p_dsg ==NULL) { badart=true; printf("\n===================================================\n"); printf("\n=\tERROR: Cant find Parent DSG for %s, This Physics Volume is MISSING its mesh!!\n",p_physobject->GetName()); printf("\n===================================================\n"); } else { printf(" Found the parent for %s\n",p_physobject->GetName()); p_dsg->AppendSubChunk(sub,FALSE); } break; } case Simulation::Collision::OBJECT: { //printf("entering Collision object \n"); //temp local variables tlCollisionObjectChunk* p_collisionobject= (tlCollisionObjectChunk*)sub; bv_data bv_object; tlDataChunk* p_dsg=NULL; char sound [64] ="nosound"; //default vaule bool errors =false; char querybuffer [1000]; ::rootname(p_collisionobject->GetName(),bv_object.name); printf("\n"); printf("BV name: %s \t ",p_collisionobject->GetName()); //seting default vaules, 7 is the default for staticphysDSG's, //and physprop 0 is bogus vaule and should get filled in if BV object is know in the artdb. bv_object.classtype=7; bv_object.physpropid=0; sprintf(querybuffer, "SELECT * FROM objects WHERE name = '%s' ",bv_object.name); query<< querybuffer; Result myresult= query.store ( ); // cout << "Records Found: " << myresult.size() << endl ; for (sql_iterator=myresult.begin ( ); sql_iterator!= myresult.end ( ); sql_iterator++) { row =*sql_iterator; char classtypeID [max_length]; strcpy(classtypeID, row["ClassType"]); bv_object.physpropid=row["physpropid"]; strcpy(sound,row["Sound"]); //make the correct DSG chunktype if (strcmp(classtypeID,"PROP_MOVEABLE")==0) { printf(" %s is of type %s Setting Classtype to 3\n",bv_object.name,classtypeID); bv_object.classtype=3; } else if (strcmp(classtypeID,"PROP_BREAKABLE")==0) { printf(" %s is of type %s Setting Classtype to 4\n",bv_object.name,classtypeID); bv_object.classtype=4; } else if (strcmp(classtypeID,"PROP_STATIC")==0) { printf(" %s is of type %s Setting Classtype to 2\n",bv_object.name,classtypeID); bv_object.classtype=2; } else if (strcmp(classtypeID,"DRAWABLE")==0) { printf(" %s is of type %s ERROR Drawable Objects DO NOT HAVE BV'S!!!\n",bv_object.name,classtypeID); badart=true; } else if (strcmp(classtypeID,"PROP_DRAWABLE")==0) { printf(" %s is of type %s ERROR PROP_DRAWABLE Objects DO NOT HAVE BV'S!!!\n",bv_object.name,classtypeID); badart=true; } else if (strcmp(classtypeID,"ANIMATED_BV")==0) { printf(" %s is of type %s Setting Classtype to 5\n",bv_object.name,classtypeID); bv_object.classtype=5; } else if (strcmp(classtypeID,"STATIC")==0) { printf(" %s is of type %s Setting Classtype to 2\n",bv_object.name,classtypeID); bv_object.classtype=7; } else if (strcmp (classtypeID,"PROP_ONETIME_MOVEABLE")==0) { printf(" %s is of type %s Setting Classtype to 10\n",bv_object.name,classtypeID); bv_object.classtype=10; } }//end for iterator loop //creating object attribute chunk tlObjectAttributeChunk* p_otc =new tlObjectAttributeChunk (); p_otc->SetClassType(bv_object.classtype); p_otc->SetPhyPropID(bv_object.physpropid); p_otc->SetSound(sound); //if object is a static then create a StaticPhysDSGChunk if(bv_object.classtype == 7) { tlStaticPhysDSGChunk* p_statdsg =new tlStaticPhysDSGChunk (); p_statdsg->AppendSubChunk(sub,FALSE); p_statdsg->AppendSubChunk(p_otc); p_statdsg->SetName(p_collisionobject->GetName()); outchunk->AppendSubChunk(p_statdsg,FALSE); } //otherwise find the Parent DSG and add OTC and else { //printf(" Need to find Parent DSG \n"); // find the parent DynaDSG object p_dsg=p_dsglist->GetDSG(p_collisionobject->GetName()); if(p_dsg ==NULL) { printf("\n===================================================\n"); printf("\n=\tERROR: Cant Find Parent DSG for %s, This Bounding Volume is MISSING its Mesh!! \n",p_collisionobject->GetName()); printf("\n===================================================\n"); badart=true; } else { printf(" Found the parent for %s\n",p_collisionobject->GetName()); p_dsg->AppendSubChunk(p_otc,FALSE); p_dsg->AppendSubChunk(sub,FALSE); } } //printf("exiting collision\n"); break; } case SRR2::ChunkID::ANIM_DSG_WRAPPER: { bv_data bv_object; char sound[64] = "nosound"; //setting default vaule char chunkname [64]; //tlAnimDSGWrapperChunk* p_animwrapper = dynamic_cast(sub); printf("Found %s AnimWrapperChunk \n",sub->GetName()); ::rootname(sub->GetName(),chunkname); //query ArtDB for info on this instanced Animated object sprintf(querybuffer, "SELECT * FROM objects WHERE name = '%s' ",chunkname); query<< querybuffer; Result myresult = query.store ( ); //check if animwrapper found in artDB if (myresult.size ( ) ==0 ) { //object not found in the art db printf(" ERROR: Object not found in the artDB,Skipping InstAnimDSGChuck Creation!\n"); break; } //getting the phys properties for (sql_iterator=myresult.begin ( ); sql_iterator!= myresult.end ( ); sql_iterator++) { row =*sql_iterator; //set classtype to prop_breakable bv_object.classtype =4; bv_object.physpropid=row["physpropid"]; strcpy(sound,row["Sound"]); } printf(" %s is of type InstaAnimDynaPhysDSG creating InstaEntityDSGChunk \n",sub->GetName()); //create InstaAnimDSGChunk and OTC tlInstAnimDynaPhysDSGChunk* p_instanimdsg = new tlInstAnimDynaPhysDSGChunk (); tlObjectAttributeChunk* p_otc = new tlObjectAttributeChunk (); //fill in data for the newly created chunks p_instanimdsg->SetName(sub->GetName()); p_otc->SetClassType(bv_object.classtype); p_otc->SetPhyPropID(bv_object.physpropid); p_otc->SetSound(sound); //append chunks into the InstaAnimDynaPhysDSGChunk p_instanimdsg->AppendSubChunk(sub,FALSE); p_instanimdsg->AppendSubChunk(p_otc,FALSE); //append InstaAnimDynaPhysDSGChunk to the outchunk outchunk->AppendSubChunk(p_instanimdsg,FALSE); p_dsglist->AddDSG(p_instanimdsg); break; } case SRR2::ChunkID::ANIM_OBJ_DSG_WRAPPER: { bv_data bv_object; char sound[64] = "nosound"; //setting default vaule char chunkname [64]; //tlAnimDSGWrapperChunk* p_animwrapper = dynamic_cast(sub); printf("Found %s AnimObjWrapperChunk \n",sub->GetName()); ::rootname(sub->GetName(),chunkname); //query ArtDB for info on this instanced Animated object sprintf(querybuffer, "SELECT * FROM objects WHERE name = '%s' ",chunkname); query<< querybuffer; Result myresult = query.store ( ); //check if animobjwrapper found in artDB if (myresult.size ( ) ==0 ) { //object not found in the art db printf(" ERROR: Object not found in the artDB,Skipping InstAnimDSGChuck Creation!\n"); break; } //getting the phys properties for (sql_iterator=myresult.begin ( ); sql_iterator!= myresult.end ( ); sql_iterator++) { row =*sql_iterator; char classtypeID [max_length]; strcpy(classtypeID, row["ClassType"]); bv_object.physpropid=row["physpropid"]; strcpy(sound,row["Sound"]); strcpy(bv_object.name,sub->GetName()); //set the correct classtypeID if (strcmp(classtypeID,"PROP_MOVEABLE")==0) { printf(" %s is of type %s Setting Classtype to 3\n",bv_object.name,classtypeID); bv_object.classtype=3; } else if (strcmp(classtypeID,"PROP_BREAKABLE")==0) { printf(" %s is of type %s Setting Classtype to 4\n",bv_object.name,classtypeID); bv_object.classtype=4; } else if (strcmp(classtypeID,"PROP_STATIC")==0) { printf(" %s is of type %s Setting Classtype to 2\n",bv_object.name,classtypeID); bv_object.classtype=2; } else if (strcmp(classtypeID,"DRAWABLE")==0) { printf(" %s is of type %s ERROR Drawable Objects DO NOT HAVE BV'S!!!\n",bv_object.name,classtypeID); badart=true; } else if (strcmp(classtypeID,"PROP_DRAWABLE")==0) { printf(" %s is of type %s ERROR PROP_DRAWABLE Objects DO NOT HAVE BV'S!!!\n",bv_object.name,classtypeID); badart=true; } else if (strcmp(classtypeID,"ANIMATED_BV")==0) { printf(" %s is of type %s Setting Classtype to 5\n",bv_object.name,classtypeID); bv_object.classtype=5; } else if (strcmp(classtypeID,"STATIC")==0) { printf(" %s is of type %s Setting Classtype to 2\n",bv_object.name,classtypeID); bv_object.classtype=7; } else if (strcmp(classtypeID,"PROP_ANIM_BREAKABLE")==0) { printf(" %s is of type %s Setting Classtype to 9 \n",bv_object.name,classtypeID); bv_object.classtype=9; } else if (strcmp(classtypeID,"PROP_ONETIME_MOVEABLE")==0) { printf(" %s is of type %s Setting Classtype to 10\n",bv_object.name,classtypeID); bv_object.classtype=10; } }//end for loop printf(" %s is of type InstaAnimDynaPhysDSG creating InstaAnimDynaPhysDSGChunk \n",sub->GetName()); //create InstaAnimDSGChunk and OTC tlInstAnimDynaPhysDSGChunk* p_instanimdsg = new tlInstAnimDynaPhysDSGChunk (); tlObjectAttributeChunk* p_otc = new tlObjectAttributeChunk (); //fill in data for the newly created chunks p_instanimdsg->SetName(sub->GetName()); p_otc->SetClassType(bv_object.classtype); p_otc->SetPhyPropID(bv_object.physpropid); p_otc->SetSound(sound); //append chunks into the InstaAnimDynaPhysDSGChunk p_instanimdsg->AppendSubChunk(sub,FALSE); p_instanimdsg->AppendSubChunk(p_otc,FALSE); //append InstaAnimDynaPhysDSGChunk to the outchunk outchunk->AppendSubChunk(p_instanimdsg,FALSE); p_dsglist->AddDSG(p_instanimdsg); break; } case SRR2::ChunkID::INSTANCES: { tlDataChunk* p_dsg=NULL; tlDataChunk* subchunk= sub->GetSubChunk(0); tlScenegraphChunk* p_scenegraphchunk= dynamic_cast(subchunk); printf("\n"); printf("Found %s instance chunk,looking for Parent DSG.\n",p_scenegraphchunk->GetName()); p_dsg=p_dsglist->GetDSG(p_scenegraphchunk->GetName()); if(p_dsg ==NULL) { printf("\n===================================================\n"); printf("\n=\tERROR: Cant Find Parent DSG Chunk for %s, SceneGraph is MISSING its Mesh!! \n",p_scenegraphchunk->GetName()); printf("\n===================================================\n"); badart=true; } else { printf(" Found the parent for %s\n",p_scenegraphchunk->GetName()); p_dsg->AppendSubChunk(sub,FALSE); } break; } default: { // this is not a chunk that we care about // so simply copy it to the output wrapper chunk // the optional parameter to AppendSubChunk // indicates that we have merely copied a pointer // so the destructor of outchunk should not // destroy this sub-chunk as that duty will be // taken care of by the destructor of inchunk outchunk->AppendSubChunk(sub,FALSE); break; } }//end switch }//end for p_dsglist->ReSortDSGChunks(); if ( mbIgnoreMissingInstanceChunk == true) { p_dsglist->mbNoInstanceChunks = true; //printf("Ignore chunk is set!\n"); } if(p_dsglist->VerifyChunks() == 1) { badart=true; } } //end of try catch (BadQuery er) { cout<<"Error: " <Write(&output); */ delete inchunk; delete outchunk; delete p_dsglist; return 1; } else { printf("\n=======================================================\n"); printf("\n=\tDSGmaker: Completed without ERRORS \n"); printf("\n=======================================================\n"); // create the new output file tlFile output(new tlFileByteStream(filename, omWRITE), tlFile::CHUNK32); if(!output.IsOpen()) { printf("Could not open %s for writing\n", filename); exit(-1); } // get the output wrapper chunk to write its data out // to the file outchunk->Write(&output); // cleanup the no-longer-needed chunks delete inchunk; delete outchunk; delete p_dsglist; return 0; } } //end of main /********************************************************************/ /* Helper Function to strip extra crap from the string */ /********************************************************************/ unsigned int rootname(const char * input,char* output) { char source_name[max_length]; char object_name1[max_length]; char object_name2[max_length]; char* token =NULL; //printf("Phase 1 get name \n"); //get the name of collision object strcpy(source_name,input); //cout<<"Source name: "<