[brlcad-commits] CVS: brlcad/src/liboptical sh_light.c, 14.27, 14.28
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: Sean M. <br...@us...> - 2007-08-16 07:44:11
|
Update of /cvsroot/brlcad/brlcad/src/liboptical In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv31200 Modified Files: sh_light.c Log Message: aha, finally realized what is going awry... since the samples were previously already allocated to the hard-coded max, the sample generator just used the slots as needed, keeping track of them with lt_pt_count as new ones were needed. what that means, though, is that we need to ensure an allocation before ALL of the places that lt_pt_count is incremented since that is when we need/make a new point. this (finally) fixes the crashes I was seeing when multiple shadow rays were requested and it actually makes sense why. .. and now users can actually request ten thousand shadow rays if they really want it, and it'll actually work Index: sh_light.c =================================================================== RCS file: /cvsroot/brlcad/brlcad/src/liboptical/sh_light.c,v retrieving revision 14.27 retrieving revision 14.28 diff -w -u -r14.27 -r14.28 --- sh_light.c 10 Jul 2007 02:17:32 -0000 14.27 +++ sh_light.c 16 Aug 2007 07:44:13 -0000 14.28 @@ -199,23 +199,16 @@ } } - /** - * allocate a set of light point samples + * ensure that there are sufficient light samples, allocate more if + * necessary in batches. */ HIDDEN void -light_pt_set(register const struct bu_structparse *sdp, register const char *name, char *base, const char *value) - /* structure description */ - /* struct member name */ - /* begining of structure */ - /* string containing value */ +light_pt_allocate(register struct light_specific *lsp) { - struct light_specific *lsp = (struct light_specific *)base; - fastf_t *p = (fastf_t *)(base+sdp->sp_offset); - /* make sure we have enough room, allocate in batches of SOME_LIGHT_SAMPLES */ if ( lsp->lt_pt_count % SOME_LIGHT_SAMPLES == 0) { - if (lsp->lt_pt_count == 0) { + if (lsp->lt_pt_count < 1) { /* assumes initialized to NULL */ if (lsp->lt_sample_pts) { bu_free(lsp->lt_sample_pts, "free light samples array"); @@ -225,6 +218,22 @@ lsp->lt_sample_pts = (struct light_pt *)bu_realloc(lsp->lt_sample_pts, (lsp->lt_pt_count + SOME_LIGHT_SAMPLES) * sizeof(struct light_pt), "reallocate light sample points"); } } +} + + +/** + * create a set of light point samples for specified pt/pn arguments + * (for points and points with normals respectively) + */ +HIDDEN void +light_pt_set(register const struct bu_structparse *sdp, register const char *name, char *base, const char *value) + /* structure description */ + /* struct member name */ + /* begining of structure */ + /* string containing value */ +{ + struct light_specific *lsp = (struct light_specific *)base; + fastf_t *p = (fastf_t *)(base+sdp->sp_offset); if (! strcmp("pt", name) ) { /* user just specified point, set normal to zeros */ @@ -234,6 +243,7 @@ return; } + light_pt_allocate(lsp); memcpy( &lsp->lt_sample_pts[ lsp->lt_pt_count++ ], p, sizeof( struct light_pt ) ); if (rdebug & RDEBUG_LIGHT ) { @@ -402,6 +412,7 @@ * light will be emitted in this direction */ if (&lsp->lt_sample_pts) { + light_pt_allocate(lsp); lpt = &lsp->lt_sample_pts[lsp->lt_pt_count++]; } else { /* no sample points? */ @@ -440,6 +451,7 @@ * will be emitted in this direction */ if (&lsp->lt_sample_pts) { + light_pt_allocate(lsp); lpt = &lsp->lt_sample_pts[lsp->lt_pt_count++]; } else { /* no sample points? */ @@ -524,7 +536,6 @@ } while ( lsp->lt_pt_count < SOME_LIGHT_SAMPLES ) { - ray_setup(&ap, tree_min, tree_max, span); (void)rt_shootray( &ap ); } |