From 9f9ce1a8f583fcf35f6723ea59ca76acf84e99dd Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Tue, 10 Mar 2009 00:01:21 +0000 Subject: [PATCH] added maximum depth command-line argument (-d) and scene option (max_depth); prettified elapsed time output when greater than 60 seconds git-svn-id: svn://anubis/fart/trunk@203 7f9b0f55-74a9-4bce-be96-3c2cd072584d --- .todo | 2 -- main/Scene-load.cc | 4 ++++ main/Scene.cc | 4 ++++ main/fart.cc | 29 ++++++++++++++++++++++++++--- parser/nodes.h | 6 ++++++ parser/parser.lex | 1 + parser/parser.yy | 4 ++++ scenes/infinity.fart | 3 ++- 8 files changed, 47 insertions(+), 6 deletions(-) diff --git a/.todo b/.todo index fd5944a..dca8048 100644 --- a/.todo +++ b/.todo @@ -2,5 +2,3 @@ FART To-Do List =============== - Shape definitions / reusability - Add distribution infrastructure -- Add maximum recursion depth option / parameter -- Prettify elapsed time output diff --git a/main/Scene-load.cc b/main/Scene-load.cc index a3a4b77..71ced78 100644 --- a/main/Scene-load.cc +++ b/main/Scene-load.cc @@ -188,6 +188,10 @@ void Scene::processOptions(refptr node) { m_multisample_level = (*it)->getInteger(); } + else if ( typeid(**it) == typeid(MaxDepthNode) ) + { + m_max_depth = (*it)->getInteger(); + } } } diff --git a/main/Scene.cc b/main/Scene.cc index be6be7d..eef9559 100644 --- a/main/Scene.cc +++ b/main/Scene.cc @@ -57,6 +57,10 @@ Scene::Scene(const map & options, { m_output_file_name = it->second; } + else if (it->first == "max-depth") + { + m_max_depth = atoi(it->second); + } else if (it->first == "verbose") { m_verbose = true; diff --git a/main/fart.cc b/main/fart.cc index 5b2aa41..9b2c013 100644 --- a/main/fart.cc +++ b/main/fart.cc @@ -36,11 +36,12 @@ int main(int argc, char * argv[]) { "height", required_argument, NULL, 'h' }, { "multisample", required_argument, NULL, 'm' }, { "field-of-view", required_argument, NULL, 'f' }, + { "max-depth", required_argument, NULL, 'd' }, { "verbose", no_argument, NULL, 'v' }, { NULL, 0, NULL, 0 } }; - while ((opt = getopt_long(argc, argv, "o:w:h:m:f:v", + while ((opt = getopt_long(argc, argv, "o:w:h:m:f:d:v", long_options, &option_index)) != -1) { switch (opt) @@ -63,6 +64,9 @@ int main(int argc, char * argv[]) case 'f': scene_options["field-of-view"] = optarg; break; + case 'd': + scene_options["max-depth"] = optarg; + break; case 'v': scene_options["verbose"] = optarg; break; @@ -87,8 +91,27 @@ int main(int argc, char * argv[]) double time_before = before.tv_sec + before.tv_usec / 1000000.0; double time_after = after.tv_sec + after.tv_usec / 1000000.0; - double diff = time_after - time_before; - cout << "Elapsed time: " << diff << " seconds." << endl; + double total_seconds = time_after - time_before; + cout << "Elapsed time: " << total_seconds << " seconds"; + + double seconds = total_seconds; + int days = (int) (seconds / (60.0 * 60.0 * 24.0)); + seconds -= days * 60.0 * 60.0 * 24.0; + int hours = (int) (seconds / (60.0 * 60.0)); + seconds -= hours * 60.0 * 60.0; + int minutes = (int) (seconds / 60.0); + seconds -= minutes * 60.0; + if (days || hours || minutes) + { + cout << " ("; + if (days) + cout << days << " days, "; + if (days || hours) + cout << hours << " hours, "; + cout << minutes << " minutes, "; + cout << seconds << " seconds)"; + } + cout << endl; return 0; } diff --git a/parser/nodes.h b/parser/nodes.h index 418bd99..b3bf038 100644 --- a/parser/nodes.h +++ b/parser/nodes.h @@ -153,6 +153,12 @@ class MaterialRefNode : public IdentifierNode bool isMaterial() { return true; } }; +class MaxDepthNode : public IntegerNode +{ + public: + MaxDepthNode(int i) : IntegerNode(i) {} +}; + class MultisampleNode : public IntegerNode { public: diff --git a/parser/parser.lex b/parser/parser.lex index 37a2f6d..b32abb0 100644 --- a/parser/parser.lex +++ b/parser/parser.lex @@ -51,6 +51,7 @@ intersect return INTERSECT; light return LIGHT; look_at return LOOKAT; material return MATERIAL; +max_depth return MAXDEPTH; multisample return MULTISAMPLE; options return OPTIONS; plane return PLANE; diff --git a/parser/parser.yy b/parser/parser.yy index a134125..2ef0361 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -70,6 +70,7 @@ static refptr parsed_scene_node; %token LIGHT; %token LOOKAT; %token MATERIAL; +%token MAXDEPTH; %token MULTISAMPLE; %token OPTIONS; %token PLANE; @@ -281,6 +282,9 @@ options_item: WIDTH DEC_NUMBER { | MULTISAMPLE DEC_NUMBER { $$ = new MultisampleNode($2->getInteger()); } + | MAXDEPTH DEC_NUMBER { + $$ = new MaxDepthNode($2->getInteger()); + } ; plane: PLANE LCURLY plane_items RCURLY { diff --git a/scenes/infinity.fart b/scenes/infinity.fart index fece196..891c87d 100644 --- a/scenes/infinity.fart +++ b/scenes/infinity.fart @@ -3,9 +3,10 @@ scene { options { - multisample 3 + multisample 4 width 1024 height 768 + max_depth 15 } camera