--- ray/src/rt/renderopts.c 2016/03/21 19:06:08 2.18 +++ ray/src/rt/renderopts.c 2024/04/05 17:55:25 2.26 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: renderopts.c,v 2.18 2016/03/21 19:06:08 greg Exp $"; +static const char RCSid[] = "$Id: renderopts.c,v 2.26 2024/04/05 17:55:25 greg Exp $"; #endif /* * renderopts.c - process common rendering options @@ -13,8 +13,113 @@ static const char RCSid[] = "$Id: renderopts.c,v 2.18 #include "paths.h" #include "pmapopt.h" +extern char *progname; /* global argv[0] */ +char RFeatureList[2048] = /* newline-separated feature list */ + "VirtualSources\nSecondarySources\nSourceSubsampling\n" + "SourceVisibility\nAmbientModifierSelection\n" + "PathTracing\nRussianRoulette\nLowDiscrepancySeq\n" + "SpecularSampling\nMaterialMixtures\nAntimatter\nBackFaceVisibility\n" + "ScatteringModels=WGMD,Ashikhmin-Shirley\n" + "TabulatedBSDFs=DataFile,KlemsXML,TensorTreeXML,+ViewPeakExtraction\n" + "Instancing=Octree,TriangleMesh\nAliases\n" +#if MAXCSAMP>3 + "Hyperspectral\n" +#endif +#if !defined(SHADCACHE) || SHADCACHE > 0 + "ShadowCache\n" +#endif +#ifdef DISPERSE + "DielectricDispersion\n" +#endif +/* PMAP_FEATURES XXX @Roland: need to define this in pmapopt.h */ +; + + +static char * +get_feature( /* find a specific feature (with optional sublist) */ + const char *feat +) +{ + char *cp = RFeatureList; + int n = 0; + + while ((feat[n] != '\0') & (feat[n] != '=')) + n++; + if (!n) + return(NULL); + while (*cp) { + if (!strncmp(cp, feat, n) && (cp[n] == '\n') | !feat[n] | (cp[n] == feat[n])) + return(cp); + while (*cp++ != '\n') + ; + } + return(NULL); +} + + +static int +match_subfeatures( /* check if subfeatures are supported */ + char *mysublist, + char *reqs +) +{ + if (mysublist) + mysublist = strchr(mysublist, '='); + if (!mysublist++ | !reqs) + return(0); /* not a feature list */ + while (*reqs) { /* check each of their subfeature requests */ + char subfeat[64]; + char *cp = subfeat; + int n; + while (*reqs && (*cp = *reqs++) != ',') + cp++; + *cp = '\0'; + if (!(n = cp - subfeat)) + continue; /* empty subfeature */ + for (cp = mysublist; (cp = strstr(cp, subfeat)) != NULL; cp++) + if ((cp[-1] == ',') | (cp[-1] == '=') && + (cp[n] == ',') | (cp[n] == '\n')) + break; /* match */ + if (!cp) + return(0); /* missing this one! */ + } + return(1); /* matched them all */ +} + + int +feature_status( /* report active feature list / check specifics */ + int ac, + char *av[] +) +{ + if (ac <= 0) /* report entire list? */ + fputs(RFeatureList, stdout); + + for ( ; ac-- > 0; av++) { /* check each argument */ + char *cp; + if (!*av[0]) continue; + if ((cp = strchr(av[0], '=')) != NULL) { + if (!match_subfeatures(get_feature(av[0]), cp+1)) + goto missing_feature; + } else if ((cp = get_feature(av[0])) != NULL) { + char *tp = strchr(cp, '='); + if (tp && tp < strchr(cp, '\n')) + do + fputc(*cp, stdout); + while (*cp++ != '\n'); + } else + goto missing_feature; + } + return(0); /* return satisfactory status */ +missing_feature: /* or report error */ + fprintf(stderr, "%s: missing feature - %s\n", progname, av[0]); + return(1); +} + + +int getrenderopt( /* get next render option */ int ac, char *av[] @@ -208,6 +313,21 @@ getrenderopt( /* get next render option */ return(1); } break; +#if MAXCSAMP>3 + case 'c': /* spectral sampling */ + switch (av[0][2]) { + case 's': /* spectral bin count */ + check(3,"i"); + NCSAMP = atoi(av[1]); + return(1); + case 'w': /* wavelength extrema */ + check(3,"ff"); + WLPART[0] = atof(av[1]); + WLPART[3] = atof(av[2]); + return(2); + } + break; +#endif } /* PMAP: Parse photon mapping options */ @@ -255,6 +375,11 @@ print_rdefaults(void) /* print default render values colval(salbedo,GRN), colval(salbedo,BLU)); printf("-mg %f\t\t\t# mist scattering eccentricity\n", seccg); printf("-ms %f\t\t\t# mist sampling distance\n", ssampdist); + if (NCSAMP > 3) { + printf("-cs %-2d\t\t\t\t# number of spectral bins\n", NCSAMP); + printf("-cw %3.0f %3.0f\t\t\t# wavelength limits (nm)\n", + WLPART[3], WLPART[0]); + } printf("-lr %-9d\t\t\t# limit reflection%s\n", maxdepth, maxdepth<=0 ? " (Russian roulette)" : ""); printf("-lw %.2e\t\t\t# limit weight\n", minweight);