/* Build our triangle mesh from recorded RBFs */ void build_mesh(void) { int nrbfs = 0, nmigs = 0; double best2 = M_PI*M_PI; RBFNODE *shrt_edj[2]; RBFNODE *rbf0, *rbf1; const MIGRATION *ej; /* average specular peak */ comp_bsdf_spec(); /* add normal if needed */ check_normal_incidence(); /* check if isotropic */ if (single_plane_incident) { for (rbf0 = dsf_list; rbf0 != NULL; rbf0 = rbf0->next) if (rbf0->next != NULL) create_migration(rbf0, rbf0->next); await_children(nchild); return; } shrt_edj[0] = shrt_edj[1] = NULL; /* start w/ shortest edge */ for (rbf0 = dsf_list; rbf0 != NULL; rbf0 = rbf0->next) { for (rbf1 = rbf0->next; rbf1 != NULL; rbf1 = rbf1->next) { double dist2 = 2. - 2.*DOT(rbf0->invec,rbf1->invec); if (dist2 < best2) { shrt_edj[0] = rbf0; shrt_edj[1] = rbf1; best2 = dist2; } } ++nrbfs; } if (shrt_edj[0] == NULL) { fprintf(stderr, "%s: Cannot find shortest edge\n", progname); exit(1); } /* build mesh from this edge */ if (shrt_edj[0]->ord < shrt_edj[1]->ord) mesh_from_edge(create_migration(shrt_edj[0], shrt_edj[1])); else mesh_from_edge(create_migration(shrt_edj[1], shrt_edj[0])); /* count up edges */ for (ej = mig_list; ej != NULL; ej = ej->next) ++nmigs; if (nmigs < nrbfs-1) /* did meshing fail? */ fprintf(stderr, "%s: warning - %d incident directions but only %d interpolant(s)\n", progname, nrbfs, nmigs); /* complete migrations */ await_children(nchild); }
/* Build our triangle mesh from recorded RBFs */ void build_mesh(void) { double best2 = M_PI*M_PI; RBFNODE *shrt_edj[2]; RBFNODE *rbf0, *rbf1; /* average specular peak */ comp_bsdf_spec(); /* add normal if needed */ check_normal_incidence(); /* check if isotropic */ if (single_plane_incident) { for (rbf0 = dsf_list; rbf0 != NULL; rbf0 = rbf0->next) if (rbf0->next != NULL) create_migration(rbf0, rbf0->next); await_children(nchild); return; } shrt_edj[0] = shrt_edj[1] = NULL; /* start w/ shortest edge */ for (rbf0 = dsf_list; rbf0 != NULL; rbf0 = rbf0->next) for (rbf1 = rbf0->next; rbf1 != NULL; rbf1 = rbf1->next) { double dist2 = 2. - 2.*DOT(rbf0->invec,rbf1->invec); if (dist2 < best2) { shrt_edj[0] = rbf0; shrt_edj[1] = rbf1; best2 = dist2; } } if (shrt_edj[0] == NULL) { fprintf(stderr, "%s: Cannot find shortest edge\n", progname); exit(1); } /* build mesh from this edge */ if (shrt_edj[0]->ord < shrt_edj[1]->ord) mesh_from_edge(create_migration(shrt_edj[0], shrt_edj[1])); else mesh_from_edge(create_migration(shrt_edj[1], shrt_edj[0])); /* complete migrations */ await_children(nchild); }