--- ray/src/rt/renderopts.c 2022/10/19 21:25:20 2.19 +++ ray/src/rt/renderopts.c 2025/04/22 18:08:48 2.28 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: renderopts.c,v 2.19 2022/10/19 21:25:20 greg Exp $"; +static const char RCSid[] = "$Id: renderopts.c,v 2.28 2025/04/22 18:08:48 greg Exp $"; #endif /* * renderopts.c - process common rendering options @@ -10,19 +10,23 @@ static const char RCSid[] = "$Id: renderopts.c,v 2.19 #include "copyright.h" #include "ray.h" +#include "func.h" #include "paths.h" #include "pmapopt.h" extern char *progname; /* global argv[0] */ char RFeatureList[2048] = /* newline-separated feature list */ - "AdaptiveShadowTesting\nVirtualSources\nSecondarySources\n" - "SourceSubsampling\nSourceVisibility\nAmbientModifierSelection\n" - "PathTracing\nBackFaceVisibility\nRussianRoulette\nLowDiscrepancySeq\n" - "SpecularSampling\nMaterialMixtures\nAntimatter\n" - "ParticipatingMedia=Mist\nScatteringModels=WGMD,Ashikhmin-Shirley\n" + "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 @@ -72,9 +76,13 @@ match_subfeatures( /* check if subfeatures are support while (*reqs && (*cp = *reqs++) != ',') cp++; *cp = '\0'; - n = cp - subfeat; - if (!(cp = strstr(mysublist, subfeat)) || - (cp[n] != ',') & (cp[n] != '\n')) + 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 */ @@ -306,6 +314,31 @@ getrenderopt( /* get next render option */ return(1); } break; + case 'f': /* .cal file */ + check(2,"s"); + loadfunc(av[1]); + return(1); + case 'e': /* .cal expression */ + check(2,"s"); + if (!strchr(av[1], '=') && !strchr(av[1], ':')) + break; + scompile(av[1], NULL, 0); + return(1); +#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 */ @@ -353,6 +386,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);