--- ray/src/rt/rxtmain.cpp 2023/08/21 22:39:05 2.1 +++ ray/src/rt/rxtmain.cpp 2025/04/22 17:12:25 2.13 @@ -1,8 +1,8 @@ #ifndef lint -static const char RCSid[] = "$Id: rxtmain.cpp,v 2.1 2023/08/21 22:39:05 greg Exp $"; +static const char RCSid[] = "$Id: rxtmain.cpp,v 2.13 2025/04/22 17:12:25 greg Exp $"; #endif /* - * rtmain.c - main for rtrace per-ray calculation program + * rxtmain.cpp - main for per-ray calculation program */ #include "copyright.h" @@ -12,6 +12,7 @@ static const char RCSid[] = "$Id: rxtmain.cpp,v 2.1 20 #include "rtprocess.h" /* getpid() */ #include "platform.h" #include "RtraceSimulManager.h" +#include "func.h" extern char *progname; /* global argv[0] */ @@ -43,14 +44,20 @@ extern void tranotify(OBJECT obj); char *tralist[MAXMODLIST]; /* list of modifers to trace (or no) */ int traincl = -1; /* include == 1, exclude == 0 */ +double (*sens_curve)(const SCOLOR scol) = NULL; /* spectral conversion for 1-channel */ +double out_scalefactor = 1; /* output calibration scale factor */ +RGBPRIMP out_prims = stdprims; /* output color primitives (NULL if spectral) */ +static RGBPRIMS our_prims; /* private output color primitives */ + static void onsig(int signo); static void sigdie(int signo, const char *msg); static void printdefaults(void); -#define RATRACE_FEATURES "IrradianceCalc\nIrradianceCalc\nDistanceLimiting\n" \ - "HessianAmbientCache\nAmbientAveraging\n" \ - "AmbientValueSharing\nAdaptiveShadowTesting\n" \ - "Outputs=o,d,v,V,w,W,l,L,c,p,n,N,s,m,M,r,x,R,X,~\n" +#define RXTRACE_FEATURES "IrradianceCalc\nMultiprocessing\nDistanceLimiting\n" \ + "HessianAmbientCache\nAmbientAveraging\n" \ + "AmbientValueSharing\nAdaptiveShadowTesting\n" \ + "Outputs=o,d,v,V,w,W,l,L,c,p,n,N,s,m,M,r,x,R,X,~\n" \ + "OutputCS=RGB,XYZ,Y,S,M,prims,spec\n" int main(int argc, char *argv[]) @@ -69,11 +76,13 @@ main(int argc, char *argv[]) int rval; int i; /* global program name */ - progname = argv[0] = fixargv0(argv[0]); + progname = argv[0]; /* feature check only? */ - strcat(RFeatureList, RATRACE_FEATURES); + strcat(RFeatureList, RXTRACE_FEATURES); if (argc > 1 && !strcmp(argv[1], "-features")) return feature_status(argc-2, argv+2); + /* initialize calcomp routines */ + initfunc(); /* add trace notify function */ for (i = 0; addobjnotify[i] != NULL; i++) ; @@ -107,8 +116,6 @@ main(int argc, char *argv[]) case 'n': /* number of cores */ check(2,"i"); nproc = atoi(argv[++i]); - if (nproc < 0) - error(USER, "bad number of processes"); break; case 'x': /* x resolution */ check(2,"i"); @@ -138,7 +145,7 @@ main(int argc, char *argv[]) break; case 'I': /* immed. irradiance */ rval = myRTmanager.rtFlags & RTimmIrrad; - check_bool(3,rval); + check_bool(2,rval); if (rval) myRTmanager.rtFlags |= RTimmIrrad; else myRTmanager.rtFlags &= ~RTimmIrrad; break; @@ -223,10 +230,89 @@ main(int argc, char *argv[]) goto badopt; } break; + case 'p': /* value output */ + switch (argv[i][2]) { + case 'R': /* standard RGB output */ + if (strcmp(argv[i]+2, "RGB")) + goto badopt; + out_prims = stdprims; + out_scalefactor = 1; + sens_curve = NULL; + break; + case 'X': /* XYZ output */ + if (strcmp(argv[i]+2, "XYZ")) + goto badopt; + out_prims = xyzprims; + out_scalefactor = WHTEFFICACY; + sens_curve = NULL; + break; + case 'c': { + int j; + check(3,"ffffffff"); + rval = 0; + for (j = 0; j < 8; j++) { + our_prims[0][j] = atof(argv[++i]); + rval |= fabs(our_prims[0][j]-stdprims[0][j]) > .001; + } + if (rval) { + if (!colorprimsOK(our_prims)) + error(USER, "illegal primary chromaticities"); + out_prims = our_prims; + } else + out_prims = stdprims; + out_scalefactor = 1; + sens_curve = NULL; + } break; + case 'Y': /* photopic response */ + if (argv[i][3]) + goto badopt; + sens_curve = scolor_photopic; + out_scalefactor = WHTEFFICACY; + break; + case 'S': /* scotopic response */ + if (argv[i][3]) + goto badopt; + sens_curve = scolor_scotopic; + out_scalefactor = WHTSCOTOPIC; + break; + case 'M': /* melanopic response */ + if (argv[i][3]) + goto badopt; + sens_curve = scolor_melanopic; + out_scalefactor = WHTMELANOPIC; + break; + default: + goto badopt; + } + break; +#if MAXCSAMP>3 + case 'c': /* output spectral results */ + if (argv[i][2] != 'o') + goto badopt; + rval = (out_prims == NULL) & (sens_curve == NULL); + check_bool(3,rval); + if (rval) { + out_prims = NULL; + sens_curve = NULL; + } else if (out_prims == NULL) + out_prims = stdprims; + break; +#endif default: goto badopt; } } + /* set/check spectral sampling */ + rval = setspectrsamp(CNDX, WLPART); + if (rval < 0) + error(USER, "unsupported spectral sampling"); + if (sens_curve != NULL) + out_prims = NULL; + else if (out_prims != NULL) { + if (!rval) + error(WARNING, "spectral range incompatible with color output"); + } else if (NCSAMP == 3) + out_prims = stdprims; /* 3 samples do not a spectrum make */ /* set up signal handling */ sigdie(SIGINT, "Interrupt"); #ifdef SIGHUP @@ -270,20 +356,21 @@ main(int argc, char *argv[]) if (outform != 'a') SET_FILE_BINARY(stdout); if (doheader) { /* print header? */ - static char fmt[] = OCTFMT; - FILE * octfp = fopen(argv[i], "rb"); - if (checkheader(octfp, fmt, stdout) < 0) - error(USER, "bad octree header"); - fclose(octfp); + newheader("RADIANCE", stdout); + fputs(myRTmanager.GetHeadStr(), stdout); printargs(i, argv, stdout); printf("SOFTWARE= %s\n", VersionID); fputnow(stdout); if (rval > 0) /* saved from setrtoutput() call */ - printf("NCOMP=%d\n", rval); + fputncomp(rval, stdout); + if (NCSAMP > 3) + fputwlsplit(WLPART, stdout); + if ((out_prims != stdprims) & (out_prims != NULL)) + fputprims(out_prims, stdout); if ((outform == 'f') | (outform == 'd')) fputendian(stdout); fputformat(formstr(outform), stdout); - putchar('\n'); + fputc('\n', stdout); /* end of header */ } rtrace(NULL, nproc); /* trace rays */ quit(0); /* clean up & exit */ @@ -309,7 +396,7 @@ wputs( /* warning output function */ void eputs( /* put string to stderr */ - char *s + const char *s ) { static int midline = 0; @@ -400,6 +487,25 @@ printdefaults(void) /* print default values to stdou case '~': printf(" tilde"); break; } putchar('\n'); + if (sens_curve == scolor_photopic) + printf("-pY\t\t\t\t# photopic output\n"); + else if (sens_curve == scolor_scotopic) + printf("-pS\t\t\t\t# scotopic output\n"); + else if (sens_curve == scolor_melanopic) + printf("-pM\t\t\t\t# melanopic output\n"); + else if (out_prims == stdprims) + printf("-pRGB\t\t\t\t# standard RGB color output\n"); + else if (out_prims == xyzprims) + printf("-pXYZ\t\t\t\t# CIE XYZ color output\n"); + else if (out_prims != NULL) + printf("-pc %.4f %.4f %.4f %.4f %.4f %.4f %.4f %.4f\t# output color primaries and white point\n", + out_prims[RED][0], out_prims[RED][1], + out_prims[GRN][0], out_prims[GRN][1], + out_prims[BLU][0], out_prims[BLU][1], + out_prims[WHT][0], out_prims[WHT][1]); + if ((sens_curve == NULL) & (NCSAMP > 3)) + printf(out_prims != NULL ? "-co-\t\t\t\t# output tristimulus colors\n" : + "-co+\t\t\t\t# output spectral values\n"); printf(erract[WARNING].pf != NULL ? "-w+\t\t\t\t# warning messages on\n" : "-w-\t\t\t\t# warning messages off\n");