From eb4b3404aa00220d659e532151dab13d642c17a3 Mon Sep 17 00:00:00 2001 From: Svxy Date: Wed, 31 May 2023 17:31:32 -0400 Subject: Released --- tools/DSGmaker/dsgmaker.cpp | 807 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 807 insertions(+) create mode 100644 tools/DSGmaker/dsgmaker.cpp (limited to 'tools/DSGmaker/dsgmaker.cpp') diff --git a/tools/DSGmaker/dsgmaker.cpp b/tools/DSGmaker/dsgmaker.cpp new file mode 100644 index 0000000..9624e04 --- /dev/null +++ b/tools/DSGmaker/dsgmaker.cpp @@ -0,0 +1,807 @@ +//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: "<