GameApi 28
Library used by GameApi Builder tool
Loading...
Searching...
No Matches
Triangle.hh
Go to the documentation of this file.
1
2#include "VectorTools.hh"
3#include "Effect.hh"
4#include "Plane.hh"
5#include "GraphI.hh"
6#include "Widgets.hh"
7
8struct TriIndex
9{
10 int i1;
11 int i2;
12 int i3;
13};
15{
16 int face;
17};
18
19struct Tri
20{
27 unsigned int c1;
28 unsigned int c2;
29 unsigned int c3;
33};
34
35template<class T>
37{
38public:
39 virtual void Modify(T &t) const=0;
40 virtual ~ModifyValue() { }
41};
42
43class MoveTri : public ModifyValue<Tri>
44{
45public:
46 MoveTri(Vector v) : v(v) { }
47 void Modify(Tri &t) const
48 {
49 t.p1 += v;
50 t.p2 += v;
51 t.p3 += v;
52 }
53private:
54 Vector v;
55};
56class ColorTri : public ModifyValue<Tri>
57{
58public:
59 ColorTri(unsigned int c) : c(c) { }
60 void Modify(Tri &t) const
61 {
62 t.c1 = c;
63 t.c2 = c;
64 t.c3 = c;
65 }
66private:
67 unsigned int c;
68};
69class NormalTri : public ModifyValue<Tri>
70{
71public:
72 void Modify(Tri &t) const
73 {
74 Point p1 = t.p1;
75 Point p2 = t.p2;
76 Point p3 = t.p3;
77 Vector n = Vector::CrossProduct(p2-p1, p3-p1);
78 t.n1 = n;
79 t.n2 = n;
80 t.n3 = n;
81 }
82};
83class MoveBox : public ModifyValue<Tri>
84{
85public:
86 MoveBox(Cube3 oldbox, Cube3 newbox) : oldbox(oldbox), newbox(newbox) { }
87 void Modify(Tri &t) const
88 {
89 Point p1 = t.p1;
90 Point p2 = t.p2;
91 Point p3 = t.p3;
92 Vector v = Vector(oldbox.minx, oldbox.miny, oldbox.minz);
93 p1 -= v;
94 p2 -= v;
95 p3 -= v;
96 p1.x /= oldbox.maxx-oldbox.minx;
97 p1.y /= oldbox.maxy-oldbox.miny;
98 p1.z /= oldbox.maxz-oldbox.minz;
99 p2.x /= oldbox.maxx-oldbox.minx;
100 p2.y /= oldbox.maxy-oldbox.miny;
101 p2.z /= oldbox.maxz-oldbox.minz;
102 p3.x /= oldbox.maxx-oldbox.minx;
103 p3.y /= oldbox.maxy-oldbox.miny;
104 p3.z /= oldbox.maxz-oldbox.minz;
105
106 p1.x *= newbox.maxx-newbox.minx;
107 p1.y *= newbox.maxy-newbox.miny;
108 p1.z *= newbox.maxz-newbox.minz;
109 p2.x *= newbox.maxx-newbox.minx;
110 p2.y *= newbox.maxy-newbox.miny;
111 p2.z *= newbox.maxz-newbox.minz;
112 p3.x *= newbox.maxx-newbox.minx;
113 p3.y *= newbox.maxy-newbox.miny;
114 p3.z *= newbox.maxz-newbox.minz;
115
116 Vector vv = Vector(newbox.minx, newbox.miny, newbox.minz);
117 p1 += vv;
118 p2 += vv;
119 p3 += vv;
120 t.p1 = p1;
121 t.p2 = p2;
122 t.p3 = p3;
123 }
124private:
125 Cube3 oldbox, newbox;
126};
127
128class MoveCoords : public ModifyValue<Tri>
129{
130public:
131 MoveCoords(Coords oldcoords, Coords newcoords) : oldcoords(oldcoords), newcoords(newcoords) { }
132 void Modify(Tri &t) const
133 {
134 Point p1 = t.p1;
135 Point p2 = t.p2;
136 Point p3 = t.p3;
137 p1 -= oldcoords.center;
138 p2 -= oldcoords.center;
139 p3 -= oldcoords.center;
140 float p1x = Vector::DotProduct(p1, oldcoords.u_x);
141 p1x /= oldcoords.u_x.Dist();
142
143 float p1y = Vector::DotProduct(p1, oldcoords.u_y);
144 p1y /= oldcoords.u_y.Dist();
145
146 float p1z = Vector::DotProduct(p1, oldcoords.u_z);
147 p1z /= oldcoords.u_z.Dist();
148
149
150 float p2x = Vector::DotProduct(p2, oldcoords.u_x);
151 p2x /= oldcoords.u_x.Dist();
152
153 float p2y = Vector::DotProduct(p2, oldcoords.u_y);
154 p2y /= oldcoords.u_y.Dist();
155
156 float p2z = Vector::DotProduct(p2, oldcoords.u_z);
157 p2z /= oldcoords.u_z.Dist();
158
159
160 float p3x = Vector::DotProduct(p3, oldcoords.u_x);
161 p3x /= oldcoords.u_x.Dist();
162
163 float p3y = Vector::DotProduct(p3, oldcoords.u_y);
164 p3y /= oldcoords.u_y.Dist();
165
166 float p3z = Vector::DotProduct(p3, oldcoords.u_z);
167 p3z /= oldcoords.u_z.Dist();
168
169 //-------------------------------
170
171 Point v1 = newcoords.center + p1x*newcoords.u_x + p1y*newcoords.u_y + p1z*newcoords.u_z;
172 Point v2 = newcoords.center + p2x*newcoords.u_x + p2y*newcoords.u_y + p2z*newcoords.u_z;
173 Point v3 = newcoords.center + p3x*newcoords.u_x + p3y*newcoords.u_y + p3z*newcoords.u_z;
174 t.p1 = v1;
175 t.p2 = v2;
176 t.p3 = v3;
177 }
178private:
179 Coords oldcoords;
180 Coords newcoords;
181};
182
183class TriArray : public Array<int, Tri>
184{
185};
186
188{
189public:
190 BoxedTriangles(Array<int, Cube3> &pos, TriArray &obj, Cube3 objpos) : pos(pos), obj(obj), objpos(objpos) { }
191 int Size() const { return pos.Size()*obj.Size(); }
192 Tri Index(int i) const
193 {
194 int i1 = i / obj.Size();
195 int i2 = i - i1*obj.Size();
196 Cube3 c = pos.Index(i1);
197 Tri t = obj.Index(i2);
198 MoveBox b(objpos, c);
199 b.Modify(t);
200 return t;
201 }
202private:
204 TriArray &obj;
205 Cube3 objpos;
206};
207
209{
210public:
211 ApplyTriArray(const TriArray &arr, ModifyValue<Tri> &mv) : arr(arr), mv(mv) { }
212 int Size() const { return arr.Size(); }
213 Tri Index(int i) const
214 {
215 Tri t = arr.Index(i);
216 mv.Modify(t);
217 return t;
218 }
219private:
220 const TriArray &arr;
222};
223
225{ // numpoints must be 3
226public:
228 int Size() const
229 {
230 return coll.NumFaces();
231 }
232 Tri Index(int i) const
233 {
234 Tri tr;
235 tr.p1 = coll.FacePoint(i, 0);
236 tr.p2 = coll.FacePoint(i, 1);
237 tr.p3 = coll.FacePoint(i, 2);
238 tr.n1 = coll.PointNormal(i, 0);
239 tr.n2 = coll.PointNormal(i, 1);
240 tr.n3 = coll.PointNormal(i, 2);
241 tr.c1 = coll.Color(i, 0);
242 tr.c2 = coll.Color(i, 1);
243 tr.c3 = coll.Color(i, 2);
244 tr.tex1 = coll.TexCoord(i, 0);
245 tr.tex2 = coll.TexCoord(i, 1);
246 tr.tex3 = coll.TexCoord(i, 2);
247 return tr;
248 }
249private:
250 FaceCollection &coll;
251};
252
254{
255public:
256 FaceCollectionFromTriArray(const TriArray &arr) : arr(arr) { }
257 virtual std::string name() const { return "FaceCollectionFromTriArray"; }
259 {
260 }
261 void HeavyPrepare() { }
262 int NumFaces() const
263 {
264 //std::cout << "NUMFACES: " << arr.Size() << std::endl;
265 return arr.Size(); // *3 is hack to make this work with UpdateVBO.
266 }
267 int NumPoints(int face) const
268 {
269 return 3;
270 }
271 Point FacePoint(int face, int point) const
272 {
273 Tri t = arr.Index(face);
274
275 Point p;
276 switch(point)
277 {
278 case 0: p= t.p1; break;
279 case 1: p= t.p2; break;
280 case 2: p= t.p3; break;
281 }
282 //std::cout << face << " " << point << " " << p << std::endl;
283 return p;
284 }
285 Vector PointNormal(int face, int point) const
286 {
287 Tri t = arr.Index(face);
288 switch(point)
289 {
290 case 0: return t.n1;
291 case 1: return t.n2;
292 case 2: return t.n3;
293 }
294 return t.n1;
295 }
296 float Attrib(int face, int point, int id) const
297 {
298 return 0.0;
299 }
300 int AttribI(int face, int point, int id) const
301 {
302 return 0;
303 }
304 unsigned int Color(int face, int point) const
305 {
306 Tri t = arr.Index(face);
307 switch(point)
308 {
309 case 0: return t.c1;
310 case 1: return t.c2;
311 case 2: return t.c3;
312 }
313 return t.c1;
314 }
315 Point2d TexCoord(int face, int point) const
316 {
317 Tri t = arr.Index(face);
318 switch(point)
319 {
320 case 0: return t.tex1;
321 case 1: return t.tex2;
322 case 2: return t.tex3;
323 }
324 return t.tex1;
325 }
326private:
327 const TriArray &arr;
328};
329
331{
332public:
333 TriArrayFromFaceCollectionIndexFace(FaceCollection &coll, Array<int, TriIndex> &index, Array<int, FaceIndex> &faces) : coll(coll), index(index), faces(faces) { }
334 int Size() const { return index.Size(); }
335 Tri Index(int i) const
336 {
337 TriIndex ia = index.Index(i);
338 int i1 = ia.i1;
339 int i2 = ia.i2;
340 int i3 = ia.i3;
341 FaceIndex fa = faces.Index(i);
342 int f = fa.face;
343 Tri tr;
344 tr.p1 = coll.FacePoint(f, i1);
345 tr.p2 = coll.FacePoint(f, i2);
346 tr.p3 = coll.FacePoint(f, i3);
347 tr.n1 = coll.PointNormal(f, i1);
348 tr.n2 = coll.PointNormal(f, i2);
349 tr.n3 = coll.PointNormal(f, i3);
350 tr.c1 = coll.Color(f, i1);
351 tr.c2 = coll.Color(f, i2);
352 tr.c3 = coll.Color(f, i3);
353 tr.tex1 = coll.TexCoord(f, i1);
354 tr.tex2 = coll.TexCoord(f, i2);
355 tr.tex3 = coll.TexCoord(f, i3);
356 return tr;
357 }
358private:
359 FaceCollection &coll;
362};
363
364class TriangulateConvexPolygonsIndex : public Array<int, TriIndex>
365{
366public:
369 void Gen()
370 {
371 int facescount = pol.NumFaces();
372 for(int i=0;i<facescount;i++)
373 {
374 int line1 = 0;
375 int line2 = 1;
376
377 int third = 2;
378 int size = pol.NumPoints(i);
379 while(third < size)
380 {
381 TriIndex t;
382 t.i1 = line1;
383 t.i2 = line2;
384 t.i3 = third;
385 //std::cout << line1 << " " << line2 << " " << third << std::endl;
386 triangles.push_back(t);
387 line2 = third;
388 third = line2 + 1;
389 }
390 }
391 }
392
393 int Size() const { return triangles.size(); }
394 TriIndex Index(int face) const
395 {
396 TriIndex t = triangles[face];
397 return t;
398 }
399private:
400 FaceCollection &pol;
401 std::vector<TriIndex> triangles;
402};
403
404class TriangulateConvexPolygonsFaces : public Array<int, FaceIndex>
405{
406public:
408 void Gen()
409 {
410 int facescount = pol.NumFaces();
411 for(int i=0;i<facescount;i++)
412 {
413 //int line1 = 0;
414 int line2 = 1;
415
416 int third = 2;
417 int size = pol.NumPoints(i);
418 while(third < size)
419 {
420 faces.push_back(i);
421 line2 = third;
422 third = line2 + 1;
423 }
424 }
425 }
426 int Size() const
427 {
428 return faces.size();
429 }
430 FaceIndex Index(int i) const
431 {
432 FaceIndex fi;
433 fi.face = faces[i];
434 return fi;
435 }
436
437private:
438 FaceCollection &pol;
439 std::vector<int> faces;
440};
441
442class Triangulate : public TriArray
443{
444public:
445 Triangulate(FaceCollection &coll) : faces(coll), index(coll), triarray(coll, index, faces) { }
446 void Gen()
447 {
448 faces.Gen();
449 index.Gen();
450 }
451 int Size() const { return triarray.Size(); }
452 Tri Index(int i) const
453 {
454 return triarray.Index(i);
455 }
456private:
460};
461
462
464{
465public:
466 virtual TriArray *Triangles(Coords pos) const=0;
467};
468
470{
471public:
472 FaceCollectionCoordObject(FaceCollection &coll, CoordSource &source) : source(source), tris(coll), c(0), c2(0)
473 {
474 tris.Gen();
475 }
476
478 {
479 delete c;
480 delete c2;
481 c = new MoveCoords(source.coord(), pos);
482 c2 = new ApplyTriArray(tris, *c);
483 return c2;
484 }
485private:
486 CoordSource &source;
487 Triangulate tris;
488 mutable MoveCoords *c;
489 mutable ApplyTriArray *c2;
490};
491
501
502class Room
503{
504public:
505 virtual TriArray *Triangles(const Array<int, Door> &doors) const=0;
506};
507
508class Shadow : public ModifyValue<Tri>
509{
510public:
511 Shadow(Plane pl, Point p) : pl(pl), p(p) { }
512 void Modify(Tri &t) const
513 {
514 LinePlaneIntersection intersect1 = LinePlaneIntersectionFunc(p, t.p1, pl.u_p, pl.u_p+pl.u_x, pl.u_p+pl.u_y);
515 t.p1 = IntersectionPoint(intersect1, p, t.p1);
516
517 LinePlaneIntersection intersect2 = LinePlaneIntersectionFunc(p, t.p2, pl.u_p, pl.u_p+pl.u_x, pl.u_p+pl.u_y);
518 t.p2 = IntersectionPoint(intersect2, p, t.p2);
519
520 LinePlaneIntersection intersect3 = LinePlaneIntersectionFunc(p, t.p3, pl.u_p, pl.u_p+pl.u_x, pl.u_p+pl.u_y);
521 t.p3 = IntersectionPoint(intersect3, p, t.p3);
522 }
523private:
524 Plane pl;
525 Point p;
526};
527#if 0
528#define retp(x,y,z) if(A++==a) return Point(x*scale,y*scale,z*scale);
529#define forq(i) for(i=-1;i<=1;i+=2)
530class Dodecahedron : public PointCollection
531{
532public:
533 double scale;
534 Dodecahedron(double s) : scale(s) {};
535 virtual int Size() const { return 20; }
536 virtual Point Index(int a) const {
537 double phi = (1+sqrt(5))/2;
538 int A = 0;
539 int i,j,k; // general counters
540 forq(i) {
541 forq(j) {
542 forq(k) {
543 retp(i,j,k);
544 }
545 }
546 };
547 // (+-1,+-1,+-1)
548
549 forq(i) {
550 forq(j) {
551 retp(0,i*(1/phi),j*phi);
552 }
553 };
554 // (0,+-1/phi,+-phi)
555
556 forq(i) {
557 forq(j) {
558 retp(i*(1/phi),j*phi,0);
559 }
560 };
561 // (+-1/phi,+-phi,0)
562
563 forq(i) {
564 forq(j) {
565 retp(j*phi,0,i*(1/phi));
566 }
567 };
568 // (+-phi,0,+-1/phi)
569 return Point(0.0,0.0,0.0);
570 }
571};
572
573#endif
574
576{
577public:
579 void Init();
580 bool Frame(float time);
581private:
582 VBOState vbostate;
583};
584
586{
587public:
589 void Init();
590 bool Frame(float time);
591 void PreFrame(float fr);
592 virtual void HandleKey(int key) { }
593 virtual void HandlePointer(int button) { }
594 virtual void HandlePointerMove(Point2d p) { pp = p; }
595
596private:
597 Point2d pp;
598};
LinePlaneIntersection LinePlaneIntersectionFunc(Point line_p1, Point line_p2, Point plane_p1, Point plane_p2, Point plane_p3)
Definition Intersect.cc:44
Point IntersectionPoint(LinePlaneIntersection &c, Point line_p1, Point line_p2)
Definition Intersect.cc:30
Definition Triangle.hh:209
Tri Index(int i) const
Definition Triangle.hh:213
ApplyTriArray(const TriArray &arr, ModifyValue< Tri > &mv)
Definition Triangle.hh:211
int Size() const
Definition Triangle.hh:212
Definition EffectI.hh:22
virtual int Size() const=0
Tri Index(int i) const
Definition Triangle.hh:192
BoxedTriangles(Array< int, Cube3 > &pos, TriArray &obj, Cube3 objpos)
Definition Triangle.hh:190
int Size() const
Definition Triangle.hh:191
Definition GraphI.hh:622
ColorTri(unsigned int c)
Definition Triangle.hh:59
void Modify(Tri &t) const
Definition Triangle.hh:60
Definition Triangle.hh:464
virtual TriArray * Triangles(Coords pos) const =0
Definition Effect.hh:3516
bool Frame(float time)
Definition Triangle.cc:39
virtual void HandlePointerMove(Point2d p)
Definition Triangle.hh:594
virtual void HandleKey(int key)
Definition Triangle.hh:592
DecodahedronEffect(Render *r)
Definition Triangle.hh:588
virtual void HandlePointer(int button)
Definition Triangle.hh:593
void Init()
Definition Triangle.cc:27
void PreFrame(float fr)
Definition Triangle.cc:30
FaceCollectionCoordObject(FaceCollection &coll, CoordSource &source)
Definition Triangle.hh:472
TriArray * Triangles(Coords pos) const
Definition Triangle.hh:477
virtual std::string name() const
Definition Triangle.hh:257
Vector PointNormal(int face, int point) const
Definition Triangle.hh:285
void HeavyPrepare()
Definition Triangle.hh:261
FaceCollectionFromTriArray(const TriArray &arr)
Definition Triangle.hh:256
int AttribI(int face, int point, int id) const
Definition Triangle.hh:300
void Collect(CollectVisitor &vis)
Definition Triangle.hh:258
int NumPoints(int face) const
Definition Triangle.hh:267
float Attrib(int face, int point, int id) const
Definition Triangle.hh:296
Point FacePoint(int face, int point) const
Definition Triangle.hh:271
int NumFaces() const
Definition Triangle.hh:262
Point2d TexCoord(int face, int point) const
Definition Triangle.hh:315
unsigned int Color(int face, int point) const
Definition Triangle.hh:304
Definition EffectI.hh:212
FrameAnim(Render *render)
Definition Effect.hh:110
virtual Point Index(int a) const=0
Definition Triangle.hh:37
virtual ~ModifyValue()
Definition Triangle.hh:40
virtual void Modify(T &t) const =0
Definition Triangle.hh:84
void Modify(Tri &t) const
Definition Triangle.hh:87
MoveBox(Cube3 oldbox, Cube3 newbox)
Definition Triangle.hh:86
Definition Triangle.hh:129
MoveCoords(Coords oldcoords, Coords newcoords)
Definition Triangle.hh:131
void Modify(Tri &t) const
Definition Triangle.hh:132
MoveTri(Vector v)
Definition Triangle.hh:46
void Modify(Tri &t) const
Definition Triangle.hh:47
Definition Triangle.hh:70
void Modify(Tri &t) const
Definition Triangle.hh:72
Definition VectorTools.hh:350
Definition Effect.hh:2456
Definition Effect.hh:9514
Definition Containment.hh:54
virtual TriArray * Triangles(const Array< int, Door > &doors) const =0
Definition GameApi_vo.cc:1110
Shadow(Plane pl, Point p)
Definition Triangle.hh:511
void Modify(Tri &t) const
Definition Triangle.hh:512
Definition Effect.hh:3156
Definition Triangle.hh:331
TriArrayFromFaceCollectionIndexFace(FaceCollection &coll, Array< int, TriIndex > &index, Array< int, FaceIndex > &faces)
Definition Triangle.hh:333
Tri Index(int i) const
Definition Triangle.hh:335
int Size() const
Definition Triangle.hh:334
TriArrayFromFaceCollection(FaceCollection &coll)
Definition Triangle.hh:227
Tri Index(int i) const
Definition Triangle.hh:232
int Size() const
Definition Triangle.hh:228
Definition Triangle.hh:184
Definition Triangle.hh:405
int Size() const
Definition Triangle.hh:426
void Gen()
Definition Triangle.hh:408
TriangulateConvexPolygonsFaces(FaceCollection &pol)
Definition Triangle.hh:407
FaceIndex Index(int i) const
Definition Triangle.hh:430
Definition Triangle.hh:365
void Gen()
Definition Triangle.hh:369
TriIndex Index(int face) const
Definition Triangle.hh:394
TriangulateConvexPolygonsIndex(FaceCollection &pol)
Definition Triangle.hh:367
int Size() const
Definition Triangle.hh:393
TriangulateEffect(Render *r)
Definition Triangle.hh:578
bool Frame(float time)
Definition Triangle.cc:21
void Init()
Definition Triangle.cc:11
Definition Triangle.hh:443
void Gen()
Definition Triangle.hh:446
Tri Index(int i) const
Definition Triangle.hh:452
int Size() const
Definition Triangle.hh:451
Triangulate(FaceCollection &coll)
Definition Triangle.hh:445
Definition Effect.hh:10694
Definition VectorTools.hh:125
static float DotProduct(const Vector &aVec, const Vector &aVec2)
Definition VectorTools.hh:185
static Vector CrossProduct(const Vector &aVec, const Vector &aVec2)
Definition VectorTools.hh:193
Widget()
Definition ui.hh:90
instead of< li > Displaying models works via URL t expect full length movie as the output of this process< li > Different animation models are very limited basically just translate rotate</ul >< h2 > What to do if your hosting location has no php</h2 >< ul >< li > comment out or remove display php lines at the beginning< li > you will lose threads too< li > every zip file distributed by meshpage org has one of those display php files with this issue</ul >< h2 > What should I do to serve the files via http</h2 > I get some random triangles that do not belong to the model</h2 > The engine works correctly The obj file supports triangles
Definition meshpage.php:1088
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:755
Definition Graph.hh:2101
Definition Triangle.hh:493
Plane plane
Definition Triangle.hh:495
Point2d topleft
Definition Triangle.hh:496
Point2d bottomleft
Definition Triangle.hh:498
Point2d topright
Definition Triangle.hh:497
Point2d bottomright
Definition Triangle.hh:499
Definition Triangle.hh:15
int face
Definition Triangle.hh:16
Definition Intersect.hh:30
Definition VectorTools.hh:910
Definition Parser.cc:60
float x
Definition Parser.cc:60
float y
Definition Parser.cc:60
float z
Definition Parser.cc:60
Definition GameApi.h:42
Definition Triangle.hh:9
int i2
Definition Triangle.hh:11
int i1
Definition Triangle.hh:10
int i3
Definition Triangle.hh:12
Definition Triangle.hh:20
Vector n2
Definition Triangle.hh:25
Vector n3
Definition Triangle.hh:26
Point2d tex2
Definition Triangle.hh:31
unsigned int c1
Definition Triangle.hh:27
unsigned int c2
Definition Triangle.hh:28
Vector n1
Definition Triangle.hh:24
Point p3
Definition Triangle.hh:23
unsigned int c3
Definition Triangle.hh:29
Point p1
Definition Triangle.hh:21
Point p2
Definition Triangle.hh:22
Point2d tex1
Definition Triangle.hh:30
Point2d tex3
Definition Triangle.hh:32