add gridding option

This commit is contained in:
cxgeorge 2001-05-14 23:11:45 +00:00
parent 57b4db99c5
commit 88e4c65bc9
1 changed files with 87 additions and 14 deletions

View File

@ -977,14 +977,30 @@ int framework_main(int argc, char *argv[]) {
typedef vector<Filename> Files;
Files files;
Files grided_files;
if (first_init != NULL)
first_init();
for (int a = 1; a < argc; a++)
Files *pFileCollection = &files;
int gridrepeats=1;
for (int a = 1; a < argc; a++) {
if ((argv[a] != (char*)0L) && ((argv[a])[0] != '-') &&
((argv[a])[0] != '+') && ((argv[a])[0] != '#'))
files.push_back(Filename::from_os_specific(argv[a]));
pFileCollection->push_back(Filename::from_os_specific(argv[a]));
else if((argv[a])[1]=='g') {
pFileCollection = &grided_files;
char *pStr=(argv[a])+2;
if(*pStr!=NULL) {
gridrepeats=atoi(pStr);
if(gridrepeats<1)
gridrepeats=1;
}
}
}
// load display modules
GraphicsPipe::resolve_modules();
@ -1124,7 +1140,7 @@ int framework_main(int argc, char *argv[]) {
root = new NamedNode("root");
first_arc = new RenderRelation(render, root, 100);
if (files.empty() && framework.GetBool("have-omnitriangle", true)) {
if (files.empty() && grided_files.empty() && framework.GetBool("have-omnitriangle", true)) {
// The user did not specify a model file to load. Create some
// default geometry.
@ -1169,10 +1185,9 @@ int framework_main(int argc, char *argv[]) {
// Load up some geometry from one or more files.
DSearchPath local_path(".");
Files::const_iterator fi;
for (fi = files.begin();
fi != files.end();
++fi) {
for (fi = files.begin(); fi != files.end(); ++fi) {
Filename filename = (*fi);
// First, we always try to resolve a filename from the current
@ -1183,19 +1198,77 @@ int framework_main(int argc, char *argv[]) {
PT_Node node = loader.load_sync(filename);
if (node == (Node *)NULL) {
framework_cat.error()
<< "Unable to load file " << filename << "\n";
} else {
new RenderRelation(root, node);
}
}
framework_cat.error() << "Unable to load file " << filename << "\n";
continue;
}
RenderRelation *pArc = new RenderRelation(root, node);
}
if(!grided_files.empty()) {
int grided_files_size = grided_files.size();
PT_Node *pNodeArr = new PT_Node[grided_files.size()];
int i=0;
for (fi = grided_files.begin(); fi != grided_files.end(); (++fi),i++) {
Filename filename = (*fi);
filename.resolve_filename(local_path);
pNodeArr[i] = loader.load_sync(filename);
if (pNodeArr[i] == (Node *)NULL) {
framework_cat.error() << "Unable to load file " << filename << "\n";
i--;
grided_files_size--;
continue;
}
}
#define GRIDCELLSIZE 5.0
int gridwidth=1;
while(gridwidth*gridwidth < grided_files_size*gridrepeats) {
gridwidth++;
}
float xpos= -gridwidth*GRIDCELLSIZE/2.0;
float ypos = xpos;
int filenum=0;
for(int passnum=0;passnum<gridrepeats;passnum++) {
for (i = 0; i < grided_files_size; i++) {
PT_Node pNodePtr=pNodeArr[i];
if(passnum>0) {
// cant directly instance characters due to LOD problems,
// must copy using copy_subgraph for now
pNodePtr = pNodeArr[i]->copy_subgraph(RenderRelation::get_class_type());
}
RenderRelation *pArc = new RenderRelation(root, pNodePtr);
pArc->set_transition(
new TransformTransition
(LMatrix4f::translate_mat(LVector3f(xpos, ypos, 0.0))));
if(((filenum+1) % gridwidth) == 0) {
xpos= -gridwidth*GRIDCELLSIZE/2.0;
ypos+=GRIDCELLSIZE;
} else {
xpos+=GRIDCELLSIZE;
}
}
}
delete [] pNodeArr;
}
// If we happened to load up both a character file and its
// matching animation file, attempt to bind them together now.
AnimControlCollection anim_controls;
auto_bind(root, anim_controls, ~0);
// And start looping any animations we successfully bound.
anim_controls.loop_all(true);
// Now prepare all the textures with the GSG.