--- ray/src/rt/renderopts.c 2024/04/05 17:52:20 2.25 +++ ray/src/rt/renderopts.c 2025/04/22 17:12:25 2.27 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: renderopts.c,v 2.25 2024/04/05 17:52:20 greg Exp $"; +static const char RCSid[] = "$Id: renderopts.c,v 2.27 2025/04/22 17:12:25 greg Exp $"; #endif /* * renderopts.c - process common rendering options @@ -10,6 +10,7 @@ static const char RCSid[] = "$Id: renderopts.c,v 2.25 #include "copyright.h" #include "ray.h" +#include "func.h" #include "paths.h" #include "pmapopt.h" @@ -75,7 +76,8 @@ match_subfeatures( /* check if subfeatures are support while (*reqs && (*cp = *reqs++) != ',') cp++; *cp = '\0'; - n = cp - subfeat; + 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')) @@ -312,6 +314,20 @@ getrenderopt( /* get next render option */ return(1); } break; + case 'f': /* .cal file */ + if (av[0][2]) + break; + check(2,"s"); + loadfunc(av[1]); + return(1); + case 'e': /* .cal expression */ + if (av[0][2]) + break; + 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]) {