annotate trunk/chipmunkd/cpSpaceQuery.d @ 4:7ebbd4d05553

initial commit
author Extrawurst
date Thu, 02 Dec 2010 02:11:26 +0100
parents
children df4ebc8add66
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
1
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
2 // written in the D programming language
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
3
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
4 module chipmunkd.cpSpaceQuery;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
5
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
6 import chipmunkd.chipmunk;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
7 import chipmunkd.chipmunk_types_h;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
8
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
9 struct pointQueryContext {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
10 cpLayers layers;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
11 cpGroup group;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
12 cpSpacePointQueryFunc func;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
13 void *data;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
14 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
15
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
16 static void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
17 pointQueryHelper(cpVect *point, cpShape *shape, pointQueryContext *context)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
18 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
19 if(
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
20 !(shape.group && context.group == shape.group) && (context.layers&shape.layers) &&
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
21 cpShapePointQuery(shape, *point)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
22 ){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
23 context.func(shape, context.data);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
24 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
25 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
26
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
27 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
28 cpSpacePointQuery(cpSpace *space, cpVect point, cpLayers layers, cpGroup group, cpSpacePointQueryFunc func, void *data)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
29 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
30 pointQueryContext context = {layers, group, func, data};
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
31 cpSpaceHashPointQuery(space.activeShapes, point, cast(cpSpaceHashQueryFunc)&pointQueryHelper, &context);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
32 cpSpaceHashPointQuery(space.staticShapes, point, cast(cpSpaceHashQueryFunc)&pointQueryHelper, &context);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
33 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
34
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
35 static void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
36 rememberLastPointQuery(cpShape *shape, cpShape **outShape)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
37 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
38 if(!shape.sensor) *outShape = shape;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
39 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
40
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
41 cpShape *
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
42 cpSpacePointQueryFirst(cpSpace *space, cpVect point, cpLayers layers, cpGroup group)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
43 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
44 cpShape *shape = null;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
45 cpSpacePointQuery(space, point, layers, group, cast(cpSpacePointQueryFunc)&rememberLastPointQuery, &shape);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
46
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
47 return shape;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
48 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
49
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
50 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
51 cpSpaceEachBody(cpSpace *space, cpSpaceBodyIterator func, void *data)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
52 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
53 cpArray *bodies = space.bodies;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
54
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
55 for(int i=0; i<bodies.num; i++)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
56 func(cast(cpBody *)bodies.arr[i], data);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
57 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
58
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
59 //#pragma mark Segment Query Functions
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
60
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
61 struct segQueryContext {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
62 cpVect start, end;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
63 cpLayers layers;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
64 cpGroup group;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
65 cpSpaceSegmentQueryFunc func;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
66 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
67
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
68 static cpFloat
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
69 segQueryFunc(segQueryContext *context, cpShape *shape, void *data)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
70 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
71 cpSegmentQueryInfo info;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
72
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
73 if(
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
74 !(shape.group && context.group == shape.group) && (context.layers&shape.layers) &&
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
75 cpShapeSegmentQuery(shape, context.start, context.end, &info)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
76 ){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
77 context.func(shape, info.t, info.n, data);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
78 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
79
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
80 return 1.0f;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
81 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
82
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
83 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
84 cpSpaceSegmentQuery(cpSpace *space, cpVect start, cpVect end, cpLayers layers, cpGroup group, cpSpaceSegmentQueryFunc func, void *data)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
85 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
86 segQueryContext context = {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
87 start, end,
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
88 layers, group,
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
89 func,
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
90 };
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
91
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
92 cpSpaceHashSegmentQuery(space.staticShapes, &context, start, end, 1.0f, cast(cpSpaceHashSegmentQueryFunc)&segQueryFunc, data);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
93 cpSpaceHashSegmentQuery(space.activeShapes, &context, start, end, 1.0f, cast(cpSpaceHashSegmentQueryFunc)&segQueryFunc, data);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
94 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
95
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
96 struct segQueryFirstContext {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
97 cpVect start, end;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
98 cpLayers layers;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
99 cpGroup group;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
100 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
101
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
102 static cpFloat
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
103 segQueryFirst(segQueryFirstContext *context, cpShape *shape, cpSegmentQueryInfo *_out)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
104 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
105 cpSegmentQueryInfo info;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
106
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
107 if(
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
108 !(shape.group && context.group == shape.group) &&
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
109 (context.layers&shape.layers) &&
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
110 !shape.sensor &&
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
111 cpShapeSegmentQuery(shape, context.start, context.end, &info) &&
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
112 info.t < _out.t
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
113 ){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
114 *_out = info;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
115 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
116
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
117 return _out.t;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
118 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
119
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
120 cpShape *
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
121 cpSpaceSegmentQueryFirst(cpSpace *space, cpVect start, cpVect end, cpLayers layers, cpGroup group, cpSegmentQueryInfo *_out)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
122 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
123 cpSegmentQueryInfo info = {null, 1.0f, cpvzero};
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
124 if(_out){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
125 (*_out) = info;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
126 } else {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
127 _out = &info;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
128 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
129
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
130 segQueryFirstContext context = {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
131 start, end,
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
132 layers, group
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
133 };
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
134
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
135 cpSpaceHashSegmentQuery(space.staticShapes, &context, start, end, 1.0f, cast(cpSpaceHashSegmentQueryFunc)&segQueryFirst, _out);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
136 cpSpaceHashSegmentQuery(space.activeShapes, &context, start, end, _out.t, cast(cpSpaceHashSegmentQueryFunc)&segQueryFirst, _out);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
137
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
138 return _out.shape;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
139 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
140
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
141 //#pragma mark BB Query functions
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
142
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
143 struct bbQueryContext {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
144 cpLayers layers;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
145 cpGroup group;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
146 cpSpaceBBQueryFunc func;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
147 void *data;
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
148 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
149
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
150 static void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
151 bbQueryHelper(cpBB *bb, cpShape *shape, bbQueryContext *context)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
152 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
153 if(
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
154 !(shape.group && context.group == shape.group) && (context.layers&shape.layers) &&
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
155 cpBBintersects(*bb, shape.bb)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
156 ){
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
157 context.func(shape, context.data);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
158 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
159 }
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
160
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
161 void
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
162 cpSpaceBBQuery(cpSpace *space, cpBB bb, cpLayers layers, cpGroup group, cpSpaceBBQueryFunc func, void *data)
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
163 {
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
164 bbQueryContext context = {layers, group, func, data};
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
165 cpSpaceHashQuery(space.activeShapes, &bb, bb, cast(cpSpaceHashQueryFunc)&bbQueryHelper, &context);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
166 cpSpaceHashQuery(space.staticShapes, &bb, bb, cast(cpSpaceHashQueryFunc)&bbQueryHelper, &context);
7ebbd4d05553 initial commit
Extrawurst
parents:
diff changeset
167 }