GameApi 28
Library used by GameApi Builder tool
Loading...
Searching...
No Matches
Plane.hh
Go to the documentation of this file.
1#ifndef PLANE_HH
2#define PLANE_HH
3
4#include "Effect.hh"
5
6
8{
9public:
10 virtual int XSize() const=0;
11 virtual int YSize() const=0;
12 virtual Point2d Index(int x, int y) const=0;
13};
14
16{
17public:
18 virtual int NumFaces() const=0;
19 virtual int NumPoints(int face) const=0;
20 virtual Point2d FacePoint(int face, int point) const=0;
21};
22
24{
25public:
26 Polygons2dFromFaceCollection(FaceCollection &coll, int face, Plane pl) : coll(coll), face(face), pl(pl) { }
27 int NumFaces() const { return 1; }
28 int NumPoints(int /*face*/) const
29 {
30 return coll.NumPoints(face);
31 }
32 Point2d FacePoint(int /*face*/, int point) const
33 {
34 Point p = coll.FacePoint(face, point);
35 float x = pl.CoordsX(p);
36 float y = pl.CoordsY(p);
37 Point2d pp;
38 pp.x = x;
39 pp.y = y;
40 return pp;
41 }
42private:
43 FaceCollection &coll;
44 int face;
45 Plane pl;
46};
47
49{
50public:
52 void Gen()
53 {
54 int facescount = pol.NumFaces();
55 for(int i=0;i<facescount;i++)
56 {
57 int line1 = 0;
58 int line2 = 1;
59
60 int third = 2;
61 int size = pol.NumPoints(i);
62 while(third < size)
63 {
64 Tri t;
65 t.a = line1;
66 t.b = line2;
67 t.c = third;
68
69 triangles.push_back(t);
70 faces.push_back(i);
71 line2 = third;
72 third = line2 + 1;
73 }
74 }
75 }
76
77 int NumFaces() const { return triangles.size(); }
78 int NumPoints(int face) const
79 {
80 return 3;
81 }
82 Point2d FacePoint(int face, int point) const
83 {
84 Tri t = triangles[face];
85 int index;
86 if (point == 0) index = t.a;
87 if (point == 1) index = t.b;
88 if (point == 2) index = t.c;
89 return pol.FacePoint(faces[face], index);
90 }
91 struct Tri
92 {
93 int a,b,c;
94 };
95private:
96 Polygons2d &pol;
97 std::vector<int> faces;
98 std::vector<Tri> triangles;
99};
100
102{
103public:
104 Polygons2dFaceCollection(Polygons2d &p, Plane pl) : p(p), pl(pl) { }
105 int NumFaces() const
106 {
107 return p.NumFaces();
108 }
109 int NumPoints(int face) const
110 {
111 return p.NumPoints(face);
112 }
113 Point FacePoint(int face, int point) const
114 {
115 PlaneIn3d pp(p.FacePoint(face,point), pl);
116 return pp.Elem();
117 }
118 Vector PointNormal(int face, int point) const
119 {
120 return -Vector::CrossProduct(pl.u_x, pl.u_y);
121 }
122 virtual float Attrib(int face, int point, int id) const
123 {
124 return 0.0;
125 }
126 virtual unsigned int Color(int face, int point) const
127 {
128 return 0xffffffff;
129 }
130 virtual Point2d TexCoord(int face, int point) const
131 {
132 return p.FacePoint(face, point);
133 }
134private:
135 Polygons2d &p;
136 Plane pl;
137};
138
140{
141public:
142 Polygons2Faces(Polygons2d &p, Plane p1, Plane p2) : p(p), p1(p1), p2(p2) { }
143 int NumFaces() const
144 {
145 int s = p.NumFaces();
146
147 int count = 0;
148 for(int i=0;i<s;i++)
149 {
150 count += p.NumPoints(i);
151 }
152 return count;
153 }
154 int NumPoints(int face) const
155 {
156 return 4;
157 }
158 int FaceToFace(int face) const
159 {
160 int s = p.NumFaces();
161
162 int count = 0;
163 for(int i=0;i<s;i++)
164 {
165 count += p.NumPoints(i);
166 if (face<count) return i;
167 }
168 return count;
169 }
170 int FaceToRemainder(int face) const
171 {
172 int s = p.NumFaces();
173
174 int count = 0;
175 for(int i=0;i<s;i++)
176 {
177 int oldcount = count;
178 count += p.NumPoints(i);
179 if (face<count) return face-oldcount;
180 }
181 return count;
182 }
183
184 Point FacePoint(int face, int point) const
185 {
186 int f = FaceToFace(face);
187 int px = FaceToRemainder(face);
188
189 if (point==1 || point==2) f++;
190 Plane pl;
191 if (point==0 || point==1) pl = p1;
192 if (point==2 || point==3) pl = p2;
193 Point2d pp = p.FacePoint(f,px);
194 PlaneIn3d pp1(pp, pl);
195 return pp1.Elem();
196 }
197 Vector PointNormal(int face, int point) const
198 {
199 Point p = FacePoint(face,0);
200 Point px = FacePoint(face, 1);
201 Point py = FacePoint(face, 2);
202 Vector vx = px-p;
203 Vector vy = py-p;
204 return -Vector::CrossProduct(vx, vy);
205 }
206 virtual float Attrib(int face, int point, int id) const
207 {
208 return 0.0;
209 }
210 virtual unsigned int Color(int face, int point) const
211 {
212 return 0xffffffff;
213 }
214 virtual Point2d TexCoord(int face, int point) const
215 {
216 return p.FacePoint(face, point);
217 }
218
219private:
220 Polygons2d &p;
221 Plane p1;
222 Plane p2;
223};
224
226{
227public:
229 int NumFaces() const { return 1; }
230 int NumPoints(int) const { return p.Size(); }
231 Point2d FacePoint(int face, int point) const
232 {
233 return p.Index(point);
234 }
235private:
237};
238
240{
241public:
243 int NumFaces() const
244 {
245 int s = arr.Size();
246 int count = 0;
247 for(int i=0;i<s;i++)
248 {
249 count += arr.Index(i)->NumFaces();
250 }
251 return count;
252 }
253 int NumPoints(int face) const
254 {
255 return arr.Index(FaceToIndex(face))->NumPoints(FaceToRemainder(face));
256 }
257 Point2d FacePoint(int face, int point) const
258 {
259 return arr.Index(FaceToIndex(face))->FacePoint(FaceToRemainder(face), point);
260 }
261 int FaceToIndex(int face) const
262 {
263 int s = arr.Size();
264 int count = 0;
265 for(int i=0;i<s;i++)
266 {
267 count += arr.Index(i)->NumFaces();
268 if (face<count) return i;
269 }
270 return -1;
271 }
272 int FaceToRemainder(int face) const
273 {
274 int s = arr.Size();
275 int count = 0;
276 for(int i=0;i<s;i++)
277 {
278 int oldcount = count;
279 count += arr.Index(i)->NumFaces();
280 if (face<count) return face-oldcount;
281 }
282 return -1;
283 }
284
285private:
287};
288
289
291{
292public:
293 virtual bool Inside(Point2d p) const=0;
294};
295
297{
298public:
300 const BoolPlane &p2,
301 bool (*fptr)(bool, bool))
302 : p1(p1), p2(p2), fptr(fptr) { }
303 bool Inside(Point2d p) const
304 {
305 bool b1 = p1.Inside(p);
306 bool b2 = p2.Inside(p);
307 return fptr(b1,b2);
308 }
309private:
310 const BoolPlane &p1;
311 const BoolPlane &p2;
312 bool (*fptr)(bool, bool);
313};
314
315
317{
318public:
319 BoolRectangle(Point2d tl, Point2d br) : tl(tl), br(br) { }
320 int Size() const
321 {
322 return 2;
323 }
324 Point2d Index(int i) const
325 {
326 switch(i)
327 {
328 case 0: return tl;
329 case 1: return br;
330 };
331 Point2d p;
332 return p;
333 }
334 bool Inside(Point2d p) const
335 {
336 if (p.x < tl.x) return false;
337 if (p.x > br.x) return false;
338 if (p.y < tl.y) return false;
339 if (p.y > br.y) return false;
340 return true;
341 }
342private:
343 Point2d tl;
344 Point2d br;
345};
346
348{
349public:
350 virtual int SizeX() const=0;
351 virtual int SizeY() const=0;
352 virtual BoolRectangle Index(int x, int y) const=0;
353};
354
356{
357public:
359 int SizeX() const { return g.XSize()-1; }
360 int SizeY() const { return g.YSize()-1; }
361 BoolRectangle Index(int x, int y) const
362 {
363 Point2d tl = g.Index(x, y);
364 Point2d br = g.Index(x+1, y+1);
365 BoolRectangle b(tl, br);
366 return b;
367 }
368private:
369 GridIn2d &g;
370};
371
372class RectangleCollection : public Array<int, BoolRectangle>
373{
374};
375
377{
378public:
380 bool Inside(Point2d p) const
381 {
382 int size = coll.Size();
383 bool bb = false;
384 for(int i=0;i<size;i++)
385 {
386 BoolRectangle r = coll.Index(i);
387 bool b = r.Inside(p);
388 bb = bb || b;
389 }
390 return bb;
391 }
392private:
393 const RectangleCollection &coll;
394};
395
397{
398public:
400 int Size() const { return c.Size()*2; }
401 Point2d Index(int i) const
402 {
403 int x = i & 1;
404 int y = i >> 1;
405 BoolRectangle r = c.Index(y);
406 return r.Index(x);
407 }
408private:
409 const RectangleCollection &c;
410};
411
413{
414public:
416 int Size() const { return g.SizeX()*g.SizeY(); }
417 BoolRectangle Index(int a) const
418 {
419 int size = g.SizeX();
420 int x = a / size;
421 int y = a - x*size;
422 return g.Index(x,y);
423 }
424
425private:
426 const RectangleGrid &g;
427};
428
429class RectCenterPoint : public Element<Point2d>
430{
431public:
432 RectCenterPoint(const BoolRectangle &r) : r(r) { }
433 Point2d Elem() const
434 {
435 Point2d p;
436 Point2d tl = r.Index(0);
437 Point2d br = r.Index(1);
438 p.x = (tl.x + br.x)/2;
439 p.y = (tl.y + br.y)/2;
440 return p;
441 }
442private:
443 const BoolRectangle &r;
444};
445
447{
448public:
449 CompareX(const PointCollection2d &pc1) : pc1(pc1) { }
450
451 bool operator()(int p1_, int p2_) const
452 {
453 Point2d p1 = pc1.Index(p1_);
454 Point2d p2 = pc1.Index(p2_);
455 return p1.x<p2.x;
456 }
457private:
458 const PointCollection2d &pc1;
459};
461{
462public:
463 CompareY(const PointCollection2d &pc1) : pc1(pc1) { }
464
465 bool operator()(int p1_, int p2_) const
466 {
467 Point2d p1 = pc1.Index(p1_);
468 Point2d p2 = pc1.Index(p2_);
469 return p1.y<p2.y;
470 }
471private:
472 const PointCollection2d &pc1;
473};
474
475class SplitRect : public GridIn2d
476{
477public:
479 {
480 int size = p.Size();
481 for(int i=0;i<size;i++)
482 {
483 x.push_back(i);
484 y.push_back(i);
485 }
486 std::sort(x.begin(), x.end(), CompareX(p));
487 std::sort(y.begin(), y.end(), CompareY(p));
488 }
489 void Refresh()
490 {
491 std::sort(x.begin(), x.end(), CompareX(p));
492 std::sort(y.begin(), y.end(), CompareY(p));
493 }
494 int XSize() const { return p.Size(); }
495 int YSize() const { return p.Size(); }
496 Point2d Index(int xx, int yy) const
497 {
498 Point2d pp;
499 pp.x = p.Index(x[xx]).x;
500 pp.y = p.Index(y[yy]).y;
501 return pp;
502 }
503private:
504 const PointCollection2d &p;
505 std::vector<int> x;
506 std::vector<int> y;
507};
508
509class RectCondition : public Function<BoolRectangle, bool>
510{
511public:
512 RectCondition(const BoolPlane &bp) : bp(bp) { }
513 bool Index(BoolRectangle r) const
514 {
515 RectCenterPoint cp(r);
516 Point2d p = cp.Elem();
517 bool b = bp.Inside(p);
518 return b;
519 }
520private:
521 const BoolPlane &bp;
522};
523
524inline bool AndFuncOp(bool b, bool b2) { return b && b2; }
525inline bool OrFuncOp(bool b, bool b2) { return b || b2; }
526inline bool AndNotFuncOp(bool b, bool b2) { return b && !b2; }
527
528
529class BooleanOp : public RectangleCollection
530{
531 BooleanOp(const RectangleCollection &r,
532 const RectangleCollection &r2,
533 bool (*op)(bool b, bool b2))
534 : points1(r), points2(r2),
535 pointscomb(points1, points2),
536 conv(pointscomb),
537 sr(conv),
538 rects(sr),
539 coll(rects),
540 filter(coll, func),
541 func(boolplane),
542 boolplane(bp1, bp2, op),
543 bp1(r),
544 bp2(r2)
545 { }
546 int Size() const { return coll.Size(); }
547 BoolRectangle Index(int i) const
548 {
549 return coll.Index(i);
550 }
551
552private:
555 CombineArrays<Point2d> pointscomb;
557 SplitRect sr; // PointCollection2d => GridIn2d
561 RectCondition func;
562 FuncBoolPlane boolplane;
565};
566
567#endif
ArrayConvert< PointCollection2d, int, Point2d > PointCollection2dConvert
Definition Effect.hh:2666
bool AndFuncOp(bool b, bool b2)
Definition Plane.hh:524
bool OrFuncOp(bool b, bool b2)
Definition Plane.hh:525
bool AndNotFuncOp(bool b, bool b2)
Definition Plane.hh:526
ArrayPolygons2d(Array< int, Polygons2d * > &arr)
Definition Plane.hh:242
Point2d FacePoint(int face, int point) const
Definition Plane.hh:257
int FaceToRemainder(int face) const
Definition Plane.hh:272
int NumPoints(int face) const
Definition Plane.hh:253
int NumFaces() const
Definition Plane.hh:243
int FaceToIndex(int face) const
Definition Plane.hh:261
Definition EffectI.hh:22
virtual int Size() const=0
Definition Plane.hh:291
virtual bool Inside(Point2d p) const =0
Definition Plane.hh:317
BoolRectangle(Point2d tl, Point2d br)
Definition Plane.hh:319
int Size() const
Definition Plane.hh:320
Point2d Index(int i) const
Definition Plane.hh:324
bool Inside(Point2d p) const
Definition Plane.hh:334
Definition Effect.hh:930
Definition Plane.hh:447
bool operator()(int p1_, int p2_) const
Definition Plane.hh:451
CompareX(const PointCollection2d &pc1)
Definition Plane.hh:449
Definition Plane.hh:461
CompareY(const PointCollection2d &pc1)
Definition Plane.hh:463
bool operator()(int p1_, int p2_) const
Definition Plane.hh:465
Definition Effect.hh:571
Definition EffectI.hh:212
Definition Effect.hh:962
Definition Plane.hh:297
bool Inside(Point2d p) const
Definition Plane.hh:303
FuncBoolPlane(const BoolPlane &p1, const BoolPlane &p2, bool(*fptr)(bool, bool))
Definition Plane.hh:299
Definition EffectI.hh:11
Definition Plane.hh:8
virtual int YSize() const =0
virtual Point2d Index(int x, int y) const =0
virtual int XSize() const =0
Definition Effect.hh:2218
Point Elem() const
Definition Effect.hh:2221
Definition VectorTools.hh:350
Definition Effect.hh:2663
Definition Plane.hh:397
Point2d Index(int i) const
Definition Plane.hh:401
int Size() const
Definition Plane.hh:400
PointsFromRectangleCollection(const RectangleCollection &c)
Definition Plane.hh:399
virtual unsigned int Color(int face, int point) const
Definition Plane.hh:210
int FaceToFace(int face) const
Definition Plane.hh:158
int FaceToRemainder(int face) const
Definition Plane.hh:170
Point FacePoint(int face, int point) const
Definition Plane.hh:184
virtual float Attrib(int face, int point, int id) const
Definition Plane.hh:206
int NumFaces() const
Definition Plane.hh:143
virtual Point2d TexCoord(int face, int point) const
Definition Plane.hh:214
int NumPoints(int face) const
Definition Plane.hh:154
Vector PointNormal(int face, int point) const
Definition Plane.hh:197
Polygons2Faces(Polygons2d &p, Plane p1, Plane p2)
Definition Plane.hh:142
Point FacePoint(int face, int point) const
Definition Plane.hh:113
virtual Point2d TexCoord(int face, int point) const
Definition Plane.hh:130
Vector PointNormal(int face, int point) const
Definition Plane.hh:118
virtual float Attrib(int face, int point, int id) const
Definition Plane.hh:122
int NumFaces() const
Definition Plane.hh:105
int NumPoints(int face) const
Definition Plane.hh:109
Polygons2dFaceCollection(Polygons2d &p, Plane pl)
Definition Plane.hh:104
virtual unsigned int Color(int face, int point) const
Definition Plane.hh:126
int NumFaces() const
Definition Plane.hh:27
Polygons2dFromFaceCollection(FaceCollection &coll, int face, Plane pl)
Definition Plane.hh:26
int NumPoints(int) const
Definition Plane.hh:28
Point2d FacePoint(int, int point) const
Definition Plane.hh:32
Definition Plane.hh:16
virtual Point2d FacePoint(int face, int point) const =0
virtual int NumFaces() const =0
virtual int NumPoints(int face) const =0
Definition Plane.hh:430
Point2d Elem() const
Definition Plane.hh:433
RectCenterPoint(const BoolRectangle &r)
Definition Plane.hh:432
Definition Plane.hh:413
int Size() const
Definition Plane.hh:416
BoolRectangle Index(int a) const
Definition Plane.hh:417
RectCollectionFromRectGrid(const RectangleGrid &g)
Definition Plane.hh:415
Definition Plane.hh:510
RectCondition(const BoolPlane &bp)
Definition Plane.hh:512
bool Index(BoolRectangle r) const
Definition Plane.hh:513
Definition Plane.hh:377
bool Inside(Point2d p) const
Definition Plane.hh:380
RectangleCollectionBoolPlane(const RectangleCollection &coll)
Definition Plane.hh:379
Definition Plane.hh:373
Definition Plane.hh:356
RectangleGridFromGrid(GridIn2d &g)
Definition Plane.hh:358
int SizeY() const
Definition Plane.hh:360
int SizeX() const
Definition Plane.hh:359
BoolRectangle Index(int x, int y) const
Definition Plane.hh:361
Definition Plane.hh:348
virtual BoolRectangle Index(int x, int y) const =0
virtual int SizeY() const =0
virtual int SizeX() const =0
Point2d FacePoint(int face, int point) const
Definition Plane.hh:231
SinglePolygon2d(PointCollection2d &p)
Definition Plane.hh:228
int NumFaces() const
Definition Plane.hh:229
int NumPoints(int) const
Definition Plane.hh:230
Definition Plane.hh:476
int XSize() const
Definition Plane.hh:494
Point2d Index(int xx, int yy) const
Definition Plane.hh:496
void Refresh()
Definition Plane.hh:489
SplitRect(const PointCollection2d &p)
Definition Plane.hh:478
int YSize() const
Definition Plane.hh:495
void Gen()
Definition Plane.hh:52
int NumFaces() const
Definition Plane.hh:77
int NumPoints(int face) const
Definition Plane.hh:78
TriangulateConvexPolygons(Polygons2d &pol)
Definition Plane.hh:51
Point2d FacePoint(int face, int point) const
Definition Plane.hh:82
Definition VectorTools.hh:125
static Vector CrossProduct(const Vector &aVec, const Vector &aVec2)
Definition VectorTools.hh:193
n< br > font size
Definition meshpage.php:3536
double f(const std::string &, double, bool) noexcept
Definition profile_cpp_calls_2.cpp:4
Definition VectorTools.hh:910
float x
Definition VectorTools.hh:911
float y
Definition VectorTools.hh:911
Definition Parser.cc:60
Definition Plane.hh:92
int b
Definition Plane.hh:93
int a
Definition Plane.hh:93
int c
Definition Plane.hh:93