ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cv/bsdfrep.c
(Generate patch)

Comparing ray/src/cv/bsdfrep.c (file contents):
Revision 2.1 by greg, Fri Oct 19 04:14:29 2012 UTC vs.
Revision 2.2 by greg, Sat Oct 20 07:02:00 2012 UTC

# Line 9 | Line 9 | static const char RCSid[] = "$Id$";
9  
10   #define _USE_MATH_DEFINES
11   #include <stdlib.h>
12 + #include <string.h>
13   #include <math.h>
14   #include "rtio.h"
15   #include "resolu.h"
# Line 341 | Line 342 | save_bsdf_rep(FILE *ofp)
342          MIGRATION       *mig;
343          int             i, n;
344                                          /* finish header */
345 +        fprintf(ofp, "SYMMETRY=%d\n", !single_plane_incident * inp_coverage);
346 +        fprintf(ofp, "IO_SIDES= %d %d\n", input_orient, output_orient);
347          fputformat(BSDFREP_FMT, ofp);
348          fputc('\n', ofp);
349                                          /* write each DSF */
# Line 360 | Line 363 | save_bsdf_rep(FILE *ofp)
363          }
364          putint(-1, 4, ofp);             /* terminator */
365                                          /* write each migration matrix */
366 <        for (mig = mig_list; mig != NULL; mig = mig_list->next) {
366 >        for (mig = mig_list; mig != NULL; mig = mig->next) {
367 >                int     zerocnt = 0;
368                  putint(mig->rbfv[0]->ord, 4, ofp);
369                  putint(mig->rbfv[1]->ord, 4, ofp);
370 +                                        /* write out as sparse data */
371                  n = mtx_nrows(mig) * mtx_ncols(mig);
372 <                for (i = 0; i < n; i++)
373 <                        putflt(mig->mtx[i], ofp);
372 >                for (i = 0; i < n; i++) {
373 >                        if (zerocnt >= 0xff) {
374 >                                putint(zerocnt, 1, ofp); zerocnt = 0;
375 >                        }
376 >                        if (mig->mtx[i] != 0) {
377 >                                putint(zerocnt, 1, ofp); zerocnt = 0;
378 >                                putflt(mig->mtx[i], ofp);
379 >                        } else
380 >                                ++zerocnt;
381 >                }
382 >                putint(zerocnt, 1, ofp);
383          }
384          putint(-1, 4, ofp);             /* terminator */
385          putint(-1, 4, ofp);
# Line 376 | Line 390 | save_bsdf_rep(FILE *ofp)
390          }
391   }
392  
393 + /* Check header line for critical information */
394 + static int
395 + headline(char *s, void *p)
396 + {
397 +        char    fmt[32];
398 +
399 +        if (!strncmp(s, "SYMMETRY=", 9)) {
400 +                inp_coverage = atoi(s+9);
401 +                single_plane_incident = !inp_coverage;
402 +                return(0);
403 +        }
404 +        if (!strncmp(s, "IO_SIDES=", 9)) {
405 +                sscanf(s+9, "%d %d", &input_orient, &output_orient);
406 +                return(0);
407 +        }
408 +        if (formatval(fmt, s) && strcmp(fmt, BSDFREP_FMT))
409 +                return(-1);
410 +        return(0);
411 + }
412 +
413   /* Read a BSDF mesh interpolant from the given binary stream */
414   int
415   load_bsdf_rep(FILE *ifp)
# Line 391 | Line 425 | load_bsdf_rep(FILE *ifp)
425                  return(0);
426          }
427   #endif
428 <        if (checkheader(ifp, BSDFREP_FMT, NULL) <= 0) {
428 >        input_orient = output_orient = 0;
429 >        single_plane_incident = -1;
430 >        if (getheader(ifp, headline, NULL) < 0 || single_plane_incident < 0 |
431 >                        !input_orient | !output_orient) {
432                  fprintf(stderr, "%s: missing/bad format for BSDF interpolant\n",
433                                  progname);
434                  return(0);
# Line 447 | Line 484 | load_bsdf_rep(FILE *ifp)
484                          goto memerr;
485                  newmig->rbfv[0] = from_rbf;
486                  newmig->rbfv[1] = to_rbf;
487 <                                        /* read matrix coefficients */
488 <                for (i = 0; i < n; i++)
489 <                        newmig->mtx[i] = getflt(ifp);
487 >                memset(newmig->mtx, 0, sizeof(float)*n);
488 >                for (i = 0; ; ) {       /* read sparse data */
489 >                        int     zc = getint(1, ifp) & 0xff;
490 >                        if (zc == 0xff) {
491 >                                i += 0xff;
492 >                                continue;
493 >                        }
494 >                        if ((i += zc) >= n)
495 >                                break;
496 >                        newmig->mtx[i++] = getflt(ifp);
497 >                }
498                  if (feof(ifp))
499                          goto badEOF;
500                                          /* insert in edge lists */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines