# HG changeset patch # User John Tsiombikas # Date 1401323704 -10800 # Node ID 11cdaa510201a86b2b89d18b251d9ff34db1bd76 # Parent e49f4d7ad04c3f38ec4a96aee13e8f67f785545b added -brdf arguments in scene construction commands diff -r e49f4d7ad04c -r 11cdaa510201 liberebus/src/scene.cc --- a/liberebus/src/scene.cc Wed May 28 07:06:29 2014 +0300 +++ b/liberebus/src/scene.cc Thu May 29 03:35:04 2014 +0300 @@ -130,7 +130,7 @@ bool Scene::load(FILE *fp) { - char buf[256]; + static char buf[256]; while(fgets(buf, sizeof buf, fp)) { char *line = strip_wspace(buf); @@ -172,6 +172,67 @@ return nelem; } +static int parse_brdf(char **argv, Reflectance **brdf_ptr) +{ + CompositeRefl *composite = 0; + Reflectance *brdf = 0; + float weight = 1.0; + int i; + + for(i=0; argv[i]; i++) { + if(strcmp(argv[i], "-brdf") == 0) { + if(strcmp(argv[++i], "lambert") == 0) { + if(composite && brdf) { + composite->add_brdf(brdf, weight); + } + brdf = new LambertRefl; + if(!composite) break; + + } else if(strcmp(argv[i], "mirror") == 0) { + if(composite && brdf) { + composite->add_brdf(brdf, weight); + } + brdf = new MirrorRefl; + if(!composite) break; + + } else if(strcmp(argv[i], "composite") == 0) { + if(composite) { + fprintf(stderr, "can't have nested composite BRDFs\n"); + return -1; + } + composite = new CompositeRefl; + + } else { + --i; + break; + } + + } else if(strcmp(argv[i], "-brdf-weight") == 0) { + if(!composite) { + fprintf(stderr, "-brdf-weight is invalid without a composite brdf\n"); + return -1; + } + char *endp; + weight = strtod(argv[++i], &endp); + if(endp == argv[i]) { + fprintf(stderr, "-brdf-weight must be followed by a number\n"); + return -1; + } + } else { + --i; + break; + } + } + + if(composite && brdf) { + composite->add_brdf(brdf, weight); + *brdf_ptr = composite; + } else { + *brdf_ptr = brdf; + } + return i; +} + static SceneNode *proc_object(Object *obj, int argc, char **argv) { float vec[4]; @@ -243,6 +304,13 @@ i += nelem; gobj->mtl.set_attrib("emissive", emissive); + } else if(strcmp(argv[i], "-brdf") == 0) { + int nelem = parse_brdf(argv + i, &gobj->brdf); + if(nelem == -1) { + goto err; + } + i += nelem; + } else { fprintf(stderr, "unrecognized %s option: %s\n", argv[0], argv[i]); goto err; diff -r e49f4d7ad04c -r 11cdaa510201 test/scene --- a/test/scene Wed May 28 07:06:29 2014 +0300 +++ b/test/scene Thu May 29 03:35:04 2014 +0300 @@ -1,7 +1,8 @@ # test scene sphere -position 0 0 0 -scaling 1 1 1 -diffuse 1 0.5 0.4 -box -position 0 -1.25 0 -scaling 4 0.5 4 -diffuse 0.3 0.4 1.0 + +box -position 0 -1.25 0 -scaling 4 0.5 4 -diffuse 0.3 0.4 1.0 -brdf composite -brdf lambert -brdf-weight 0.5 -brdf mirror -brdf-weight 0.5 box -position 0 5 0 -scaling 3 0.1 3 -emissive 5 5 5