Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /branches/lamont/src/include/Diderot/grid.h
ViewVC logotype

Annotation of /branches/lamont/src/include/Diderot/grid.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2162 - (view) (download) (as text)

1 : lamonts 2083 /*! \file grid.h
2 :     *
3 :     * \author Lamont Samuels
4 :     *
5 : lamonts 2162 * This is includes the structure of the uniform grid on the CPU and functions for calculating cell indicies for strand positions.
6 : lamonts 2083 */
7 :    
8 :     /*
9 :     * COPYRIGHT (c) 2010 The Diderot Project (http://diderot-language.cs.uchicago.edu)
10 :     * All rights reserved.
11 :     */
12 :    
13 :     #ifndef _GRID_H_
14 :     #define _GRID_H_
15 :    
16 :     #ifndef _DIDEROT_TYPES_H_
17 :     #include "Diderot/types.h"
18 :     #endif
19 :    
20 :     #define UMAD(a, b, c) ( (a) * (b) + (c) )
21 :    
22 : lamonts 2162 #define XMIN 0
23 :     #define XMAX 1
24 :     #define YMIN 2
25 :     #define YMAX 3
26 :    
27 : lamonts 2083 //StrandItem_t -> Strand Id linked list node
28 :     typedef struct strandItem{
29 :     uint32_t strandId; //the unique identification number for a strand
30 :     struct strandItem * next; //the next strand item in the list
31 : lamonts 2160 struct strandItem * prev; //the previous strand item in the list
32 : lamonts 2083 }StrandItem_t;
33 :    
34 :     //GridContext -> Information about the grid
35 : lamonts 2093 typedef struct GridCtx2D {
36 : lamonts 2162 Diderot_vec2_t * gridSize; // the size(s) of the spatial grid structure
37 :     uint32_t numberOfStrands; // The nuber of strands in execution
38 :     Diderot_vec2_t * cellSize; // The size of each cell in the grid
39 :     Diderot_vec4_t * window; // The window dimensions (XMin,XMax,YMin,YMax)
40 :     StrandItem_t ** grid; // the number of strands in each grid cell.
41 : lamonts 2093 } GridContext2D;
42 : lamonts 2083
43 : lamonts 2093 typedef struct GridCtx3D {
44 : lamonts 2162 Diderot_vec3_t * gridSize; // the size(s) of the spatial grid structure
45 :     uint32_t numberOfStrands; // The nuber of strands in execution
46 :     Diderot_vec3_t * cellSize; // The size of each cell in the grid
47 :     Diderot_vec6_t * window; // The window dimensions (XMin,XMax,YMin,YMax,ZMin,ZMax)
48 :     StrandItem_t ** grid; // the number of strands in each grid cell.
49 : lamonts 2093 } GridContext3D;
50 : lamonts 2083
51 : lamonts 2093
52 :    
53 : lamonts 2162
54 : lamonts 2093 STATIC_INLINE bool isWithinRadius2D( Diderot_vec2_t particle, Diderot_vec2_t neighbor, int radius) {
55 : lamonts 2083 return dist2(particle,neighbor) <= radius;
56 : lamonts 2093 }
57 :     STATIC_INLINE bool isWithinRadius3D( Diderot_vec3_t particle, Diderot_vec3_t neighbor, int radius) {
58 :     return dist3(particle,neighbor) <= radius;
59 :     }
60 : lamonts 2083
61 : lamonts 2093 STATIC_INLINE Diderot_int_t clamp_int(Diderot_int_t x, Diderot_int_t a, Diderot_int_t b)
62 : lamonts 2083 {
63 : lamonts 2162 return x < a ? (a + 1) : (x > b ? (b + 1) : x);
64 : lamonts 2083 }
65 : lamonts 2162 STATIC_INLINE Diderot_ivec2_t clampToGrid2D(GridContext2D * ctx, Diderot_ivec2_t cell) {
66 : lamonts 2083
67 : lamonts 2162 Diderot_iunion2_t u;
68 :     u.v = cell;
69 :    
70 :     Diderot_union2_t v;
71 :     v.v = *(ctx->gridSize);
72 : lamonts 2083
73 : lamonts 2162 return vec2i(clamp_int(u.i[0],0,(Diderot_int_t)v.r[0] -1),
74 :     clamp_int(u.i[1],0,(Diderot_int_t)v.r[1] -1));
75 : lamonts 2093 }
76 : lamonts 2162 STATIC_INLINE Diderot_vec2_t worldToGrid2D(Diderot_vec2_t p, GridContext2D * ctx){
77 : lamonts 2083
78 : lamonts 2162 Diderot_union2_t pos;
79 :     pos.v = p;
80 :    
81 :     Diderot_union2_t cellSize;
82 :     cellSize.v = *(ctx->cellSize);
83 :    
84 :     Diderot_union4_t winSize;
85 :     winSize.v = *(ctx->window);
86 :    
87 :     Diderot_union2_t gridSize;
88 :     gridSize.v = *(ctx->gridSize);
89 :    
90 :     Diderot_real_t gridWidth = cellSize.r[0] * gridSize.r[0];
91 :     Diderot_real_t gridHeight = cellSize.r[1] * gridSize.r[1];
92 :    
93 :     Diderot_real_t x = (pos.r[0] - winSize.r[XMIN]) * gridWidth / (winSize.r[XMAX] - winSize.r[XMIN]);
94 :     Diderot_real_t y = (pos.r[1] - winSize.r[YMAX]) * gridHeight / (winSize.r[YMAX] - winSize.r[YMIN]);
95 :    
96 :     return vec2(x,y);
97 :     }
98 :     STATIC_INLINE Diderot_ivec2_t worldToCell(Diderot_vec2_t p, GridContext2D * ctx){
99 :    
100 :     Diderot_union2_t u;
101 :     u.v = worldToGrid2D(p,ctx);
102 :    
103 :     Diderot_union2_t v;
104 :     v.v = *(ctx->cellSize);
105 :    
106 :     return clampToGrid2D(ctx,vec2rtoi(vec2(floor(u.r[0] /v.r[0]),floor(u.r[1]/v.r[1]))));
107 :     }
108 :     STATIC_INLINE uint32_t worldToGridIdx(Diderot_vec2_t p, GridContext2D * ctx){
109 :    
110 :     Diderot_ivec2_t cell = worldToCell(p,ctx);
111 :    
112 :     Diderot_iunion2_t u;
113 :     u.v = cell;
114 :    
115 :     Diderot_union2_t gridSize;
116 :     gridSize.v = *(ctx->gridSize);
117 :    
118 :     return UMAD(u.i[1],(Diderot_int_t)gridSize.r[1],u.i[0]);
119 :     }
120 :     /* FIXME: Need to update the 3D functions to work once the 2D versions work */
121 :     STATIC_INLINE Diderot_ivec3_t worldToGrid3D(Diderot_vec3_t p, GridContext3D * ctx){
122 :    
123 : lamonts 2093 Diderot_union3_t u;
124 :     u.v = p;
125 : lamonts 2162
126 :     Diderot_union3_t v;
127 :     v.v = *(ctx->cellSize);
128 :    
129 :     return vec3rtoi(vec3(floor(u.r[0] /v.r[0]),
130 :     floor(u.r[1]/v.r[1]),
131 :     floor(u.r[2] /v.r[2])));
132 : lamonts 2083 }
133 : lamonts 2162 STATIC_INLINE Diderot_ivec3_t clampToGrid3D(GridContext3D * ctx, Diderot_ivec3_t cell) {
134 : lamonts 2083
135 : lamonts 2162 Diderot_iunion3_t u;
136 :     u.v = cell;
137 : lamonts 2083
138 : lamonts 2162 Diderot_union3_t v;
139 :     v.v = *(ctx->gridSize);
140 : lamonts 2083
141 : lamonts 2162 Diderot_int_t x = clamp_int(u.i[0],0,(Diderot_int_t)v.r[0] -1);
142 :     Diderot_int_t y = clamp_int(u.i[1],0,(Diderot_int_t)v.r[1] -1);
143 :     Diderot_int_t z = clamp_int(u.i[2],0,(Diderot_int_t)v.r[2] -1);
144 :    
145 :     return __extension__ (Diderot_ivec3_t){
146 :     x,
147 :     y,
148 :     z,
149 :     0
150 :     };
151 :    
152 : lamonts 2083 }
153 :    
154 :     #endif /* _GRID_H_ */

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0