ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/pmapdata.h
Revision: 2.8
Committed: Tue Aug 18 18:45:55 2015 UTC (8 years, 9 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.7: +2 -1 lines
Log Message:
Added missing RCSid forgotten during initial check-in

File Contents

# User Rev Content
1 greg 2.8 /* RCSid $Id$ */
2 greg 2.1 /*
3     ==================================================================
4     Photon map data structures and kd-tree handling
5    
6     Roland Schregle (roland.schregle@{hslu.ch, gmail.com})
7     (c) Fraunhofer Institute for Solar Energy Systems,
8 rschregle 2.2 (c) Lucerne University of Applied Sciences and Arts,
9     supported by the Swiss National Science Foundation (SNSF, #147053)
10 greg 2.1 ==================================================================
11    
12 greg 2.8 $Id: pmapdata.h,v 2.7 2015/07/29 18:54:20 rschregle Exp $
13 greg 2.1 */
14    
15    
16     #ifndef PMAPDATA_H
17     #define PMAPDATA_H
18    
19     #include "ray.h"
20     #include "pmaptype.h"
21     #include "lookup.h"
22    
23    
24     /* Define PMAP_FLOAT_FLUX to store photon flux as floats instead of
25     * compact RGBE, which was found to improve accuracy in analytical
26     * validation. */
27     #ifdef PMAP_FLOAT_FLUX
28     #define setPhotonFlux(p,f) copycolor((p) -> flux, f)
29     #define getPhotonFlux(p,f) copycolor(f, (p) -> flux)
30     #else
31     #define setPhotonFlux(p,f) setcolr((p)->flux, (f)[0], (f)[1], (f)[2])
32     #define getPhotonFlux(p,f) colr_color(f, (p) -> flux)
33     #endif
34    
35    
36     /* Primary photon ray for light source contributions */
37     typedef struct {
38 greg 2.6 int32 srcIdx; /* Index of emitting light source */
39 greg 2.5 int32 dir; /* Encoded ray direction */
40     float pos [3]; /* Hit point */
41 greg 2.1 } PhotonPrimary;
42    
43     #define photonSrcIdx(pm, p) ((pm) -> primary [(p) -> primary].srcIdx)
44    
45    
46     typedef struct {
47     float pos [3]; /* Photon position */
48     signed char norm [3]; /* Surface normal at pos (incident
49     direction for volume photons) */
50     char flags; /* Bit 0-1: kd-tree discriminator axis,
51     Bit 2: caustic photon */
52     #ifdef PMAP_FLOAT_FLUX
53     COLOR flux;
54     #else
55     COLR flux; /* Photon flux */
56     #endif
57    
58 greg 2.4 uint32 primary; /* Index to primary ray */
59 greg 2.1 } Photon;
60    
61     /* Photon flag bitmasks and manipulation macros */
62     #define PMAP_DISCR_BIT 3
63     #define PMAP_CAUST_BIT 4
64     #define photonDiscr(p) ((p).flags & PMAP_DISCR_BIT)
65     #define setPhotonDiscr(p, d) ((p).flags = ((p).flags & ~PMAP_DISCR_BIT) | \
66     ((d) & PMAP_DISCR_BIT))
67    
68     /* Photon map type tests */
69     #define isGlobalPmap(p) ((p) -> type == PMAP_TYPE_GLOBAL)
70     #define isCausticPmap(p) ((p) -> type == PMAP_TYPE_CAUSTIC)
71     #define isContribPmap(p) ((p) -> type == PMAP_TYPE_CONTRIB)
72     #define isVolumePmap(p) ((p) -> type == PMAP_TYPE_VOLUME)
73    
74    
75     /* Queue node for photon lookups */
76     typedef struct {
77     Photon *photon;
78     float dist;
79     } PhotonSQNode;
80    
81     /* Bias compensation history node */
82     typedef struct {
83     COLOR irrad;
84     float weight;
85     } PhotonBCNode;
86    
87    
88     struct PhotonMap; /* Forward declarations */
89    
90     typedef struct PhotonMap {
91     PhotonMapType type; /* See pmaptype.h */
92     char *fileName; /* Photon map file */
93     Photon *heap; /* Photon k-d tree as linear array */
94     PhotonSQNode *squeue; /* Search queue */
95     PhotonBCNode *biasCompHist; /* Bias compensation history */
96     char lookupFlags; /* Flags passed to findPhotons() */
97    
98     unsigned long distribTarget, /* Num stored specified by user */
99     heapSize,
100     heapSizeInc,
101     heapEnd, /* Num actually stored in heap */
102     numDensity, /* Num density estimates */
103     totalGathered, /* Total photons gathered */
104     numLookups, /* Counters for short photon lookups */
105     numShortLookups;
106    
107     unsigned minGather, /* Specified min/max photons per */
108     maxGather, /* density estimate */
109     squeueSize,
110     squeueEnd,
111     minGathered, /* Min/max photons actually gathered */
112     maxGathered, /* per density estimate */
113     shortLookupPct; /* Percentage of short lookups (for
114     statistics output */
115    
116     /* NOTE: All distances are SQUARED */
117     float maxDist, /* Max search radius during NN search */
118     maxDist0, /* Initial value for above */
119     maxDistLimit, /* Hard limit for above */
120     CoGdist, /* Avg distance to centre of gravity */
121     maxPos [3], minPos [3], /* Max & min photon positions */
122     distribRatio, /* Probability of photon storage */
123     gatherTolerance, /* Fractional deviation from minGather/
124     maxGather for short lookup */
125     minError, maxError, /* Min/max/rms density estimate error */
126     rmsError;
127    
128     FVECT CoG; /* Centre of gravity (avg photon pos) */
129     COLOR photonFlux; /* Average photon flux */
130     unsigned short randState [3]; /* Local RNG state */
131    
132     void (*lookup)(struct PhotonMap*, RAY*, COLOR);
133     /* Callback for type-specific photon
134     * lookup (usually density estimate) */
135    
136     PhotonPrimary *primary; /* Primary photon rays & associated
137     counters */
138     unsigned primarySize, primaryEnd;
139    
140     LUTAB *srcContrib; /* lookup table for source contribs */
141     } PhotonMap;
142    
143    
144    
145     /* Photon maps by type (see PhotonMapType) */
146     extern PhotonMap *photonMaps [];
147    
148     /* Macros for specific photon map types */
149     #define globalPmap (photonMaps [PMAP_TYPE_GLOBAL])
150     #define preCompPmap (photonMaps [PMAP_TYPE_PRECOMP])
151     #define causticPmap (photonMaps [PMAP_TYPE_CAUSTIC])
152     #define volumePmap (photonMaps [PMAP_TYPE_VOLUME])
153     #define directPmap (photonMaps [PMAP_TYPE_DIRECT])
154     #define contribPmap (photonMaps [PMAP_TYPE_CONTRIB])
155    
156    
157    
158     void initPhotonMap (PhotonMap *pmap, PhotonMapType t);
159     /* Initialise empty photon map of specified type */
160    
161     const PhotonPrimary* addPhotonPrimary (PhotonMap *pmap, const RAY *ray);
162     /* Add primary ray for emitted photon and save light source index, origin
163     * on source, and emitted direction; used by contrib photons */
164    
165     const Photon* addPhoton (PhotonMap *pmap, const RAY *ray);
166     /* Create new photon with ray's direction, intersection point, and flux,
167     and add to photon map subject to acceptance probability pmap ->
168     distribRatio for global density control; if the photon is rejected,
169     NULL is returned. The flux is scaled by ray -> rweight and
170     1 / pmap -> distribRatio. */
171    
172     void balancePhotons (PhotonMap *pmap, double *photonFlux);
173     /* Build a balanced kd-tree as heap to guarantee logarithmic search
174     * times. This must be called prior to performing photon search with
175     * findPhotons().
176     * PhotonFlux is the flux scaling factor per photon averaged over RGB. In
177     * the case of a contribution photon map, this is an array with a
178     * separate factor specific to each light source due to non-uniform
179     * photon emission; Otherwise it is referenced as a scalar value. Flux is
180     * not scaled if photonFlux == NULL. */
181    
182     void buildHeap (Photon *heap, unsigned long *heapIdx,
183     unsigned long *heapXdi, const float min [3],
184     const float max [3], unsigned long left,
185     unsigned long right, unsigned long root);
186     /* Recursive part of balancePhotons(..); builds heap from subarray
187     * defined by indices left and right. */
188    
189     void findPhotons (PhotonMap* pmap, const RAY *ray);
190     /* Find pmap -> squeueSize closest photons to ray -> rop with similar
191     normal. For volume photons ray -> rorg is used and the normal is
192     ignored (being the incident direction in this case). Found photons
193     are placed in pmap -> squeue, with pmap -> squeueEnd being the number
194     actually found. */
195    
196     Photon *find1Photon (PhotonMap *pmap, const RAY *ray);
197     /* Finds single closest photon to ray -> rop with similar normal.
198     Returns NULL if none found. */
199    
200     void deletePhotons (PhotonMap*);
201     /* Free dem mammaries... */
202    
203     #endif