GameApi 28
Library used by GameApi Builder tool
Loading...
Searching...
No Matches
Effect.hh
Go to the documentation of this file.
1//
2// Copyright (C) 2009 Tero Pulkkinen
3// Released under LGPL License.
4//
5// This file is part of Polygon.
6//
7// Polygon is free software: you can redistribute it and/or modify
8// it under the terms of the GNU General Public License as published by
9// the Free Software Foundation, either version 3 of the License, or
10// (at your option) any later version.
11//
12// Polygon is distributed in the hope that it will be useful,
13// but WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15// GNU General Public License for more details.
16//
17// You should have received a copy of the GNU Library General Public License
18// along with Polygon. If not, see <http://www.gnu.org/licenses/>.
19//
20
21
22#ifndef EFFECT_HH
23#define EFFECT_HH 1
24#include "VectorTools.hh"
25#include <vector>
26#include <map>
27#include <cmath>
28#undef M_PI
29#include <iostream>
30#include "Pieces.hh"
31#ifndef DEPS
32//#include <SDL.h>
33#endif
34#undef M_PI
35#include "Buffer.hh"
36#include "Intersect.hh"
37#include "Shader.hh"
38#include <iterator>
39#include <cassert>
40#include <memory>
41#include <fstream>
42#ifndef HAS_PTHREAD
43#define HAS_PTHREAD 1
44#undef HAVE_STRUCT_TIMESPEC
45#include <pthread.h>
46#undef PTW32_LEVEL
47#undef PTW32_SCHED_LEVEL
48#endif
49#include "EffectI.hh"
50#include "GameApi_low.hh"
51
52#ifdef ARM
53#define pthread_mutex_unlock __gthread_mutex_unlock
54#define pthread_mutex_lock __gthread_mutex_lock
55#define PTHREAD_MUTEX_INITIALIZER __GTHREAD_MUTEX_INIT
56#define pthread_mutex_t __gthread_mutex_t
57#endif
58
59
61{
62public:
63 virtual ~BooleanOps() { }
64 virtual bool Inside(Point p) const { return false; }
65};
67{
68};
69
91
92
93
94
95class Effect
96{
97public:
98 virtual ~Effect() { }
99 virtual float Length() const=0;
100 virtual void ChangeTime(float time)=0;
101};
102
103class Render;
104class LineCollection;
105class FaceCollection;
106
108{
109public:
110 FrameAnim(Render *render) : render(render) { }
111 virtual ~FrameAnim() { }
112 virtual float Time() const { return 5.0; }
113 virtual void Init() { }
114 virtual void Cleanup() { }
115 virtual void PreFrame(float time) { /*GetRender()->SetTime(time);*/ }
116 virtual bool Frame(float time)=0;
117 virtual void PostFrame() { }
118 virtual float XRot() const { return 1.0; }
119 virtual float YRot() const { return 1.0; }
120 virtual float ZRot() const { return 0.0; }
121 virtual float RotSpeed() const { return 1.0; }
122public:
123 Render *GetRender() const { return render; }
124public:
125 void RenderOpenGl(const FaceCollection &col);
126 void RenderOpenGlLines(const LineCollection &col);
127 void RenderOpenGlPoly(const PointCollection &col);
128private:
129 Render *render;
130};
131
132
134{
135public:
136 virtual ~FramePlugin() { }
137 virtual void Init() { }
138 virtual void Cleanup() { }
139 virtual void PreFrame(float time) { }
140 virtual void PostFrame() { }
141};
142
143template<class T>
145{
146public:
147 virtual T get() const=0;
148 virtual ~LazyValue() { }
149};
150
151template<class A, class B>
152class Union
153{
154public:
155 Union(A a) : is_a(true) { either.a = a; }
156 Union(B b) : is_a(false) { either.b = b; }
157 Union(A a, B b, bool is_a) : is_a(is_a) { if (is_a) either.a = a; else either.b = b; }
158 Union(const Union<A,B> &c)
159 {
160 if (c.is_a) either.a = c.either.a;
161 else
162 either.b = c.either.b;
163 is_a = c.is_a;
164 }
165 bool is_a;
166 union {
170};
171
172
173#if 0
174template<class A, class B>
175class DynFunction
176{
177 virtual ~DynFunction() { }
178 virtual void set(float x, float y)=0;
179};
180
181template<class T>
182class DynamicFunction : public Function<float,float>, public DynFunction<float,float>
183{
184public:
185 float Index(float a) const
186 {
187 std::map<float,float>::iterator i = std::lower_bound(mymap.begin(), mymap.end(), a);
188 if (i==mymap.end()) return 0.0;
189 std::map<float,float>::iterator i2 = i+1;
190 if (i2==mymap.end()) return (*i).second;
191 a-=(*i).first;
192 a/=(*i2).first - (*i).first;
193 float val1 = (*i).second;
194 float val2 = (*i2).second;
195 return val1*(1.0-a) + val2*a;
196 }
197 void set(float x, float y) { mymap[x] = y; }
198private:
199 std::map<float, float> mymap;
200};
201
202#endif
203
204template<class A, class B>
205class RangeFunction : public Function<A,B>
206{
207public:
208 virtual B Index(A a) const
209 {
210 int s = value.size();
211 for(int i=0;i<s;i++)
212 {
213 if (a >= start_range[i] && a < end_range[i])
214 {
215 return value[i];
216 }
217 }
218 return B();
219 }
220 void push_back(A start, A end, B val) {
221 value.push_back(val);
222 start_range.push_back(start);
223 end_range.push_back(end);
224 }
225 static std::pair<A,B> *EqualizerCheck(RangeFunction<A,B> &f1,
226 RangeFunction<A,B> &f2, int i1, int i2)
227 {
228 B start = f1.value(i1);
229 B end = f1.value(i2);
230 B middle = f2.Index(f1.end_range[i1]);
231 //B middle2 = f2.Index(f1.start_range[i2]);
232 if (start <= middle && middle <= end) return new std::pair<A,B>(f1.end_range[i1], middle);
233 if (end <= middle && middle <= start) return new std::pair<A,B>(f1.end_range[i1], middle);
234 return 0;
235 }
236
237private:
238 std::vector<B> value;
239 std::vector<A> start_range;
240 std::vector<A> end_range;
241};
242
243template<class A, class B>
244class Arrow
245{
246public:
247 virtual B Map(A a) const=0;
248 virtual A InvMap(A a, int num) const=0;
249};
250
251class InterpolateFunction : public Function<float, float>
252{
253public:
255 Function<float,float> &f2, float pos) : f1(f1),f2(f2), pos(pos) { }
256
257 float Index(float x) const
258 {
259 return f1.Index(x)*pos + f2.Index(x)*(1.0-pos);
260 }
261private:
264 float pos;
265};
266
267template<class T, class K>
268class InvertableFunction : public Function<T,K>
269{
270public:
271 virtual K Index(T t) const=0;
272 virtual std::vector<T> Inverse(K k) const=0;
273};
274
275class VectorInvertableFunction2d : public InvertableFunction<Point2d, Point2d>
276{
277public:
280 {
281 Point2d p = { t.x+vec.dx, t.y+vec.dy };
282 return p;
283 }
284 std::vector<Point2d> Inverse(Point2d k) const
285 {
286 std::vector<Point2d> p;
287 Point2d pp = { k.x-vec.dx, k.y-vec.dy };
288 p.push_back(pp);
289 return p;
290 }
291private:
292 Vector2d vec;
293};
294
295class VectorPointConversion : public Function<Vector, Point>
296{
297public:
299 {
300 Point p;
301 p.x = v.dx;
302 p.y = v.dy;
303 p.z = v.dz;
304 return p;
305 }
306};
307
308class PointVectorConversion : public Function<Point, Vector>
309{
310public:
312 {
313 Vector p;
314 p.dx = v.x;
315 p.dy = v.y;
316 p.dz = v.z;
317 return p;
318 }
319};
320
321
322template<class T, class A, class B>
323class ForwardFunction : public Function<A,B>
324{
325public:
326 ForwardFunction(T *obj, B (T::*fptr)(A) const) : obj(obj), fptr(fptr) { }
327 B Index(A a) const { return (obj->*fptr)(a); }
328private:
329 T *obj;
330 B (T::*fptr)(A) const;
331};
332template<class A, class B>
333class NativeFunction : public Function<A,B>
334{
335public:
336 NativeFunction(B (*fptr)(A)) : fptr(fptr) { }
337 B Index(A a) const { return fptr(a); }
338private:
339 B (*fptr)(A);
340};
341
342template<class K, class Impl>
343class FunctionImplT0 : public Function<void, K>
344{
345 FunctionImplT0() : c(0) { }
346 K Index() const {
347 delete c;
348 c = new Impl();
349 return c;
350 }
351 ~FunctionImplT0() { delete c; }
352private:
353 mutable Impl *c;
354};
355
356template<class K, class P1, class Impl>
357class FunctionImplT1 : public Function<void, K>
358{
359 FunctionImplT1(P1 p1) : c(0), p1(p1) { }
360 K Index() const {
361 delete c;
362 c = new Impl(p1);
363 return c;
364 }
365 ~FunctionImplT1() { delete c; }
366
367private:
368 P1 p1;
369 mutable Impl *c;
370};
371
372
373template<class K, class P1, class P2, class Impl>
374class FunctionImplT2 : public Function<void, K>
375{
376 FunctionImplT2(P1 p1, P2 p2) : c(0), p1(p1), p2(p2) { }
377 K Index() const {
378 delete c;
379 c = new Impl(p1,p2);
380 return c;
381 }
382 ~FunctionImplT2() { delete c; }
383
384private:
385 P1 p1;
386 P2 p2;
387 mutable Impl *c;
388};
389
390
391template<class K, class P1, class P2, class P3, class Impl>
392class FunctionImplT3 : public Function<void, K>
393{
394 FunctionImplT3(P1 p1, P2 p2, P3 p3) : c(0), p1(p1), p2(p2), p3(p3) { }
395 K Index() const {
396 delete c;
397 c = new Impl(p1,p2, p3);
398 return c;
399 }
400 ~FunctionImplT3() { delete c; }
401
402private:
403 P1 p1;
404 P2 p2;
405 P3 p3;
406 mutable Impl *c;
407};
408
409
410
411
412template<class T, class K, class Impl>
413class FunctionImpl0 : public Function<T,K>
414{
415public:
416 FunctionImpl0() : c(0) { }
417 K Index(T a) const
418 {
419 delete c;
420 c = new Impl(a);
421 return c;
422 }
423 ~FunctionImpl0() { delete c; }
424
425private:
426 mutable Impl *c;
427};
428
429template<class T, class K, class P, class Impl>
430class FunctionImpl1 : public Function<T,K>
431{
432public:
433 FunctionImpl1(P p) : p(p), c(0) { }
434 K Index(T a) const
435 {
436 delete c;
437 c = new Impl(a, p);
438 return c;
439 }
440 ~FunctionImpl1() { delete c; }
441private:
442 P p;
443 mutable Impl *c;
444};
445
446template<class T, class K, class P1, class P2, class Impl>
447class FunctionImpl2 : public Function<T,K>
448{
449public:
450 FunctionImpl2(P1 p1, P2 p2) : p1(p1), p2(p2), c(0) { }
451 K Index(T a) const
452 {
453 delete c;
454 c = new Impl(a, p1, p2);
455 return c;
456 }
457 ~FunctionImpl2() { delete c; }
458
459private:
460 P1 p1;
461 P2 p2;
462 mutable Impl *c;
463};
464
465template<class T, class K, class P1, class P2, class P3, class Impl>
466class FunctionImpl3 : public Function<T,K>
467{
468public:
469 FunctionImpl3(P1 p1, P2 p2, P3 p3) : p1(p1), p2(p2), p3(p3), c(0) { }
470 K Index(T a) const
471 {
472 delete c;
473 c = new Impl(a, p1, p2, p3);
474 return c;
475 }
476 ~FunctionImpl3() { delete c; }
477
478private:
479 P1 p1;
480 P2 p2;
481 P3 p3;
482 mutable Impl *c;
483};
484
485
486
487
488template<class A, class B, class C>
489class FunctionCompose : public Function<A,C>
490{
491public:
492 FunctionCompose(Function<A,B> &f1, Function<B,C> &f2) : f1(f1), f2(f2) { }
493 C Index(A a) const { return f2.Index(f1.Index(a)); }
494private:
495 Function<A,B> &f1;
497};
498
499template<class C1, class C2, class D>
500class EitherFunction : public Function<Union<C1,C2>, D>
501{
502public:
503 EitherFunction(Function<C1,D> &f1, Function<C2,D> &f2) : f1(f1), f2(f2) { }
505 {
506 if (u.is_a)
507 return f1.Index(u.either.a);
508 else
509 return f2.Index(u.either.b);
510 }
511private:
512 Function<C1,D> &f1;
514};
515
516template<class A, class B, class C>
518{
519public:
520 typedef std::pair<A,B> Domain;
521 typedef C CoDomain;
522 C Index(const std::pair<A,B> &p) { return Index(p.first, p.second); }
523
524 virtual ~Function2() { }
525 virtual C Index(A a, B b) const=0;
526};
527
528template<class A>
529class ForLoop : public Function<A,A>
530{
531public:
532 ForLoop(int repeat, Function<A,A> &a) : repeat(repeat), f(&a), f2(0) { }
533 ForLoop(int repeat, Function2<int, A,A> &a) : repeat(repeat), f(0), f2(&a) { }
534 A Index(A a) const
535 {
536 if (f)
537 {
538 for(int i=0;i<repeat;i++)
539 {
540 a = f->Index(a);
541 }
542 }
543 else
544 {
545 for(int i=0;i<repeat;i++)
546 {
547 a = f2->Index(i,a);
548 }
549 }
550 return a;
551 }
552private:
553 int repeat;
556};
557
558
559template<class A, class B, class C>
560class NativeFunction2 : public Function2<A,B,C>
561{
562public:
563 NativeFunction2(C (*fptr)(A,B)) : fptr(fptr) { }
564 C Index(A a, B b) const { return fptr(a,b); }
565private:
566 C (*fptr)(A, B);
567};
568
569template<class T>
571{
572public:
573 virtual ~Element() { }
574 virtual T Elem() const=0;
575};
576template<class A, class B>
577class Curry : public Element<B>
578{
579public:
580 Curry(const Function<A,B> &func, A a) : func(func),a(a) { }
581 B Elem() const { return func.Index(a); }
582private:
583 const Function<A,B> &func;
584 A a;
585};
586template<class A, class B, class C>
587class Curry2a : public Function<B,C>
588{
589public:
590 Curry2a(const Function2<A,B,C> &func2, A a) : func2(func2), a(a) { }
591 C Index(B b) const { return func2.Index(a,b); }
592private:
593 const Function2<A,B,C> &func2;
594 A a;
595};
596
597template<class A, class B, class C>
598class Curry2b : public Function<A,C>
599{
600public:
601 Curry2b(const Function2<A,B,C> &func2, B b) : func2(func2), b(b) { }
602 C Index(A a) const { return func2.Index(a,b); }
603private:
604 const Function2<A,B,C> &func2;
605 B b;
606};
607template<class A, class B>
608class RenamedFunction : public Function<A,B>
609{
610public:
611 B Index(A a) const { return Map(a); }
612 virtual B Map(A a) const=0;
613};
614
615template<class X, class Y, class B>
616class Exponentiation : public Function<X,Function<B,Y>* >, private RenamedFunction<B,Y>
617{
618public:
619 Exponentiation(Function<std::pair<X,B>, Y> &f) : f(f) { }
621 {
622 xx = x;
623 return this;
624 }
625 Y Map(B b) const
626 {
627 return f.Index(std::make_pair(xx,b));
628 }
629private:
631 X xx;
632};
633
634template<class X, class Y, class B>
635class ExponentiationI : public Function<std::pair<X,B>, Y>
636{
637public:
638 ExponentiationI(Function<X, Function<B,Y> *> &func) : func(func) { }
639 Y Index(std::pair<X,B> &p) const
640 {
641 Function<B,Y> *func2 = func.Index(p.first);
642 return func2->Index(p.second);
643 }
644private:
646};
647
648// This is really a Function<std::pair<Function<B,Y>*,B>, Y>
649template<class B, class Y>
650class Evaluation : public ExponentiationI<Function<B,Y>*, Y, B>
651{
652public:
654};
655
656template<class X>
657class EvaluationCharacteristicFunction : public Function<std::pair<Function<X,bool>*, X>, bool>
658{
659public:
661 bool Index(std::pair<Function<X,bool>*, X> p) const
662 {
663 return eval.Index(p);
664 }
665private:
667};
668template<class A, class B, class C, class D>
669class PairFunction : Function<std::pair<A,B>, std::pair<C,D> >
670{
671public:
672 PairFunction(Function<A,C> &f1, Function<B,D> &f2) : f1(f1), f2(f2) { }
673 std::pair<C,D> Index(std::pair<A,B> p) const
674 {
675 return make_pair(f1.Index(p.first), f2.Index(p.second));
676 }
677private:
678 Function<A,C> &f1;
680};
681
682template<class N>
683class Successor : public Function<N,N>
684{
685public:
686 N Index(N n) const
687 {
688 return n+1;
689 }
690};
691
692
693template<class N>
694class Iteration : public Function<int, Function<N,N>* >, private Function<N,N>
695{
696public:
697 Iteration(Function<N,N> &succ) : succ(succ) { }
698 Function<N,N>* Index(int n) const
699 {
700 count = n;
701 return this;
702 }
703 N Index(N n) const
704 {
705 N nn = n;
706 for(int i=0;i<count;i++)
707 {
708 nn = succ(nn);
709 }
710 return nn;
711 }
712private:
713 Function<N,N> &succ;
714 mutable int count;
715};
716
717template<class N>
718class Plus : public Function<std::pair<N,N>, N>
719{
720public:
721 Plus(Function<N,N> &succ) : ite(succ), exp(ite) { }
722 N Index(std::pair<N,N> &p) const
723 {
724 return exp.Index(p);
725 }
726private:
727 Iteration<N> ite;
729};
730
731template<class N, class A>
732class Mul : public Function<std::pair<N,A>, A>, private Function<A, Function<int, A>*>
733{
734public:
735 Mul(Function<std::pair<A,A>, A> &plus, A zero) : exp(plus), zero(zero), expi(this) { }
736 A Index(std::pair<N,A> &p) const
737 {
738 //return expi.Index(p);
739 }
740#if 0
741 class IteFunc : public Function<int, A>
742 {
743 public:
744 IteFunc(Function<A,A> *func, A zero) : func(func), zero(zero) { }
745 A Index(int a) const
746 {
747 Iteration<A> ite(func);
748 Function<A,A> *f2 = ite.Index(a);
749 A aa = f2->Index(zero);
750 return aa;
751 }
752 Function<A,A> *func;
753 A zero;
754 };
755#endif
757 {
758#if 0
759 Function<A,A> *func = exp.Index(a);
760 delete ptr;
761 ptr = new IteFunc(func, zero);
762 return ptr;
763#endif
764 }
765 ~Mul() { /*delete ptr;*/ }
766private:
768 Evaluation<A,A> eval;
770 //IteFunc *ptr;
771 A zero;
772};
773
774template<class T>
775class ElementFunction : public Function<Element<T>*, T>
776{
777public:
779 {
780 return e->Elem();
781 }
782};
783
784template<class T>
785void AllocToNativeArray(Array<int,T> &arr, T*** result);
786
787template<class T>
788class NativeArray : public Array<int, T>
789{
790public:
791 NativeArray(T *array, int size) : array(array), size(size) { }
792 int Size() const { return size; }
793 T Index(int i) const { return array[i]; }
794private:
795 T *array;
796 int size;
797};
798
799template<class I, class A, class B>
800class MapArray : public Array<I, B>
801{
802public:
803 MapArray(Array<I,A> &arr, Function<A,B> &func) : arr(arr), func(func) { }
804 I Size() const { return arr.Size(); }
805 B Index(I i) const { return func.Index(arr.Index(i)); }
806private:
807 Array<I,A> &arr;
809};
810
811class SingleInt : public Array<int,int>
812{
813public:
814 SingleInt(int a) : a(a) { }
815 int Size() const { return 1; }
816 int Index(int i) const { return a; }
817 int Sum() const { return a; }
818private:
819 int a;
820};
821class TwoInts : public Array<int,int>
822{
823public:
824 TwoInts(int a, int b) : a(a), b(b) { }
825 int Size() const { return 2; }
826 int Index(int i) const { if (i==0) return a; else return b; }
827 int Sum() const { return a+b; }
828private:
829 int a,b;
830};
831
832class ThreeInts : public Array<int,int>
833{
834public:
835 ThreeInts(int a, int b, int c) : a(a), b(b), c(c) { }
836 int Size() const { return 3; }
837 int Index(int i) const { if (i==0) return a; else if (i==1) return b; else return c; }
838 int Sum() const { return a+b+c; }
839private:
840 int a,b,c;
841};
842
843template<class T>
844class ResizeArray : public Array<int, T>
845{
846public:
847 ResizeArray(Array<int, T> &arr, T def, int size) : arr(arr), def(def), size(size) { }
848 int Size() const { return size; }
849 T Index(int i) const
850 {
851 if (i < arr.Size()) return arr.Index(i);
852 return def;
853 }
854private:
855 Array<int, T> &arr;
856 T def;
857 int size;
858};
859
860
861template<class I, class I2, class T>
862class SwapIndexesArray : public Array<I2, Array<I, T>*>
863{ // all arrays need to be same size.
864public:
865 SwapIndexesArray(Array<I, Array<I2, T>*> &arr) : arr(arr),i(0) { }
866 I2 Size() const { return arr.Index(0)->Size(); }
867 ~SwapIndexesArray() { delete i; }
868 Array<I,T>* Index(I2 index) const
869 {
870 delete i;
871 i = new InnerArray(arr, index);
872 return i;
873 }
874 struct InnerArray : public Array<I,T>
875 {
877 I Size() const { return arr.Size(); }
878 T Index(I i) const
879 {
880 return arr.Index(i)->Index(index);
881 }
884 };
885private:
887 mutable InnerArray *i;
888};
889
890template<class P, class T>
891class ApplyParameterArray : public Array<int, T>
892{
893public:
894 ApplyParameterArray(Array<int, Array<P, T>*> &arr, P p) : arr(arr), p(p) { }
895 int Size() const { return arr.Size(); }
896 T Index(int i) const
897 {
898 return arr.Index(i)->Index(p);
899 }
900private:
902 P p;
903};
904
905template<class I, class T>
906class FunctionArray : public Array<I,T>
907{
908public:
909 FunctionArray(I size, Function<I,T> &func) : size(size), func(func) { }
910 I Size() const { return size; }
911 T Index(I i) const { return func.Index(i); }
912private:
913 I size;
915};
916
917template<class B, class I, class T>
918class ArrayConvert : public B
919{
920public:
921 ArrayConvert(const Array<I, T> &arr) : arr(arr) { }
922 int Size() const { return arr.Size(); }
923 T Index(int i) const { return arr.Index(i); }
924private:
925 const Array<I,T> &arr;
926};
927
928template<class T>
929class CombineArrays : public Array<int,T>
930{
931public:
932 CombineArrays(const Array<int,T> &a1, const Array<int,T> &a2) : a1(a1), a2(a2) { }
933 int Size() const { return a1.Size()+ a2.Size(); }
934 T Index(int i) const
935 {
936 int size = a1.Size();
937 if (i < size)
938 {
939 return a1.Index(i);
940 }
941 else
942 {
943 return a2.Index(i-size);
944 }
945 }
946 bool ItemInFirstArray(int i) const
947 {
948 return i < a1.Size();
949 }
950 bool ItemInSecondArray(int i) const
951 {
952 return !ItemInFirstArray(i);
953 }
954
955private:
956 const Array<int,T> &a1;
957 const Array<int,T> &a2;
958};
959
960template<class T>
961class FilterArray : public Array<int,T>
962{
963public:
964 FilterArray(Array<int,T> &arr, Function<T, bool> &b) : arr(arr), b(b) { }
965 int Size() const
966 {
967 int size = arr.Size();
968 int count = 0;
969 for(int i=0;i<size;i++)
970 {
971 if (b.Index(arr.Index(i)))
972 count++;
973 }
974 return count;
975 }
976 T Index(int ii) const
977 {
978 int size = arr.Size();
979 int count = 0;
980 for(int i=0;i<size;i++)
981 {
982 if (count == ii) return arr.Index(i);
983 if (b.Index(arr.Index(i)))
984 count++;
985 }
986 return arr.Index(0);
987 }
988private:
989 Array<int, T> &arr;
991};
992
993template<class I, class T>
994std::ostream &operator<<(std::ostream &o, const Array<I,T> &arr)
995{
996 int size = arr.Size();
997 o << "[";
998 for(int i=0;i<50 && i<size;i++)
999 {
1000 o << arr.Index(i) << ",";
1001 }
1002 o << "...]";
1003 return o;
1004}
1005
1006
1007template<class I1, class I2, class T>
1008class Array2 : public Function2<I1,I2,T>
1009{
1010public:
1011 virtual I1 SizeX() const=0;
1012 virtual I2 SizeY() const=0;
1013};
1014
1015template<class A, class B, class C>
1016class ComposeArrays : public Array<A,C>
1017{
1018public:
1019 ComposeArrays(Array<A,B> &a1, Function<B,C> &a2) : a1(a1), a2(a2) { }
1020 A Size() const { return a1.Size(); }
1021 C Index(A a) const { return a2.Index(a1.Index(a)); }
1022private:
1023 Array<A,B> &a1;
1024 Function<B,C> &a2;
1025};
1026
1027template<class A, class C>
1028class ComposeChain : public Array<A,C>
1029{
1030public:
1031 template<class T1>
1033 {
1034 arr = new ComposeArrays<A,T1,C>(a1, f1);
1035 }
1036 template<class T1, class T2>
1038 {
1039 Array<A,T2> *arr1 = new ComposeArrays<A,T1,T2>(a1, f1);
1040 arr = new ComposeArrays<A,T2, C>(*arr1, f2);
1041 }
1042 template<class T1, class T2, class T3>
1049 template<class T1, class T2, class T3, class T4>
1057 template<class T1, class T2, class T3, class T4,class T5>
1059 {
1060 ComposeChain<A,T5> *arr1 = new ComposeChain<A,T5>(a1,f1,f2,f3,f4);
1061 arr = new ComposeArrays<A,T5, C>(*arr1, f5);
1062 }
1063
1064 template<class T1, class T2, class T3, class T4,class T5, class T6>
1066 {
1067 ComposeChain<A,T6> *arr1 = new ComposeChain<A,T6>(a1,f1,f2,f3,f4,f5);
1068 arr = new ComposeArrays<A,T6, C>(*arr1, f6);
1069 }
1070
1071
1072
1073 A Size() const { return arr->Size(); }
1074 C Index(A a) const { return arr->Index(a); }
1075
1076
1077private:
1078 Array<A,C> *arr;
1079};
1080
1081template<class T>
1082class SingletonArray : public Array<int,T>
1083{
1084public:
1085 SingletonArray(T t) : t(t) { }
1086 virtual int Size() const { return 1; }
1087 virtual T Index(int index) const { return t; }
1088private:
1089 T t;
1090};
1091
1092template<class S, class T>
1093class DuplicateArray : public Array<S, T>
1094{
1095public:
1096 DuplicateArray(const T &t, const S &s) : t(t),s(s) { }
1097 S Size() const { return s; }
1098 T Index(S index) const { return t; }
1099private:
1100 T t;
1101 S s;
1102};
1103
1104template<class T>
1105class DupArray : public Array<int, T>
1106{
1107public:
1108 DupArray(Array<int,T> &orig, int count) : orig(orig), count(count) { }
1109 int Size() const { return orig.Size()*count; }
1110 T Index(int i) const
1111 {
1112 int pos = i % orig.Size();
1113 return orig.Index(pos);
1114 }
1115private:
1116 Array<int,T> &orig;
1117 int count;
1118};
1119
1120template<class T>
1121class VectorArray : public Array<int, T>
1122{
1123public:
1124 VectorArray() : vec() { }
1125 template<class It>
1126 VectorArray(It beg, It end) : vec(beg, end) { }
1127 virtual int Size() const { return vec.size(); }
1128 virtual T Index(int index) const { return vec.at(index); }
1129
1130 T &operator[](int index) { return vec[index]; }
1131 void push_back(T t) { vec.push_back(t); }
1133 {
1134 T t = vec.back();
1135 vec.pop_back();
1136 return t;
1137 }
1138 void clear() { vec.clear(); }
1139 const T *get_whole_array() const { return &vec[0]; }
1140private:
1141 std::vector<T> vec;
1142};
1143
1144template<class T>
1145class CopyArray : public VectorArray<T>
1146{
1147public:
1148 CopyArray(Array<int, T> &arr) : arr(arr)
1149 {
1150 Generate();
1151 }
1153 {
1154 int size = VectorArray<T>::Size();
1155 for(int i=0;i<size;i++)
1157 // now VectorArray is empty
1158 int size2 = arr.Size();
1159 for(int ii=0;ii<size2;ii++)
1160 this->push_back(arr.Index(ii));
1161 }
1162private:
1163 Array<int, T> &arr;
1164};
1165
1166template<class T, class K>
1168{
1169public:
1170 IteratorArray(const Array<T,K> &arr) : arr(arr) { }
1172 {
1174 void operator++() { index++; }
1175 void operator--() { index--; }
1176 void operator+=(int i) { index+=i; }
1177 void operator-=(int i) { index-=i; }
1178 friend int operator-(const const_iterator &i, const const_iterator &i2)
1179 {
1180 return i.index - i2.index;
1181 }
1182 typedef std::random_access_iterator_tag iterator_category;
1183 typedef int pointer;
1184 typedef int &reference;
1185 typedef K value_type;
1186 typedef int difference_type;
1187 K operator*() const { return arr.Index(index); }
1190 };
1191 const_iterator begin() const { return const_iterator(arr, 0); }
1192 const_iterator end() const { return const_iterator(arr, arr.Size()); }
1193private:
1194 const Array<T,K> &arr;
1195};
1196#undef min
1197#undef max
1198template<class I, class T>
1199class ArrayDiagonal : public Array<I,T>
1200{
1201public:
1202 ArrayDiagonal(Array<std::pair<I,I>, T> &arr) : arr(arr) { }
1203 I Size() const
1204 {
1205 std::pair<I,I> p = arr.Size();
1206 return std::min(p.first, p.second);
1207 }
1208 T Index(I i) const
1209 {
1210 return arr.Index(std::make_pair(i,i));
1211 }
1212private:
1213 Array<std::pair<I,I>, T> &arr;
1214};
1215
1216template<class I1, class I2, class T1, class T2>
1217class ArrayPair2 : public Array<std::pair<I1,I2>, std::pair<T1,T2> >
1218{
1219public:
1220 ArrayPair2(const Array<I1,T1> &arr1, const Array<I2,T2> &arr2) : arr1(arr1), arr2(arr2) { }
1221 std::pair<I1,I2> Size() const
1222 {
1223 return std::make_pair(arr1.Size(), arr2.Size());
1224 }
1225 std::pair<T1,T2> Index(std::pair<I1,I2> i) const
1226 {
1227 T1 i2 = arr1.Index(i.first);
1228 T2 i3 = arr2.Index(i.second);
1229 //std::cout << "ArrayPair: " << i2 << " " << i3 << std::endl;
1230 return std::make_pair(i2, i3); }
1231private:
1232 const Array<I1,T1> &arr1;
1233 const Array<I2,T2> &arr2;
1234};
1235
1236template<class I, class T1, class T2>
1237class ArrayPair : public Array<I,std::pair<T1,T2> >
1238{
1239public:
1240 ArrayPair(Array<I,T1> &a1, Array<I,T2> &a2) : pair(a1,a2), diag(pair) { }
1241 I Size() const { return diag.Size(); }
1242 std::pair<T1,T2> Index(I i) const
1243 {
1244 return diag.Index(i);
1245 }
1246private:
1249};
1250
1251template<class I, class T1, class T2>
1252class FstArray : public Array<I, T1>
1253{
1254public:
1255 FstArray(Array<I, std::pair<T1,T2> > &arr) : arr(arr) { }
1256 I Size() const { return arr.Size(); }
1257 T1 Index(I i) const
1258 {
1259 return arr.Index(i).first;
1260 }
1261private:
1263};
1264
1265template<class I, class T1, class T2>
1266class SndArray : public Array<I, T2>
1267{
1268public:
1269 SndArray(Array<I, std::pair<T1,T2> > &arr) : arr(arr) { }
1270 I Size() const { return arr.Size(); }
1271 T2 Index(I i) const
1272 {
1273 return arr.Index(i).second;
1274 }
1275private:
1277};
1278
1279
1280template<class I, class T>
1281class SubArray : public Array<I,T>
1282{
1283public:
1284 SubArray(const Array<I,T> &arr, int start_index, int length) : arr(arr), start_index(start_index), length(length) { }
1285 I Size() const { return length; }
1286 T Index(int i) const
1287 {
1288 return arr.Index(start_index+i);
1289 }
1290private:
1291 const Array<I,T> &arr;
1292 int start_index;
1293 int length;
1294};
1295
1296
1297template<class I, class J, class T>
1298class ArrayArray : public Array<I, Array<J,T>*>
1299{
1300public:
1301};
1302
1303template<class T>
1305{
1306public:
1307 Range() : start(), end() { }
1308 Range(T s, T e) : start(s), end(e) { }
1311};
1312
1313template<class T>
1314class SubArrayArray : public ArrayArray<int, int, T>
1315{
1316public:
1317 SubArrayArray(Array<int, Range<int> > &ranges, Array<int, T> &contents) : ranges(ranges), contents(contents) { }
1318 Array<int, T> *Index(int i) const
1319 {
1320 delete sub;
1321 Range<int> r = ranges.Index(i);
1322 sub = new SubArray<int,T>(contents, r.start, r.end-r.start);
1323 return sub;
1324 }
1325 ~SubArrayArray() { delete sub; }
1326private:
1327 SubArray<int, T> *sub;
1328 Array<int,Range<int> > &ranges;
1330};
1331
1332template<class I, class J, class T>
1333class ArrayArraySizes : public Array<I, J>
1334{
1335public:
1337 J Index(I i) const
1338 {
1339 return arr.Index(i)->Size();
1340 }
1341 I Size() const { return arr.Size(); }
1342private:
1344};
1345
1346class IndexMap : public Array<int,std::pair<int,int> >
1347{ // takes small array of sizes, and creates larger array which
1348 // is described by the sizes.
1349public:
1350 IndexMap(Array<int,int> &arr) : arr(arr) { }
1351 std::pair<int,int> Index(int i) const
1352 {
1353 int index = 0;
1354 int size = arr.Size();
1355 for(int ii = 0;ii<size;ii++)
1356 {
1357 int oldindex = index;
1358 index += arr.Index(ii);
1359 if (index >= i) return std::make_pair(ii, i - oldindex);
1360 }
1361 return std::make_pair(0,0);
1362 }
1363 int Size() const
1364 {
1365 int size = arr.Size();
1366 int count = 0;
1367 for(int ii=0;ii<size;ii++)
1368 {
1369 count += arr.Index(ii);
1370 }
1371 return count;
1372 }
1373private:
1374 Array<int,int> &arr;
1375};
1376
1377
1378template<class T>
1379class CompressArrayArray : public Array<int,T>
1380{
1381public:
1382 CompressArrayArray(ArrayArray<int, int, T> &arr) : arr(arr), sizes(arr), sizesmap(sizes) { }
1383 T Index(int i) const
1384 {
1385 std::pair<int,int> p = sizesmap.Index(i);
1386 return arr.Index(p.first)->Index(p.second);
1387 }
1388private:
1390
1392 IndexMap sizesmap;
1393};
1394
1395
1397
1398
1399template<class T>
1400class CurveConvert : public Curve<T>
1401{
1402public:
1403 CurveConvert(const Array<float,T> &arr) : arr(arr) { }
1404 int Size() const { return arr.Size(); }
1405 T Index(float i) const { return arr.Index(i); }
1406
1407private:
1408 const Array<float, T> &arr;
1409};
1410
1411template<class T>
1412class ScaleCurve : public Curve<T>
1413{
1414public:
1415 ScaleCurve(Curve<T> &curve, float target_length) : curve(curve), target_length(target_length) { }
1416 float Size() const { return target_length; }
1417 T Index(float x) const
1418 {
1419 return curve.Index(x/target_length*curve.Size());
1420 }
1421private:
1422 Curve<T> &curve;
1423 float target_length;
1424};
1425
1426
1428{
1429public:
1430 FunctionCurveIn2d(Function<float, float> &f, float size, Point2d p, Vector2d u_x, Vector2d u_y) : f(f), size(size), p(p), u_x(u_x), u_y(u_y) { }
1431 float Size() const { return size; }
1432 Point2d Index(float x) const
1433 {
1434 Point2d res = p;
1435 res += x*u_x + f.Index(x)*u_y;
1436 return res;
1437 }
1438private:
1440 float size;
1441 Point2d p;
1442 Vector2d u_x, u_y;
1443};
1444
1445
1447{
1448public:
1450 float Size() const { return c2.Size();}
1451 Point2d Index(float i) const { return c2.Index(i); }
1452private:
1453 const Array<float, Point2d> &c2;
1454};
1455
1456
1458{
1459public:
1460 FunctionCurveIn3d(Function<float, float> &f, float size, Point p, Vector u_x, Vector u_y) : f(f), size(size), p(p), u_x(u_x), u_y(u_y) { }
1461 float Size() const { return size; }
1462 Point Index(float x) const
1463 {
1464 Point res = p;
1465 res += u_x*x + u_y*f.Index(x);
1466 return res;
1467 }
1468private:
1470 float size;
1471 Point p;
1472 Vector u_x;
1473 Vector u_y;
1474};
1475
1476
1477class CurveArrayConvert : public Array<int, Array<float, Point>* >
1478{
1479public:
1481 int Size() const { return arr.Size(); }
1483 {
1484 return arr.Index(i); // conversion CurveIn3d* => Array<int,Point>*
1485 }
1486private:
1488};
1489
1491{
1492public:
1494 float Size() const { return c2.Size(); }
1495 Point Index(float i) const { return c2.Index(i); }
1496private:
1497 const Array<float, Point> &c2;
1498};
1499
1501{
1502public:
1503 RepositionCurve(CurveIn3d &curve, Point new_start_point) : curve(curve), new_start_point(new_start_point) { }
1504 float Size() const { return curve.Size(); }
1505 Point Index(float i) const
1506 {
1507 Point p = curve.Index(i);
1508 Point pp = curve.Index(0.0);
1509 p -= pp;
1510 p += new_start_point;
1511 return p;
1512 }
1513private:
1514 CurveIn3d &curve;
1515 Point new_start_point;
1516};
1518{
1519public:
1520 ConstantSpeedCurve(CurveIn3d &curve, int divs) : curve(curve), divs(divs) { }
1521
1522 float Size() const
1523 {
1524 return LengthAtPos(curve.Size());
1525 }
1526 Point Index(float len) const
1527 {
1528 float pos = PosAtLength(len);
1529 return curve.Index(pos);
1530 }
1531 float LengthAtPos(float pos2) const
1532 {
1533 float delta = curve.Size()/divs;
1534 float pos = 0.0;
1535 float len = 0.0;
1536 for(int i = 0;i<divs;i++)
1537 {
1538 Point p = curve.Index(pos);
1539 Point p2 = curve.Index(pos+delta);
1540 Vector v = p2-p;
1541 float dist = v.Dist();
1542 len+=dist;
1543 pos+=delta;
1544 if (pos > pos2) return len;
1545 }
1546 return 0.0;
1547 }
1548
1549 float PosAtLength(float length) const
1550 {
1551 float delta = curve.Size()/divs;
1552 float pos = 0.0;
1553 float len = 0.0;
1554 for(int i = 0;i<divs;i++)
1555 {
1556 Point p = curve.Index(pos);
1557 Point p2 = curve.Index(pos+delta);
1558 Vector v = p2-p;
1559 float dist = v.Dist();
1560 len+=dist;
1561 if (len > length) return pos;
1562 pos+=delta;
1563 }
1564 return 0.0;
1565 }
1566private:
1567 CurveIn3d &curve;
1568 int divs;
1569};
1570
1571
1572class CurveCollection : public Array<int, CurveIn3d*>
1573{
1574public:
1575};
1576class CurveCollection2d : public Array<int, CurveIn2d*>
1577{
1578public:
1579};
1580
1581class MatrixCurve : public Curve<Matrix>
1582{
1583public:
1584 virtual ~MatrixCurve() { }
1585 //virtual Matrix Index(float pos) const=0;
1586 //virtual float Length() const=0;
1587};
1588
1589class XRotate : public MatrixCurve
1590{
1591public:
1592 XRotate(float angle) : angle(angle) { }
1593 float Size() const { return angle*2.0*3.14159/360.0; }
1594 Matrix Index(float x) const
1595 {
1596 return Matrix::XRotation(x);
1597 }
1598private:
1599 float angle;
1600};
1601
1603{
1604public:
1605 // must be pushed in order.
1606 void push_back(float starttime, float len, MatrixCurve *c)
1607 {
1608 start_time.push_back(starttime);
1609 end_time.push_back(starttime+len);
1610 length.push_back(c->Size());
1611 curve.push_back(c);
1612 }
1613 float Size() const
1614 {
1615 if (end_time.Size()==0) return 0.0;
1616 return end_time.Index(end_time.Size()-1);
1617 }
1618 Matrix Index(float x) const
1619 {
1620 int s = start_time.Size();
1622 for(int i=0;i<s;i++)
1623 {
1624 float st = start_time.Index(i);
1625 float et = end_time.Index(i);
1626 if (x < st) continue;
1627 if (x >= st && x < et)
1628 {
1629 MatrixCurve *c = curve.Index(i);
1630 float l = length.Index(i);
1631 m = m * c->Index((x-st)*l/(et-st));
1632 }
1633 if (x >= et)
1634 {
1635 MatrixCurve *c = curve.Index(i);
1636 float l = length.Index(i);
1637 m = m * c->Index(l);
1638 }
1639 }
1640 return m;
1641 }
1642private:
1643 VectorArray<float> start_time;
1644 VectorArray<float> end_time;
1645 VectorArray<float> length;
1647};
1648
1649
1650class TranslateElement : public Element<Matrix>
1651{
1652public:
1654 Matrix Elem() const { return Matrix::Translate(p.x,p.y,p.z); }
1655private:
1656 Point p;
1657};
1659
1661{
1662public:
1663 TranslateToMatrixCurve(CurveIn3d &curve) : curve(curve) { }
1664 Matrix Index(float pos) const
1665 {
1666 Point p = curve.Index(pos);
1667 return Matrix::Translate(p.x,p.y,p.z);
1668 }
1669 float Size() const { return curve.Size(); }
1670private:
1671 CurveIn3d &curve;
1672};
1674#undef min
1676{
1677public:
1678 MultiplyMatrixCurve(MatrixCurve &c1, MatrixCurve &c2) : c1(c1), c2(c2) { }
1679 float Size() const { return std::min(c1.Size(), c2.Size()); }
1680 Matrix Index(float x) const { return c1.Index(x)*c2.Index(x); }
1681private:
1682 MatrixCurve &c1, &c2;
1683};
1684
1686{
1687public:
1688 SpiralMatrixCurve(float rot) : rot(rot) { }
1689 float Size() const { return 2.0*3.14159; }
1690 Matrix Index(float x) const { return Matrix::ZRotation(x*rot); }
1691private:
1692 float rot;
1693};
1695
1697{
1698public:
1700 float Size() const { return c2.Size(); }
1701 Matrix Index(float i) const { return c2.Index(i); }
1702private:
1703 const Array<float, Matrix> &c2;
1704};
1706
1708{
1709public:
1710 IdentityMatrixCurve(float length) : length(length) { }
1711 Matrix Index(float pos) const { return Matrix::Identity(); }
1712 float Size() const { return length; }
1713private:
1714 float length;
1715};
1716
1718{
1719public:
1720 CircleMatrixCurve(float x) : x(x) { }
1721 virtual Matrix Index(float pos) const
1722 {
1723 return Matrix::Translate(x, 0.0, 0.0)*Matrix::YRotation(pos);
1724 }
1725 virtual float Size() const { return 3.14159*2.0; }
1726private:
1727 float x;
1728};
1729
1731{
1732public:
1733 CircleMatrixCurve2(float x, float time) : time(time), m(Matrix::Translate(x,0.0,0.0)) { }
1734 virtual Matrix Index(float pos) const
1735 {
1736 float y = 1.0+0.2*sin(pos*3.0+time); // [0.8..1.2]
1737
1738 return Matrix::Scale(y,y,y)*m*Matrix::YRotation(pos);
1739 }
1740 virtual float Size() const { return 3.14159*2.0; }
1741private:
1742 //float x;
1743 float time;
1744 Matrix m;
1745};
1746
1748{
1749public:
1750 MatrixCurveToCurveIn3d(const MatrixCurve &curve, Vector v) : curve(curve), v(v) { }
1751 Point Index(float pos) const
1752 {
1753 return v*curve.Index(pos);
1754 }
1755 float Size() const { return curve.Size(); }
1756private:
1757 const MatrixCurve &curve;
1758 Vector v;
1759};
1760
1762
1763
1764template<class T>
1766{
1767};
1768
1769template<>
1771{
1772public:
1773 static Point Identity() { return Point(0.0,0.0,0.0); }
1774 static Point Compose(Point p, Point p2) { return p+p2; }
1775};
1776
1777template<>
1779{
1780public:
1781 static Point2d Identity() { Point2d p; p.x=0.0; p.y=0.0; return p; }
1783 {
1784 Point2d pp;
1785 pp.x = p.x+p2.x;
1786 pp.y = p.y+p2.y;
1787 return pp;
1788 }
1789};
1790
1791template<>
1793{
1794public:
1795 static Matrix Identity() { return Matrix::Identity(); }
1796 static Matrix Compose(Matrix m, Matrix m2) { return m*m2; }
1797};
1798
1799template<class T, class Base>
1800class ComposeCurve : public Base
1801{
1802public:
1803 template<class It>
1804 ComposeCurve(It beg, It end) : vec(beg, end) { }
1805 ComposeCurve(std::vector<Base*> vec) : vec(vec) { }
1806
1807 T Index(float pos) const
1808 {
1809 typedef typename std::vector<Base*>::iterator iterator;
1810 int ii =0;
1812 for(iterator i=vec.begin();i!=vec.end();i++,ii++)
1813 {
1814 float p = Pos(pos, ii);
1815 Base *b = *i;
1816 T t = b->Index(p);
1817 res = ComposeTrait<T>::Compose(res,t);
1818 }
1819 return res;
1820 }
1821 float Length() const
1822 {
1823 typedef typename std::vector<Base*>::iterator iterator;
1824 float length = 0.0;
1825 for(iterator i=vec.begin();i!=vec.end();i++)
1826 {
1827 length += (*i)->Length();
1828 }
1829 return length;
1830 }
1831 float Pos(float pos, int i)
1832 {
1833 typedef typename std::vector<Base*>::iterator iterator;
1834 int length=0.0;
1835 for(iterator i=vec.begin();i!=vec.end();i++)
1836 {
1837 float len = (*i)->Length();
1838 float oldlength = length;
1839 length += len;
1840 if (pos < length) return pos-oldlength;
1841 }
1842 return length;
1843 }
1844private:
1845 std::vector<Base*> vec;
1846};
1847
1848// already exists in Graph.hh
1849#if 0
1850class LineIn2d : public CurveIn2d
1851{
1852public:
1853 LineIn2d(Point2d p1, Point2d p2) : p1(p1), p2(p2) { }
1854 virtual Point2d Index(float pos) const
1855 {
1857 }
1858 virtual float Size() const { return 1.0; }
1859
1860private:
1861 Point2d p1,p2;
1862};
1863#endif
1864
1865class LineIn3d : public CurveIn3d
1866{
1867public:
1868 LineIn3d(Point p1, Point p2) : p1(p1), p2(p2) { }
1869 virtual Point Index(float pos) const
1870 {
1871 return Vector(p1)*pos+Vector(p2)*(1.0-pos);
1872 }
1873 virtual float Size() const { return 1.0; }
1874private:
1875 Point p1,p2;
1876
1877};
1878
1880{
1881public:
1882 virtual ~SurfaceIn3d() { }
1883 virtual void Prepare() { }
1884 virtual Point Index(float x, float y) const = 0;
1885 virtual Point2d Texture(float x, float y) const = 0;
1886 virtual float Attrib(float x, float y, int id) const=0;
1887 virtual int AttribI(float x, float y, int id) const=0;
1888 virtual Vector Normal(float x, float y) const = 0;
1889 virtual unsigned int Color(float x, float y) const =0;
1890 virtual float XSize() const = 0;
1891 virtual float YSize() const = 0;
1892};
1893
1894
1895
1897{
1898public:
1899 SurfaceIn3dImpl(SurfaceIn3d &next) : next(next) { }
1900 virtual void Prepare() { next.Prepare(); }
1901 virtual Point Index(float x, float y) const { return next.Index(x,y); }
1902 virtual Point2d Texture(float x, float y) const { return next.Texture(x,y); }
1903 virtual float Attrib(float x, float y, int id) const { return next.Attrib(x,y,id); }
1904 virtual int AttribI(float x, float y, int id) const { return next.AttribI(x,y,id); }
1905 virtual Vector Normal(float x, float y) const { return next.Normal(x,y); }
1906 virtual unsigned int Color(float x, float y) const { return next.Color(x,y); }
1907 virtual float XSize() const { return next.XSize(); }
1908 virtual float YSize() const { return next.YSize(); }
1909private:
1910 SurfaceIn3d &next;
1911};
1912
1914{
1915public:
1916 MoveSurfaceIn3d(SurfaceIn3d &next, Vector v) : SurfaceIn3dImpl(next), next(next), v(v) { }
1917 virtual Point Index(float x, float y) const {
1918 Point p = next.Index(x,y);
1919 Move(p);
1920 return p;
1921 }
1922 void Move(Point &p) const { p+=v; }
1923private:
1924 SurfaceIn3d &next;
1925 Vector v;
1926};
1927
1929{
1930public:
1931 BetweenSurface(SurfaceIn3d &next, CurveIn3d &first, CurveIn3d &second) : SurfaceIn3dImpl(next), first(first), second(second) { }
1932 virtual Point Index(float x, float y) const { return Pos(x,y); }
1933 virtual float XSize() const { return std::min(first.Size(), second.Size()); }
1934 virtual float YSize() const { return 1.0; }
1935
1936 Point Pos(float x, float y) const
1937 {
1938 Point p1 = first.Index(x);
1939 Point p2 = second.Index(x);
1940 LineIn3d ln(p1,p2);
1941 return ln.Index(y);
1942 }
1943private:
1944 CurveIn3d &first;
1945 CurveIn3d &second;
1946};
1947
1949{
1950public:
1951 SurfaceBetweenSurfaces(SurfaceIn3d &next, SurfaceIn3d &plane1, SurfaceIn3d &plane2, CurveIn2d &curve): SurfaceIn3dImpl(next), plane1(plane1), plane2(plane2), curve(curve) { }
1952 virtual Point Index(float x, float y) const
1953 {
1954 Point2d p1 = curve.Index(x);
1955 Point pp1 = plane1.Index(p1.x, p1.y);
1956 Point pp2 = plane2.Index(p1.x, p1.y);
1957 LineIn3d ln(pp1,pp2);
1958 return ln.Index(y);
1959 }
1960
1961private:
1962 SurfaceIn3d &plane1;
1963 SurfaceIn3d &plane2;
1964 CurveIn2d &curve;
1965};
1966
1967
1968// Note, coordinates.hh has other surfaces
1969#if 0
1970class SphereSurfaceIn3d : public SurfaceIn3d
1971{
1972public:
1973 SphereSurfaceIn3d(Point center, float radius) : center(center), radius(radius) { }
1974 void Collect(CollectVisitor &vis) {
1975 }
1976 void HeavyPrepare() { }
1977
1978 virtual Point Index(float x, float y) const
1979 {
1980 Matrix m = Matrix::XRotation(x)*Matrix::YRotation(y);
1981 Vector v = Vector(0.0,0.0,radius);
1982 Vector pp = v*m;
1983 Point ps = center+pp;
1984 //std::cout << "SphereSurface:" << x << " " << y << ":" << ps << std::endl;
1985 return ps;
1986 }
1987 virtual Point2d Texture(float x, float y) const { Point2d p = { 0,0 }; return p; }
1988 virtual float Attrib(float x, float y, int id) const
1989 {
1990 return 0.0;
1991 }
1992 virtual int AttribI(float x, float y, int id) const { return 0; }
1993 virtual Vector Normal(float x, float y) const { Vector v; v.dx = 0.0; v.dy=0.0; return v; }
1994 virtual unsigned int Color(float x, float y) const { return 0; }
1995 virtual float XSize() const { return 2.0*3.14159; }
1996 virtual float YSize() const { return 3.14159; }
1997private:
1998 Point center;
1999 float radius;
2000};
2001#endif
2002
2004{
2005public:
2007 : surf(surf), curve(curve) { }
2008 float Size() const
2009 {
2010 return curve.Size();
2011 }
2012 Point Index(float x) const
2013 {
2014 Point2d p = curve.Index(x);
2015 return surf.Index(p.x,p.y);
2016 }
2017private:
2018 SurfaceIn3d &surf;
2019 CurveIn2d &curve;
2020};
2021
2023{
2024public:
2025 virtual ~GridIn3d() { }
2026 virtual Point Index(int x, int y) const = 0;
2027 virtual Point2d Texture(int x, int y) const = 0;
2028 virtual Vector Normal(int x, int y) const = 0;
2029 virtual unsigned int Color(int x, int y) const =0;
2030 virtual float Attrib(int x, int y, int id) const = 0;
2031 virtual int AttribI(int x, int y, int id) const = 0;
2032 virtual int XSize() const = 0;
2033 virtual int YSize() const = 0;
2034};
2035
2036
2037
2038class FloatArray : public Array<int, float>
2039{
2040public:
2041 virtual ~FloatArray() {}
2042 int NumFloats() const { return Size(); }
2043 //virtual int NumFloats() const=0;
2044 //virtual float Index(int x) const=0;
2045};
2046
2048{
2049public:
2050 FloatArrayConvert(const Array<int, float> &c2) : c2(c2) { }
2051 int Size() const { return c2.Size(); }
2052 float Index(int i) const { return c2.Index(i);}
2053private:
2054 const Array<int, float> &c2;
2055};
2057
2058
2059class Circle : public CurveIn2d
2060{
2061public:
2062 Circle() : r(1.0) { center.x = 0; center.y = 0; }
2063 Circle(Point2d center, float r) : center(center), r(r) { }
2064 Point2d Index(float angle) const
2065 {
2066 Point2d res;
2067 res.x=r*cos(angle) + center.x;
2068 res.y = r* sin(angle) + center.y;
2069 return res;
2070 }
2071 float Size() const { return 2.0*3.14159; }
2072private:
2073 Point2d center;
2074 float r;
2075};
2077
2078#if 0
2079class CircleFrom2Points
2080{
2081public:
2082 CircleFrom2Points(Point2d p1, Point2d p2, float r, bool b) : p1(p1), p2(p2), r(r), b(b) { }
2083 Point2d Center() const
2084 {
2085 // (p1.x+x)*(p1.x+x) + (p1.y+y)*(p1.y+y) = r*r
2086 // (p2.x+x)*(p2.x+x) + (p2.y+y)*(p2.y+y) = r*r
2087
2088 // p1.x*p1.x + 2*(p1.x*x) + x*x + p1.y*p1.y + 2*p1.y*y + y*y = r*r
2089 // p2.x*p2.x + 2*(p2.x*x) + x*x + p2.y*p2.y + 2*p2.y*y + y*y = r*r
2090 // (p1.x*p1.x - p2.x*p2.x) + (p1.x-p2.x)*2*x +
2091 // (p1.y*p1.y - p2.y*p2.y) + (p1.y-p2.y)*2*y = 0
2092
2093 // (p1.x-p2.x)*2*x = (p2.x*p2.x - p1.x*p1.x) + (p2.y*p2.y-p1.y*p1.y) + (p2.y-p1.y)*2*y
2094 float px = (p2.x*p2.x-p1.x*p1.x) / (p1.x-p2.x)/2.0;
2095 float py = (p2.y*p2.y-p1.y*p1.y) / (p1.x-p2.x)/2.0;
2096 float m = (p2.y-p1.y)*2/(p1.x-p2.x)/2.0;
2097 // line eq: x = px+py + m*y;
2098
2099 // (p1.x+px+py+m*y)*(p1.x+px+py+m*y) + (p1.y+y)*(p1.y+y) = r*r
2100 //
2101
2102
2103 }
2104
2105private:
2106 Point2d p1;
2107 Point2d p2;
2108 float r;
2109 bool b;
2110};
2111#endif
2112class Distance2d : public Function<Point2d, float>
2113{
2114public:
2115 Distance2d(Point2d center) : center(center) { }
2116 float Index(Point2d p) const { p.x-=center.x; p.y-=center.y; return sqrt(p.x*p.x+p.y*p.y); }
2117private:
2118 Point2d center;
2119};
2121
2122
2123class FloatMove : public Function<float, float>
2124{
2125public:
2126 FloatMove(float val) : val(val) { }
2127 float Index(float p) const { return p+val; }
2128private:
2129 float val;
2130};
2132
2134{
2135public:
2136 ScaleCurveIn2d(CurveIn2d &curve, float x, float y) : curve(curve), x(x),y(y) { }
2137 float Size() const { return curve.Size(); }
2138 Point2d Index(float angle) const
2139 {
2140 Point2d p = curve.Index(angle);
2141 p.x*=x;
2142 p.y*=y;
2143 return p;
2144 }
2145private:
2146 CurveIn2d &curve;
2147 float x,y;
2148};
2150
2151class AnimCircle : public CurveIn2d
2152{
2153public:
2154 AnimCircle(float time, float count) : time(time), count(count) { }
2155 Point2d Index(float angle) const
2156 {
2157 float r = 1.5+0.2*sin((angle+time)*count);
2158 Point2d res;
2159 res.x=r*cos(angle);
2160 res.y=r*sin(angle);
2161 return res;
2162 }
2163 float Size() const { return 2.0*3.14159; }
2164private:
2165 float time;
2166 float count;
2167};
2169
2171{
2172public:
2173 CurveMultiply(MatrixCurve &curve, CurveIn3d &curve2) : curve(curve), curve2(curve2) { }
2175 void HeavyPrepare() { }
2176 Point Index(float x, float y) const
2177 {
2178 Point p = curve2.Index(y);
2179 Matrix m = curve.Index(x);
2180 return p*m;
2181 }
2182 Point2d Texture(float x, float y) const { Point2d p; p.x=x; p.y=y; return p; }
2183 unsigned int Color(float x, float y) const
2184 {
2185 return Color::White().Pixel();
2186 }
2187 Vector Normal(float x, float y) const
2188 {
2189 Point p1 = Index(x,y);
2190 Point p2 = Index(x+0.01,y);
2191 Point p3 = Index(x,y+0.01);
2192 Vector u_x = p2-p1;
2193 Vector u_y = p3-p1;
2194 return Vector::CrossProduct(u_x, u_y);
2195 }
2196 virtual int AttribI(float x, float y, int id) const
2197 {
2198 return 0;
2199 }
2200 virtual float Attrib(float x, float y, int id) const
2201 {
2202 switch(id)
2203 {
2204 case AttrInternalX: return x;
2205 case AttrInternalY: return y;
2206 };
2207 return 0.0;
2208 }
2209
2210 float XSize() const { return curve.Size(); }
2211 float YSize() const { return curve2.Size(); }
2212private:
2213 MatrixCurve &curve;
2214 CurveIn3d &curve2;
2215};
2216
2217class PlaneIn3d : public Element<Point>
2218{
2219public:
2220 PlaneIn3d(Point2d p, Plane pl) : p(p), pl(pl) { }
2221 Point Elem() const
2222 {
2223 return pl.u_p + p.x*pl.u_x + p.y*pl.u_y;
2224 }
2225private:
2226 Point2d p;
2227 Plane pl;
2228};
2229class PlaneIn3d2 : public Function<Point2d, Point>
2230{
2231public:
2232 PlaneIn3d2(Plane pl) : pl(pl) { }
2234 {
2235 return pl.u_p + p.x*pl.u_x+p.y*pl.u_y;
2236 }
2237private:
2238 Plane pl;
2239};
2240
2241
2243
2245{
2246public:
2247 PlaneCurveIn3d(CurveIn2d &c, Plane p) : c(c), p(p) { }
2248 PlaneCurveIn3d(CurveIn2d *c, Plane p) : c(*c), p(p) { }
2249 float Size() const { return c.Size(); }
2250 Point Index(float angle) const
2251 {
2252 Point2d pp = c.Index(angle);
2253 Point pp2 = p.u_p + pp.x*p.u_x + pp.y*p.u_y;
2254
2255 //std::cout << Point(p.u_x) << " " << Point(p.u_y) << " " << pp.x << " " << pp.y << " " << pp2 << std::endl;
2256 return pp2;
2257 }
2258private:
2259 CurveIn2d &c;
2260 Plane p;
2261};
2263
2265{
2266public:
2267 MultiplyCurves(const CurveIn3d &c1, const CurveIn3d &c2) : c1(c1), c2(c2) { }
2269 {
2270 //c1.Collect(vis);
2271 //c2.Collect(vis);
2272 }
2273 void HeavyPrepare() { }
2274 virtual Point Index(float x, float y) const
2275 {
2276 return c1.Index(x)+c2.Index(y);
2277 }
2278 virtual Point2d Texture(float x, float y) const { Point2d p; p.x=x; p.y=y; return p; }
2279 virtual unsigned int Color(float x, float y) const
2280 {
2281 return Color::White().Pixel();
2282 }
2283 virtual Vector Normal(float x, float y) const {
2284 Point p1 = Index(x,y);
2285 Point p2 = Index(x+0.01,y);
2286 Point p3 = Index(x,y+0.01);
2287 Vector u_x = p2-p1;
2288 Vector u_y = p3-p1;
2289 return Vector::CrossProduct(u_x, u_y);
2290
2291 // Vector u_x = c1.Index(x+0.1)-c1.Index(x);
2292 //Vector u_y = c2.Index(y+0.1)-c2.Index(y);
2293 //return Vector::CrossProduct(u_x, u_y);
2294 }
2295 virtual int AttribI(float x, float y, int id) const
2296 {
2297 return 0;
2298 }
2299 virtual float Attrib(float x, float y, int id) const
2300 {
2301 switch(id)
2302 {
2303 case AttrInternalX: return x/XSize();
2304 case AttrInternalY: return y/YSize();
2305 }
2306 return 0.0;
2307 }
2308 virtual float XSize() const { return c1.Size(); }
2309 virtual float YSize() const { return c2.Size(); }
2310
2311private:
2312 const CurveIn3d &c1;
2313 const CurveIn3d &c2;
2314};
2315
2316#if 0
2317class PlaneSurfaceIn3d : public SurfaceIn3d
2318{
2319public:
2320 PlaneSurfaceIn3d(Plane pl)
2321 : line_x(pl.u_p, pl.u_p+pl.u_x),
2322 line_y(pl.u_p, pl.u_p+pl.u_y),
2323 mult(line_x, line_y)
2324 { }
2325 void Collect(CollectVisitor &vis) { }
2326 void HeavyPrepare() { }
2327 virtual Point Index(float x, float y) const { return mult.Index(x,y); }
2328 virtual Point2d Texture(float x, float y) const { return mult.Texture(x,y); }
2329 virtual float Attrib(float x, float y, int id) const { return mult.Attrib(x,y,id); }
2330 virtual int AttribI(float x, float y, int id) const { return mult.AttribI(x,y,id); }
2331 virtual Vector Normal(float x, float y) const { return mult.Normal(x,y); }
2332 virtual unsigned int Color(float x, float y) const { return mult.Color(x,y); }
2333 virtual float XSize() const
2334 { return mult.XSize(); }
2335 virtual float YSize() const { return mult.YSize(); }
2336
2337private:
2338 LineIn3d line_x;
2339 LineIn3d line_y;
2340 MultiplyCurves mult;
2341};
2342#endif
2343
2345{
2346public:
2347 AnimCurveIn3d(CurveIn3d &c1, CurveIn3d &c2, float time, float length) : c1(c1), c2(c2), time(time), length(length) { }
2348 virtual Point Index(float pos) const
2349 {
2350 float p = time/length;
2351
2352 float pos1 = pos*c1.Size()/Size();
2353 float pos2 = pos*c2.Size()/Size();
2354 return Vector(c1.Index(pos1))*p+Vector(c2.Index(pos2))*(1.0-p);
2355 }
2356 virtual float Size() const
2357 {
2358 float p = time/length;
2359 return c1.Size()*p+c2.Size()*(1.0-p);
2360 }
2361private:
2362 CurveIn3d &c1, &c2;
2363 float time, length;
2364};
2365
2366
2367
2368
2370{
2371public:
2372 virtual ~ContinuousPlanes() { }
2373 virtual Plane Index(float x)=0;
2374};
2375
2377{
2378public:
2379 PlanesFromCurve(CurveIn3d &center, CurveIn3d &x, CurveIn3d &y) : center(center), x(x), y(y) { }
2380
2381 Plane Index(float xx) { Plane p; p.u_p = center.Index(xx); p.u_x = x.Index(xx)-p.u_p; p.u_y = y.Index(xx)-p.u_p; return p; }
2382private:
2383 CurveIn3d &center, &x, &y;
2384};
2385
2386
2388{
2389public:
2390 FrameAnimPlugins(Render *render) : FrameAnim(render) { }
2391 void Init() {
2392 for(std::vector<FramePlugin*>::iterator i=plugins.begin();i!=plugins.end();i++)
2393 (*i)->Init();
2394 }
2395 void Cleanup() {
2396 for(std::vector<FramePlugin*>::iterator i=plugins.begin();i!=plugins.end();i++)
2397 (*i)->Cleanup();
2398 }
2399 void PreFrame(float time)
2400 {
2401 for(std::vector<FramePlugin*>::iterator i=plugins.begin();i!=plugins.end();i++)
2402 (*i)->PreFrame(time);
2403 }
2405 {
2406 for(std::vector<FramePlugin*>::iterator i=plugins.begin();i!=plugins.end();i++)
2407 (*i)->PostFrame();
2408 }
2410 {
2411 for(std::vector<FramePlugin*>::iterator i=plugins.begin();i!=plugins.end();i++)
2412 delete *i;
2413 }
2414public:
2415 std::vector<FramePlugin*> plugins;
2416};
2417
2419{
2420public:
2421 virtual ~Storage() {}
2422 virtual int MatrixCount() const = 0;
2423 virtual Matrix &IndexMatrix(int i) const=0;
2424 virtual int PointCount() const = 0;
2425 virtual Point &IndexPoint(int i) const =0;
2426 virtual int VectorCount() const = 0;
2427 virtual Vector &IndexVector(int i) const =0;
2428 virtual int FloatCount() const = 0;
2429 virtual float &IndexFloat(int i) const =0;
2430};
2431
2432
2433#if 0
2434class TexturePlugin : public FramePlugin
2435{
2436public:
2437 TexturePlugin(BufferRef buf) : buf(buf), texture(5566) { }
2438
2439 void Init();
2440
2441 void Start();
2442 void End();
2443 ~TexturePlugin();
2444 unsigned int Texture() const { return texture; }
2445public:
2446 BufferRef buf;
2447 unsigned int texture;
2448};
2449#endif
2450
2451void Execute(FrameAnim &f, Low_SDL_Surface *screen);
2452BufferRef LoadImage(std::string filename, bool &success);
2453BufferRef LoadImageFromString(const std::vector<unsigned char> &buffer, bool &success);
2454
2455class PointCollection : public Array<int, Point>
2456{
2457public:
2458 virtual ~PointCollection() { }
2459 int NumPoints() const { return Size(); }
2460 Point Points(int index) const { return Index(index); }
2461 //virtual Point Points(int index) const=0;
2462};
2463
2464
2465#if 0
2466class PointCollectionConvert : public PointCollection
2467{
2468public:
2469 PointCollectionConvert(const Array<int, Point> &c2) : c2(c2) { }
2470 int Size() const { return c2.Size();}
2471 Point Index(int i) const { return c2.Index(i); }
2472private:
2473 const Array<int, Point> &c2;
2474};
2475typedef FunctionImpl0<Array<int,Point>*, PointCollection*, PointCollectionConvert> PointCollectionConvertFunction;
2476#endif
2477
2478class PointCollectionConvertArray : public Array<int, PointCollection*>
2479{
2480public:
2482 int Size() const { return arr.Size(); }
2484 {
2485 //delete convert;
2486 //convert = new PointCollectionConvert(*arr.Index(i));
2487 //return convert;
2488 return 0;
2489 }
2490 ~PointCollectionConvertArray() { /*delete convert;*/ }
2491private:
2493 //mutable PointCollectionConvert *convert;
2494};
2495
2496
2498{
2499public:
2500 Triangle(Point p1, Point p2, Point p3) : p1(p1), p2(p2), p3(p3) { }
2501 int Size() const { return 3; }
2502 Point Index(int i) const {
2503 switch(i)
2504 {
2505 case 0: return p1;
2506 case 1: return p2;
2507 case 2: return p3;
2508 }
2509 return Point(0.0,0.0,0.0);
2510 }
2511private:
2512 Point p1, p2, p3;
2513};
2514
2516{
2517public:
2518 InterpolateTriangle(Point p1, Point p2, Point p3) : p1(p1), p2(p2), p3(p3)
2519 {
2520 }
2521 // (x,y) \in Triangle((0.0,0.0), (1.0,0.0), (0.0,1.0))
2522 Point p12_13(float x, float y) const
2523 {
2524 Vector v1(p2-p1);
2525 Vector v2(p3-p1);
2526 v1*=x;
2527 v2*=y;
2528 return p1+v1+v2;
2529 }
2530 Point p21_23(float x, float y) const
2531 {
2532 Vector v1(p1-p2);
2533 Vector v2(p3-p2);
2534 v1*=x;
2535 v2*=y;
2536 return p2+v1+v2;
2537 }
2538 Point p31_32(float x, float y) const
2539 {
2540 Vector v1(p1-p3);
2541 Vector v2(p2-p3);
2542 v1*=x;
2543 v2*=y;
2544 return p3+v1+v2;
2545 }
2546
2547private:
2548 Point p1,p2,p3;
2549};
2550
2552{
2553public:
2554 PolygonEdges1(PointCollection &coll) : coll(coll) { }
2555 int Size() const
2556 {
2557 return coll.Size()+1;
2558 }
2559 float Index(int ii) const
2560 {
2561 if (ii==0) return 0.0;
2562 int s = coll.Size();
2563 Point old_p = coll.Index(0);
2564 float dist = 0.0;
2565 for(int i=1;i<s;i++)
2566 {
2567 Point p = coll.Index(i);
2568 dist += Dist(old_p, p);
2569 if (i==ii) return dist;
2570 old_p = p;
2571 }
2572 dist+=Dist(old_p, coll.Index(0));
2573 return dist;
2574 }
2575private:
2576 PointCollection &coll;
2577};
2579{
2580public:
2581 PolygonEdges2(PointCollection &coll) : coll(coll) { }
2582 float Size() const
2583 {
2584 Point old_p = coll.Index(0);
2585 float dist = 0.0;
2586 int s = coll.Size();
2587 for(int i=1;i<s;i++)
2588 {
2589 Point p = coll.Index(i);
2590 dist += Dist(old_p, p);
2591 old_p = p;
2592 }
2593 dist+=Dist(old_p, coll.Index(0));
2594 return dist;
2595 }
2596 Point Index(float x) const
2597 {
2598 Point old_p = coll.Index(0);
2599 float dist = 0.0;
2600 int s = coll.Size();
2601 for(int i=1;i<s;i++)
2602 {
2603 float old_dist = dist;
2604 Point p = coll.Index(i);
2605 dist += Dist(old_p, p);
2606 if (dist>=x)
2607 {
2608 LineIn3d line(old_p, p);
2609 return line.Index((x - old_dist)/(dist-old_dist));
2610 }
2611 old_p = p;
2612 }
2613 LineIn3d line2(old_p, coll.Index(0));
2614 return line2.Index((x-dist)/Dist(old_p, coll.Index(0)));
2615 }
2616private:
2617 PointCollection &coll;
2618};
2619
2620// finds nearest point which is not the current point
2622{
2623public:
2624 FindNearestPoint(PointCollection &coll) /*coll(coll)*/
2625 {
2626 size = coll.Size();
2627 array = new Point[size];
2628 for(int i=0;i<size;i++)
2629 {
2630 array[i] = coll.Index(i);
2631 }
2632 }
2633 int Size() const { return size; }
2634 Point Index(int ii) const
2635 {
2636 int dist = 999999.0;
2637 Point res(0.0,0.0,0.0);
2638 Vector ref(array[ii]);
2639 for(int i=0;i<size;i++)
2640 {
2641 Point ai = array[i];
2642 float d = (ai-ref).Dist();
2643 if (d<dist)
2644 {
2645 // check if we're at same point.
2646 if (i != ii)
2647 {
2648 res = ai;
2649 dist = d;
2650 }
2651 }
2652 }
2653 return res;
2654 }
2655 ~FindNearestPoint() { delete [] array; }
2656private:
2657 Point *array;
2658 int size;
2659 //PointCollection &coll;
2660};
2661
2662class PointCollection2d : public Array<int, Point2d>
2663{
2664};
2665
2667
2669{
2670public:
2671 PointArrayPointCollection2d(std::vector<Point2d> vec) : vec(vec) { }
2672 int Size() const { return vec.size(); }
2673 Point2d Index(int i) const { return vec[i]; }
2674private:
2675 std::vector<Point2d> vec;
2676};
2677
2678class Bezier2d : public CurveIn2d
2679{
2680public:
2682 Point2d Index(float pos) const
2683 {
2684 int count = p.Size();
2685 Point2d val = { 0.0,0.0 };
2686 for(int i=0;i<count;i++)
2687 {
2688 val += bin(pos,i,count-1)*Vector2d::FromPoint(p.Index(i));
2689 }
2690 return val;
2691 }
2692 float bin(float pos, int i, int n) const
2693 {
2694 return float(ni(n,i)) * pow(double(pos), double(i))*pow(double(1.0-pos),double(n-i));
2695 }
2696 int ni(int n, int i) const
2697 {
2698 if (i==0) return 1;
2699 if (n==i) return 1;
2700 return ni(n-1,i-1)+ni(n-1,i);
2701 }
2702 float Size() const
2703 {
2704 return 1.0;
2705 }
2706private:
2708};
2709
2710
2712{
2713public:
2715 int Size() const { return p1.Size()+p2.Size(); }
2716 Point2d Index(int i) const
2717 {
2718 if (i>=0 && i<p1.Size()) return p1.Index(i);
2719 return p2.Index(i-p1.Size());
2720 }
2721private:
2722 PointCollection2d &p1, &p2;
2723};
2724
2726{
2727public:
2728 OrArrayPointCollection2d(std::vector<PointCollection2d*> vec) : vec(vec) { }
2729 int Size() const
2730 {
2731 int sz = vec.size();
2732 int res=0;
2733 for(int i=0;i<sz;i++) res+=vec[i]->Size();
2734 return res;
2735 }
2736 Point2d Index(int i) const
2737 {
2738 int s = vec.size();
2739 int sz=0;
2740 for(int ii=0;ii<s;ii++)
2741 {
2742 int sz0 = sz;
2743 sz+=vec[ii]->Size();
2744 int sz1 = sz;
2745 if (i>=sz0 && i<sz1) {
2746 return vec[ii]->Index(i-sz0);
2747 }
2748 }
2749 Point2d p = { 0.0,0.0 };
2750 return p;
2751 }
2752private:
2753 std::vector<PointCollection2d*> vec;
2754};
2755
2757{
2758public:
2760 int Size() const { return coll.Size()+1; }
2761 Point2d Index(int i) const { if (i==Size()-1) return coll.Index(0); return coll.Index(i); }
2762private:
2763 PointCollection2d &coll;
2764};
2765
2767{
2768public:
2769 PlanePointCollectionFrom2d(PointCollection2d &coll, float z) : coll(coll), z(z) { }
2770 int Size() const { return coll.Size(); }
2771 Point Index(int i) const { Point2d p = coll.Index(i); return Point(p.x,p.y,z); }
2772private:
2773 PointCollection2d &coll;
2774 float z;
2775};
2776
2778{
2779public:
2782 void HeavyPrepare() { }
2783 void Prepare() { }
2784 int NumFaces() const { return std::min(p1.Size(),p2.Size()); }
2785 int NumPoints(int face) const { return 4; }
2786 Point FacePoint(int face, int point) const
2787 {
2788 switch(point) {
2789 case 0: return p1.Index(face);
2790 case 1: return p1.Index((face+1)%NumFaces());
2791 case 2: return p2.Index((face+1)%NumFaces());
2792 case 3: return p2.Index(face);
2793 default:
2794 std::cout << "Error at LinkPointCollections" << std::endl;
2795 };
2796 return Point(0.0,0.0,0.0);
2797 }
2798 Vector PointNormal(int face, int point) const
2799 {
2800 return -Vector::CrossProduct(FacePoint(face,(point+1)%NumPoints(face))-FacePoint(face,point),
2801 FacePoint(face,(point+3)%NumPoints(face))-FacePoint(face,point));
2802 }
2803 unsigned int Color(int face, int point) const { return 0xffffffff; }
2804 Point2d TexCoord(int face,int point) const { Point2d p={0.0,0.0}; return p; }
2805 float TexCoord3(int face, int point) const { return 0.0; }
2806private:
2807 PointCollection &p1, &p2;
2808};
2809
2810
2812{
2813public:
2814 TriPointCollection2d(Point2d p1, Point2d p2, Point2d p3) : p1(p1), p2(p2), p3(p3) { }
2815 int Size() const { return 3; }
2816 Point2d Index(int i) const
2817 {
2818 switch(i)
2819 {
2820 case 0: return p1;
2821 case 1: return p2;
2822 case 2: return p3;
2823 };
2824 Point2d p = { 0.0,0.0 };
2825 return p;
2826 }
2827private:
2828 Point2d p1,p2,p3;
2829};
2831{
2832public:
2833 QuadPointCollection2d(Point2d p1, Point2d p2, Point2d p3, Point2d p4) : p1(p1), p2(p2), p3(p3),p4(p4) { }
2834 int Size() const { return 4; }
2835 Point2d Index(int i) const
2836 {
2837 switch(i)
2838 {
2839 case 0: return p1;
2840 case 1: return p2;
2841 case 2: return p3;
2842 case 3: return p4;
2843 };
2844 Point2d p = { 0.0,0.0 };
2845 return p;
2846 }
2847private:
2848 Point2d p1,p2,p3,p4;
2849};
2850
2852{
2853public:
2854 int Size() const { return vec.size(); }
2855 Point2d Index(int i) const
2856 {
2857 return vec[i];
2858 }
2859 void push_back(Point2d p) { vec.push_back(p); }
2860private:
2861 std::vector<Point2d> vec;
2862};
2863
2864
2866{
2867public:
2868 SampleCurveIn2d(const CurveIn2d &curve, int count, float length) : curve(curve), count(count), length(length) { }
2869 int Size() const
2870 {
2871 return count;
2872 }
2873 Point2d Index(int i) const
2874 {
2875 float x = i * length / count;
2876 return curve.Index(x);
2877 }
2878private:
2879 const CurveIn2d &curve;
2880 int count;
2881 float length;
2882};
2883
2885{
2886public:
2887 BezierPointCollection2d(PointCollection2d &p, int count) : p(p),bez(p),sample(bez,count,bez.Size()),count(count) { }
2888 int Size() const { return count; }
2889 Point2d Index(int i) const {
2890 return sample.Index(i);
2891 }
2892private:
2894 Bezier2d bez;
2895 SampleCurveIn2d sample;
2896 int count;
2897};
2898
2899
2901{
2902public:
2903 PolyFromCurve2d(Function<float,float> &curve, float y, float start_x, float end_x, int x_numpoints) : curve(curve), y(y), start_x(start_x), end_x(end_x), x_numpoints(x_numpoints) { }
2904 int Size() const
2905 {
2906 return x_numpoints+2;
2907 }
2908 Point2d Index(int i) const
2909 {
2910 if (i==0)
2911 {
2912 Point2d corner = { start_x,y };
2913 return corner;
2914 }
2915 if (i>0 && i<x_numpoints+1)
2916 {
2917 i-=1;
2918 float x = start_x + i*(end_x-start_x)/x_numpoints;
2919 float yy = curve.Index(x);
2920 if (yy<y) yy=y;
2921 Point2d p = { x,yy };
2922 return p;
2923 }
2924 if (i==x_numpoints+1)
2925 {
2926 Point2d corner = { end_x, y };
2927 return corner;
2928 }
2929 Point2d p = { 0.0,0.0};
2930 return p;
2931 }
2932
2933private:
2934 Function<float,float> &curve;
2935 float y;
2936 float start_x;
2937 float end_x;
2938 int x_numpoints;
2939};
2940
2941
2942#undef max
2943class MaxCurve : public Function<float,float>
2944{
2945public:
2947 float Index(float x) const
2948 {
2949 return std::max(f1.Index(x),f2.Index(x));
2950 }
2951private:
2954};
2955
2957{
2958public:
2960 Function<float,float> &curve2,
2961 float start_x, float end_x, int x_numpoints)
2962 : /*curve1(curve1), curve2(curve2), start_x(start_x), end_x(end_x),*/ x_numpoints(x_numpoints) { }
2963
2964 int Size() const
2965 {
2966 return x_numpoints*2;
2967 }
2968 Point2d Index(int i) const
2969 {
2970 Point2d p;
2971 p.x = 0.0;
2972 p.y = 0.0;
2973 return p;
2974 }
2975private:
2976 //Function<float,float> &curve1;
2977 //Function<float,float> &curve2;
2978 //float start_x;
2979 //float end_x;
2980 int x_numpoints;
2981};
2982
2983
2985{
2986public:
2987 PlanePointsIn3d(PointCollection2d &pc, Plane p) : pc(pc), p(p) { }
2988 int Size() const { return pc.Size(); }
2989 Point Index(int num) const
2990 {
2991 Point2d pp = pc.Index(num);
2992 Point pp2 = p.u_p + pp.x*p.u_x + pp.y*p.u_y;
2993 return pp2;
2994 }
2995private:
2997 Plane p;
2998};
3000
3001class VectorCollection : public Array<int, Vector>
3002{
3003public:
3004 virtual ~VectorCollection() { }
3005 int NumVectors() const { return Size(); }
3006 Vector Vectors(int index) const { return Index(index); }
3007};
3008
3010{
3011public:
3013 int Size() const { return c2.Size(); }
3014 Vector Index(int i) const { return c2.Index(i);}
3015private:
3016 const Array<int, Vector> &c2;
3017};
3019
3021{
3022public:
3024 int Size() const { return 1; }
3025 Vector Index(int index)const { return v; }
3026private:
3027 Vector v;
3028};
3030
3031class VectorCurve : public Array<float, Vector>
3032{
3033};
3034
3035class PointVectorCurve : public Array<float, std::pair<Point, Vector> >
3036{
3037};
3038class PointVectorCollection : public Array<int, std::pair<Point,Vector> >
3039{
3040};
3041
3042
3044{
3045public:
3046 PointVectorCollectionConvert(const Array<int, std::pair<Point,Vector> > &c2) : c2(c2) { }
3047 int Size() const { return c2.Size(); }
3048 std::pair<Point,Vector> Index(int i) const { return c2.Index(i); }
3049private:
3051};
3052
3053class Distance : public FloatArray
3054{
3055public:
3056 Distance(VectorCollection &coll) : coll(coll) { }
3057 int Size() const { return coll.NumVectors(); }
3058 float Index(int x) const
3059 {
3060 Vector v = coll.Vectors(x);
3061 return sqrt(v.dx*v.dx+v.dy*v.dy+v.dz*v.dz);
3062 }
3063 float Sum() const {
3064 int size = Size();
3065 float d = 0.0;
3066 for(int i=0;i<size;i++)
3067 {
3068 d+=Index(i);
3069 }
3070 return d;
3071 }
3072private:
3073 VectorCollection &coll;
3074};
3076
3078{
3079public:
3080 WeightedSampling(FloatArray &weights, float start) : weights(weights), start(start)
3081 {
3082 //float s = start;
3083 //int size = Size();
3084 //for(int i=0;i<size;i++)
3085 // {
3086 // s+=weights.Index(i);
3087 // vec.push_back(s);
3088 // }
3089 }
3090 int Size() const { return weights.NumFloats(); }
3091 float Index(int x) const
3092 {
3093 //return vec[x];
3094 float s = start;
3095
3096 for(int i=0;i<x;i++)
3097 s+=weights.Index(i);
3098 return s;
3099 }
3100private:
3101 FloatArray &weights;
3102 float start;
3103};
3104
3106{
3107public:
3108 ConstantSampling(int count, float dist) : count(count), dist(dist) { }
3109 int Size() const { return count; }
3110 float Index(int x) const
3111 {
3112 float length = dist;
3113 length /= float(count);
3114 length *= float(x);
3115 return length;
3116 }
3117private:
3118 int count;
3119 float dist;
3120};
3121
3123{
3124public:
3125 PointCollectionFromGrid(GridIn3d &grid) : grid(grid) { }
3126 int Size() const { return grid.XSize()*grid.YSize(); }
3127
3128 Point Index(int index) const
3129 {
3130 int size = grid.XSize();
3131 int y = index / size;
3132 int x = index - y*size;
3133 Point p = grid.Index(x,y);
3134 return p;
3135 }
3136private:
3137 GridIn3d &grid;
3138};
3140
3142{
3143public:
3144 int array[5];
3146};
3147
3149{
3150public:
3151 int id;
3152};
3153
3154
3156{
3157public:
3158 void Prepare() { }
3160 void HeavyPrepare() { }
3161};
3163{
3164public:
3165 void Prepare() { }
3167 void HeavyPrepare() { }
3168};
3169
3171{
3172public:
3174 BBOX GetBoundingBox(bool &success) const {
3175 return coll.GetBoundingBox(success);
3176 }
3177 void Collect(CollectVisitor &vis) { coll.Collect(vis); }
3178 void HeavyPrepare() { }
3179 virtual bool Ready() const { return coll.Ready(); }
3180 virtual bool IsTransparent() const { return coll.IsTransparent(); }
3181 virtual void Prepare() { coll.Prepare(); }
3182 virtual void SetDoneCount(int i) { coll.SetDoneCount(i); }
3183 virtual void PrepareDone() { coll.PrepareDone(); }
3184 virtual int NumFaces() const { return coll.NumFaces(); }
3185 virtual int NumPoints(int face) const { return coll.NumPoints(face); }
3186 virtual Point FacePoint(int face, int point) const { return coll.FacePoint(face,point); }
3187 virtual Point EndFacePoint(int face, int point) const { return coll.EndFacePoint(face, point); }
3188
3189 virtual Vector PointNormal(int face, int point) const { return coll.PointNormal(face,point); }
3190 virtual float Attrib(int face, int point, int id) const { return coll.Attrib(face,point,id); }
3191 virtual int AttribI(int face, int point, int id) const { return coll.AttribI(face,point,id); }
3192 virtual unsigned int Color(int face, int point) const { return coll.Color(face,point); }
3193 virtual Point2d TexCoord(int face, int point) const { return coll.TexCoord(face,point); }
3194 virtual float TexCoord3(int face, int point) const { return coll.TexCoord3(face,point); }
3195 virtual VEC4 Joints(int face, int point) const { return coll.Joints(face,point); }
3196 virtual VEC4 Weights(int face, int point) const { return coll.Weights(face,point); }
3197
3198 virtual bool has_normal() const { return coll.has_normal(); }
3199 virtual bool has_attrib() const { return coll.has_attrib(); }
3200 virtual bool has_color() const { return coll.has_color(); }
3201 virtual bool has_texcoord() const { return coll.has_texcoord(); }
3202 virtual bool has_skeleton() const { return coll.has_skeleton(); }
3203
3204
3205 virtual int NumObjects() const { return coll.NumObjects(); }
3206 virtual std::pair<int,int> GetObject(int o) const { return coll.GetObject(o); }
3207
3208 virtual int NumTextures() const { return coll.NumTextures(); }
3209 virtual void GenTexture(int num) { coll.GenTexture(num); }
3210 virtual BufferRef TextureBuf(int num) const { return coll.TextureBuf(num); }
3211 virtual int FaceTexture(int face) const { return coll.FaceTexture(face); }
3212private:
3213 FaceCollection &coll;
3214};
3215
3217{
3218public:
3220 BBOX GetBoundingBox(bool &success) const
3221 {
3222 return coll.GetBoundingBox(success);
3223 }
3224 void Collect(CollectVisitor &vis) { coll.Collect(vis); }
3225 void HeavyPrepare() { }
3226 virtual bool IsTransparent() const { return coll.IsTransparent(); }
3227 virtual void Prepare() { coll.Prepare(); }
3228 virtual void PrepareDone() { coll.PrepareDone(); }
3229 virtual int NumFaces() const { return coll.NumFaces(); }
3230 virtual int NumPoints(int face) const { return coll.NumPoints(face); }
3231 virtual Point FacePoint(int face, int point) const { return coll.FacePoint(face,point); }
3232 virtual Point EndFacePoint(int face, int point) const { return coll.EndFacePoint(face, point); }
3233
3234 virtual Vector PointNormal(int face, int point) const { return coll.PointNormal(face,point); }
3235 virtual float Attrib(int face, int point, int id) const { return coll.Attrib(face,point,id); }
3236 virtual int AttribI(int face, int point, int id) const { return coll.AttribI(face,point,id); }
3237 virtual unsigned int Color(int face, int point) const { return coll.Color(face,point); }
3238 virtual Point2d TexCoord(int face, int point) const { return coll.TexCoord(face,point); }
3239 virtual float TexCoord3(int face, int point) const { return coll.TexCoord3(face,point); }
3240
3241 virtual VEC4 Joints(int face, int point) const { return coll.Joints(face,point); }
3242 virtual VEC4 Weights(int face, int point) const { return coll.Weights(face,point); }
3243
3244 virtual bool has_normal() const { return coll.has_normal(); }
3245 virtual bool has_attrib() const { return coll.has_attrib(); }
3246 virtual bool has_color() const { return coll.has_color(); }
3247 virtual bool has_texcoord() const { return coll.has_texcoord(); }
3248 virtual bool has_skeleton() const { return coll.has_skeleton(); }
3249
3250
3251
3252 virtual int NumTextures() const { return coll.NumTextures(); }
3253 virtual void GenTexture(int num) { coll.GenTexture(num); }
3254 virtual BufferRef TextureBuf(int num) const { return coll.TextureBuf(num); }
3255 virtual int FaceTexture(int face) const { return coll.FaceTexture(face); }
3256
3257 virtual int NumObjects() const { return coll.NumObjects(); }
3258 virtual std::pair<int,int> GetObject(int o) const { return coll.GetObject(o); }
3259
3260private:
3261 FaceCollection &coll;
3262};
3263
3264
3266{
3267public:
3268 ShadowFaceCollection(FaceCollection &coll, Point pos, Vector u_x, Vector u_y, Vector light_vec) : ForwardFaceCollection(coll), pos(pos), u_x(u_x), u_y(u_y), light_vec(light_vec) { }
3269 virtual std::string name() const { return "ShadowFaceCollection"; }
3270
3271 virtual Point FacePoint(int face, int point) const;
3272private:
3273 Point pos;
3274 Vector u_x, u_y;
3275 Vector light_vec;
3276};
3277
3278
3280{
3281public:
3282 ReflectFaceCollection(FaceCollection &coll, Point pos, Vector u_x, Vector u_y, Vector ref_vec) : ForwardFaceCollection(coll), pos(pos), u_x(u_x), u_y(u_y), ref_vec(ref_vec) { }
3283 virtual std::string name() const { return "ReflectFaceCollection"; }
3284
3285 virtual Point FacePoint(int face, int point) const;
3286private:
3287 Point pos;
3288 Vector u_x, u_y;
3289 Vector ref_vec;
3290};
3291
3292#if 0
3293class CoordChangeFaceColl : public ForwardFaceCollection
3294{
3295public:
3296 CoordChangeFaceColl(FaceCollection *coll, bool invert, Coords coordchange)
3297 : ForwardFaceCollection(*coll),
3298 invert(invert),
3299 coordchange(coordchange) {}
3300 virtual Point FacePoint(int face, int point) const
3301 {
3302 Point p = ForwardFaceCollection::FacePoint(face,point);
3303 if (!invert) {
3304 p = coordchange.FindInternalCoords(p);
3305 }
3306 else {
3307 p = coordchange.FindExternalCoords(p);
3308 }
3309 return p;
3310 }
3311
3312private:
3313 bool invert;
3314 Coords coordchange;
3315};
3316#endif
3318{
3319public:
3321 virtual std::string name() const { return "RecalculateNormals"; }
3322
3323 virtual bool has_normal() const { return true; }
3324 Vector PointNormal(int face, int point) const
3325 {
3326 if (store_face==face) return store_res;
3327
3328 Point p1 = FacePoint(face, 0);
3329 Point p2 = FacePoint(face, 1);
3330 Point p3 = FacePoint(face, 2);
3331 Vector v = Vector::CrossProduct(p2-p1,p3-p1);
3332 Vector res = v / v.Dist();
3333 store_face = face;
3334 store_res = res;
3335 return res;
3336 }
3337private:
3338 mutable int store_face=-1;
3339 mutable Vector store_res;
3340
3341};
3342
3343#if 0
3344class AverageNormals : public ForwardFaceCollection
3345{
3346public:
3347 AverageNormals(FaceCollection *coll, int sx, int sy) : ForwardFaceCollection(*coll), sx(sx),sy(sy), coll(coll) { }
3348 Vector PointNormal(int face, int point) const
3349 {
3350 int face_xp = face + 1;
3351 int face_xm = face - 1;
3352 int face_yp = face + sx;
3353 int face_ym = face - sx;
3354 int face_xm_ym = face - 1 - sx;
3355 int face_xp_ym = face + 1 - sx;
3356 int face_xm_yp = face - 1 + sx;
3357 int face_xp_yp = face + 1 + sx;
3358
3359 Vector n_face = coll->PointNormal(face,point);
3360 Vector n_xm_ym = coll->PointNormal(face_xm_ym, point);
3361 Vector n_xp_ym = coll->PointNormal(face_xp_ym, point);
3362 Vector n_xm_yp = coll->PointNormal(face_xm_yp, point);
3363 Vector n_xp_yp = coll->PointNormal(face_xp_yp, point);
3364 Vector n_xp = coll->PointNormal(face_xp, point);
3365 Vector n_xm = coll->PointNormal(face_xm, point);
3366 Vector n_yp = coll->PointNormal(face_yp, point);
3367 Vector n_ym = coll->PointNormal(face_ym, point);
3368
3369 Vector n,n2;
3370 Vector p,p2;
3371
3372 switch(point) {
3373 case 0: n = n_xm_ym; n2=n_ym; p=n_xm; p2=n_face; break;
3374 case 1: n = n_ym; n2=n_xp_ym; p=n_face; p2=n_xp; break;
3375 case 2: n = n_face; n2=n_xp; p=n_yp; p2=n_xp_yp; break;
3376 case 3: n = n_xm; n2=n_face; p=n_xm_yp; p2=n_yp; break;
3377 };
3378 Vector avg = n+n2+p+p2;
3379 avg/=4.0;
3380 return avg;
3381 }
3382private:
3383 int sx,sy;
3384 FaceCollection *coll;
3385};
3386#endif
3388{
3389public:
3391 Vector PointNormal(int face, int point) const
3392 {
3393 Point p = FacePoint(face,point);
3394 int count = NumFaces();
3395 int res_i = 0, res_ii = 0;
3396 bool result = false;
3397 for(int i=0;i<count;i++)
3398 {
3399 if (i==face) continue;
3400 int count2 = NumPoints(i);
3401 for(int ii=0;ii<count2;ii++)
3402 {
3403 Point p2 = FacePoint(i,ii);
3404 Vector v = p2-p;
3405 if (v.Dist() < 0.001)
3406 {
3407 res_i = i; res_ii = ii;
3408 result = true;
3409 break;
3410 }
3411
3412 }
3413 if (result) break;
3414 }
3415 if (!result) { return ForwardFaceCollection::PointNormal(face,point); }
3416
3418 Vector v1 = ForwardFaceCollection::PointNormal(res_i, res_ii);
3419 return (v0+v1)/2.0;
3420 }
3421};
3422
3423
3425{
3426public:
3429 virtual Point FacePoint(int face, int point) const
3430 {
3431 Point p = ForwardFaceCollection::FacePoint(face,point);
3432 return f.Index(p);
3433 }
3434private:
3436};
3437
3438
3439// TODO: do MemoizeAnim to speed up precalc
3440class Anim
3441{
3442public:
3443 virtual int NumFrames() const=0;
3444 virtual FaceCollection *Frame(int framenum) const=0;
3445};
3446
3448{
3449public:
3450 virtual void Set(int index, bool b)=0;
3451};
3452
3454{
3455public:
3456 virtual int Size() const=0;
3457 virtual int *SelectArray() const=0;
3458};
3459
3460class SubSelect : public AnimSet
3461{
3462public:
3463 SubSelect(AnimSet &s, int start, int size) : s(s), start(start) /*, size(size)*/ { }
3464 void Set(int index, bool b)
3465 {
3466 s.Set(index+start, b);
3467 }
3468private:
3469 AnimSet &s;
3470 int start;
3471 //int size;
3472};
3473
3474class AnimSelect : public AnimSelectI, public AnimSet
3475{
3476public:
3477 AnimSelect(int size) : size(size)
3478 {
3479 selectarray = new int[size];
3480 for(int i=0;i<size;i++)
3481 {
3482 selectarray[i] = 0;
3483 }
3484 }
3485 ~AnimSelect() { delete [] selectarray; }
3486 void Set(int index, bool b)
3487 {
3488 if (index<0 || index >=size) return;
3489 if (b) { selectarray[index] = 1; }
3490 else { selectarray[index] = 0; }
3491 }
3492 int *SelectArray() const { return selectarray; }
3493 int Size() const { return size; }
3494private:
3495 int *selectarray;
3496 int size;
3497};
3498
3500{
3501public:
3502 FrameSelect(AnimSet &s) : s(s) { }
3503 void set_frame(int framenum)
3504 {
3505 s.Set(frame, false);
3506 s.Set(framenum, true);
3507 frame = framenum;
3508 }
3509private:
3510 AnimSet &s;
3511 int frame;
3512};
3513
3514
3516{
3517public:
3518 virtual Coords coord() const=0;
3519};
3520
3522{
3523public: // m = position of object at time 0
3524 RotateAroundEdge(Matrix m, FaceCollection &obj, int face, int point1, int point2, float speed, float length) : m(m), obj(obj), speed(speed), face(face), point1(point1), point2(point2), length(length) { }
3525 float Size() const { return length; }
3526 Matrix Index(float time) const
3527 {
3528 Point p1 = obj.FacePoint(face, point1);
3529 Point p2 = obj.FacePoint(face, point2);
3530 Point p1m = p1 * m;
3531 Point p2m = p2 * m;
3532 Vector v = p2m - p1m;
3533 Matrix mm = Matrix::RotateAroundAxisPoint(p1m, v, time*speed);
3534 return mm;
3535 }
3536private:
3537 Matrix m;
3538 FaceCollection &obj;
3539 float speed;
3540 int face, point1, point2;
3541 float length;
3542};
3543
3544
3545
3546class FaceCollectionArray : public Array<int, const FaceCollection*>
3547{
3548};
3549
3551{
3552public:
3553 AnimFaceCollectionArray(const Anim &a) : a(a) { }
3554 int Size() const { return a.NumFrames(); }
3555 const FaceCollection *Index(int i) const
3556 {
3557 return a.Frame(i);
3558 }
3559private:
3560 const Anim &a;
3561};
3562
3564
3566{
3567public:
3569 int Size() const { return arr.Size(); }
3570 const FaceCollection *Index(int object) const
3571 {
3572 object_id = object;
3573 return this;
3574 }
3575 virtual int NumFaces() const { return arr.Index(object_id)->NumFaces(); }
3576 virtual int NumPoints(int face) const { return arr.Index(object_id)->NumPoints(face); }
3577 virtual Point FacePoint(int face, int point) const { return arr.Index(object_id)->FacePoint(face,point); }
3578 virtual Vector PointNormal(int face, int point) const { return arr.Index(object_id)->PointNormal(face,point); }
3579 virtual int AttribI(int face, int point, int id) const
3580 {
3581 return arr.Index(object_id)->AttribI(face,point,id);
3582
3583 }
3584 virtual float Attrib(int face, int point, int id) const
3585 {
3586 if (id == AttrObjectId)
3587 {
3588 return object_id;
3589 }
3590 return arr.Index(object_id)->Attrib(face,point,id);
3591 }
3592private:
3594 mutable int object_id;
3595};
3596
3598{
3599public:
3600 DuplicateObject(const FaceCollection &coll, int count) : coll(coll), count(count) { }
3601
3602 int Size() const { return count; }
3603 const FaceCollection *Index(int i) const
3604 {
3605 return &coll;
3606 }
3607private:
3608 const FaceCollection &coll;
3609 int count;
3610};
3611
3613{
3614public:
3615 CompressObject(FaceCollectionArray &arr) : arr(arr), oldcount(-1) { }
3616 void Prepare()
3617 {
3618 int s = arr.Size();
3619 for(int i=0;i<s;i++) const_cast<FaceCollection*>(arr.Index(i))->Prepare();
3620 }
3621 virtual int NumFaces() const
3622 {
3623 if (oldcount != -1) return oldcount;
3624 int count = 0;
3625 int num = arr.Size();
3626 for(int i=0;i<num;i++)
3627 {
3628 count += arr.Index(i)->NumFaces();
3629 }
3630 oldcount = count;
3631 return count;
3632 }
3633 virtual int NumPoints(int face) const
3634 {
3635 int count = 0;
3636 int num = arr.Size();
3637 for (int i=0;i<num;i++)
3638 {
3639 int oldcount = count;
3640 count += arr.Index(i)->NumFaces();
3641 if (count > face) { return arr.Index(i)->NumPoints(face-oldcount); }
3642 }
3643 return 0;
3644 }
3645 virtual Point FacePoint(int face, int point) const
3646 {
3647 int count = 0;
3648 int num = arr.Size();
3649 for (int i=0;i<num;i++)
3650 {
3651 int oldcount = count;
3652 count += arr.Index(i)->NumFaces();
3653 if (count > face) { return arr.Index(i)->FacePoint(face-oldcount, point); }
3654 }
3655 std::cout << "CompressObject::Point" << std::endl;
3656 return Point(0.0,0.0,0.0);
3657
3658 }
3659
3660 virtual unsigned int Color(int face, int point) const
3661 {
3662 int count = 0;
3663 int num = arr.Size();
3664 for (int i=0;i<num;i++)
3665 {
3666 int oldcount = count;
3667 count += arr.Index(i)->NumFaces();
3668 if (count > face) { return arr.Index(i)->Color(face-oldcount, point); }
3669 }
3670 std::cout << "CompressObject::0" << std::endl;
3671 return 0;
3672 }
3673
3674 virtual Point2d TexCoord(int face, int point) const
3675 {
3676 int count = 0;
3677 int num = arr.Size();
3678 for (int i=0;i<num;i++)
3679 {
3680 int oldcount = count;
3681 count += arr.Index(i)->NumFaces();
3682 if (count > face) { return arr.Index(i)->TexCoord(face-oldcount, point); }
3683 }
3684 std::cout << "CompressObject::0" << std::endl;
3685 Point2d p;
3686 p.x = 0;
3687 p.y = 0;
3688 return p;
3689 }
3690
3691
3692 virtual Vector PointNormal(int face, int point) const
3693 {
3694 int count = 0;
3695 int num = arr.Size();
3696 for (int i=0;i<num;i++)
3697 {
3698 int oldcount = count;
3699 count += arr.Index(i)->NumFaces();
3700 if (count > face) { return arr.Index(i)->PointNormal(face-oldcount, point); }
3701 }
3702 std::cout << "CompressObject::Vector" << std::endl;
3703 return Vector(0.0,0.0,0.0);
3704
3705 }
3706 virtual float Attrib(int face, int point, int id) const
3707 {
3708 int count = 0;
3709 int num = arr.Size();
3710 for (int i=0;i<num;i++)
3711 {
3712 int oldcount = count;
3713 count += arr.Index(i)->NumFaces();
3714 if (count > face) { return arr.Index(i)->Attrib(face-oldcount, point, id); }
3715 }
3716 return 0.0;
3717 }
3718
3719 virtual int AttribI(int face, int point, int id) const
3720 {
3721 int count = 0;
3722 int num = arr.Size();
3723 //std::cout << "AttribI: " << num << std::endl;
3724 for (int i=0;i<num;i++)
3725 {
3726 int oldcount = count;
3727 count += arr.Index(i)->NumFaces();
3728 if (count > face) { return arr.Index(i)->AttribI(face-oldcount, point, id); }
3729 }
3730 return 0.0;
3731 }
3732
3733
3734private:
3736 mutable int oldcount;
3737};
3738
3740{
3741public:
3743 virtual int NumFaces() const=0;
3744 virtual int NumPoints() const=0;
3745 virtual Point FacePoint(int index) const=0;
3746 virtual Vector PointNormal(int index) const=0;
3747 virtual Point2d TexCoord(int index) const=0;
3748 virtual unsigned int Color(int index) const=0;
3749 virtual float Attrib(int index, int id) const=0;
3750 virtual int AttribI(int index, int id) const=0;
3751 virtual int Index(int face, int point) const=0;
3752 virtual int IndexCount() const=0;
3753 virtual int IndexToFace(int index) const=0;
3754};
3755
3756class SeparateArrayElements : public Array<int,const FaceCollectionTri*>
3757{
3758public:
3760 struct Arr : public FaceCollectionTri
3761 {
3762 Arr(const FaceCollectionTri &tri, const Array<int,const FaceCollectionTri*> &arr, int t) : tri(tri),arr(arr),t(t) { }
3763 virtual int NumFaces() const { arr.Index(t); return tri.NumFaces(); }
3764 virtual int NumPoints() const { arr.Index(t); return tri.NumPoints(); }
3765 virtual Point FacePoint(int index) const { arr.Index(t); return tri.FacePoint(index); }
3766 virtual Vector PointNormal(int index) const { arr.Index(t); return tri.PointNormal(index); }
3767 virtual unsigned int Color(int index) const { arr.Index(t); return tri.Color(index); }
3768 virtual Point2d TexCoord(int index) const { arr.Index(t); return tri.TexCoord(index); }
3769
3770 virtual float Attrib(int index, int id) const { arr.Index(t); return tri.Attrib(index,id); }
3771 virtual int AttribI(int index, int id) const { arr.Index(t); return tri.AttribI(index,id); }
3772 virtual int Index(int face, int point) const { arr.Index(t); return tri.Index(face,point); }
3773 virtual int IndexCount() const { arr.Index(t); return tri.IndexCount(); }
3774 virtual int IndexToFace(int index) const { arr.Index(t); return tri.IndexToFace(index); }
3775 private:
3776 const FaceCollectionTri &tri;
3778 int t;
3779 };
3780 int Size() const { return arr.Size(); }
3781 const FaceCollectionTri *Index(int i) const
3782 {
3783 Arr *a = new Arr(*arr.Index(i), arr, i);
3784 owner.push_back(a);
3785 return a;
3786 }
3788 {
3789 for(std::vector<Arr*>::iterator i = owner.begin();i!=owner.end();i++)
3790 {
3791 delete *i;
3792 }
3793 }
3794private:
3796 mutable std::vector<Arr*> owner;
3797};
3798
3799class BatchGeneration : public Array<int, const FaceCollectionTri*>, private FaceCollectionTri
3800{
3801public:
3802 BatchGeneration(FaceCollectionTri &tri, int batchsize) : tri(tri), batchsize(batchsize) { }
3803public: // FaceCollectionTri
3804 virtual int NumFaces() const { return CurrentBatchSize(); }
3805 virtual int NumPoints() const
3806 {
3807 int i = LastIndex()-FirstIndex();
3808 //std::cout << "NumPoints() " << i << std::endl;
3809 return i;
3810 }
3811 virtual Point FacePoint(int index) const
3812 {
3813 return tri.FacePoint(IndexMap(index));
3814 }
3815 virtual Vector PointNormal(int index) const
3816 {
3817 return tri.PointNormal(IndexMap(index));
3818 }
3819 virtual unsigned int Color(int index) const
3820 {
3821 return tri.Color(IndexMap(index));
3822 }
3823 virtual Point2d TexCoord(int index) const
3824 {
3825 return tri.TexCoord(IndexMap(index));
3826 }
3827 virtual float Attrib(int index, int id) const
3828 {
3829 return tri.Attrib(IndexMap(index), id);
3830 }
3831 virtual int AttribI(int index, int id) const
3832 {
3833 return tri.AttribI(IndexMap(index), id);
3834 }
3835 virtual int Index(int face, int point) const
3836 { // input face=[0..currentbatchsize()]
3837 // output index = [0..(LastIndex()-FirstIndex()]
3838 return IndexMapI(tri.Index(FaceMap(face), point));
3839 }
3840 virtual int IndexCount() const { return LastIndex()-FirstIndex(); }
3841 virtual int IndexToFace(int index) const
3842 {
3843 return FaceMapI(tri.IndexToFace(IndexMap(index)));
3844 }
3845private:
3846 int FaceMap(int face) const
3847 {
3848 face += batchsize*currentbatch;
3849 return face;
3850 }
3851 int FaceMapI(int face) const
3852 {
3853 face -= batchsize*currentbatch;
3854 return face;
3855 }
3856 int IndexMap(int index) const
3857 {
3858 index += FirstIndex();
3859 return index;
3860 }
3861 int IndexMapI(int index) const
3862 {
3863 index -= FirstIndex();
3864 return index;
3865 }
3866 int BatchFace(int face) const
3867 {
3868 return face % batchsize;
3869 }
3870 int FirstIndex() const
3871 {
3872 return tri.Index(batchsize*currentbatch,0);
3873 }
3874 int LastIndex() const
3875 {
3876 return tri.Index(batchsize*currentbatch+CurrentBatchSize(),0);
3877 }
3878 int CurrentBatchSize() const
3879 {
3880 int numfaces = tri.NumFaces();
3881 numfaces -= currentbatch*batchsize;
3882 if (numfaces > batchsize) return batchsize;
3883 return numfaces;
3884 }
3885public: // Array<int, FaceCollectionTri*>
3886 int Size() const { return tri.NumFaces()/batchsize + 1; }
3887 const FaceCollectionTri *Index(int i) const
3888 {
3889 currentbatch = i;
3890 return this;
3891 }
3892private:
3893 FaceCollectionTri &tri;
3894 int batchsize;
3895 mutable int currentbatch;
3896};
3897
3899{
3900public:
3901 virtual int NumObjects() const=0;
3902 virtual int PointsStartRange(int obj) const=0;
3903 virtual int PointsEndRange(int obj) const=0;
3904 virtual int IndexStartRange(int obj) const=0;
3905 virtual int IndexEndRange(int obj) const=0;
3906};
3907
3908
3910{
3911public:
3913 int NumObjects() const { return arr.Size(); }
3914 virtual int PointsStartRange(int obj) const
3915 {
3916 int count = 0;
3917 int ii = 0;
3918 int num = arr.Size();
3919 for(int i=0;i<num;i++)
3920 {
3921 int oldcount = count;
3922 count += arr.Index(i)->NumPoints();
3923 ii++;
3924 if (ii > obj) { count = oldcount; break; }
3925 }
3926 return count;
3927 }
3928 virtual int PointsEndRange(int obj) const
3929 {
3930 return PointsStartRange(obj) + arr.Index(obj)->NumPoints();
3931 }
3932 virtual int IndexStartRange(int obj) const
3933 {
3934 int count = 0;
3935 int ii = 0;
3936 int num = arr.Size();
3937 for(int i=0;i<num;i++)
3938 {
3939 int oldcount = count;
3940 count += arr.Index(i)->IndexCount();
3941 ii++;
3942 if (ii > obj) { count = oldcount; break; }
3943 }
3944 return count;
3945 }
3946
3947 virtual int IndexEndRange(int obj) const
3948 {
3949 return IndexStartRange(obj) + arr.Index(obj)->IndexCount();
3950 }
3951
3952 virtual int NumFaces() const
3953 {
3954 int count = 0;
3955 int num = arr.Size();
3956 for(int i=0;i<num;i++)
3957 {
3958 count += arr.Index(i)->NumFaces();
3959 }
3960 return count;
3961
3962 }
3963 virtual int NumPoints() const
3964 {
3965 int count = 0;
3966 int num = arr.Size();
3967 for(int i=0;i<num;i++)
3968 {
3969 count += arr.Index(i)->NumPoints();
3970 }
3971 return count;
3972 }
3973 virtual Point FacePoint(int index) const
3974 {
3975 int count = 0;
3976 int num = arr.Size();
3977 for(int i=0;i<num;i++)
3978 {
3979 int oldcount = count;
3980 count += arr.Index(i)->IndexCount();
3981 if (count > index)
3982 {
3983 Point p = arr.Index(i)->FacePoint(index-oldcount);
3984 //std::cout << index << " " << p << std::endl;
3985 return p;
3986 }
3987 }
3988 Point b;
3989 return b;
3990 }
3991 virtual unsigned int Color(int index) const
3992 {
3993 int count = 0;
3994 int num = arr.Size();
3995 for(int i=0;i<num;i++)
3996 {
3997 int oldcount = count;
3998 count += arr.Index(i)->IndexCount();
3999 if (count > index) { return arr.Index(i)->Color(index-oldcount); }
4000 }
4001 std::cout << "ObjectArray2::0" << std::endl;
4002 return 0;
4003 }
4004
4005 virtual Point2d TexCoord(int index) const
4006 {
4007 int count = 0;
4008 int num = arr.Size();
4009 for(int i=0;i<num;i++)
4010 {
4011 int oldcount = count;
4012 count += arr.Index(i)->IndexCount();
4013 if (count > index) { return arr.Index(i)->TexCoord(index-oldcount); }
4014 }
4015 std::cout << "ObjectArray2::0" << std::endl;
4016 Point2d p;
4017 p.x = 0;
4018 p.y = 0;
4019 return p;
4020 }
4021
4022
4023 virtual Vector PointNormal(int index) const
4024 {
4025 int count = 0;
4026 int num = arr.Size();
4027 for(int i=0;i<num;i++)
4028 {
4029 int oldcount = count;
4030 count += arr.Index(i)->IndexCount();
4031 if (count > index) { return arr.Index(i)->PointNormal(index-oldcount); }
4032 }
4033 Vector b;
4034 return b;
4035
4036 }
4037 virtual float Attrib(int index, int id) const
4038 {
4039 int count = 0;
4040 int num = arr.Size();
4041 for(int i=0;i<num;i++)
4042 {
4043 int oldcount = count;
4044 count += arr.Index(i)->IndexCount();
4045 if (count > index) { return arr.Index(i)->Attrib(index-oldcount, id); }
4046 }
4047 float b=0.0;
4048 return b;
4049
4050 }
4051 virtual int AttribI(int index, int id) const
4052 {
4053 int count = 0;
4054 int num = arr.Size();
4055 for(int i=0;i<num;i++)
4056 {
4057 int oldcount = count;
4058 count += arr.Index(i)->IndexCount();
4059 if (count > index) { return arr.Index(i)->AttribI(index-oldcount, id); }
4060 }
4061 float b=0.0;
4062 return b;
4063
4064 }
4065 virtual int IndexCount() const
4066 {
4067 int count = 0;
4068 int num = arr.Size();
4069 for(int i=0;i<num;i++)
4070 {
4071 count += arr.Index(i)->IndexCount();
4072 }
4073 return count;
4074 }
4075 virtual int IndexToFace(int index) const
4076 {
4077 int count = 0;
4078 int facecount = 0;
4079 int oldfacecount = 0;
4080 int result = 0;
4081 int num = arr.Size();
4082 int i = 0;
4083 for(;i<num;i++)
4084 {
4085 int oldcount = count;
4086 oldfacecount = facecount;
4087 count += arr.Index(i)->IndexCount();
4088 facecount += arr.Index(i)->NumFaces();
4089 if (count > index) { result = index-oldcount; break; }
4090 }
4091 return oldfacecount + arr.Index(i)->IndexToFace(result);
4092 }
4093 virtual int Index(int face, int point) const
4094 {
4095 int result =0;
4096 int count = 0;
4097 int i = 0;
4098 int obj=0;
4099 int num = arr.Size();
4100 for(;i<num;i++)
4101 {
4102 int oldcount = count;
4103 count += arr.Index(i)->NumFaces();
4104 if (count > face) { result = face-oldcount; break; }
4105 obj++;
4106 }
4107 int ii = arr.Index(i)->Index(result, point);
4108 return IndexStartRange(obj) + ii;
4109 }
4110private:
4112};
4113
4115{
4116public:
4117 // array of const FaceCollectionTri*
4118 template<class It>
4119 ObjectArray(It beg, It end) : vec(beg, end) {}
4120
4121 virtual int NumObjects() const { return vec.size(); }
4122 virtual int PointsStartRange(int obj) const
4123 {
4124 int count = 0;
4125 int ii = 0;
4126 for(std::vector<const FaceCollectionTri*>::const_iterator i=vec.begin();i!=vec.end();i++)
4127 {
4128 int oldcount = count;
4129 count += (*i)->NumPoints();
4130 ii++;
4131 if (ii > obj) { count = oldcount; break; }
4132 }
4133 return count;
4134 }
4135 virtual int PointsEndRange(int obj) const
4136 {
4137 return PointsStartRange(obj) + vec[obj]->NumPoints();
4138 }
4139 virtual int IndexStartRange(int obj) const
4140 {
4141 int count = 0;
4142 int ii = 0;
4143 for(std::vector<const FaceCollectionTri*>::const_iterator i=vec.begin();i!=vec.end();i++)
4144 {
4145 int oldcount = count;
4146 count += (*i)->IndexCount();
4147 ii++;
4148 if (ii > obj) { count = oldcount; break; }
4149 }
4150 return count;
4151 }
4152
4153 virtual int IndexEndRange(int obj) const
4154 {
4155 return IndexStartRange(obj) + vec[obj]->IndexCount();
4156 }
4157
4158 virtual int NumFaces() const
4159 {
4160 int count = 0;
4161 for(std::vector<const FaceCollectionTri*>::const_iterator i=vec.begin();i!=vec.end();i++)
4162 {
4163 count += (*i)->NumFaces();
4164 }
4165 return count;
4166
4167 }
4168 virtual int NumPoints() const
4169 {
4170 int count = 0;
4171 for(std::vector<const FaceCollectionTri*>::const_iterator i=vec.begin();i!=vec.end();i++)
4172 {
4173 count += (*i)->NumPoints();
4174 }
4175 return count;
4176 }
4177 virtual Point FacePoint(int index) const
4178 {
4179 int count = 0;
4180 for(std::vector<const FaceCollectionTri*>::const_iterator i=vec.begin(); i!=vec.end();i++)
4181 {
4182 int oldcount = count;
4183 count += (*i)->IndexCount();
4184 if (count > index) { return (*i)->FacePoint(index-oldcount); }
4185 }
4186 Point b;
4187 return b;
4188 }
4189
4190 virtual unsigned int Color(int index) const
4191 {
4192 int count = 0;
4193 for(std::vector<const FaceCollectionTri*>::const_iterator i=vec.begin(); i!=vec.end();i++)
4194 {
4195 int oldcount = count;
4196 count += (*i)->IndexCount();
4197 if (count > index) { return (*i)->Color(index-oldcount); }
4198 }
4199 std::cout << "ObjectArray::0" << std::endl;
4200
4201 return 0;
4202 }
4203
4204 virtual Point2d TexCoord(int index) const
4205 {
4206 int count = 0;
4207 for(std::vector<const FaceCollectionTri*>::const_iterator i=vec.begin(); i!=vec.end();i++)
4208 {
4209 int oldcount = count;
4210 count += (*i)->IndexCount();
4211 if (count > index) { return (*i)->TexCoord(index-oldcount); }
4212 }
4213 std::cout << "ObjectArray::0" << std::endl;
4214
4215 Point2d p;
4216 p.x = 0;
4217 p.y = 0;
4218 return p;
4219 }
4220
4221
4222 virtual Vector PointNormal(int index) const
4223 {
4224 int count = 0;
4225 for(std::vector<const FaceCollectionTri*>::const_iterator i=vec.begin(); i!=vec.end();i++)
4226 {
4227 int oldcount = count;
4228 count += (*i)->IndexCount();
4229 if (count > index) { return (*i)->PointNormal(index-oldcount); }
4230 }
4231 Vector b;
4232 return b;
4233
4234 }
4235 virtual float Attrib(int index, int id) const
4236 {
4237 int count = 0;
4238 for(std::vector<const FaceCollectionTri*>::const_iterator i=vec.begin(); i!=vec.end();i++)
4239 {
4240 int oldcount = count;
4241 count += (*i)->IndexCount();
4242 if (count > index) { return (*i)->Attrib(index-oldcount, id); }
4243 }
4244 float b=0.0;
4245 return b;
4246
4247 }
4248 virtual int AttribI(int index, int id) const
4249 {
4250 int count = 0;
4251 for(std::vector<const FaceCollectionTri*>::const_iterator i=vec.begin(); i!=vec.end();i++)
4252 {
4253 int oldcount = count;
4254 count += (*i)->IndexCount();
4255 if (count > index) { return (*i)->AttribI(index-oldcount, id); }
4256 }
4257 int b=0;
4258 return b;
4259
4260 }
4261
4262 virtual int IndexCount() const
4263 {
4264 return 0;
4265 }
4266 virtual int IndexToFace(int index) const
4267 {
4268 int count = 0;
4269 int facecount = 0;
4270 int oldfacecount = 0;
4271 int result = 0;
4272 std::vector<const FaceCollectionTri*>::const_iterator i = vec.begin();
4273 for(; i!=vec.end();i++)
4274 {
4275 int oldcount = count;
4276 oldfacecount = facecount;
4277 count += (*i)->IndexCount();
4278 facecount += (*i)->NumFaces();
4279 if (count > index) { result = index-oldcount; break; }
4280 }
4281 return oldfacecount + (*i)->IndexToFace(result);
4282 }
4283 virtual int Index(int face, int point) const
4284 {
4285 int result =0;
4286 int count = 0;
4287 std::vector<const FaceCollectionTri*>::const_iterator i = vec.begin();
4288 int obj=0;
4289 for(; i!=vec.end();i++)
4290 {
4291 int oldcount = count;
4292 count += (*i)->NumFaces();
4293 if (count > face) { result = face-oldcount; break; }
4294 obj++;
4295 }
4296 int ii = (*i)->Index(result, point);
4297 return IndexStartRange(obj) + ii;
4298 }
4299private:
4300 std::vector<const FaceCollectionTri*> vec;
4301};
4302
4304{
4305public:
4306 TrisToTris(const FaceCollection &coll) : coll(coll) { }
4307 virtual int NumFaces() const
4308 {
4309 return coll.NumFaces();
4310 }
4311 virtual int NumPoints() const
4312 {
4313 return coll.NumFaces()*3;
4314 }
4315 virtual Point FacePoint(int index) const
4316 {
4317 int face = index / 3;
4318 int point = index - face*3;
4319 return coll.FacePoint(face, point);
4320 }
4321 virtual unsigned int Color(int index) const
4322 {
4323 int face = index / 3;
4324 int point = index - face*3;
4325 return coll.Color(face, point);
4326 }
4327 virtual Point2d TexCoord(int index) const
4328 {
4329 int face = index / 3;
4330 int point = index - face*3;
4331 return coll.TexCoord(face, point);
4332 }
4333
4334 virtual Vector PointNormal(int index) const
4335 {
4336 int face = index / 3;
4337 int point = index - face*3;
4338 return coll.PointNormal(face, point);
4339 }
4340 virtual float Attrib(int index, int id) const
4341 {
4342 int face = index / 3;
4343 int point = index - face*3;
4344 return coll.Attrib(face, point, id);
4345 }
4346 virtual int AttribI(int index, int id) const
4347 {
4348 int face = index / 3;
4349 int point = index - face*3;
4350 return coll.AttribI(face, point, id);
4351 }
4352 virtual int Index(int face, int point) const
4353 {
4354 return face*3+point;
4355 }
4356 virtual int IndexCount() const
4357 {
4358 return coll.NumFaces();
4359 }
4360 virtual int IndexToFace(int index) const
4361 {
4362 //return index;
4363 return index/3;
4364 }
4365private:
4366 const FaceCollection &coll;
4367
4368};
4370class QuadsToPlanes : public Array<int, Plane>
4371{
4372public:
4373 QuadsToPlanes(const FaceCollection &coll) : coll(coll) { }
4374 Plane Index(int i) const
4375 {
4376 Point p1 = coll.FacePoint(i, 0);
4377 Point p2 = coll.FacePoint(i, 1);
4378 Point p3 = coll.FacePoint(i, 2);
4379 Point p4 = coll.FacePoint(i, 3);
4380 Point avg = Vector(p1+p2+p3+p4)/4;
4381 return Plane(avg, Vector(p2-p1)/2, Vector(p4-p1)/2);
4382 }
4383 int Size() const { return coll.NumFaces(); }
4384private:
4385 const FaceCollection &coll;
4386};
4387
4389{ // assumes that NumPoints(face) is 4
4390public:
4391 QuadsToTris(const FaceCollection &coll) : coll(coll) { }
4392 virtual int NumFaces() const
4393 {
4394 return coll.NumFaces()*2;
4395 }
4396 virtual int NumPoints() const
4397 {
4398 return coll.NumFaces()*4;
4399 }
4400 virtual Point FacePoint(int index) const
4401 {
4402 int face = index >> 2;
4403 int point = index & 0x3;
4404 return coll.FacePoint(face, point);
4405 }
4406 virtual Vector PointNormal(int index) const
4407 {
4408 int face = index >> 2;
4409 int point = index & 0x3;
4410 return coll.PointNormal(face, point);
4411 }
4412 virtual unsigned int Color(int index) const
4413 {
4414 int face = index >> 2;
4415 int point = index & 0x3;
4416 return coll.Color(face, point);
4417 }
4418
4419 virtual Point2d TexCoord(int index) const
4420 {
4421 int face = index >> 2;
4422 int point = index & 0x3;
4423 return coll.TexCoord(face, point);
4424 }
4425
4426 virtual float Attrib(int index, int id) const
4427 {
4428 int face = index >> 2;
4429 int point = index & 0x3;
4430 return coll.Attrib(face, point, id);
4431 }
4432 virtual int AttribI(int index, int id) const
4433 {
4434 int face = index >> 2;
4435 int point = index & 0x3;
4436 return coll.AttribI(face, point, id);
4437 }
4438 virtual int Index(int face, int point) const
4439 {
4440 int face1 = face >> 1;
4441 int face2 = face &0x1;
4442 int offset = face2*2 + face1*4;
4443 if (face2==1 && point==2)
4444 {
4445 int i = offset-face2*2;
4446 //std::cout << "Indexes2: " << face << " " << point << ":" << i << std::endl;
4447 return i;
4448 }
4449 int i = offset+point;
4450 //std::cout << "Indexes: " << face << " " << point << ":" << i << std::endl;
4451 return i;
4452 }
4453 virtual int IndexCount() const
4454 {
4455 //return 3*NumFaces();
4456 //return 6*coll.NumFaces();
4457 return 4*coll.NumFaces();
4458 }
4459 virtual int IndexToFace(int index) const
4460 {
4461 //return index/3;
4462 //return index;
4463 return index/2;
4464 }
4465private:
4466 const FaceCollection &coll;
4467};
4469
4471{
4472public:
4473 template<class It>
4474 PointCollectionArray(It beg, It end) : vec(beg,end) { }
4475 virtual int Size() const { return vec.size(); }
4476 virtual Point Index(int index) const { return vec[index]; }
4477private:
4478 std::vector<Point> vec;
4479};
4480
4482{
4483public:
4484 StarCurve(float r1, float r2, int numpoints) : num(numpoints), r1(r1), r2(r2) {}
4485 int Size() const { return num*2; }
4486 Point Index(int i) const
4487 {
4488 int ii = i % 2;
4489 float r=0.0;
4490 if (ii==0) r=r1;
4491 if (ii==1) r=r2;
4492
4493 float angle = 2.0*3.14159*float(i/2)/float(num);
4494 Point p;
4495 p.x = r*cos(angle);
4496 p.y = r*sin(angle);
4497 p.z = 0.0;
4498 return p;
4499 }
4500private:
4501 int num;
4502 float r1,r2;
4503};
4504
4506{
4507public:
4508 SampleCurve3d(const CurveIn3d &curve, int count) : curve(curve), arr(c), c(count, curve.Size()) { }
4509 SampleCurve3d(const CurveIn3d *curve, int count) : curve(*curve), arr(c), c(count, curve->Size()) { }
4510 SampleCurve3d(const CurveIn3d &curve, const FloatArray &arr) : curve(curve), arr(arr), c(1,0) { }
4511 int Size() const { return arr.NumFloats(); }
4512 Point Index(int index) const
4513 {
4514 //float length = curve.Length();
4515 //length /= float(count);
4516 //length *= float(index);
4517 float length = arr.Index(index);
4518 return curve.Index(length);
4519 }
4520private:
4521 const CurveIn3d &curve;
4522 //int count;
4523 const FloatArray &arr;
4525};
4526
4527
4529
4531{
4532public:
4533 SampledLine(Point p1, Point p2, int count) : line(p1,p2), sample(line, count) { }
4534 int Size() const { return sample.Size(); }
4535 Point Index(int i) const { return sample.Index(i); }
4536private:
4537 LineIn3d line;
4538 SampleCurve3d sample;
4539};
4540
4541
4542class Direction : public Element<Matrix>
4543{
4544public:
4545 Direction(const std::pair<Point, Point> &p) : p(p) { }
4546 Matrix Elem() const
4547 {
4548 Vector v = p.second - p.first;
4549 //std::cout << p.first << " " << p.second << " " << v << std::endl;
4550 Vector vx(1.0,0.0,0.0);
4551 Vector vy(0.0,1.0,0.0);
4552 Vector vz(0.0,0.0,1.0);
4553 float anglex = Vector::Angle(v,vx);
4554 float angley = Vector::Angle(v,vy);
4555 float anglez = Vector::Angle(v,vz);
4556 //std::cout << anglex << " " << angley << " " << anglez << std::endl;
4557 return Matrix::XRotation(anglex)*Matrix::YRotation(angley)*Matrix::ZRotation(anglez)*Matrix::Translate(p.first.x,p.first.y,p.first.z);
4558 }
4559private:
4560 std::pair<Point, Point> p; // need to take copy
4561};
4563
4565{
4566public:
4567 CurveMovement(const CurveIn3d &curve) : curve(curve) { }
4568 float Size() const { return curve.Size(); }
4569 Matrix Index(float x) const
4570 {
4571 Point p = curve.Index(x);
4572 Point p2 = curve.Index(x+0.01);
4573 Direction d(std::make_pair(p,p2));
4574 return d.Elem();
4575 }
4576private:
4577 const CurveIn3d &curve;
4578};
4580
4582{
4583public:
4584 FlipNormals(FaceCollection &coll) : ForwardFaceCollection(coll), coll(coll) { }
4585 ~FlipNormals() { delete [] pos2; }
4586 virtual std::string name() const { return "FlipNormals"; }
4587
4588 void Collect(CollectVisitor &vis) { coll.Collect(vis); }
4589 void HeavyPrepare() { }
4590 int NumFaces() const { return coll.NumFaces(); }
4591 int NumPoints(int face) const { return coll.NumPoints(face); }
4592 Point FacePoint(int face, int point) const { return coll.FacePoint(face,point); }
4593 Vector PointNormal(int face, int point) const {
4594 return -coll.PointNormal(face,point);
4595 }
4596 float Attrib(int face, int point, int id) const { return coll.Attrib(face,point,id); }
4597 int AttribI(int face, int point, int id) const { return coll.AttribI(face,point,id); }
4598 virtual bool HasBatchMap() const
4599 {
4600 return coll.HasBatchMap();
4601 }
4602 void change_normal(Vector **pos, int numvertices) const
4603 {
4604 //static Vector *pos2=0;
4605 delete [] pos2;
4606 pos2 = new Vector[numvertices];
4607 for(int i=0;i<numvertices;i++)
4608 {
4609 pos2[i] = -(*pos)[i];
4610 //if (i<20)
4611 //std::cout << "FLIPNORMAL:" << pos2[i] << std::endl;
4612 }
4613 *pos = pos2;
4614 }
4615 virtual FaceBufferRef BatchMap(int start_face, int end_face) const
4616 {
4617 FaceBufferRef r = coll.BatchMap(start_face,end_face);
4619 return r;
4620 }
4621private:
4622 FaceCollection &coll;
4623 mutable Vector *pos2=0;
4624};
4626
4627
4628
4629#if 0
4630class ForwardLineCollection : public LineCollection
4631{
4632public:
4633 ForwardLineCollection(LineCollection *coll) : coll(coll) { }
4634 void Collect(CollectVisitor &vis) { coll->Collect(vis); }
4635 void HeavyPrepare() { }
4636 virtual int NumLines() const { return coll->NumLines(); }
4637 virtual Point LinePoint(int line, int point) const
4638 {
4639 return coll->LinePoint(line,point);
4640 }
4641private:
4642 LineCollection *coll;
4643};
4644#endif
4645
4647{
4648public:
4649 ContinuousLines(PointCollection &p, bool loops) : p(p), loops(loops) { }
4650 ContinuousLines(PointCollection *p, bool loops) : p(*p), loops(loops) { }
4652 {
4653 }
4654 void HeavyPrepare() { }
4655
4656 int NumLines() const { return loops?p.NumPoints():p.NumPoints()-1; }
4657 Point LinePoint(int line, int point) const
4658 {
4659 int num = line+point;
4660 num %= p.NumPoints();
4661 return p.Points(num);
4662 }
4663private:
4664 PointCollection &p;
4665 bool loops;
4666};
4668
4669#if 0
4670class AnimLines : public LineCollection
4671{
4672public:
4673 AnimLines(FaceCollection *p1, FaceCollection *p2) : p1(p1), p2(p2) { }
4674 void Collect(CollectVisitor &vis) { p1->Collect(vis); p2->Collect(vis); }
4675 void HeavyPrepare() { }
4676 int NumLines() const
4677 {
4678 int s = p1->NumFaces();
4679 int count = 0;
4680 for(int i=0;i<s;i++)
4681 {
4682 count+=p1->NumPoints(i);
4683 }
4684 return count;
4685 }
4686 Point LinePoint(int line, int point) const
4687 {
4688 int s = p1->NumFaces();
4689 int count = 0;
4690 int oldcount = 0;
4691 int i = 0;
4692 for(;i<s;i++)
4693 {
4694 oldcount = count;
4695 count+=p1->NumPoints(i);
4696 if (count>=line)
4697 {
4698 break;
4699 }
4700 }
4701 switch(point)
4702 {
4703 case 0: return p1->FacePoint(i, line-oldcount);
4704 case 1: return p2->FacePoint(i, line-oldcount);
4705 };
4706 Point p;
4707 return p;
4708 }
4709private:
4710 FaceCollection *p1;
4711 FaceCollection *p2;
4712};
4713#endif
4715{
4716public:
4718 {
4719 firsttime=true;
4720 }
4721 void Collect(CollectVisitor &vis) { c.Collect(vis); vis.register_obj(this); }
4723 if (firsttime) {
4724 int faces = c.NumFaces();
4725 int cc = 0;
4726 for(int i=0;i<faces;i++)
4727 {
4728 int num = c.NumPoints(i);
4729 int oldc = cc;
4730 for(int j=0;j<num;j++)
4731 {
4732 counts.push_back(i);
4733 counts2.push_back(oldc);
4734 cc++;
4735 }
4736 }
4737
4738
4739 firsttime = false;
4740 }
4741
4742 }
4743 void Prepare();
4744 int NumLines() const;
4745 Point LinePoint(int line, int point) const;
4746 unsigned int LineColor(int line, int point) const;
4747private:
4748 FaceCollection &c;
4749 std::vector<int> counts;
4750 std::vector<int> counts2;
4751 bool firsttime;
4752};
4754
4756{
4757public:
4758 InverseOutlineFaces(FaceCollection &previous, LineCollection &coll) : ForwardFaceCollection(previous), previous(previous), coll(coll) { }
4759 Point FacePoint(int face, int point) const
4760 {
4761 int num2 = 0;
4762 int faces = previous.NumFaces();
4763 for(int i=0;i<faces;i++)
4764 {
4765 if (i>=face) break;
4766 num2+=previous.NumPoints(i)+1;
4767 }
4768 return coll.LinePoint(num2+point, 0);
4769 }
4770private:
4771 FaceCollection &previous;
4772 LineCollection &coll;
4773};
4774
4776{
4777public:
4778 FaceCenterPoints(FaceCollection &faces) : faces(faces) { }
4779 int Size() const { return faces.NumFaces(); }
4780 Point Index(int face) const {
4781 int count = faces.NumPoints(face);
4782 Vector sum;
4783 for(int i=0;i<count;i++)
4784 {
4785 Vector p = faces.FacePoint(face, i);
4786 sum+=p;
4787 }
4788 sum*=1.0/float(count);
4789 //std::cout << face << ":" << sum.dx << " " << sum.dy << " " << sum.dz << std::endl;
4790 return sum;
4791 }
4792private:
4793 FaceCollection &faces;
4794};
4796
4798{
4799public:
4800 FaceNormals(FaceCollection &faces) : faces(faces) { }
4801 int Size() const { return faces.NumFaces(); }
4802 Vector Index(int face) const {
4803 int count = faces.NumPoints(face);
4804 Vector sum;
4805 for(int i=0;i<count;i++)
4806 {
4807 Vector p = faces.PointNormal(face,i);
4808 sum += p;
4809 }
4810 sum*=1.0/float(count);
4811 return sum;
4812 }
4813private:
4814 FaceCollection &faces;
4815};
4816class AdvanceVector : public Element<std::pair<Point, Vector> >
4817{
4818public:
4819 AdvanceVector(const std::pair<Point,Vector> &v, float val) : v(v), val(val) { }
4820 std::pair<Point,Vector> Elem() const
4821 {
4822 return std::make_pair(v.first + val*v.second, v.second);
4823 }
4824private:
4825 std::pair<Point,Vector> v;
4826 float val;
4827};
4829
4830class VectorPoints : public Element<std::pair<Point,Point> >
4831{
4832public:
4833 VectorPoints(const std::pair<Point, Vector> &vec) : vec(vec) { }
4834 std::pair<Point, Point> Elem() const
4835 {
4836 //std::cout << "VectorPoints: " << vec.first << " " << vec.second << std::endl;
4837 return std::make_pair(vec.first, vec.first+vec.second);
4838 }
4839private:
4840 std::pair<Point, Vector> vec; // need to take copy of the values.
4841};
4843
4844class Fur : public LineCollection
4845{
4846public:
4847 Fur(FaceCollection &face, int numlines, int numlines2, float length) : face(face), numlines(numlines), numlines2(numlines2), length(length) { }
4848 int NumLines() const { return face.NumFaces()*numlines*numlines2; }
4849 Point LinePoint(int line, int point) const
4850 {
4851 int zz = line / (numlines*numlines2);
4852 int ddz = line - zz * (numlines*numlines2);
4853 int yy = ddz / numlines;
4854 int ddy = ddz - yy*numlines;
4855 int xx = ddy;
4856 float yyy = float(yy)/numlines2;
4857 float xxx = float(xx)/numlines;
4858
4859 //int face = line / numlines;
4860 //int line2 = line - face*numlines;
4861 Point p1 = face.FacePoint(zz, 0);
4862 Point p2 = face.FacePoint(zz, 1);
4863 Point p3 = face.FacePoint(zz, 2);
4864 Vector v1 = p2-p1;
4865 Vector v2 = p3-p2;
4866
4867 if (point == 0)
4868 {
4869 return p1+v1*yyy+xxx*v2;
4870 }
4871 else
4872 {
4873 return p1+v1*yyy+v2*xxx+face.PointNormal(zz,0)*length;
4874
4875 }
4876 }
4877private:
4878 FaceCollection &face;
4879 int numlines, numlines2;
4880 float length;
4881};
4882
4884{
4885public:
4886 virtual ~TextureCoords() { }
4887 virtual int Texture(int face) const=0;
4888 virtual Point2d TexCoord(int face, int point) const=0;
4889};
4890
4892{
4893public:
4894 FaceCollectionTextureCoords(const FaceCollection &coll) : coll(coll) { }
4895 int Texture(int face) const
4896 {
4897 return coll.FaceTexture(face);
4898 }
4899 Point2d TexCoord(int face, int point) const { return coll.TexCoord(face,point); }
4900private:
4901 const FaceCollection &coll;
4902};
4903
4905{
4906public:
4907 SphericalTexCoords(FaceCollection &coll, int texture, Point center) : coll(coll), texture(texture), center(center) { }
4908
4909 int Texture(int face) const { return texture; }
4910 Point2d TexCoord(int face, int point) const
4911 {
4912 Point p = coll.FacePoint(face,point);
4913 Vector v = p-Vector(center);
4914 float alfa = atan2(sqrt(v.dx*v.dx+v.dy*v.dy),v.dz);
4915 float beta = atan2(v.dy,v.dx);
4916 Point2d res;
4917 res.x = alfa/3.14159/2.0;
4918 res.y = beta/3.14159/2.0;
4919 return res;
4920 }
4921private:
4922 FaceCollection &coll;
4923 int texture;
4924 Point center;
4925};
4927
4929{
4930public:
4931 PlaneTexCoords(FaceCollection &coll, int texture, Point center, Vector x, Vector y) : coll(coll), texture(texture), center(center), x(x), y(y) { }
4932 int Texture(int face) const { return texture; }
4933 Point2d TexCoord(int face, int point) const
4934 {
4935 Point p = coll.FacePoint(face,point);
4936 Vector v = p-Vector(center);
4937 float projx = Vector::DotProduct(v,x)/x.Dist();
4938 float projy = Vector::DotProduct(v,y)/y.Dist();
4939 Point2d res;
4940 res.x = projx;
4941 res.y = projy;
4942 return res;
4943 }
4944
4945private:
4946 FaceCollection &coll;
4947 int texture;
4948 Point center;
4949 Vector x,y;
4950};
4951
4953{
4954public:
4955 HorizTexCoords(FaceCollection &coll, int texture) : coll(coll), texture(texture) { }
4956 int Texture(int face) const { return texture; }
4957 Point2d TexCoord(int face, int point) const
4958 {
4959 int numfaces = coll.NumFaces();
4960 float dx = 1.0/numfaces;
4961 float x = face*dx;
4962 float xx=0.0,yy=0.0;
4963 float dy = 1.0;
4964 switch(point)
4965 {
4966 case 3: xx=0.0; yy=0.0; break;
4967 case 0: xx=0.0; yy=dy; break;
4968 case 1: xx=dx; yy=dy; break;
4969 case 2: xx=dx; yy=0.0; break;
4970 };
4971 Point2d p;
4972 p.x = x+xx;
4973 p.y = yy;
4974 return p;
4975 }
4976private:
4977 FaceCollection &coll;
4978 int texture;
4979};
4981
4983{
4984public:
4985 SimpleTexCoords(FaceCollection &coll, int texture) : coll(coll), texture(texture) { }
4986 void SetTexture(int tex) { texture=tex; }
4987 int Texture(int face) const { return texture; }
4988 Point2d TexCoord(int face, int point) const
4989 {
4990 int count = coll.NumPoints(face);
4991 float angle = 45.0 /*/2.0*/+point*360.0/count;
4992 Point2d d;
4993 d.x = 0.5+0.5* cos(angle*3.14159*2.0/360.0);
4994 d.y = 0.5+0.5* sin(angle*3.14159*2.0/360.0);
4995 return d;
4996 }
4997private:
4998 FaceCollection &coll;
4999 int texture;
5000};
5002
5004{
5005public:
5006 SpaceTexCoords(FaceCollection &coll, int texture, Point p, Vector x, Vector y) : coll(coll), texture(texture), p(p), x(x), y(y) { }
5007 int Texture(int face) const { return texture; }
5008 Point2d TexCoord(int face, int point) const
5009 {
5010 Point c = coll.FacePoint(face, point);
5011 Vector v = c-p;
5012 float d1 = Vector::DotProduct(v, x);
5013 float d2 = Vector::DotProduct(v, y);
5014 //d1/= v.Dist();
5015 d1/= x.Dist();
5016 d1/= x.Dist();
5017 //d2/= v.Dist();
5018 d2/= y.Dist();
5019 d2/= y.Dist();
5020 Point2d res;
5021 res.x = d1;
5022 res.y = d2;
5023 return res;
5024 }
5025private:
5026 FaceCollection &coll;
5027 int texture;
5028 Point p;
5029 Vector x,y;
5030};
5031
5032
5034{
5035public:
5037 virtual int NumElements() const = 0;
5038 virtual void SetElemId(int id)=0;
5039};
5040
5042{
5043public:
5044 template<class It>
5045 ColorElement(It beg, It end, ElementCollection &ec) : cont(beg, end), ec(ec) { }
5046
5047 int NumElements() const { return ec.NumElements(); }
5048 void SetElemId(int id);
5049private:
5050 std::vector<Color2> cont;
5052};
5053class Portal
5054{
5055public:
5056 virtual ~Portal(){ }
5057 virtual Matrix PortalMatrix() const=0;
5058 virtual float Width() const=0;
5059 virtual float Height() const=0;
5060};
5061
5062
5063/*
5064class Room
5065{
5066public:
5067 virtual ~Room() { }
5068 virtual Matrix RoomMatrix() const=0;
5069};
5070*/
5071
5072class Waveform : public Function<float, float>
5073{
5074public:
5075 virtual ~Waveform() { }
5076 virtual void HandleEvent(MainLoopEvent &event) { }
5077 virtual bool Update(MainLoopEnv &e) { return false; }
5078 virtual float Length() const=0;
5079 virtual float Min() const = 0;
5080 virtual float Max() const = 0;
5081 virtual float Index(float val) const = 0;
5082};
5083
5085{
5086public:
5087 FreqChangeWaveform(Waveform *wv, float old_freq, float new_freq) : wv(wv), old_freq(old_freq), new_freq(new_freq) { }
5088 virtual float Length() const { return wv->Length()/old_freq*new_freq; }
5089 virtual float Min() const { return wv->Min(); }
5090 virtual float Max() const { return wv->Max(); }
5091 virtual float Index(float val) const
5092 {
5093 return wv->Index(val/old_freq*new_freq);
5094 }
5095
5096private:
5097 Waveform *wv;
5098 float old_freq, new_freq;
5099};
5101{
5102public:
5103 VolumeRampWaveform(Waveform *orig, float old_y_value, float x_pos1, float x_pos2, float y_pos1, float y_pos2) : orig(orig), old_y(old_y_value), x_pos1(x_pos1), x_pos2(x_pos2), y_pos1(y_pos1), y_pos2(y_pos2) { }
5104 virtual float Length() const { return orig->Length(); }
5105 virtual float Min() const { return orig->Min(); }
5106 virtual float Max() const { return orig->Max(); }
5107 virtual float Index(float val) const
5108 {
5109 float val2 = orig->Index(val);
5110 if (val>=x_pos1 && val<x_pos2)
5111 {
5112 val2/=old_y;
5113 float pos = val-x_pos1;
5114 pos/=x_pos2-x_pos1;
5115 // pos \in [0..1]
5116 pos*=y_pos2-y_pos1;
5117 val2*=y_pos1;
5118 val2+=pos;
5119 }
5120 return val2;
5121 }
5122
5123private:
5124 Waveform *orig;
5125 float old_y;
5126 float x_pos1;
5127 float x_pos2;
5128 float y_pos1;
5129 float y_pos2;
5130};
5131
5132class MixWaveform : public Waveform
5133{
5134public:
5135 MixWaveform(Waveform *orig, float pos, Waveform *sample) : orig(orig), pos(pos), sample(sample) { }
5136 virtual float Length() const
5137 {
5138 return std::max(orig->Length(), pos+sample->Length());
5139 }
5140 virtual float Min() const
5141 {
5142 return std::min(orig->Min(), sample->Min());
5143 }
5144 virtual float Max() const
5145 {
5146 return std::max(orig->Max(), sample->Max());
5147 }
5148 virtual float Index(float val) const
5149 {
5150 if (val < pos) { return orig->Index(val); }
5151 if (val>orig->Length() && val<pos+sample->Length()) { return sample->Index(val-pos); }
5152 if (val>=pos && val<pos+sample->Length()) { return orig->Index(val)+sample->Index(val-pos); }
5153 return orig->Index(val);
5154 }
5155private:
5156 Waveform *orig;
5157 float pos;
5158 Waveform *sample;
5159};
5161{
5162public:
5163 ZeroWaveform(float length_x, float min_y, float max_y) : length(length_x), min(min_y), max(max_y) { }
5164 float Length() const { return length; }
5165 float Min() const { return min; }
5166 float Max() const { return max; }
5167 float Index(float val) const { return 0.0; }
5168private:
5169 float length, min, max;
5170};
5171
5173{
5174public:
5175 virtual float Delta(float x) const=0;
5176 virtual ~WaveformPart() { }
5177};
5178#if 0
5179class ConstantWaveformPart : public WaveformPart
5180{
5181public:
5182 ConstantWaveformPart(float start_x, float end_x, float value) : start_x(start_x), end_x(end_x), value(value) { }
5183 float Delta(float x) const
5184 {
5185 if (x < start_x) return 0.0;
5186 if (x >= end_x) return 0.0;
5187 return value;
5188 }
5189private:
5190 float start_x, end_x, value;
5191};
5192#endif
5193
5195{
5196public:
5197 LinWaveformPart(float start_x, float end_x, float delta_y) : start_x(start_x), end_x(end_x), delta_y(delta_y) { }
5198 float Delta(float x) const
5199 {
5200 if (x < start_x) return 0.0;
5201 if (x > end_x) return delta_y;
5202 return (x-start_x)/(end_x-start_x)*delta_y;
5203 }
5204private:
5205 float start_x, end_x, delta_y;
5206};
5207
5208class ArrayWaveform : public Array<int, WaveformPart*>, private WaveformPart
5209{
5210public:
5211 ArrayWaveform(float *array, int size, float samplelength) : array(array), size(size), samplelength(samplelength) { }
5212 int Size() const { return size; }
5213 WaveformPart *Index(int i) const
5214 {
5215#if 0
5216 delete part;
5217 part = new ConstantWaveformPart(samplelength*i, samplelength*(i+1), array[i]);
5218 return part;
5219#endif
5220 return 0;
5221 }
5222
5223private:
5224 float *array;
5225 int size;
5226 float samplelength;
5227 //mutable ConstantWaveformPart *part;
5228};
5230{
5231public:
5232 ArrayWaveform2(float *array, int size, float samplelength, float m_min, float m_max) : array(array), size(size), samplelength(samplelength), m_min(m_min), m_max(m_max) { }
5233 virtual float Length() const { return size*samplelength; }
5234 virtual float Min() const { return m_min; }
5235 virtual float Max() const { return m_max; }
5236 virtual float Index(float val) const
5237 {
5238 val /= samplelength;
5239 int val2 = val;
5240 if (val >= 0 && val < size)
5241 {
5242 return array[val2];
5243 }
5244 else
5245 {
5246 return 0.0;
5247 }
5248 }
5249
5250private:
5251 float *array;
5252 int size;
5253 float samplelength;
5254 float m_min, m_max;
5255};
5256
5257
5259{
5260public:
5261 PartWaveform(Waveform &base, Array<int, WaveformPart*> &arr) : base(base), arr(arr) { }
5262 float Length() const { return base.Length(); }
5263 float Min() const { return base.Min(); }
5264 float Max() const { return base.Max(); }
5265 float Index(float val) const
5266 {
5267 float val2 = base.Index(val);
5268 int size = arr.Size();
5269 for(int i=0;i<size;i++)
5270 {
5271 val+=arr.Index(i)->Delta(val2);
5272 }
5273 return val;
5274 }
5275private:
5276 Waveform &base;
5278};
5279
5281{
5282public:
5283 float Length() const { return 1.0; }
5284 float Min() const { return 0.0; }
5285 float Max() const { return 1.0; }
5286 float Index(float val) const { return val; }
5287};
5288
5290{
5291public:
5292 SampleWaveform(Waveform &wave, int count) : wave(wave), count(count) { }
5293 int Size() const { return count; }
5294 float Index(int i) const
5295 {
5296 return wave.Index(Sample(i));
5297 }
5298 float Sample(int i) const
5299 {
5300 return float(i)*wave.Length()/float(count);
5301 }
5302private:
5303 Waveform &wave;
5304 int count;
5305};
5307
5308
5310{
5311public:
5312 FloatArrayToPointCollection2d(FloatArray &array, Point2d p, Vector2d v_x, Vector2d v_y) : array(array), p(p), v_x(v_x), v_y(v_y) { }
5313 int Size() const { return array.Size(); }
5314 Point2d Index(int i) const
5315 {
5316 Point2d pp;
5317 pp.x = p.x + v_x.dx*i/Size() + v_y.dx*array.Index(i);
5318 pp.y = p.y + v_x.dy*i/Size() + v_y.dy*array.Index(i);
5319 return pp;
5320 }
5321private:
5322 FloatArray &array;
5323 Point2d p;
5324 Vector2d v_x, v_y;
5325};
5326
5327
5328class WaveformArray : public Array<int, Waveform*>
5329{
5330};
5331class WaveformCurve : public Curve<Waveform*>
5332{
5333};
5334
5335class WaveformFunction : public Array2<float, float, float>
5336{
5337public:
5338 WaveformFunction(WaveformCurve &curve) : curve(curve) { }
5339 float Index(float x, float y) const
5340 {
5341 Waveform *wave = curve.Index(x);
5342 float val = wave->Index(y);
5343 return val;
5344 }
5345 float SizeX() const { return curve.Size(); }
5346 float SizeY() const { return curve.Index(0.0)->Length(); }
5347private:
5348 WaveformCurve &curve;
5349};
5350
5351
5353{
5354public:
5355 HeightMapSurface(Array2<float, float, float> &array, Point p, UnitVectors u) : array(array), p(p), u(u) { }
5356 virtual Point Index(float x, float y) const
5357 {
5358 float val = array.Index(x,y);
5359 return p + x*u.u_x/array.SizeX() + y*u.u_y/array.SizeY() + val*u.u_z;
5360 }
5361 virtual Point2d Texture(float x, float y) const { Point2d p; p.x=x; p.y=y; return p; }
5362 virtual float Attrib(float x, float y, int id) const { return 0.0; }
5363 virtual int AttribI(float x, float y, int id) const { return 0; }
5364 virtual Vector Normal(float xx, float yy) const
5365 {
5366 Point p = Index(xx,yy);
5367 Point p2 = Index(xx+0.01,yy);
5368 Point p3 = Index(xx,yy+0.01);
5369 return -Vector::CrossProduct(p2-p, p3-p);
5370 }
5371 virtual float XSize() const { return array.SizeX(); }
5372 virtual float YSize() const { return array.SizeY(); }
5373private:
5375 Point p;
5376 UnitVectors u;
5377};
5378
5380{
5381public:
5382 RepeatWaveform(Waveform &w, int times) : w(w), times(times) { }
5383 float Length() const { return w.Length()*times; }
5384 float Min() const { return w.Min(); }
5385 float Max() const { return w.Max(); }
5386 float Index(float val) const
5387 {
5388 while(val>=w.Length()) val-=w.Length();
5389 return w.Index(val);
5390 }
5391
5392private:
5393 Waveform &w;
5394 int times;
5395};
5397
5398class SinWaveform : public Waveform
5399{
5400public:
5401 SinWaveform(float length, float freq) : length(length), freq(freq) { }
5402 float Length() const { return length; }
5403 float Min() const { return -1.0; }
5404 float Max() const { return 1.0; }
5405 float Index(float val) const { return sinf(freq*val); }
5406private:
5407 float length;
5408 float freq;
5409};
5411
5412class FitWaveform : public Waveform
5413{
5414public:
5415 FitWaveform(Waveform &v, float x, float ymin, float ymax)
5416 : x(x), ymin(ymin), ymax(ymax), v(v)
5417 {
5418 }
5419 float Min() const { return ymin; }
5420 float Max() const { return ymax; }
5421 float Length() const { return x; }
5422 float Index(float xx) const { return (v.Index(xx/x*v.Length())-v.Min())/(v.Max()-v.Min())*(ymax-ymin)+ymin; }
5423public:
5424 float x,ymin,ymax;
5426};
5428
5430{
5431public:
5432 ConstantWaveform(float val, float length=1000.0) : val(val), length(length) { }
5433 float Min() const { return val; }
5434 float Max() const { return val; }
5435 float Length() const { return length; }
5436 float Index(float xx) const { return val; }
5437private:
5438 float val, length;
5439};
5441
5443{
5444public:
5445 template<class It>
5446 InterpolateWaveform(It beg, It end, float length, float ymin, float ymax) :
5447 length(length), ymin(ymin), ymax(ymax), cont(beg, end)
5448 { }
5449 float Min() const { return ymin; }
5450 float Max() const { return ymax; }
5451 float Length() const { return length; }
5452 float Index(float time) const;
5453private:
5454 float length, ymin, ymax;
5455 std::vector<Point2d> cont;
5456};
5458{
5459public:
5460 SawWaveform() : InterpolateWaveform(array, array+3, 1.0, 0.0, 1.0) { }
5461private:
5462 static Point2d array[3];
5463};
5465
5466class Box
5467{
5468public:
5469 Point BoxPoint(float x, float y, float z) const;
5470
5473};
5474
5475class BoxCollection : public Array<int, Matrix>
5476{
5477public:
5478 virtual ~BoxCollection() { }
5479
5480 int NumBoxes() const { return Size(); }
5481 Matrix BoxIndex(int box) const { return Index(box); }
5482};
5484{
5485public:
5487 int Size() const
5488 {
5489 int size = c2.Size();
5490 return size;
5491 }
5492 Matrix Index(int i) const { return c2.Index(i); }
5493private:
5494 const Array<int,Matrix> &c2;
5495};
5497
5499{
5500public:
5501 FacesToBoxCollection(FaceCollection &coll, float dist) : facepoints(coll), normals(coll), combined(facepoints, normals), advance(dist), ch(combined, advance, advance_elem, func, func_elem, dir_func, dir_func_elem), boxes(ch) { }
5502 int Size() const { return boxes.Size(); }
5503 Matrix Index(int i) const { return boxes.Index(i); }
5504
5505private:
5506 FaceCenterPoints facepoints;
5507 FaceNormals normals;
5509 AdvanceVectorFunction advance;
5513 DirectionFunction dir_func;
5514 ElementFunction<Matrix> dir_func_elem;
5517};
5519
5521{
5522public:
5523 virtual ~ObjectCollection() { }
5524 virtual int NumObjects() const = 0;
5525 virtual int BoxObject(int obj) const=0;
5526};
5528{
5529public:
5530 LinearObjectCollection(int count) : count(count) { }
5531 int NumObjects() const { return count; }
5532 int BoxObject(int obj) const { return obj; }
5533private:
5534 int count;
5535};
5537{
5538public:
5539 ConstantObjectCollection(int count, int object) : count(count), object(object) { }
5540 int NumObjects() const { return count; }
5541 int BoxObject(int /*obj*/) const { return object; }
5542private:
5543 int count;
5544 int object;
5545};
5546
5547class BoxCollectionWithObject : public Array<int, std::pair<Matrix, int> >
5548{
5549public:
5551
5552 int Size() const { return NumBoxes(); }
5553 std::pair<Matrix, int> Index(int box) const { return std::make_pair(BoxIndex(box), BoxObject(box)); }
5554
5555 virtual int NumBoxes() const = 0;
5556 virtual Matrix BoxIndex(int box) const=0;
5557 virtual int BoxObject(int box) const=0;
5558};
5559
5560class ShaderParameterArray : public Array<int, ShaderParameters*>
5561{
5562};
5564{
5565public:
5567 int Size() const { return c2.Size(); }
5568 ShaderParameters* Index(int i) const { return c2.Index(i); }
5569private:
5571};
5572
5574{
5575public:
5577 int Size() const { return std::min(arr.Size(), arr2.Size()); }
5579 {
5580 combine.SetValues(arr.Index(i), arr2.Index(i));
5581 return &combine;
5582 }
5583private:
5584 mutable CombineParameters combine;
5587};
5588
5590{
5591public:
5592 BlobParameterArray(PointCollection &center_points, PointCollection &center2_points, FloatArray &radius) : center_points(center_points), center2_points(center2_points), r(radius) {}
5593 ~BlobParameterArray() { /*delete p;*/ }
5594 int Size() const { return std::min(std::min(center_points.Size(), center2_points.Size()), r.Size()); }
5596 {
5597#if 0
5598 Point center = center_points.Index(i);
5599 Point center2 = center2_points.Index(i);
5600 float rr = r.Index(i);
5601 if (!p) { p = new BlobParameters(center, center2,rr); }
5602 p->set_points(center, center2,rr);
5603 return p;
5604#endif
5605 return 0;
5606 }
5607private:
5608 PointCollection &center_points;
5609 PointCollection &center2_points;
5610 //mutable BlobParameters *p;
5611 FloatArray &r;
5612};
5613
5615{
5619 // to be extended if needed for RenderOpenGlObjects to use new data
5620 friend std::ostream &operator<<(std::ostream &o, const ObjectData &od);
5621};
5622class ObjectDataArray : public Array<int, ObjectData>
5623{
5624public:
5625};
5627{
5628public:
5629 CombineObjectData(BoxCollection &box, ObjectCollection &obj, ShaderParameterArray &params) : box(box), obj(obj), params(params) { }
5630 int Size() const { return std::min(std::min(box.NumBoxes(), obj.NumObjects()), params.Size()); }
5631 ObjectData Index(int i) const
5632 {
5633 Matrix m = box.BoxIndex(i);
5634 int o = obj.BoxObject(i);
5635 ShaderParameters *p = params.Index(i);
5636 ObjectData d;
5637 d.matrix = m;
5638 d.object = o;
5639 d.params = p;
5640 return d;
5641 }
5642private:
5644 ObjectCollection &obj;
5645 ShaderParameterArray &params;
5646};
5647
5649{
5650public:
5651 CombineBoxesAndObjects(BoxCollection &box, ObjectCollection &obj) : box(box), obj(obj) { }
5652 int NumBoxes() const { return std::min(box.NumBoxes(), obj.NumObjects()); }
5653 Matrix BoxIndex(int b) const { return box.BoxIndex(b); }
5654 int BoxObject(int b) const { return obj.BoxObject(b); }
5655
5656private:
5658 ObjectCollection &obj;
5659};
5660
5662{
5663public:
5665 virtual int Size() const { return p.NumPoints(); }
5666 virtual Matrix Index(int box) const
5667 {
5668 Point pp = p.Points(box);
5669 return Matrix::Translate(pp.x, pp.y, pp.z);
5670 }
5671private:
5672 PointCollection &p;
5673};
5675
5676class Origo : public BoxCollection
5677{
5678public:
5679 virtual int NumBoxes() { return 1; }
5680 virtual Matrix BoxIndex(int box) { return Matrix::Identity(); }
5681};
5682
5683
5684// morphism A->B
5686{
5687public:
5688 virtual ~PathCollection() { }
5689 virtual float PathLength() const = 0;
5690 virtual int NumPaths(float posinpath) const = 0;
5691 virtual Matrix Index(float posinpath, int path) const = 0;
5692};
5693
5695{
5696public:
5697 virtual bool Visible(float posinpath, int path)=0;
5698};
5699
5700// diagram commutes
5702{
5703public:
5704 EqualPaths(PathCollection &p1, PathCollection &p2) : p1(p1), p2(p2)
5705 {
5706 }
5707 float PathLength() const { return p1.PathLength(); }
5708 int NumPaths(float posinpath) const { return p1.NumPaths(posinpath) + p2.NumPaths(posinpath); }
5709 Matrix Index(float posinpath, int path) const
5710 {
5711 if (path < p1.NumPaths(posinpath))
5712 {
5713 return p1.Index(posinpath, path);
5714 }
5715 else
5716 {
5717 return p2.Index(posinpath, path-p1.NumPaths(posinpath));
5718 }
5719 }
5720private:
5721 PathCollection &p1;
5722 PathCollection &p2;
5723};
5724
5726{
5727public:
5728 BreakPaths(PathCollection &coll, PathVisibility &p) : coll(coll), p(p) { }
5729 float PathLength() const { return coll.PathLength(); }
5730 int NumPaths(float posinpath) const
5731 {
5732 int c=coll.NumPaths(posinpath);
5733 int count = 0;
5734 for(int i=0;i<c;i++)
5735 {
5736 bool b = p.Visible(posinpath, i);
5737 if (b) count++;
5738 }
5739 return count;
5740 }
5741 Matrix Index(float posinpath, int path) const
5742 {
5743 return coll.Index(posinpath, Mapping(posinpath, path));
5744 }
5745 int Mapping(float posinpath, int ii) const
5746 {
5747 int count = 0;
5748 int num = coll.NumPaths(posinpath);
5749 for(int i=0;i<num;i++)
5750 {
5751 bool b = p.Visible(posinpath,i);
5752 if (b)
5753 {
5754 if (count == ii) return i;
5755 count++;
5756 }
5757 }
5758 return 0;
5759 }
5760private:
5761 PathCollection &coll;
5762 PathVisibility &p;
5763};
5764
5766{
5767public:
5768 DiagonalPathCollection(float length, BoxCollection &box) : length(length), box(box) { }
5769 float PathLength() const { return length; }
5770 int NumPaths(float posinpath) const
5771 {
5772 if (posinpath<length/2.0) return box.NumBoxes();
5773 return box.NumBoxes()*2;
5774 }
5775 Matrix Index(float /*posinpath*/, int path) const
5776 {
5777 return box.BoxIndex(path);
5778 }
5779private:
5780 float length;
5782};
5783
5785{
5786public:
5788 BoxCollection *Cod() const { return ChooseTime(path.PathLength()); }
5789 BoxCollection *Dom() const { return ChooseTime(0.0); }
5790 BoxCollection *ChooseTime(float pos) const { timeproj.SetTime(pos); return &timeproj; }
5791 MatrixCurve *ChoosePath(int path) const { pathproj.SetPath(path); return &pathproj; }
5792
5793
5795 {
5796 public:
5797 TimeProjection(PathCollection &path) : time(0.0), path(path) { }
5798 void SetTime(float time_) { time = time_; }
5799 int Size() const { return path.NumPaths(time); }
5800 Matrix Index(int box) const { return path.Index(time, box); }
5801 private:
5802 float time;
5804 };
5806 {
5807 public:
5808 PathProjection(PathCollection &path) : path(path) { }
5809 Matrix Index(float pos) const { return path.Index(pos, pathpos); }
5810 float Size() const { return path.PathLength(); }
5811 void SetPath(int path_) { pathpos=path_; }
5812 private:
5813 int pathpos;
5815 };
5819};
5820
5822{
5823public:
5824 SampleMatrixCurve(const MatrixCurve &curve, int count) : curve(curve), count(count) { }
5825 int Size() const { return count; }
5826 Matrix Index(int box) const
5827 {
5828 float length = curve.Size();
5829 length /= float(count);
5830 length *= float(box);
5831 return curve.Index(length);
5832 }
5833private:
5834 const MatrixCurve &curve;
5835 int count;
5836};
5838
5840{
5841public:
5842 virtual ~Boxable() { }
5843
5844 virtual void SetBox(Matrix b)=0;
5845};
5846
5847
5849{
5850public:
5851 virtual void Add(const FaceCollection &coll)=0;
5852};
5853
5864
5866{
5867 int face;
5869 friend bool operator<(const FaceIndexStruct &i1, const FaceIndexStruct &i2)
5870 {
5871 if (i1.face < i2.face) return true;
5872 if (i1.face > i2.face) return false;
5873 if (i1.point < i2.point) return true;
5874 if (i1.point > i2.point) return false;
5875 return false;
5876 }
5877};
5878
5880{
5881public:
5882 FaceCollectionStore() : facecount(0),texturecount(0), textures(false) { }
5883 virtual std::string name() const { return "FaceCollectionStore"; }
5884 void SetTextures(bool b) { textures = b; }
5886 {
5887 }
5888 void HeavyPrepare() { }
5889
5890 void Prepare() {}
5891
5892 void Add(const FaceCollection &coll)
5893 {
5894 Add(coll, textures);
5895 }
5896 void Add(const FaceCollection &coll, bool textures)
5897 {
5898 int oldtextures = texturecount;
5899 int numtextures = coll.NumTextures();
5900 if (textures)
5901 {
5902 for(int i=0;i<numtextures;i++)
5903 {
5904 const_cast<FaceCollection&>(coll).GenTexture(i);
5905 buffers.push_back(coll.TextureBuf(i));
5906 }
5907 }
5908 int faces = coll.NumFaces();
5909 int oldfaces = facecount;
5910 facecount += faces;
5911 texturecount += coll.NumTextures();
5912 for(int f=0;f<faces;f++)
5913 {
5914 int points = coll.NumPoints(f);
5915 points_vec.push_back(points);
5916 textureselection.push_back(coll.FaceTexture(f)+oldtextures);
5917 for(int p = 0;p<points;p++)
5918 {
5919 FaceIndexStruct fi;
5920 FacePointStruct fp;
5921 fi.face = f + oldfaces;
5922 fi.point = p;
5923 fp.vec_point = coll.FacePoint(f,p);
5924 fp.normal = coll.PointNormal(f,p);
5925 // TODO Attrib & AttribI
5926 fp.color = coll.Color(f,p);
5927 fp.tex_coord = coll.TexCoord(f,p);
5928 map[fi] = fp;
5929 }
5930 }
5931 }
5932
5933
5934 virtual int NumFaces() const { return facecount; }
5935 virtual int NumPoints(int face) const { return points_vec[face]; }
5936 virtual Point FacePoint(int face, int point) const
5937 {
5938 FacePointStruct &fp = find(face,point);
5939 return fp.vec_point;
5940 }
5941 virtual Vector PointNormal(int face, int point) const
5942 {
5943 FacePointStruct &fp = find(face,point);
5944 return fp.normal;
5945 }
5946 virtual float Attrib(int face, int point, int id) const
5947 {
5948 return 0.0;
5949 }
5950 virtual int AttribI(int face, int point, int id) const
5951 {
5952 return 0;
5953 }
5954 virtual unsigned int Color(int face, int point) const
5955 {
5956 FacePointStruct &fp = find(face,point);
5957 return fp.color;
5958 }
5959 virtual Point2d TexCoord(int face, int point) const
5960 {
5961 FacePointStruct &fp = find(face,point);
5962 return fp.tex_coord;
5963 }
5964 int NumTextures() const { return texturecount; }
5965 BufferRef TextureBuf(int num) const { return buffers[num]; }
5966 int FaceTexture(int face) const { return textureselection[face]; }
5967
5968public:
5969 FacePointStruct &find(int face, int point) const
5970 {
5971 FaceIndexStruct ii = { face, point };
5972 FacePointStruct &fp = map[ii];
5973 return fp;
5974 }
5975private:
5976 int facecount;
5977 std::vector<int> points_vec;
5978 int texturecount;
5979 std::vector<BufferRef> buffers;
5980 std::vector<int> textureselection;
5981 mutable std::map<FaceIndexStruct, FacePointStruct> map;
5982 //std::vector<FacePoint> vec;
5983 bool textures;
5984};
5985
5986#if 0
5987class FrameFaceCollection : public SingleForwardBoxableFaceCollection
5988{
5989public:
5990 FrameFaceCollection(BoxableFaceCollection &coll, int frame) : coll(coll), frame(frame) { }
5991 virtual int NumFaces() const { return coll.NumFaces(); }
5992 virtual int NumPoints(int face) const { return coll.NumPoints(face); }
5993 virtual Point FacePoint(int face, int point) const { return coll.FacePoint(face, point); }
5994 virtual Point EndFacePoint(int face, int point) const { return coll.EndFacePoint(face, point); }
5995 virtual Vector PointNormal(int face, int point) const { return coll.PointNormal(face,point); }
5996 virtual float Attrib(int face, int point, int id) const {
5997 if (id==AttrFrame)
5998 {
5999 //std::cout << "AttribI " << face << " " << point << " " << frame << std::endl;
6000 return float(frame)+0.01;
6001 }
6002 return coll.Attrib(face, point, id); }
6003 virtual int AttribI(int face, int point, int id) const
6004 {
6005 if (id==AttrFrame)
6006 {
6007 //std::cout << "AttribI " << face << " " << point << " " << frame << std::endl;
6008 return frame;
6009 }
6010 return coll.AttribI(face, point, id);
6011 }
6012 virtual unsigned int Color(int face, int point) const { return coll.Color(face,point); }
6013 virtual Point2d TexCoord(int face, int point) const { return coll.TexCoord(face,point); }
6014 virtual bool Inside(Point p) const { return false; }
6015 virtual void SetBox(Matrix b) { }
6016private:
6017 const BoxableFaceCollection &coll;
6018 int frame;
6019};
6020#endif
6021
6023{
6024public:
6026 virtual std::string name() const { return "BoxableFaceCollectionConvert"; }
6027
6029 {
6030 coll.Collect(vis);
6031 }
6032 void HeavyPrepare() { }
6033
6034 virtual void Prepare() { coll.Prepare(); }
6035 virtual int NumFaces() const { return coll.NumFaces(); }
6036 virtual int NumPoints(int face) const { return coll.NumPoints(face); }
6037 virtual Point FacePoint(int face, int point) const { return coll.FacePoint(face, point); }
6038 virtual Point EndFacePoint(int face, int point) const { return coll.EndFacePoint(face, point); }
6039 virtual Vector PointNormal(int face, int point) const { return coll.PointNormal(face,point); }
6040 virtual float Attrib(int face, int point, int id) const { return coll.Attrib(face, point, id); }
6041 virtual int AttribI(int face, int point, int id) const { return coll.AttribI(face, point, id); }
6042 virtual unsigned int Color(int face, int point) const { return coll.Color(face,point); }
6043 virtual Point2d TexCoord(int face, int point) const { return coll.TexCoord(face,point); }
6044 virtual float TexCoord3(int face, int point) const { return coll.TexCoord3(face,point); }
6045 virtual bool Inside(Point p) const { return false; }
6046 virtual void SetBox(Matrix b) { }
6047
6048private:
6049 FaceCollection &coll;
6050};
6051
6052#if 0
6053class FrameFaceCollectionArray : public FaceCollectionArray
6054{
6055public:
6056 FrameFaceCollectionArray(FaceCollectionArray &arr) : arr(arr), frames(0), convert(0) { }
6057 int Size() const { return arr.Size(); }
6058 const FaceCollection *Index(int i) const
6059 {
6060 delete frames;
6061 delete convert;
6062 convert = new BoxableFaceCollectionConvert(*arr.Index(i));
6063 frames = new FrameFaceCollection(*convert, i);
6064 return frames;
6065 }
6066private:
6067 FaceCollectionArray &arr;
6068 mutable FrameFaceCollection *frames;
6069 mutable BoxableFaceCollectionConvert *convert;
6070};
6071#endif
6073{
6074public:
6075 virtual std::string name() const { return "EmptyBoxableFaceCollection"; }
6076
6077 void SetBox(Matrix b) { }
6078 void Prepare() { }
6079 virtual int NumFaces() const { return 0; }
6080 virtual int NumPoints(int face) const { return 0; }
6081 virtual Point FacePoint(int face, int point) const { return Point(0.0,0.0,0.0); }
6082 virtual Vector PointNormal(int face, int point) const { return Vector(0.0,0.0,0.0); }
6083 virtual unsigned int Color(int face, int point) const
6084 {
6085 std::cout << "EmptyBoxableFaceCollection::0" << std::endl;
6086 return 0;
6087 }
6088 virtual Point2d TexCoord(int face, int point) const
6089 {
6090 std::cout << "EmptyBoxableFaceCollection::1" << std::endl;
6091 Point2d p;
6092 p.x = 0;
6093 p.y = 0;
6094 return p;
6095 }
6096 virtual float Attrib(int face, int point, int id) const { return 0.0; }
6097 virtual int AttribI(int face, int point, int id) const { return 0; }
6098 virtual int NumObjects() const { return 1; }
6099 virtual std::pair<int,int> GetObject(int o) const {
6100 return std::make_pair(0,NumFaces()); }
6101
6102 bool HasBatchMap() const {
6103 return true;
6104 }
6105 virtual FaceBufferRef BatchMap(int start_face, int end_face) const
6106 {
6107 FaceBufferRef r;
6108 r.numfaces = 0;
6109 r.numvertices = 0;
6110 r.indices_char = new unsigned char[1];
6111 r.indices_short = new unsigned short[1];
6112 r.indices_int = new unsigned int[1];
6113 r.facepoint = new Point[1];
6114 r.facepoint2 = new Point[1];
6115 r.pointnormal = new Vector[1];
6116 r.color = new unsigned int[1];
6117 r.texcoords = new Point[1];
6118 r.joints = new VEC4[1];
6119 r.weights = new VEC4[1];
6120 return r;
6121 }
6122};
6123
6124void AttachBoxes(const BoxCollection &c, const std::vector<Boxable*> &v);
6125
6127{
6128public:
6129 virtual BoxableFaceCollection *Select(int index)=0;
6130};
6131
6133{
6134public:
6137 {
6138 return face;
6139 }
6140private:
6142};
6143
6145{
6146public:
6147 BoxedElem(BoxCollection &coll, BoxableFaceCollection &item) : coll(coll), sel(cont), cont(&item) { }
6148 BoxedElem(BoxCollection &coll, ObjectSelection &sel) : coll(coll), sel(sel), cont(0) { }
6149 void Prepare() { }
6151 {
6152 /*
6153 for(int i=0;i<coll.NumBoxes();i++)
6154 {
6155 BoxableFaceCollection *face = sel.Select(i);
6156 face->SetBox(m);
6157 }
6158 */
6159 }
6160 int NumFaces() const
6161 {
6162 int count=0;
6163 for(int i=0;i<coll.NumBoxes();i++)
6164 {
6165 FaceCollection *face = sel.Select(i);
6166 count += face->NumFaces();
6167 }
6168 return count;
6169 }
6171 {
6173 int face;
6174 };
6175 FaceObject FindFace(int face) const
6176 {
6177 int count=0;
6178 for(int i=0;i<coll.NumBoxes();i++)
6179 {
6180 FaceCollection *fc = sel.Select(i);
6181 int prevcount = count;
6182 count += fc->NumFaces();
6183 if (count > face)
6184 {
6185 FaceObject o;
6186 o.object = i;
6187 o.face = face - prevcount;
6188 return o;
6189 }
6190 }
6191 FaceObject o;
6192 o.object = 0;
6193 o.face = 0;
6194 return o;
6195 }
6196 int NumPoints(int face) const
6197 {
6198 FaceObject o = FindFace(face);
6199 FaceCollection *fc = sel.Select(o.object);
6200 return fc->NumPoints(o.face);
6201 }
6202 Point FacePoint(int face, int point) const
6203 {
6204 FaceObject o = FindFace(face);
6205 FaceCollection *fc = sel.Select(o.object);
6206 return fc->FacePoint(o.face, point)*coll.BoxIndex(o.object);
6207 }
6208 unsigned int Color(int face, int point) const
6209 {
6210 FaceObject o = FindFace(face);
6211 FaceCollection *fc = sel.Select(o.object);
6212 return fc->Color(o.face, point);
6213 }
6214 Point2d TexCoord(int face, int point) const
6215 {
6216 FaceObject o = FindFace(face);
6217 FaceCollection *fc = sel.Select(o.object);
6218 return fc->TexCoord(o.face, point);
6219 }
6220
6221 Vector PointNormal(int face, int point) const
6222 {
6223 FaceObject o = FindFace(face);
6224 FaceCollection *fc = sel.Select(o.object);
6225 return fc->PointNormal(o.face, point);
6226 }
6227 float Attrib(int face, int point, int id) const
6228 {
6229 FaceObject o = FindFace(face);
6230 FaceCollection *fc = sel.Select(o.object);
6231 return fc->Attrib(o.face,point,id);
6232 }
6233 int AttribI(int face, int point, int id) const
6234 {
6235 FaceObject o = FindFace(face);
6236 FaceCollection *fc = sel.Select(o.object);
6237 return fc->AttribI(o.face,point,id);
6238 }
6239private:
6240 BoxCollection &coll;
6241 ObjectSelection &sel;
6243};
6245
6246
6248{
6249public:
6250 SampleSurfaceForGrid(const SurfaceIn3d &surf, int x, int y) : surf(surf), x(x), y(y) {}
6251 virtual Point Index(int x1, int y1) const
6252 {
6253 return surf.Index(Sample(x1,x,surf.XSize()),Sample(y1,y,surf.YSize()));
6254 }
6255 virtual Point2d Texture(int x1, int y1) const
6256 {
6257 return surf.Texture(Sample(x1,x,surf.XSize()),Sample(y1,y,surf.YSize()));
6258 }
6259 virtual Vector Normal(int x1, int y1) const
6260 {
6261 return surf.Normal(Sample(x1,x,surf.XSize()),Sample(y1,y,surf.YSize()));
6262 }
6263 virtual unsigned int Color(int x1, int y1) const
6264 {
6265 return surf.Color(Sample(x1,x, surf.XSize()), Sample(y1,y, surf.YSize()));
6266 }
6267 virtual float Attrib(int x1, int y1, int id) const
6268 {
6269 return surf.Attrib(Sample(x1,x,surf.XSize()),Sample(y1,y,surf.YSize()), id);
6270 }
6271 virtual int AttribI(int x1, int y1, int id) const
6272 {
6273 return surf.AttribI(Sample(x1,x,surf.XSize()),Sample(y1,y,surf.YSize()), id);
6274 }
6275
6276 virtual int XSize() const { return x; }
6277 virtual int YSize() const { return y; }
6278
6279 static float Sample(int val, int size, float sizef) { return float(val)*sizef/float(size); }
6280private:
6281 const SurfaceIn3d &surf;
6282 int x;
6283 int y;
6284};
6287
6289{
6290public:
6291 SampleSurfaceIn3d(const SurfaceIn3d &surf, int texture, int x, int y) : surf(surf), texture(texture), x(x), y(y) { }
6292 virtual std::string name() const { return "SampleSurfaceIn3d"; }
6294 //const_cast<SurfaceIn3d&>(surf).Collect(vis);
6295 vis.register_obj(this);
6296 }
6298
6299 void Prepare() {
6301 const_cast<SurfaceIn3d&>(surf).Prepare(); }
6302 virtual int Texture(int face) const { return texture; }
6303 bool has_texcoord() const { return true; }
6304 virtual Point2d TexCoord(int face, int point) const
6305 {
6306 Point2d p = Sample(face, point);
6307 Point2d pp = surf.Texture(p.x, p.y);
6308 return pp;
6309 }
6310
6311 virtual int NumFaces() const { return x*y; }
6312 virtual int NumPoints(int face) const { return 4; }
6313 virtual Point FacePoint(int face, int point) const
6314 {
6315 Point2d p = Sample(face, point);
6316 Point pp = surf.Index(p.x, p.y);
6317 //std::cout << face << " " << point << " " << p.x <<" " << p.y << " " << pp << std::endl;
6318 return pp;
6319 }
6320 virtual Point EndFacePoint(int face, int point) const
6321 {
6322 return FacePoint(face,point);
6323 }
6324 bool has_color() const { return true; }
6325
6326 virtual unsigned int Color(int face, int point) const
6327 {
6328 Point2d p = Sample(face, point);
6329 unsigned int pp = surf.Color(p.x, p.y);
6330 return pp;
6331 }
6332 bool has_normal() const { return true; }
6333 virtual Vector PointNormal(int face, int point) const
6334 {
6335 Point2d p = Sample(face, point);
6336 Vector pp = surf.Normal(p.x, p.y);
6337 return pp;
6338 }
6339 float Attrib(int face, int point, int id) const
6340 {
6341 Point2d p = Sample(face, point);
6342 float pp = surf.Attrib(p.x, p.y, id);
6343 //std::cout << p.x << " " << p.y << " " << id << " " << pp << std::endl;
6344 return pp;
6345 }
6346 int AttribI(int face, int point, int id) const
6347 {
6348 Point2d p = Sample(face, point);
6349 int pp = surf.AttribI(p.x, p.y, id);
6350 //std::cout << p.x << " " << p.y << " " << id << " " << pp << std::endl;
6351 return pp;
6352 }
6353private:
6354 Point2d Sample(int face, int point) const
6355 {
6356 int yindex = face/x;
6357 int ddy = face - yindex*x;
6358 int xindex = ddy;
6359
6360 if (point==1 || point==2) xindex++;
6361 if (point==2 || point==3) yindex++;
6362 //std::cout << face << " " << point << " " << xindex << " " << yindex;
6363 float xlength = surf.XSize();
6364 float ylength = surf.YSize();
6365 xlength /= float(x);
6366 ylength /= float(y);
6367 xlength *= float(xindex);
6368 ylength *= float(yindex);
6369 Point2d p;
6370 p.x = xlength;
6371 p.y = ylength;
6372 //std::cout << ":" << xlength << " " << ylength << std::endl;
6373 return p;
6374 }
6375
6376
6377private:
6378 const SurfaceIn3d &surf;
6379 int texture;
6380 int x,y;
6381};
6383//
6384// Note: SurfaceIn3d methods needs to be called immediately after Index()
6385// is called. Otherwise other Index() calls might confuse state of this.
6386//
6387class QuadsToSurfaces : public Array<int, const SurfaceIn3d*>, private SurfaceIn3d
6388{
6389public:
6390 QuadsToSurfaces(FaceCollection &coll) : coll(coll) { }
6392 {
6393 }
6394 void HeavyPrepare() { }
6395 const SurfaceIn3d* Index(int i) const { last_i = i; return this; }
6396 int Size() const { return coll.NumFaces(); }
6397
6398 virtual Point Index(float x, float y) const { return interpolate2(last_i, x, y); }
6399 virtual Point2d Texture(float x, float y) const { Point2d p; p.x = x; p.y = y; return p; }
6400 virtual unsigned int Color(float x, float y) const
6401 {
6402 unsigned int v1 = coll.Color(last_i, 0);
6403 unsigned int v2 = coll.Color(last_i, 1);
6404 unsigned int v3 = coll.Color(last_i, 2);
6405 unsigned int v4 = coll.Color(last_i, 3);
6406 return interpolate(v1,v2,v3,v4,x,y);
6407 }
6408 virtual int AttribI(float x, float y, int id) const
6409 {
6410 return 0;
6411 }
6412 virtual float Attrib(float x, float y, int id) const
6413 {
6414 if (id==AttrInternalX) return x;
6415 if (id==AttrInternalY) return y;
6416 if (id==AttrInternalNX_X)
6417 {
6418 Point p = Index(x+0.01,y);
6419 return p.x;
6420 }
6421 if (id==AttrInternalNX_Y)
6422 {
6423 Point p = Index(x+0.01,y);
6424 return p.y;
6425 }
6426 if (id==AttrInternalNX_Z)
6427 {
6428 Point p = Index(x+0.01,y);
6429 return p.z;
6430 }
6431 if (id==AttrInternalNY_X)
6432 {
6433 Point p = Index(x,y+0.01);
6434 return p.x;
6435 }
6436 if (id==AttrInternalNY_Y)
6437 {
6438 Point p = Index(x,y+0.01);
6439 return p.y;
6440 }
6441 if (id==AttrInternalNY_Z)
6442 {
6443 Point p = Index(x,y+0.01);
6444 return p.z;
6445 }
6446
6447 return 0.0;
6448 }
6449 virtual Vector Normal(float x, float y) const
6450 {
6451 Vector v1 = coll.PointNormal(last_i, 0);
6452 Vector v2 = coll.PointNormal(last_i, 1);
6453 Vector v3 = coll.PointNormal(last_i, 2);
6454 Vector v4 = coll.PointNormal(last_i, 3);
6455 return interpolate(v1,v2,v3,v4,x,y);
6456 }
6457 virtual float XSize() const { return 1.0; }
6458 virtual float YSize() const { return 1.0; }
6459
6460private:
6461 static Point interpolate(Point p0, Point p1, Point p2, Point p3, float x, float y)
6462 {
6463 Point pp0 = p0 + Vector(p3-p0)*x;
6464 Point pp1 = p1 + Vector(p2-p1)*x;
6465 return y*Vector(pp0) + (1.0-y)*Vector(pp1);
6466 }
6467 Point interpolate2(int face, float x, float y) const
6468 {
6469 Point p0 = coll.FacePoint(face, 0);
6470 Point p1 = coll.FacePoint(face, 1);
6471 Point p2 = coll.FacePoint(face, 2);
6472 Point p3 = coll.FacePoint(face, 3);
6473 return interpolate(p0,p1,p2,p3, x,y);
6474 }
6475 static unsigned int interpolate(unsigned int p0, unsigned int p1, unsigned int p2, unsigned int p3, float x, float y)
6476 {
6477 unsigned int v1 = Color::Interpolate(p0,p1,x);
6478 unsigned int v2 = Color::Interpolate(p3,p2,x);
6479
6480 unsigned int res = Color::Interpolate(v1,v2,y);
6481 return res;
6482 }
6483 static Vector interpolate(Vector p0, Vector p1, Vector p2, Vector p3, float x, float y)
6484 {
6485 Vector v1 = p0*x+p1*(1.0-x);
6486 Vector v2 = p3*x+p2*(1.0-x);
6487
6488 Vector res = v1*y+v2*(1.0-y);
6489 return res;
6490 }
6491
6492
6493private:
6494 mutable int last_i;
6495 FaceCollection &coll;
6496};
6497
6498
6500{
6501public:
6502 SplitQuads(FaceCollection &faces, int x, int y) : ForwardFaceCollection(faces), surf(faces), faces(faces), x(x), y(y) { }
6503 virtual std::string name() const { return "SplitQuads"; }
6504 void Collect(CollectVisitor &vis) { faces.Collect(vis); }
6505 void HeavyPrepare() { }
6506 void Prepare() { faces.Prepare(); }
6507 virtual int NumFaces() const
6508 {
6509 SampleSurfaceIn3d sample(*surf.Index(0), 0, x,y);
6510 return sample.NumFaces()*faces.NumFaces();
6511 }
6512 virtual int NumPoints(int face) const { return 4; }
6513 virtual Point FacePoint(int face, int point) const
6514 {
6515 int face1 = face / faces.NumFaces();
6516 int face2 = face - face1*faces.NumFaces();
6517 const SurfaceIn3d *s = surf.Index(face2);
6518 SampleSurfaceIn3d sample(*s, 0, x, y);
6519 return sample.FacePoint(face1, point);
6520 }
6521
6522 virtual Point EndFacePoint(int face, int point) const
6523 {
6524 int face1 = face / faces.NumFaces();
6525 int face2 = face - face1*faces.NumFaces();
6526 const SurfaceIn3d *s = surf.Index(face2);
6527 SampleSurfaceIn3d sample(*s, 0, x, y);
6528 return sample.EndFacePoint(face1, point);
6529 }
6530
6531
6532 virtual unsigned int Color(int face, int point) const
6533 {
6534 int face1 = face / faces.NumFaces();
6535 int face2 = face - face1*faces.NumFaces();
6536 const SurfaceIn3d *s = surf.Index(face2);
6537 SampleSurfaceIn3d sample(*s, 0, x, y);
6538 return sample.Color(face1, point);
6539 }
6540
6541 virtual Point2d TexCoord(int face, int point) const
6542 {
6543 int face1 = face / faces.NumFaces();
6544 int face2 = face - face1*faces.NumFaces();
6545 const SurfaceIn3d *s = surf.Index(face2);
6546 SampleSurfaceIn3d sample(*s, 0, x, y);
6547 return sample.TexCoord(face1, point);
6548 }
6549 virtual float TexCoord3(int face, int point) const
6550 {
6551 int face1 = face / faces.NumFaces();
6552 int face2 = face - face1*faces.NumFaces();
6553 const SurfaceIn3d *s = surf.Index(face2);
6554 SampleSurfaceIn3d sample(*s, 0, x, y);
6555 return sample.TexCoord3(face1, point);
6556 }
6557
6558
6559 virtual Vector PointNormal(int face, int point) const
6560 {
6561 int face1 = face / faces.NumFaces();
6562 int face2 = face - face1*faces.NumFaces();
6563 const SurfaceIn3d *s = surf.Index(face2);
6564 SampleSurfaceIn3d sample(*s, 0, x, y);
6565 return sample.PointNormal(face1, point);
6566 }
6567 virtual float Attrib(int face, int point, int id) const
6568 {
6569 int face1 = face / faces.NumFaces();
6570 int face2 = face - face1*faces.NumFaces();
6571 const SurfaceIn3d *s = surf.Index(face2);
6572 SampleSurfaceIn3d sample(*s, 0, x, y);
6573 return sample.Attrib(face1, point, id);
6574 }
6575 virtual int AttribI(int face, int point, int id) const
6576 {
6577 int face1 = face / faces.NumFaces();
6578 int face2 = face - face1*faces.NumFaces();
6579 const SurfaceIn3d *s = surf.Index(face2);
6580 SampleSurfaceIn3d sample(*s, 0, x, y);
6581 return sample.AttribI(face1, point, id);
6582 }
6583private:
6584 QuadsToSurfaces surf;
6585 FaceCollection &faces;
6586 int x,y;
6587};
6589
6590
6592{
6593public:
6594 OrElem2(FaceCollection *coll1, FaceCollection *coll2) : coll1(coll1), coll2(coll2),s(0),s1(0),s2(0),oo1(0),oo2(0) { }
6595 virtual std::string name() const { return "OrElem2"; }
6596
6598 {
6599 int s1 = m_p1.size(); for(int i=0;i<s1;i++)
6600 delete [] m_p1[i];
6601 int s2 = m_p2.size(); for(int i=0;i<s2;i++)
6602 delete [] m_p2[i];
6603 int s3 = m_p3.size(); for(int i=0;i<s3;i++)
6604 delete [] m_p3[i];
6605 int s4 = m_p4.size(); for(int i=0;i<s4;i++)
6606 delete [] m_p4[i];
6607 int s5 = m_p5.size(); for(int i=0;i<s5;i++)
6608 delete [] m_p5[i];
6609 int s6 = m_p6.size(); for(int i=0;i<s6;i++)
6610 delete [] m_p6[i];
6611 int s7 = m_p7.size(); for(int i=0;i<s7;i++)
6612 delete [] m_p7[i];
6613 int s8 = m_p8.size(); for(int i=0;i<s8;i++)
6614 delete [] m_p8[i];
6615 int s9 = m_p9.size(); for(int i=0;i<s9;i++)
6616 delete [] m_p9[i];
6617 int s10 = m_p10.size(); for(int i=0;i<s10;i++)
6618 delete [] m_p10[i];
6619 }
6620
6621
6622 BBOX GetBoundingBox(bool &success) const
6623 {
6624 std::vector<FaceCollection*> vec = { coll1, coll2 };
6625 int s = vec.size();
6626 BBOX bb;
6627 bb.start_x=30000.0;
6628 bb.end_x=-30000.0;
6629 bb.start_y=30000.0;
6630 bb.end_y=-30000.0;
6631 bb.start_z=30000.0;
6632 bb.end_z=-30000.0;
6633 success=false;
6634 bool success2 = true;
6635 for(int i=0;i<s;i++) {
6636 BBOX b = vec[i]->GetBoundingBox(success2);
6637 if (success2) {
6638 bb.start_x=std::min(bb.start_x,b.start_x);
6639 bb.start_y=std::min(bb.start_y,b.start_y);
6640 bb.start_z=std::min(bb.start_z,b.start_z);
6641 bb.end_x=std::max(bb.end_x,b.end_x);
6642 bb.end_y=std::max(bb.end_y,b.end_y);
6643 bb.end_z=std::max(bb.end_z,b.end_z);
6644 success=true;
6645 }
6646 }
6647 return bb;
6648 }
6649
6650
6652 {
6653 coll1->Collect(vis);
6654 coll2->Collect(vis);
6655 vis.register_obj(this);
6656 }
6658 s = coll1->NumFaces();
6659 s1 = coll2->NumFaces();
6660 s2 = coll1->NumTextures();
6661 oo1 = coll1->NumObjects();
6662 oo2 = coll2->NumObjects();
6663
6664 }
6665
6666 void Prepare() {
6667 coll1->Prepare();
6668 coll2->Prepare();
6669 s = coll1->NumFaces();
6670 s1 = coll2->NumFaces();
6671 s2 = coll1->NumTextures();
6672 oo1 = coll1->NumObjects();
6673 oo2 = coll2->NumObjects();
6674 }
6675 int get_index(int face) const
6676 {
6677 if (face<s) { return face; }
6678 return face-s;
6679 }
6680 FaceCollection *get_elem(int face) const {
6681 if (face<s) return coll1;
6682 return coll2;
6683 }
6684 int get_index2(int face) const
6685 {
6686 if (face<s2) { return face; }
6687 return face-s2;
6688 }
6689 FaceCollection *get_elem2(int face) const {
6690 if (face<s2) return coll1;
6691 return coll2;
6692 }
6693 virtual int NumObjects() const { return oo1+oo2; }
6694 virtual std::pair<int,int> GetObject(int o) const
6695 {
6696 if (o<oo1) return coll1->GetObject(o);
6697 std::pair<int,int> p = coll2->GetObject(o-oo1);
6698 p.first+=s;
6699 p.second+=s;
6700 return p;
6701 //if (o==0) return std::make_pair(0,s);
6702 //if (o==1) return std::make_pair(s,s+s1);
6703 //return std::make_pair(-1,-1);
6704 }
6705 virtual int NumFaces() const { return s+s1; /*coll1->NumFaces()+coll2->NumFaces();*/ }
6706 virtual int NumPoints(int face) const
6707 {
6708 return get_elem(face)->NumPoints(get_index(face));
6709 }
6710 virtual Point FacePoint(int face, int point) const
6711 {
6712 return get_elem(face)->FacePoint(get_index(face), point);
6713 }
6714 virtual bool has_normal() const
6715 {
6716 return coll1->has_normal()||coll2->has_normal();
6717 }
6718 virtual Vector PointNormal(int face, int point) const
6719 {
6720 return get_elem(face)->PointNormal(get_index(face), point);
6721 }
6722 virtual bool has_attrib() const
6723 {
6724 return coll1->has_attrib()||coll2->has_attrib();
6725 }
6726 virtual float Attrib(int face, int point, int id) const
6727 {
6728 return get_elem(face)->Attrib(get_index(face), point,id);
6729 }
6730 virtual int AttribI(int face, int point, int id) const
6731 {
6732 return get_elem(face)->AttribI(get_index(face), point,id);
6733 }
6734 virtual bool has_color() const
6735 {
6736 return coll1->has_color()||coll2->has_color();
6737 }
6738 virtual unsigned int Color(int face, int point) const
6739 {
6740 return get_elem(face)->Color(get_index(face), point);
6741 }
6742 virtual bool has_texcoord() const
6743 {
6744 return coll1->has_texcoord()||coll2->has_texcoord();
6745 }
6746 virtual Point2d TexCoord(int face, int point) const
6747 {
6748 return get_elem(face)->TexCoord(get_index(face), point);
6749 }
6750 virtual float TexCoord3(int face, int point) const {
6751 return get_elem(face)->TexCoord3(get_index(face), point);
6752
6753 }
6754 virtual bool has_skeleton() const
6755 {
6756 return coll1->has_skeleton()||coll2->has_skeleton();
6757 }
6758 virtual VEC4 Joints(int face, int point) const {
6759 return get_elem(face)->Joints(get_index(face), point);
6760 }
6761 virtual VEC4 Weights(int face, int point) const {
6762 return get_elem(face)->Weights(get_index(face), point);
6763 }
6764
6765
6766 virtual Point EndFacePoint(int face, int point) const {
6767 return get_elem(face)->EndFacePoint(get_index(face), point);
6768 }
6769 virtual Vector EndPointNormal(int face, int point) const {
6770 return get_elem(face)->EndPointNormal(get_index(face), point);
6771 }
6772 virtual float EndAttrib(int face, int point, int id) const {
6773 return get_elem(face)->EndAttrib(get_index(face), point,id);
6774 }
6775 virtual int EndAttribI(int face, int point, int id) const {
6776 return get_elem(face)->EndAttribI(get_index(face), point,id);
6777 }
6778 virtual unsigned int EndColor(int face, int point) const {
6779 return get_elem(face)->EndColor(get_index(face), point);
6780 }
6781 virtual Point2d EndTexCoord(int face, int point) const {
6782 return get_elem(face)->EndTexCoord(get_index(face), point);
6783 }
6784 virtual float EndTexCoord3(int face, int point) const {
6785 return get_elem(face)->EndTexCoord3(get_index(face), point);
6786 }
6787
6788 virtual float Duration() const { return 1.0; }
6789
6790 virtual int NumTextures() const { return coll1->NumTextures() + coll2->NumTextures(); }
6791 virtual void GenTexture(int num) {
6793 }
6794 virtual BufferRef TextureBuf(int num) const {
6796 }
6797 virtual int FaceTexture(int face) const {
6798 return get_elem(face)->FaceTexture(get_index(face));
6799
6800 }
6801
6802
6803 bool HasBatchMap() const {
6804 bool b = true;
6805 std::vector<FaceCollection*> vec = { coll1, coll2 };
6806 int s = vec.size();
6807 for(int i=0;i<s;i++) b&=vec[i]->HasBatchMap();
6808 return b;
6809 }
6810
6811 unsigned char *combine_indices_char(unsigned char *p1, unsigned char *p2, int numfaces1, int numfaces2, int numvertices1, int numvertices2) const
6812 {
6813 if (!p1||!p2) return 0;
6814 //static unsigned char *p=0;
6815 //delete [] m_p1;
6816 unsigned char *p;
6817 m_p1.push_back(p=new unsigned char[numfaces1*3+numfaces2*3]);
6818 std::copy(p1,p1+numfaces1*3,p);
6819 int i = 0;
6820 for(;i<numfaces2;i++)
6821 {
6822 p[(numfaces1+i)*3+0] = numvertices1 + p2[i*3+0];
6823 p[(numfaces1+i)*3+1] = numvertices1 + p2[i*3+1];
6824 p[(numfaces1+i)*3+2] = numvertices1 + p2[i*3+2];
6825 }
6826 return p;
6827 }
6828 unsigned short *combine_indices_short(unsigned short *p1, unsigned short *p2, int numfaces1, int numfaces2, int numvertices1, int numvertices2) const
6829 {
6830 if (!p1||!p2) return 0;
6831 //static unsigned short *p=0;
6832 //delete [] m_p2;
6833 unsigned short *p;
6834 m_p2.push_back(p=new unsigned short[numfaces1*3+numfaces2*3]);
6835 std::copy(p1,p1+numfaces1*3,p);
6836 int i = 0;
6837 for(;i<numfaces2;i++)
6838 {
6839 p[(numfaces1+i)*3+0] = numvertices1 + p2[i*3+0];
6840 p[(numfaces1+i)*3+1] = numvertices1 + p2[i*3+1];
6841 p[(numfaces1+i)*3+2] = numvertices1 + p2[i*3+2];
6842 //p[(numfaces1+i)*3] = numvertices1 + p2[i];
6843 }
6844 return p;
6845 }
6846 unsigned int *combine_indices_int(unsigned int *p1, unsigned int *p2, int numfaces1, int numfaces2, int numvertices1, int numvertices2) const
6847 {
6848 if (!p1||!p2) return 0;
6849 //static unsigned int *p=0;
6850 //delete [] m_p3;
6851 unsigned int *p;
6852 m_p3.push_back(p=new unsigned int[numfaces1*3+numfaces2*3]);
6853 std::copy(p1,p1+numfaces1*3,p);
6854 int i = 0;
6855 for(;i<numfaces2;i++)
6856 {
6857 p[(numfaces1+i)*3+0] = numvertices1 + p2[i*3+0];
6858 p[(numfaces1+i)*3+1] = numvertices1 + p2[i*3+1];
6859 p[(numfaces1+i)*3+2] = numvertices1 + p2[i*3+2];
6860 //p[(numfaces1+i)*3] = numvertices1 + p2[i];
6861 }
6862 return p;
6863 }
6864
6865 Point *combine_pos(Point *p1, Point *p2, int numvertices1, int numvertices2) const
6866 {
6867 if (!p1||!p2) return 0;
6868 //static Point *p=0;
6869 //delete [] m_p4;
6870 Point *p;
6871 m_p4.push_back(p=new Point[numvertices1+numvertices2]);
6872 std::copy(p1,p1+numvertices1,p);
6873 std::copy(p2,p2+numvertices2,p+numvertices1);
6874 return p;
6875 }
6876 Point *combine_pos2(Point *p1, Point *p2, int numvertices1, int numvertices2) const
6877 {
6878 if (!p1||!p2) return 0;
6879 //static Point *p=0;
6880 //delete [] m_p5;
6881 Point *p;
6882 m_p5.push_back(p=new Point[numvertices1+numvertices2]);
6883 std::copy(p1,p1+numvertices1,p);
6884 std::copy(p2,p2+numvertices2,p+numvertices1);
6885 return p;
6886 }
6887 Vector *combine_normal(Vector *p1, Vector *p2, int numvertices1, int numvertices2) const
6888 {
6889 if (!p1||!p2) return 0;
6890 //static Vector *p=0;
6891 //delete [] m_p6;
6892 Vector *p;
6893 m_p6.push_back(p=new Vector[numvertices1+numvertices2]);
6894 std::copy(p1,p1+numvertices1,p);
6895 std::copy(p2,p2+numvertices2,p+numvertices1);
6896 return p;
6897 }
6898 unsigned int *combine_color(unsigned int *p1, unsigned int *p2, int numvertices1, int numvertices2) const
6899 {
6900 if (!p1||!p2) return 0;
6901 //static unsigned int *p=0;
6902 //delete [] m_p7;
6903 unsigned int *p;
6904 m_p7.push_back(p=new unsigned int[numvertices1+numvertices2]);
6905 std::copy(p1,p1+numvertices1,p);
6906 std::copy(p2,p2+numvertices2,p+numvertices1);
6907 return p;
6908 }
6909 Point *combine_texcoord(Point *p1, Point *p2, int numvertices1, int numvertices2) const
6910 {
6911 if (!p1||!p2) return 0;
6912 //static Point *p=0;
6913 //delete [] m_p8;
6914 Point *p;
6915 m_p8.push_back(p=new Point[numvertices1+numvertices2]);
6916 std::copy(p1,p1+numvertices1,p);
6917 std::copy(p2,p2+numvertices2,p+numvertices1);
6918 return p;
6919 }
6920 VEC4 *combine_joints(VEC4 *p1, VEC4 *p2, int numvertices1, int numvertices2) const
6921 {
6922 if (!p1||!p2) return 0;
6923 //static VEC4 *p=0;
6924 //delete [] m_p9;
6925 VEC4 *p;
6926 m_p9.push_back(p=new VEC4[numvertices1+numvertices2]);
6927 std::copy(p1,p1+numvertices1,p);
6928 std::copy(p2,p2+numvertices2,p+numvertices1);
6929 return p;
6930 }
6931 VEC4 *combine_weights(VEC4 *p1, VEC4 *p2, int numvertices1, int numvertices2) const
6932 {
6933 if (!p1||!p2) return 0;
6934 //static VEC4 *p=0;
6935 //delete [] m_p10;
6936 VEC4 *p;
6937 m_p10.push_back(p=new VEC4[numvertices1+numvertices2]);
6938 std::copy(p1,p1+numvertices1,p);
6939 std::copy(p2,p2+numvertices2,p+numvertices1);
6940 return p;
6941 }
6942 template<class T>
6943 void swap2( T**ptr, T*val) const
6944 {
6945 //delete [] (*ptr);
6946 (*ptr)=val;
6947 }
6948
6949 FaceBufferRef BatchMap(int start_x, int end_x) const
6950 {
6951 std::vector<FaceCollection*> vec = { coll1, coll2 };
6952 if (vec.size()==0) { FaceBufferRef r; r.numfaces=0; return r; }
6953 std::vector<FaceBufferRef> vec2;
6954 int s = vec.size();
6955 int num = 0;
6956 for(int i=0;i<s;i++)
6957 {
6958 if (start_x>=0 && end_x>=0) {
6959 FaceBufferRef r = vec[i]->BatchMap(start_x,end_x);
6960 start_x-=r.numfaces;
6961 end_x-=r.numfaces;
6962 num+=r.numfaces;
6963 vec2.push_back(r);
6964 } else if (start_x<0 && end_x>=0)
6965 {
6966 FaceBufferRef r = vec[i]->BatchMap(0,end_x);
6967 start_x-=r.numfaces;
6968 end_x-=r.numfaces;
6969 num+=r.numfaces;
6970 vec2.push_back(r);
6971 }
6972 }
6973 static FaceBufferRef result;
6974 result = vec2[0];
6975 int s2 = vec2.size();
6976 for(int i=1;i<s2;i++)
6977 {
6978 swap2(&result.facepoint,combine_pos(result.facepoint,vec2[i].facepoint,result.numvertices,vec2[i].numvertices));
6979 swap2(&result.facepoint2,combine_pos2(result.facepoint2,vec2[i].facepoint2,result.numvertices,vec2[i].numvertices));
6980 swap2(&result.pointnormal, combine_normal(result.pointnormal,vec2[i].pointnormal,result.numvertices,vec2[i].numvertices));
6981 swap2(&result.color,combine_color(result.color,vec2[i].color,result.numvertices,vec2[i].numvertices));
6982 swap2(&result.texcoords, combine_texcoord(result.texcoords,vec2[i].texcoords,result.numvertices,vec2[i].numvertices));
6983 swap2(&result.joints,combine_joints(result.joints,vec2[i].joints,result.numvertices,vec2[i].numvertices));
6984 swap2(&result.weights,combine_weights(result.weights,vec2[i].weights,result.numvertices,vec2[i].numvertices));
6985
6986 result.indices_int = combine_indices_int(result.indices_int, vec2[i].indices_int, result.numfaces, vec2[i].numfaces, result.numvertices, vec2[i].numvertices);
6987 result.indices_short = combine_indices_short(result.indices_short, vec2[i].indices_short, result.numfaces, vec2[i].numfaces, result.numvertices, vec2[i].numvertices);
6988 result.indices_char = combine_indices_char(result.indices_char, vec2[i].indices_char, result.numfaces, vec2[i].numfaces, result.numvertices, vec2[i].numvertices);
6989
6990 result.numfaces += vec2[i].numfaces;
6991 result.numvertices += vec2[i].numvertices;
6992 }
6993 //print("POINTNORMAL", result.pointnormal);
6994 return result;
6995 }
6996
6997
6998private:
6999 FaceCollection *coll1;
7000 FaceCollection *coll2;
7001 int s;
7002 int s1;
7003 int s2;
7004 int oo1;
7005 int oo2;
7006 mutable std::vector<unsigned char *> m_p1;
7007 mutable std::vector<unsigned short *> m_p2;
7008 mutable std::vector<unsigned int *> m_p3;
7009 mutable std::vector<Point *> m_p4;
7010 mutable std::vector<Point *> m_p5;
7011 mutable std::vector<Vector *> m_p6;
7012 mutable std::vector<unsigned int *> m_p7;
7013 mutable std::vector<Point *> m_p8;
7014 mutable std::vector<VEC4 *> m_p9;
7015 mutable std::vector<VEC4 *> m_p10;
7016
7017};
7018
7019template<class T>
7020class OrElem : public T /*BoxableFaceCollection*/
7021{
7022public:
7023 OrElem() : vec() { }
7024 template<class It>
7025 OrElem(It beg, It end) : vec(beg, end) { }
7026 OrElem(T *o1, T *o2, T *o3, T *o4)
7027 {
7028 vec.push_back(o1);
7029 vec.push_back(o2);
7030 vec.push_back(o3);
7031 vec.push_back(o4);
7032 }
7033
7034
7035 virtual std::string name() const { return "OrElem"; }
7036
7038 {
7039 int count = 0;
7040 int sum = 0;
7041 int f = 0;
7042 int k = 0;
7043 int s = NumFaces();
7044 if (s<=0||s>100000000) return; // there was limit of 200000 here, but it was removed. (the limit is needed because NumFaces() can give trash values if prepare has not been called)
7045 //if (faces_cache.size()>0) return; // optimization, don't do it several times
7046 faces_cache.clear();
7047 faces_num.clear();
7048
7049 faces_cache.reserve(s);
7050 faces_num.reserve(s);
7051 //int faces = NumFaces();
7052 for(typename std::vector<T /*BoxableFaceCollection*/ *>::const_iterator i=vec.begin();i!=vec.end();i++,k++)
7053 {
7054 int oldsum = sum;
7055 count = (*i)->NumFaces();
7056 sum += count;
7057 for(int i=0;i<count;i++)
7058 {
7059 if (f%1000==0) {
7060 //std::cout << "faces: " << f << "/" << faces << std::endl;
7061 }
7062
7063 faces_cache.push_back(f-oldsum);
7064 faces_num.push_back(k);
7065 f++;
7066 }
7067 }
7068 }
7069 void push_back(T *ptr)
7070 {
7071 vec.push_back(ptr);
7072 }
7073 bool Inside(Point p) const
7074 {
7075 bool b = false;
7076 for(typename std::vector<T*>::const_iterator i=vec.begin();i!=vec.end();i++)
7077 b |= (*i)->Inside(p);
7078 return b;
7079 }
7081 {
7082 }
7084 {
7085 for(typename std::vector<T /*BoxableFaceCollection*/ *>::const_iterator i=vec.begin();i!=vec.end();i++)
7086 (*i)->Collect(vis);
7087 vis.register_obj(this);
7088 }
7090 {
7092 }
7093 void Prepare() {
7094 for(typename std::vector<T /*BoxableFaceCollection*/ *>::const_iterator i=vec.begin();i!=vec.end();i++)
7095 (*i)->Prepare();
7097 }
7098 virtual int NumObjects() const { return vec.size(); }
7099 virtual bool has_skeleton() const {
7100 int s = vec.size();
7101 bool sk = false;
7102 for(int i=0;i<s;i++) {
7103 sk |= vec[i]->has_skeleton();
7104 }
7105 return sk;
7106
7107 }
7108
7109 virtual bool has_texcoord() const {
7110 int s = vec.size();
7111 bool sk = false;
7112 for(int i=0;i<s;i++) {
7113 sk |= vec[i]->has_texcoord();
7114 }
7115 return sk;
7116
7117 }
7118 virtual bool has_color() const {
7119 int s = vec.size();
7120 bool sk = false;
7121 for(int i=0;i<s;i++) {
7122 sk |= vec[i]->has_color();
7123 }
7124 return sk;
7125 }
7126
7127 virtual bool has_attrib() const {
7128 int s = vec.size();
7129 bool sk = false;
7130 for(int i=0;i<s;i++) {
7131 sk |= vec[i]->has_attrib();
7132 }
7133 return sk;
7134 }
7135
7136 virtual bool has_normal() const {
7137 int s = vec.size();
7138 bool sk = false;
7139 for(int i=0;i<s;i++) {
7140 sk |= vec[i]->has_normal();
7141 }
7142 return sk;
7143
7144 }
7145
7146
7147 BBOX GetBoundingBox(bool &success) const
7148 {
7149 int s = vec.size();
7150 BBOX bb;
7151 bb.start_x=30000.0;
7152 bb.end_x=-30000.0;
7153 bb.start_y=30000.0;
7154 bb.end_y=-30000.0;
7155 bb.start_z=30000.0;
7156 bb.end_z=-30000.0;
7157 success=false;
7158 bool success2 = true;
7159 for(int i=0;i<s;i++) {
7160 BBOX b = vec[i]->GetBoundingBox(success2);
7161 if (success2) {
7162 bb.start_x=std::min(bb.start_x,b.start_x);
7163 bb.start_y=std::min(bb.start_y,b.start_y);
7164 bb.start_z=std::min(bb.start_z,b.start_z);
7165 bb.end_x=std::max(bb.end_x,b.end_x);
7166 bb.end_y=std::max(bb.end_y,b.end_y);
7167 bb.end_z=std::max(bb.end_z,b.end_z);
7168 success=true;
7169 }
7170 }
7171 return bb;
7172 }
7173
7174
7175
7176 virtual std::pair<int,int> GetObject(int o) const
7177 {
7178 int s = vec.size();
7179 if (o>=s) return std::make_pair(-1,-1);
7180 int count = 0;
7181 for(int i=0;i<o;i++) {
7182 count+=vec[i]->NumFaces();
7183 }
7184 return std::make_pair(count,count+vec[o]->NumFaces());
7185 }
7186 virtual int NumFaces() const
7187 {
7188 if (faces_num.size()==0) {
7189 int count = 0;
7190 for(typename std::vector<T /*BoxableFaceCollection*/ *>::const_iterator i=vec.begin();i!=vec.end();i++)
7191 count += (*i)->NumFaces();
7192 return count;
7193 } else
7194 {
7195 return faces_num.size();
7196 }
7197 }
7198 virtual int NumPoints(int face) const
7199 {
7200 int s = faces_num.size();
7201 if (face<0 || face>s-1) return 0;
7202 return vec[faces_num[face]]->NumPoints(faces_cache[face]);
7203 }
7204 virtual Point FacePoint(int face, int point) const
7205 {
7206 int s = faces_num.size();
7207 if (face<0 || face>s-1) return Point(0.0,0.0,0.0);
7208 return vec[faces_num[face]]->FacePoint(faces_cache[face], point);
7209 }
7210 virtual Point EndFacePoint(int face, int point) const
7211 {
7212 int s = faces_num.size();
7213 if (face<0 || face>s-1) return Point(0.0,0.0,0.0);
7214 return vec[faces_num[face]]->EndFacePoint(faces_cache[face], point);
7215 }
7216
7217 virtual unsigned int Color(int face, int point) const
7218 {
7219 int s = faces_num.size();
7220 if (face<0 || face>s-1) return 0xffffffff;
7221 return vec[faces_num[face]]->Color(faces_cache[face],point);
7222 }
7223
7224 virtual Point2d TexCoord(int face, int point) const
7225 {
7226 int s = faces_num.size();
7227 if (face<0 || face>s-1) { Point2d p; p.x=0.0; p.y=0.0; return p; }
7228 return vec[faces_num[face]]->TexCoord(faces_cache[face],point);
7229 }
7230 virtual float TexCoord3(int face, int point) const
7231 {
7232 int s = faces_num.size();
7233 if (face<0 || face>s-1) { return 0.0; }
7234 return vec[faces_num[face]]->TexCoord3(faces_cache[face],point);
7235 }
7236 virtual VEC4 Joints(int face, int point) const {
7237 int s = faces_num.size();
7238 if (face<0||face>s-1) { VEC4 v; v.x = 0.0; v.y=0.0; v.z = 0.0; v.w=0.0; return v; }
7239 return vec[faces_num[face]]->Joints(faces_cache[face],point);
7240 }
7241 virtual VEC4 Weights(int face, int point) const {
7242 int s = faces_num.size();
7243 if (face<0||face>s-1) { VEC4 v; v.x = 0.0; v.y=0.0; v.z = 0.0; v.w=0.0; return v; }
7244 return vec[faces_num[face]]->Weights(faces_cache[face],point);
7245 }
7246
7247
7248 virtual Vector PointNormal(int face, int point) const
7249 {
7250 int s = faces_num.size();
7251 if (face<0 || face>s-1) { return Vector(0.0,0.0,0.0); }
7252 return vec[faces_num[face]]->PointNormal(faces_cache[face], point);
7253 }
7254 float Attrib(int face, int point, int id) const
7255 {
7256 int s = faces_num.size();
7257 if (face<0 || face>s-1) { return 0.0; }
7258 return vec[faces_num[face]]->Attrib(faces_cache[face], point, id);
7259 }
7260 int AttribI(int face, int point, int id) const
7261 {
7262 int s = faces_num.size();
7263 if (face<0 || face>s-1) { return 0; }
7264 if (id==AttrPart)
7265 {
7266 return faces_num[face];
7267 }
7268 return vec[faces_num[face]]->AttribI(faces_cache[face], point, id);
7269 }
7270
7271 virtual int NumTextures() const
7272 {
7273 int s = vec.size();
7274 int count = 0;
7275 for(int i=0;i<s;i++)
7276 {
7277 count += vec[i]->NumTextures();
7278 }
7279 return count;
7280 }
7281
7282 virtual void GenTexture(int num)
7283 {
7284 int count = 0;
7285 for(typename std::vector<T /*BoxableFaceCollection*/ *>::const_iterator i=vec.begin();i!=vec.end();i++)
7286 {
7287 int oldcount = count;
7288 count += (*i)->NumTextures();
7289 if (count > num) { (*i)->GenTexture(num-oldcount); break; }
7290 }
7291 }
7292 virtual BufferRef TextureBuf(int num) const
7293 {
7294 int count = 0;
7295 for(typename std::vector<T /*BoxableFaceCollection*/ *>::const_iterator i=vec.begin();i!=vec.end();i++)
7296 {
7297 int oldcount = count;
7298 count += (*i)->NumTextures();
7299 if (count > num) { return (*i)->TextureBuf(num-oldcount);}
7300 }
7302 return ref;
7303 }
7304 virtual int FaceTexture(int face) const
7305 {
7306 int count = 0;
7307 int texcount = 0;
7308 for(typename std::vector<T /*BoxableFaceCollection*/ *>::const_iterator i=vec.begin();i!=vec.end();i++)
7309 {
7310 int oldcount = count;
7311 int oldtexcount = texcount;
7312 count += (*i)->NumFaces();
7313 texcount += (*i)->NumTextures();
7314 if (count > face) { return oldtexcount+(*i)->FaceTexture(face-oldcount);}
7315 }
7316 return 0;
7317 }
7318
7319private:
7320 std::vector<T /*BoxableFaceCollection*/ *> vec;
7321 mutable std::vector<int> faces_cache;
7322 mutable std::vector<int> faces_num;
7323};
7324
7326{
7327public:
7328 QuadElem(Point p1, Point p2, Point p3, Point p4) : p1(p1), p2(p2), p3(p3), p4(p4) { }
7329 virtual std::string name() const { return "QuadElem"; }
7331 void HeavyPrepare() { }
7332 virtual void SetBox(Matrix b) { /*box = b;*/ }
7333 virtual int NumFaces() const { return 1; }
7334 virtual int NumPoints(int face) const { return 4; }
7335 //virtual int Texture(int face) const { return face; }
7336 //virtual Point2d TexCoord(int face, int point) const;
7337 virtual Point FacePoint(int face, int point) const
7338 {
7339 if (point==0) return p1;
7340 if (point==1) return p2;
7341 if (point==2) return p3;
7342 return p4;
7343 }
7344 virtual bool has_normal() const { return true; }
7345 virtual Vector PointNormal(int face, int point) const
7346 {
7347 Vector u_x = p2-p1;
7348 Vector u_y = p3-p1;
7349 return Vector::CrossProduct(u_x, u_y);
7350 }
7351 virtual unsigned int Color(int face, int point) const
7352 {
7353 return Color::White().Pixel();
7354 }
7355 virtual bool has_texcoord() const { return true; }
7356 virtual Point2d TexCoord(int face, int point) const
7357 {
7358 Point2d p;
7359 if (point==0) {
7360 p.x = 0;
7361 p.y = 0;
7362 }
7363 if (point==1) {
7364 p.x = 1;
7365 p.y = 0;
7366 }
7367 if (point==2) {
7368 p.x = 1;
7369 p.y = 1;
7370 }
7371 if (point==3) {
7372 p.x = 0;
7373 p.y = 1;
7374 }
7375
7376 return p;
7377 }
7378 virtual int AttribI(int face, int point, int id) const
7379 {
7380 return 0;
7381 }
7382 virtual float Attrib(int face, int point, int id) const
7383 {
7384 switch(id)
7385 {
7386 case AttrCenterX: return 0.0; //box.matrix[3];
7387 case AttrCenterY: return 0.0; //box.matrix[7];
7388 case AttrCenterZ: return 0.0; //box.matrix[11];
7389 }
7390 return 0.0;
7391 }
7392
7393private:
7394 Point p1,p2,p3,p4;
7395};
7396
7398{
7399public:
7400 TriElem(Point p1, Point p2, Point p3) : p1(p1), p2(p2), p3(p3) { }
7401 virtual std::string name() const { return "TriElem"; }
7402
7403 virtual void SetBox(Matrix b) { /*box = b;*/ }
7404 virtual int NumFaces() const { return 1; }
7405 virtual int NumPoints(int face) const { return 3; }
7406 //virtual int Texture(int face) const { return face; }
7407 //virtual Point2d TexCoord(int face, int point) const;
7408 virtual Point FacePoint(int face, int point) const
7409 {
7410 if (point==0) return p1;
7411 if (point==1) return p2;
7412 return p3;
7413 }
7414 virtual bool has_normal() const { return true; }
7415 virtual Vector PointNormal(int face, int point) const
7416 {
7417 Vector u_x = p2-p1;
7418 Vector u_y = p3-p1;
7419 return Vector::CrossProduct(u_x, u_y);
7420 }
7421 virtual unsigned int Color(int face, int point) const
7422 {
7423 return Color::White().Pixel();
7424 }
7425 virtual Point2d TexCoord(int face, int point) const
7426 {
7427 Point2d p;
7428 p.x = 0;
7429 p.y = 0;
7430 return p;
7431 }
7432 virtual int AttribI(int face, int point, int id) const
7433 {
7434 return 0;
7435 }
7436 virtual float Attrib(int face, int point, int id) const
7437 {
7438 switch(id)
7439 {
7440 case AttrCenterX: return 0.0; //box.matrix[3];
7441 case AttrCenterY: return 0.0; //box.matrix[7];
7442 case AttrCenterZ: return 0.0; //box.matrix[11];
7443 }
7444 return 0.0;
7445 }
7446
7447private:
7448 Point p1,p2,p3;
7449};
7450
7462
7464{
7465public:
7467 virtual std::string name() const { return "PolygonElem"; }
7468 void push_back(Point p) { points.push_back(p); }
7469 virtual int NumFaces() const { return 1; }
7470 virtual int NumPoints(int face) const { return points.size(); }
7471 virtual Point FacePoint(int face, int point) const
7472 {
7473 return points[point];
7474 }
7475 virtual Vector PointNormal(int face, int point) const
7476 {
7477 return Vector(0.0,0.0,0.0);
7478 }
7479 virtual float Attrib(int face, int point, int id) const { return 0.0; }
7480 virtual int AttribI(int face, int point, int id) const { return 0; }
7481 virtual unsigned int Color(int face, int point) const
7482 {
7483 return 0xffffffff;
7484 }
7485 virtual Point2d TexCoord(int face, int point) const
7486 {
7487 Point2d p = { 0.0, 0.0 };
7488 return p;
7489 }
7490 virtual int NumTextures() const { return 0; }
7491 virtual void GenTexture(int num) { }
7492 virtual BufferRef TextureBuf(int num) const { BufferRef ref; ref.buffer = 0; return ref; }
7493 virtual int FaceTexture(int face) const { return -1; }
7494
7495private:
7496 std::vector<Point> points;
7497};
7498
7500{
7501public:
7502 CubeElem() : p111(Point(-1.0,-1.0,-1.0)),
7503 p112(Point(-1.0,-1.0,1.0)),
7504 p121(Point(-1.0,1.0,-1.0)),
7505 p122(Point(-1.0,1.0,1.0)),
7506 p211(Point(1.0,-1.0,-1.0)),
7507 p212(Point(1.0,-1.0,1.0)),
7508 p221(Point(1.0,1.0,-1.0)),
7509 p222(Point(1.0,1.0,1.0)) { }
7511 Point p112,
7512 Point p121,
7513 Point p122,
7514 Point p211,
7515 Point p212,
7516 Point p221,
7517 Point p222) : p111(p111), p112(p112), p121(p121),
7518 p122(p122), p211(p211), p212(p212),
7519 p221(p221), p222(p222) { }
7520 virtual std::string name() const { return "CubeElem"; }
7521
7522 virtual Coords coord() const
7523 {
7524 Coords c;
7525 c.center = Point(0.0,0.0,0.0);
7526 c.u_x = Vector(1.0,0.0,0.0);
7527 c.u_y = Vector(0.0,1.0,0.0);
7528 c.u_z = Vector(0.0,0.0,1.0);
7529 return c;
7530 }
7532 {
7533 }
7534 void HeavyPrepare() { }
7535
7536 void Prepare() { }
7537 virtual void SetBox(Matrix b) { /*box = b;*/ }
7538 virtual int NumFaces() const { return 6; }
7539 virtual int NumPoints(int face) const { return 4; }
7540 //virtual int Texture(int face) const { return face; }
7541 //virtual Point2d TexCoord(int face, int point) const;
7542 virtual Point FacePoint(int face, int point) const;
7543 virtual bool has_normal() const { return true; }
7544 virtual Vector PointNormal(int face, int point) const
7545 {
7546 Point pp1 = FacePoint(face,0);
7547 Point pp2 = FacePoint(face,1);
7548 Point pp3 = FacePoint(face,2);
7549 Vector u_x = pp2-pp1;
7550 Vector u_y = pp3-pp1;
7551 Vector v = Vector::CrossProduct(u_x, u_y);
7552 return v/v.Dist();
7553 }
7554 virtual unsigned int Color(int face, int point) const
7555 {
7556 return Color::White().Pixel();
7557 }
7558 bool has_texcoord() const { return true; }
7559 virtual Point2d TexCoord(int face, int point) const;
7560 virtual int AttribI(int face, int point, int id) const
7561 {
7562 return 0;
7563 }
7564 virtual float Attrib(int face, int point, int id) const
7565 {
7566 switch(id)
7567 {
7568 case AttrCenterX: return 0.0; //box.matrix[3];
7569 case AttrCenterY: return 0.0; //box.matrix[7];
7570 case AttrCenterZ: return 0.0; //box.matrix[11];
7571 }
7572 return 0.0;
7573 }
7574
7575private:
7576 Point p111;
7577 Point p112;
7578 Point p121;
7579 Point p122;
7580 Point p211;
7581 Point p212;
7582 Point p221;
7583 Point p222;
7584 //Matrix box;
7585};
7587
7589{
7590public:
7591 virtual std::string name() const { return "CylinderElem"; }
7592 virtual Coords coord() const
7593 {
7594 Coords c;
7595 c.center = Point(0.0,0.0,0.0);
7596 c.u_x = Vector(1.0,0.0,0.0);
7597 c.u_y = Vector(0.0,1.0,0.0);
7598 c.u_z = Vector(0.0,0.0,1.0);
7599 return c;
7600 }
7601
7602 CylinderElem(int numfaces) : numfaces(numfaces) { }
7604 {
7605 }
7606 void HeavyPrepare() { }
7607 void Prepare() { }
7608 virtual void SetBox(Matrix b) { /*box = b;*/ }
7609 virtual int NumFaces() const { return numfaces; }
7610 virtual int NumPoints(int face) const { return 4; }
7611 virtual Point FacePoint(int face, int point) const;
7612
7613 virtual bool has_normal() const { return true; }
7614 virtual Vector PointNormal(int face, int point) const
7615 {
7616 Vector v = FacePoint(face, point);
7617 //Vector center = Vector(box.matrix[3], box.matrix[7], box.matrix[11]);
7618 return v; /*-center;*/
7619 }
7620 virtual unsigned int Color(int face, int point) const
7621 {
7622 return Color::White().Pixel();
7623 }
7624
7625 virtual Point2d TexCoord(int face, int point) const
7626 {
7627 Point2d p;
7628 p.x = 0;
7629 p.y = 0;
7630 return p;
7631 }
7632
7633 virtual float Attrib(int face, int point, int id) const
7634 {
7635 return 0.0;
7636 }
7637 virtual int AttribI(int face, int point, int id) const
7638 {
7639 return 0;
7640 }
7641
7642private:
7643 //Matrix box;
7644 int numfaces;
7645};
7646
7647
7648
7650
7651
7653{
7654public:
7655 DiskElem(int numfaces, float disk_pos) : numfaces(numfaces), disk_pos(disk_pos) { }
7656 virtual std::string name() const { return "DiskElem"; }
7658 {
7659 }
7660 void HeavyPrepare() { }
7661
7662 void Prepare() { }
7663 virtual void SetBox(Matrix b) { /*box = b;*/ }
7664 virtual int NumFaces() const { return numfaces+1; }
7665 virtual int NumPoints(int face) const { return 3; }
7666 virtual Point FacePoint(int face, int point) const;
7667
7668 virtual unsigned int Color(int face, int point) const
7669 {
7670 return Color::White().Pixel();
7671 }
7672 virtual Point2d TexCoord(int face, int point) const
7673 {
7674 Point2d p;
7675 p.x = 0;
7676 p.y = 0;
7677 return p;
7678 }
7679
7680 virtual bool has_normal() const { return true; }
7681 virtual Vector PointNormal(int face, int point) const
7682 {
7683 Vector v = FacePoint(face, point);
7684 //Vector center = Vector(box.matrix[3], box.matrix[7], box.matrix[11]);
7685 return v;
7686 }
7687 virtual float Attrib(int face, int point, int id) const
7688 {
7689 return 0.0;
7690 }
7691 virtual int AttribI(int face, int point, int id) const
7692 {
7693 return 0;
7694 }
7695
7696private:
7697 //Matrix box;
7698 int numfaces;
7699 float disk_pos;
7700};
7702
7703
7704template<class T>
7705class IdentityFunction : public Function<T,T>
7706{
7707public:
7708 virtual T Index(T a) const { return a; }
7709};
7710
7711// interpolation morphism
7713{
7714public:
7715 InterpolationPathCollection(float pathlength, BoxCollection &dom, BoxCollection &cod, Function<int,int> &mapping) : pathlength(pathlength), dom(dom)/*, cod(cod)*/, mapping(mapping) { }
7716 int NumPaths(float /*time*/) const { return dom.NumBoxes(); }
7717 float PathLength() const { return pathlength; }
7718 Matrix Index(float posinpath, int path) const
7719 {
7720 Matrix domm = dom.BoxIndex(path);
7721 Matrix codm = dom.BoxIndex(mapping.Index(path));
7722 Matrix m = Matrix::Interpolate(domm, codm, posinpath/pathlength);
7723 return m;
7724 }
7725private:
7726 float pathlength;
7727 BoxCollection &dom;
7728 //BoxCollection &cod;
7730};
7731
7732
7733class Water : public Function2<float, float, float>
7734{
7735public:
7736 Water(float time) : time(time)
7737 {
7738 int starttime=300;
7739 for(int i =0;i<320;i++)
7740 {
7741 float ii = i;
7742 if (i>time-starttime&&i<time-starttime+50.0)
7743 array[i]=0.5*0.1*sin(ii*2.0*3.14159/320.0);
7744 else
7745 array[i]=0.05*0.1;
7746 }
7747 }
7748 float Index(float x, float y) const
7749 {
7750 float m = 8;
7751 float n = 5;
7752 // waves
7753 float lx = cos(m*3.14159*x);
7754 float ly = cos(n*3.14159*y);
7755 float lt = cos(8.0*time);
7756 float wave = 0.02*lx*ly*lt;
7757
7758 float m2 = 5;
7759 float n2 = 10;
7760 // waves
7761 float lx2 = cos(m2*3.14159*x);
7762 float ly2 = cos(n2*3.14159*y);
7763 float lt2 = cos(18.0*time);
7764 float wave2 = 0.02*lx2*ly2*lt2;
7765
7766 // splash
7767 float xr = x-0.5;
7768 float yr = y-0.5;
7769 float r = sqrtf(xr*xr+yr*yr);
7770 //float s = 1.0/(r+0.05);
7771 int rr = int(320.0*r);
7772 float s=array[rr]; //sin(r);
7773 return wave+wave2+s*sin(r*90.0-time*2.0);
7774 }
7775private:
7776 float time;
7777 float array[320];
7778};
7779
7781{
7782public:
7783 HeightMap(int x, int y, Function2<float, float, float> &func) : x(x), y(y), func(func) { }
7784 void Prepare() {}
7785 virtual void SetBox(Matrix b) { /*box = b;*/ }
7786 virtual int NumFaces() const { return x*y; }
7787 virtual int NumPoints(int face) const { return 4; }
7788 virtual Point FacePoint(int face, int point) const
7789 {
7790 int dx=0, dy=0;
7791 if (point==1) dx=1;
7792 else if (point==2) { dx=1; dy=1; }
7793 else if (point==3) { dy=1; }
7794
7795 int xx = face / y;
7796 int yy = face - xx*y;
7797 xx += dx;
7798 yy += dy;
7799 return GetPoint(xx,yy);
7800 }
7801 unsigned int Color(int face, int point) const
7802 {
7803 return Color::White().Pixel();
7804 }
7805 virtual Point2d TexCoord(int face, int point) const
7806 {
7807 Point2d p;
7808 p.x = 0;
7809 p.y = 0;
7810 return p;
7811 }
7812
7813 Point GetPoint(float xx, float yy) const
7814 {
7815 float zz = func.Index(xx/x,yy/y);
7816
7817 Vector vx=xx*Vector(1.0/x,0.0,0.0);
7818 Vector vy=yy*Vector(0.0,0.0,1.0/y);
7819 Vector vz=zz*Vector(0.0,1.0,0.0);
7820 return (vx+vy+vz);
7821 }
7822
7823 virtual Vector PointNormal(int face, int point) const
7824 {
7825 int dx=0, dy=0;
7826 if (point==1) dx=1;
7827 else if (point==2) { dx=1; dy=1; }
7828 else if (point==3) { dy=1; }
7829
7830 int xx = face / y;
7831 int yy = face - xx*y;
7832 xx += dx;
7833 yy += dy;
7834 Point p = GetPoint(xx,yy);
7835 Point p2 = GetPoint(xx+0.01,yy);
7836 Point p3 = GetPoint(xx,yy+0.01);
7837 return -Vector::CrossProduct(p2-p, p3-p);
7838 }
7839 virtual float Attrib(int face, int point, int id) const
7840 {
7841 return 0.0;
7842 }
7843 virtual int AttribI(int face, int point, int id) const
7844 {
7845 return 0;
7846 }
7847
7848private:
7849 int x,y;
7850 //Matrix box;
7852};
7854{
7855public:
7856 ColorElem(BoxableFaceCollection &next, unsigned int color) : ForwardBoxableFaceCollection(next), next(next) , color(color) { }
7857 virtual std::string name() const { return "ColorElem"; }
7858
7860 {
7861 const_cast<BoxableFaceCollection&>(next).Collect(vis);
7862 }
7863 void HeavyPrepare() { }
7864 void Prepare() { const_cast<BoxableFaceCollection&>(next).Prepare(); }
7865 virtual void SetBox(Matrix b) { /*const_cast<BoxableFaceCollection&>(next).SetBox(b);*/ }
7866 virtual int NumFaces() const { return next.NumFaces(); }
7867 virtual int NumPoints(int face) const { return next.NumPoints(face); }
7868 virtual Point FacePoint(int face, int point) const
7869 {
7870 return next.FacePoint(face,point);
7871 }
7872 virtual bool has_color() const { return true; }
7873 virtual unsigned int Color(int face, int point) const
7874 {
7875 return color;
7876 }
7877 virtual Point2d TexCoord(int face, int point) const
7878 {
7879 Point2d p;
7880 p.x = 0;
7881 p.y = 0;
7882 return p;
7883 }
7884
7885 virtual Vector PointNormal(int face, int point) const
7886 {
7887 return next.PointNormal(face,point);
7888 }
7889 virtual float Attrib(int face, int point, int id) const
7890 {
7891 return next.Attrib(face, point, id);
7892 }
7893 virtual int AttribI(int face, int point, int id) const
7894 {
7895 return next.AttribI(face,point,id);
7896 }
7897
7898private:
7900 unsigned int color;
7901};
7902
7904{
7905public:
7907 unsigned int color_1,
7908 unsigned int color_2,
7909 unsigned int color_3,
7910 unsigned int color_4
7911 ) : ForwardBoxableFaceCollection(next), next(next) , color_1(color_1), color_2(color_2), color_3(color_3), color_4(color_4) { }
7912 virtual std::string name() const { return "ColorFaceElem"; }
7913
7914 virtual void SetBox(Matrix b) { /*const_cast<BoxableFaceCollection&>(next).SetBox(b);*/ }
7915 virtual int NumFaces() const { return next.NumFaces(); }
7916 virtual int NumPoints(int face) const { return next.NumPoints(face); }
7917 virtual Point FacePoint(int face, int point) const
7918 {
7919 return next.FacePoint(face,point);
7920 }
7921 virtual bool has_color() const { return true; }
7922
7923 virtual unsigned int Color(int face, int point) const
7924 {
7925 switch(point)
7926 {
7927 case 0: return color_1;
7928 case 1: return color_2;
7929 case 2: return color_3;
7930 case 3: return color_4;
7931 }
7932 return color_1;
7933 }
7934 virtual Point2d TexCoord(int face, int point) const
7935 {
7936 return next.TexCoord(face,point);
7937 /*
7938 Point2d p;
7939 p.x = 0;
7940 p.y = 0;
7941 return p;
7942 */
7943 }
7944
7945 virtual Vector PointNormal(int face, int point) const
7946 {
7947 return next.PointNormal(face,point);
7948 }
7949 virtual float Attrib(int face, int point, int id) const
7950 {
7951 return next.Attrib(face, point, id);
7952 }
7953 virtual int AttribI(int face, int point, int id) const
7954 {
7955 return next.AttribI(face,point,id);
7956 }
7957
7958private:
7960 unsigned int color_1;
7961 unsigned int color_2;
7962 unsigned int color_3;
7963 unsigned int color_4;
7964};
7965
7966
7968{
7969public:
7970 TextureElem(const BoxableFaceCollection &next, TextureCoords &coords) : next(next) , coords(coords) { }
7971 void Collect(CollectVisitor &vis) { const_cast<BoxableFaceCollection&>(next).Collect(vis); }
7972 void HeavyPrepare() { }
7973 virtual void SetBox(Matrix b) { /*const_cast<BoxableFaceCollection&>(next).SetBox(b);*/ }
7974 virtual int NumFaces() const { return next.NumFaces(); }
7975 virtual int NumPoints(int face) const { return next.NumPoints(face); }
7976 virtual Point FacePoint(int face, int point) const
7977 {
7978 return next.FacePoint(face,point);
7979 }
7980 virtual unsigned int Color(int face, int point) const
7981 {
7982 return next.Color(face,point);
7983 }
7984 virtual bool has_texcoord() const { return true; }
7985 virtual Point2d TexCoord(int face, int point) const
7986 {
7987 return coords.TexCoord(face,point);
7988 }
7989
7990 virtual Vector PointNormal(int face, int point) const
7991 {
7992 return next.PointNormal(face,point);
7993 }
7994 virtual float Attrib(int face, int point, int id) const
7995 {
7996 return next.Attrib(face, point, id);
7997 }
7998 virtual int AttribI(int face, int point, int id) const
7999 {
8000 return next.AttribI(face,point,id);
8001 }
8002
8003private:
8004 const BoxableFaceCollection &next;
8005 TextureCoords &coords;
8006};
8007
8008
8009
8010
8012{
8013public:
8014 TextureElem2(FaceCollection &next, BufferRefReq &ref, TextureCoords &coords) : ForwardBoxableFaceCollection(next), next(next), ref(ref), coords(coords) { }
8015 virtual std::string name() const { return "TextureElem2"; }
8017 void HeavyPrepare() { }
8018 virtual void SetBox(Matrix b) { /*const_cast<BoxableFaceCollection&>(next).SetBox(b);*/ }
8019 virtual int NumFaces() const { return next.NumFaces(); }
8020 virtual int NumPoints(int face) const { return next.NumPoints(face); }
8021 virtual Point FacePoint(int face, int point) const
8022 {
8023 return next.FacePoint(face,point);
8024 }
8025 virtual unsigned int Color(int face, int point) const
8026 {
8027 return next.Color(face,point);
8028 }
8029 virtual bool has_texcoord() const { return true; }
8030
8031 virtual Point2d TexCoord(int face, int point) const
8032 {
8033 return coords.TexCoord(face,point);
8034 }
8035
8036 virtual Vector PointNormal(int face, int point) const
8037 {
8038 return next.PointNormal(face,point);
8039 }
8040 virtual float Attrib(int face, int point, int id) const
8041 {
8042 return next.Attrib(face, point, id);
8043 }
8044 virtual int AttribI(int face, int point, int id) const
8045 {
8046 return next.AttribI(face,point,id);
8047 }
8048 virtual int NumTextures() const { return 1+next.NumTextures(); }
8049 virtual void GenTexture(int num)
8050 {
8051 ref.Gen();
8052 }
8053 virtual BufferRef TextureBuf(int num) const
8054 {
8055 if (num==0)
8056 {
8057 return ref.Buffer();
8058 }
8059 else return next.TextureBuf(num-1);
8060 }
8061 virtual int FaceTexture(int face) const
8062 {
8063 int i = coords.Texture(face);
8064 return i;
8065 }
8066
8067private:
8068 const FaceCollection &next;
8069 BufferRefReq &ref;
8070 TextureCoords &coords;
8071};
8072
8073
8074
8076{
8077public:
8078 MatrixElem(FaceCollection &next, Matrix m) : ForwardFaceCollection(next), next(&next), m(m) { skip=false; }
8079 virtual std::string name() const { return "MatrixElem"; }
8081 {
8082 int s1 = pos2_1.size(); for(int i=0;i<s1;i++)
8083 delete [] pos2_1[i];
8084 int s2 = pos2_2.size(); for(int i=0;i<s2;i++)
8085 delete [] pos2_2[i];
8086 int s3 = pos2_3.size(); for(int i=0;i<s3;i++)
8087 delete [] pos2_3[i];
8088 }
8089 virtual bool IsMatrixElem() const { return true; }
8091 {
8092 next->Collect(vis);
8093 vis.register_obj(this);
8094 }
8096 //std::cout << "MatrixElem::HEAVYPREPARE" << std::endl;
8097 m2 = get_matrix();
8098 next2 = get_next();
8099 skip=true;
8100 }
8101
8102 virtual void Prepare() { next->Prepare(); HeavyPrepare(); }
8103 virtual int NumFaces() const { if (skip) return next2->NumFaces(); return next->NumFaces(); }
8104 virtual int NumPoints(int face) const { if (skip) return next2->NumPoints(face); return next->NumPoints(face); }
8105 virtual Point FacePoint(int face, int point) const
8106 {
8107 if (skip) {
8108 Point p = next2->FacePoint(face,point);
8109 return p*m2;
8110 } else {
8111 Point p = next->FacePoint(face,point);
8112 return p*m;
8113 }
8114 }
8115 virtual Point EndFacePoint(int face, int point) const
8116 {
8117 if (skip) {
8118 Point p = next2->EndFacePoint(face,point);
8119 return p*m2;
8120 } else {
8121 Point p = next->EndFacePoint(face,point);
8122 return p*m;
8123 }
8124 }
8125 virtual Vector PointNormal(int face, int point) const
8126 {
8127 if (skip) {
8129 Vector v = next2->PointNormal(face,point);
8130 return v*m3;
8131 } else {
8133 Vector v = next->PointNormal(face,point);
8134 return v*m3;
8135 }
8136 }
8137
8138 BBOX GetBoundingBox(bool &success) const
8139 {
8140 BBOX bb = next->GetBoundingBox(success);
8141 Point p1(bb.start_x, bb.start_y, bb.start_z);
8142 Point p2(bb.end_x,bb.start_y,bb.start_z);
8143 Point p3(bb.start_x,bb.end_y,bb.start_z);
8144 Point p4(bb.end_x,bb.end_y,bb.start_z);
8145
8146 Point p5(bb.start_x, bb.start_y, bb.end_z);
8147 Point p6(bb.end_x,bb.start_y,bb.end_z);
8148 Point p7(bb.start_x,bb.end_y,bb.end_z);
8149 Point p8(bb.end_x,bb.end_y,bb.end_z);
8150
8151 p1=p1*m;
8152 p2=p2*m;
8153 p3=p3*m;
8154 p4=p4*m;
8155 p5=p5*m;
8156 p5=p6*m;
8157 p6=p7*m;
8158 p8=p8*m;
8159
8160 BBOX res;
8161 res.start_x = std::min(std::min(std::min(std::min(p1.x,p2.x),
8162 std::min(p3.x,p4.x)),
8163 std::min(std::min(p5.x,p6.x),
8164 std::min(p6.x,p7.x))),
8165 p8.x);
8166 res.end_x = std::max(std::max(std::max(std::max(p1.x,p2.x),
8167 std::max(p3.x,p4.x)),
8168 std::max(std::max(p5.x,p6.x),
8169 std::max(p6.x,p7.x))),
8170 p8.x);
8171
8172 res.start_y = std::min(std::min(std::min(std::min(p1.y,p2.y),
8173 std::min(p3.y,p4.y)),
8174 std::min(std::min(p5.y,p6.y),
8175 std::min(p6.y,p7.y))),
8176 p8.y);
8177 res.end_y = std::max(std::max(std::max(std::max(p1.y,p2.y),
8178 std::max(p3.y,p4.y)),
8179 std::max(std::max(p5.y,p6.y),
8180 std::max(p6.y,p7.y))),
8181 p8.y);
8182
8183 res.start_z = std::min(std::min(std::min(std::min(p1.z,p2.z),
8184 std::min(p3.z,p4.z)),
8185 std::min(std::min(p5.z,p6.z),
8186 std::min(p6.z,p7.z))),
8187 p8.z);
8188 res.end_z = std::max(std::max(std::max(std::max(p1.z,p2.z),
8189 std::max(p3.z,p4.z)),
8190 std::max(std::max(p5.z,p6.z),
8191 std::max(p6.z,p7.z))),
8192 p8.z);
8193
8194 return res;
8195
8196 }
8197 // This is optimization that skips some MatrixElem nodes if there's many
8199 {
8200 bool b = next->IsMatrixElem();
8201 if (b) {
8202 return static_cast<MatrixElem*>(next)->get_matrix()*m;
8203 } else return m;
8204
8205 }
8207 {
8208 bool b = next->IsMatrixElem();
8209 if (b) {
8210 return static_cast<MatrixElem*>(next)->get_next();
8211 } else return next;
8212 }
8213 virtual bool HasBatchMap() const
8214 {
8215
8216 if (skip) {
8217 return next2->HasBatchMap();
8218 } else {
8219 return next->HasBatchMap();
8220 }
8221
8222 }
8223 void change_pos(Point **pos, int numvertices) const
8224 {
8225 if (*pos==0) return;
8226 //static Point *pos2=0;
8227 //delete [] pos2;
8228 Point *pos2;
8229 pos2_1.push_back(pos2 = new Point[numvertices]);
8230 if (skip) {
8231 for(int i=0;i<numvertices;i++)
8232 {
8233 pos2[i] = (*pos)[i]*m2;
8234 }
8235 } else {
8236 for(int i=0;i<numvertices;i++)
8237 {
8238 pos2[i] = (*pos)[i]*m;
8239 }
8240 }
8241 *pos = pos2;
8242 }
8243 void change_pos2(Point **pos, int numvertices) const
8244 {
8245 if (*pos==0) return;
8246 //static Point *pos2=0;
8247 //delete [] pos2;
8248 Point *pos2;
8249 pos2_2.push_back(pos2 = new Point[numvertices]);
8250 if (skip) {
8251 for(int i=0;i<numvertices;i++)
8252 {
8253 pos2[i] = (*pos)[i]*m2;
8254 }
8255 } else {
8256 for(int i=0;i<numvertices;i++)
8257 {
8258 pos2[i] = (*pos)[i]*m;
8259 }
8260 }
8261 *pos = pos2;
8262 }
8263 void change_normal(Vector **pos, int numvertices) const
8264 {
8265 if (*pos==0) return;
8266 //static Vector *pos2=0;
8267 //delete [] pos2;
8268 Vector *pos2;
8269 pos2_3.push_back(pos2 = new Vector[numvertices]);
8270 if (skip) {
8272 for(int i=0;i<numvertices;i++)
8273 {
8274 pos2[i] = (*pos)[i]*m3;
8275 //if (i<30)
8276 //std::cout << "MatrixElem:" << pos2[i] << std::endl;
8277 }
8278 } else {
8280 //std::cout << m3 << std::endl;
8281 for(int i=0;i<numvertices;i++)
8282 {
8283 pos2[i] = (*pos)[i]*m3;
8284 //if (i<30)
8285 //std::cout << "MatrixElem2:" << (*pos)[i] << "->" << pos2[i] << std::endl;
8286 }
8287 }
8288 *pos = pos2;
8289 }
8290 virtual FaceBufferRef BatchMap(int start_face, int end_face) const
8291 {
8292 if (skip) {
8293 FaceBufferRef r = next2->BatchMap(start_face,end_face);
8297 return r;
8298 } else {
8299 FaceBufferRef r = next->BatchMap(start_face,end_face);
8303 return r;
8304 }
8305
8306 }
8307
8308private:
8309 FaceCollection *next;
8310 Matrix m;
8311 bool skip;
8312 FaceCollection *next2;
8313 Matrix m2;
8314 mutable std::vector<Point*> pos2_1;
8315 mutable std::vector<Point*> pos2_2;
8316 mutable std::vector<Vector*> pos2_3;
8317};
8319
8321{
8322public:
8323 Move(BoxableFaceCollection &coll, Vector v) : ForwardBoxableFaceCollection(coll), coll(coll), v(v) { }
8324 Move(BoxableFaceCollection &coll, float x, float y, float z) : ForwardBoxableFaceCollection(coll), coll(coll), v(x,y,z) { }
8325 virtual void SetBox(Matrix b) { /*coll.SetBox(b);*/ }
8326 virtual int NumFaces() const { return coll.NumFaces(); }
8327 virtual int NumPoints(int face) const { return coll.NumPoints(face); }
8328 virtual Point FacePoint(int face, int point) const
8329 {
8330 Point p = coll.FacePoint(face,point);
8331 p += v;
8332 return p;
8333 }
8334
8335 virtual Vector PointNormal(int face, int point) const
8336 {
8337 return coll.PointNormal(face,point);
8338 }
8339 virtual float Attrib(int face, int point, int id) const
8340 {
8341 return coll.Attrib(face, point, id);
8342 }
8343 virtual int AttribI(int face, int point, int id) const
8344 {
8345 return coll.AttribI(face,point,id);
8346 }
8347
8348 virtual bool Inside(Point p) const {
8349 p-=v;
8350 return coll.Inside(p);
8351 }
8352private:
8354 Vector v;
8355};
8357
8358class OrFunc : public Function<int, bool>
8359{
8360public:
8362 bool Index(int a) const { return f.Index(a)||f2.Index(a); }
8363private:
8366};
8367
8368class AndFunc : public Function<int, bool>
8369{
8370public:
8372 bool Index(int a) const { return f.Index(a)&&f2.Index(a); }
8373private:
8376};
8377
8378class NotFunc : public Function<int, bool>
8379{
8380public:
8382 bool Index(int a) const { return !f.Index(a); }
8383private:
8385};
8386
8393
8394template<class T>
8395class IsEqualFunc : public Function<T, bool>
8396{
8397public:
8398 IsEqualFunc(T t) : t(t) { }
8399 bool Index(T tt) const { return tt==t; }
8400private:
8401 T t;
8402};
8403
8404template<class A, class B, class C>
8405class ComposeFunc : public Function<A,C>
8406{
8407public:
8409 {
8410 }
8411 C Index(A aa) const { return b.Index(a.Index(aa)); }
8412private:
8413 Function<A,B> &a;
8414 Function<B,C> &b;
8415};
8416template<class C>
8417class SampleFunction : public ComposeFunc<int, float, C>
8418{
8419public:
8421};
8422
8423class Sample : public Function<int, float>
8424{
8425public:
8426 Sample(float zero, float succ) : zero(zero), succ(succ) { }
8427 float Index(int i) const
8428 {
8429 return zero + i*succ;
8430 }
8431private:
8432 float zero, succ;
8433};
8434
8435class RemovePolysFunc : public Boxable, public Function<int, FaceType>
8436{
8437public:
8438 RemovePolysFunc(BoxableFaceCollection &obj, BoxableFaceCollection &obj2) : obj(obj), obj2(obj2) { }
8439
8440 void SetBox(Matrix b) { /*obj.SetBox(b);*/ }
8441 FaceType Index(int face) const
8442 {
8443 //Point sum = center.Points(face);
8444 int count = obj.NumPoints(face);
8445 bool foundtrue = false;
8446 bool foundfalse = false;
8447 for(int i=0;i<count;i++)
8448 {
8449 Point p = obj.FacePoint(face,i);
8450 bool b = obj2.Inside(p);
8451 if (b) { foundtrue = true; }
8452 else { foundfalse = true; }
8453 }
8454 if (foundtrue && foundfalse)
8455 return EIntersect;
8456 if (foundtrue)
8457 return EDraw;
8458 if (foundfalse)
8459 return EDoNotDraw;
8460 return EIntersect;
8461 }
8462private:
8465 //Matrix invbox;
8466};
8467
8468#if 0
8469class IsChangingFace : public Function<int, bool>
8470{
8471public:
8472 IsChangingFace(const std::vector<FaceCollection*> &v) : v(v) { }
8473 bool Index(int id) const
8474 {
8475 int s = v.size();
8476 for(int f=0;f<v[0]->NumPoints(id);f++)
8477 {
8478 Point p = v[0]->FacePoint(id,0);
8479 for(int i=1;i<s;i++)
8480 {
8481 Point p2 = v[i]->FacePoint(id,f);
8482 if ((p2-p).Dist()>0.002) return true;
8483 }
8484 }
8485 return false;
8486 }
8487private:
8488 const std::vector<FaceCollection*> &v;
8489};
8490#endif
8491
8492#if 0
8493class FilterFaces : public ForwardFaceCollection
8494{
8495public:
8496 FilterFaces(FaceCollection &obj, Function<int, bool> &func) : ForwardFaceCollection(obj), obj(obj), func(func) { }
8497 void Collect(CollectVisitor &vis)
8498 {
8499 }
8500 void HeavyPrepare() { }
8501
8502 void Prepare() { obj.Prepare(); }
8503 int NumFaces() const
8504 {
8505 int c=obj.NumFaces();
8506 int count = 0;
8507 for(int i=0;i<c;i++)
8508 {
8509 bool b = func.Index(i);
8510 if (b) count++;
8511 }
8512 return count;
8513 }
8514 int NumPoints(int face) const
8515 {
8516 return obj.NumPoints(Mapping(face));
8517 }
8518 Point FacePoint(int face, int point) const
8519 {
8520 return obj.FacePoint(Mapping(face), point);
8521 }
8522 Point EndFacePoint(int face, int point) const
8523 {
8524 return obj.EndFacePoint(Mapping(face), point);
8525 }
8526 unsigned int Color(int face, int point) const
8527 {
8528 return obj.Color(Mapping(face), point);
8529 }
8530 Point2d TexCoord(int face, int point) const
8531 {
8532 return obj.TexCoord(Mapping(face), point);
8533 }
8534
8535 Vector PointNormal(int face, int point) const
8536 {
8537 return obj.PointNormal(Mapping(face), point);
8538 }
8539 virtual float Attrib(int face, int point, int id) const
8540 {
8541 return obj.Attrib(Mapping(face), point, id);
8542 }
8543 virtual int AttribI(int face, int point, int id) const
8544 {
8545 return obj.AttribI(Mapping(face),point,id);
8546 }
8547
8548private:
8549 int Mapping(int ii) const
8550 {
8551 int count=0;
8552 int num = obj.NumFaces();
8553 for(int i=0;i<num;i++)
8554 {
8555 bool b = func.Index(i);
8556 if (b)
8557 {
8558 if (count == ii) return i;
8559 count++;
8560 }
8561 }
8562 return 0;
8563 }
8564
8565private:
8566 FaceCollection &obj;
8567 Function<int,bool> &func;
8568};
8569#endif
8570
8571#if 0
8572class SplitPolygons : public FaceCollection
8573{
8574public:
8575 SplitPolygons(FaceCollection &a1, FaceCollection &a2, BooleanOps &ops, bool b) : a1(a1), a2(a2), ops(ops), points1(a1), points2(a2), b(b) { }
8576
8577 void Collect(CollectVisitor &vis)
8578 {
8579 a1.Collect(vis); a2.Collect(vis);
8580 }
8581 void HeavyPrepare() { }
8582
8583 void Prepare() { a1.Prepare(); a2.Prepare(); }
8584 int NumFaces() const { return faces.size(); }
8585 int NumPoints(int face) const { return faces[face].poly.size(); }
8586 Point FacePoint(int face, int point) const { return faces[face].poly[point]; }
8587 unsigned int Color(int face, int point) const { return Color::White().Pixel(); }
8588 virtual Point2d TexCoord(int face, int point) const
8589 {
8590 Point2d p;
8591 p.x = 0;
8592 p.y = 0;
8593 return p;
8594 }
8595
8596 Vector PointNormal(int face, int point) const
8597 {
8598 return normals[face].poly[point];
8599 }
8600 virtual float Attrib(int face, int point, int id) const
8601 {
8602 return 0.0;
8603 }
8604 virtual int AttribI(int face, int point, int id) const
8605 {
8606 return 0;
8607 }
8608
8609 struct OnePolygon
8610 {
8611 std::vector<Point> poly;
8612 };
8613 struct OneNormal
8614 {
8615 std::vector<Vector> poly;
8616 };
8617
8618 void DoSplitting();
8619
8620private:
8621 FaceCollection &a1;
8622 FaceCollection &a2;
8623 BooleanOps &ops;
8624 FaceCenterPoints points1, points2;
8625 std::vector<OnePolygon> faces;
8626 std::vector<OneNormal> normals;
8627 bool b;
8628};
8629
8630#endif
8631
8632template<class A>
8633class MemoizeFunction : public Function<int,A>
8634{
8635public:
8636 MemoizeFunction(int count, Function<int,A> &func) : func(func), array(count), toggle(count)
8637 {
8638 for(int i=0;i<count;i++) toggle[i]=false;
8639 }
8640
8641 A Index(int val) const
8642 {
8643 if (toggle[val]==false)
8644 {
8645 toggle[val]=true;
8646 array[val]=func.Index(val);
8647 }
8648 return array[val];
8649 }
8650private:
8652 mutable std::vector<A> array;
8653 mutable std::vector<char> toggle;
8654};
8655
8656template<class A>
8657class MemoizeArray : public Array<int,A>
8658{
8659public:
8660 MemoizeArray(int count, Array<int,A> &func) : func(func), array(count), toggle(count), count(count)
8661 {
8662 for(int i=0;i<count;i++) toggle[i]=false;
8663 }
8664
8665 A Index(int val) const
8666 {
8667 if (toggle[val]==false)
8668 {
8669 toggle[val]=true;
8670 array[val]=func.Index(val);
8671 }
8672 return array[val];
8673 }
8674 int Size() const { return count; }
8675private:
8677 mutable std::vector<A> array;
8678 mutable std::vector<char> toggle;
8679 int count;
8680};
8681
8682
8683
8684
8686{
8687public:
8688 MemoizeFaces(FaceCollection &c) : ForwardFaceCollection(c), c(c), numfaces(-1),mutex(PTHREAD_MUTEX_INITIALIZER) { }
8689 //MemoizeFaces(const MemoizeFaces &c) : c(c.c), numfaces(c.numfaces), numpoints(c.numpoints), facepoint(c.facepoint), color(c.color), normal(c.normal), facetexture(c.facetexture),mutex(PTHREAD_MUTEX_INITIALIZER)
8690 //{
8691 // }
8692 virtual std::string name() const { return "MemoizeFaces"; }
8694 {
8695 c.Collect(vis);
8696 }
8697 void HeavyPrepare() { }
8698
8699 void Prepare() { c.Prepare(); /*MemoizeAll();*/ }
8701 {
8702 pthread_mutex_lock(&mutex);
8703 numfaces=c.numfaces;
8704 numpoints=c.numpoints;
8705 facepoint=c.facepoint;
8706 color = c.color;
8707 normal=c.normal;
8708 facetexture = c.facetexture;
8709 pthread_mutex_unlock(&mutex);
8710 }
8711 void Reset()
8712 {
8713 numfaces=-1;
8714 pthread_mutex_lock(&mutex);
8715 numpoints = std::vector<int>(1);
8716 facepoint = std::map<FP,Point>();
8717 color = std::map<FP,unsigned int>();
8718 normal = std::map<FP,Vector>();
8719 facetexture = std::map<int,int>();
8720 pthread_mutex_unlock(&mutex);
8721 }
8723 {
8724 int faces = NumFaces();
8725 for(int i=0;i<faces;i++)
8726 {
8727 int points = NumPoints(i);
8728 for(int j=0;j<points;j++)
8729 {
8730 FacePoint(i,j);
8731 Color(i,j);
8732 TexCoord(i,j);
8733 PointNormal(i,j);
8734 }
8735 }
8736 }
8737 int NumFaces() const
8738 {
8739 if (numfaces==-1)
8740 {
8741 numfaces=c.NumFaces();
8742 if (numfaces > 0)
8743 numpoints.resize(numfaces);
8744 return numfaces;
8745 }
8746 return numfaces;
8747 }
8748 int NumPoints(int face) const
8749 {
8750 pthread_mutex_lock(&mutex);
8751 int i = numpoints[face];
8752 if (i==0)
8753 {
8754 numpoints[face]=c.NumPoints(face);
8755 int val = numpoints[face];
8756 pthread_mutex_unlock(&mutex);
8757 return val;
8758 }
8759 pthread_mutex_unlock(&mutex);
8760 return i;
8761 }
8762 Point FacePoint(int face, int point) const
8763 {
8764 FP fp;
8765 fp.face = face;
8766 fp.point = point;
8767 pthread_mutex_lock(&mutex);
8768 std::map<FP,Point>::iterator i = facepoint.find(fp);
8769 if (i==facepoint.end())
8770 {
8771 Point p;
8772 p=(facepoint[fp]=c.FacePoint(face, point));
8773 pthread_mutex_unlock(&mutex);
8774 return p;
8775 }
8776 Point ps = i->second;
8777 pthread_mutex_unlock(&mutex);
8778 return ps;
8779 }
8780 Point EndFacePoint(int face, int point) const
8781 {
8782 FP fp;
8783 fp.face = face;
8784 fp.point = point;
8785 pthread_mutex_lock(&mutex);
8786 std::map<FP,Point>::iterator i = endfacepoint.find(fp);
8787 if (i==endfacepoint.end())
8788 {
8789 Point p;
8790 p=(endfacepoint[fp]=c.EndFacePoint(face, point));
8791 pthread_mutex_unlock(&mutex);
8792 return p;
8793 }
8794 Point ps = i->second;
8795 pthread_mutex_unlock(&mutex);
8796 return ps;
8797 }
8798 unsigned int Color(int face, int point) const
8799 {
8800 FP fp;
8801 fp.face = face;
8802 fp.point = point;
8803 pthread_mutex_lock(&mutex);
8804 std::map<FP,unsigned int>::iterator i = color.find(fp);
8805 if (i==color.end())
8806 {
8807 unsigned int p;
8808 p=(color[fp]=c.Color(face, point));
8809 pthread_mutex_unlock(&mutex);
8810 return p;
8811 }
8812 unsigned int ps = i->second;
8813 pthread_mutex_unlock(&mutex);
8814 return ps;
8815 }
8816 virtual Point2d TexCoord(int face, int point) const
8817 {
8818 return c.TexCoord(face,point);
8819 }
8820
8821 Vector PointNormal(int face, int point) const
8822 {
8823 FP fp;
8824 fp.face = face;
8825 fp.point = point;
8826 pthread_mutex_lock(&mutex);
8827 std::map<FP,Vector>::iterator i = normal.find(fp);
8828 if (i==normal.end())
8829 {
8830 Vector p;
8831 p=(normal[fp]=c.PointNormal(face, point));
8832 pthread_mutex_unlock(&mutex);
8833 return p;
8834 }
8835 Vector ps = i->second;
8836 pthread_mutex_unlock(&mutex);
8837 return ps;
8838 }
8839 virtual float Attrib(int face, int point, int id) const
8840 {
8841 return c.Attrib(face,point, id);
8842 }
8843 virtual int AttribI(int face, int point, int id) const
8844 {
8845 return c.AttribI(face,point,id);
8846 }
8847 virtual int NumTextures() const { return c.NumTextures(); }
8848 virtual void GenTexture(int num) { c.GenTexture(num); }
8849 virtual BufferRef TextureBuf(int num) const { return c.TextureBuf(num); }
8850
8851 virtual int FaceTexture(int face) const
8852 {
8853 pthread_mutex_lock(&mutex);
8854
8855 std::map<int,int>::iterator i = facetexture.find(face);
8856 if (i==facetexture.end())
8857 {
8858 int p;
8859 p = (facetexture[face]=c.FaceTexture(face));
8860 pthread_mutex_unlock(&mutex);
8861 return p;
8862 }
8863 int ps = i->second;
8864 pthread_mutex_unlock(&mutex);
8865 return ps;
8866 }
8867
8868private:
8869 struct FP
8870 {
8871 int face;
8872 int point;
8873 friend bool operator<(const FP &a, const FP &b)
8874 {
8875 if (a.face<b.face) return true;
8876 else if (b.face < a.face) return false;
8877 if (a.face==b.face)
8878 {
8879 if (a.point<b.point) return true;
8880 else if (b.point<a.point) return false;
8881 }
8882 return false;
8883
8884 }
8885 };
8886 FaceCollection &c;
8887 mutable int numfaces;
8888 mutable std::vector<int> numpoints;
8889 mutable std::map<FP, Point> facepoint;
8890 mutable std::map<FP, Point> endfacepoint;
8891 mutable std::map<FP, unsigned int> color;
8892 mutable std::map<FP, Vector> normal;
8893 mutable std::map<int, int> facetexture;
8894 mutable pthread_mutex_t mutex;
8895};
8896
8897#if 0
8898class PreCalcThread : public FaceCollection, public Effect
8899{
8900public:
8901 int NumFaces() const
8902 {
8903 pthread_mutex_lock(&start_lock);
8904 pthread_mutex_unlock(&start_lock);
8905
8906 pthread_mutex_lock(&mutex);
8907 int t = Map(time).NumFaces();
8908 pthread_mutex_unlock(&mutex);
8909 return t;
8910 }
8911 int NumPoints(int face) const
8912 {
8913 pthread_mutex_lock(&start_lock);
8914 pthread_mutex_unlock(&start_lock);
8915
8916 pthread_mutex_lock(&mutex);
8917 int t = Map(time).NumPoints(face);
8918 pthread_mutex_unlock(&mutex);
8919 return t;
8920 }
8921 Point FacePoint(int face, int point) const
8922 {
8923 pthread_mutex_lock(&start_lock);
8924 pthread_mutex_unlock(&start_lock);
8925
8926 pthread_mutex_lock(&mutex);
8927 Point p = Map(time).FacePoint(face,point);
8928 pthread_mutex_unlock(&mutex);
8929 return p;
8930 }
8931 Vector PointNormal(int face, int point) const
8932 {
8933 pthread_mutex_lock(&start_lock);
8934 pthread_mutex_unlock(&start_lock);
8935
8936 pthread_mutex_lock(&mutex);
8937 Vector v = Map(time).PointNormal(face,point);
8938 pthread_mutex_unlock(&mutex);
8939 return v;
8940 }
8941 virtual float Attrib(int face, int point, int id) const
8942 {
8943 return 0.0;
8944 }
8945 virtual int AttribI(int face, int point, int id) const
8946 {
8947 return 0;
8948 }
8949
8950 const MemoizeFaces &Map(float time) const
8951 {
8952 SawWaveform saw;
8953 FitWaveform fit(saw, 150.0, 0.0, (float)framelist.size());
8954 RepeatWaveform rep(fit, 50);
8955 const MemoizeFaces &ref = framelist[(int)rep.Index(time)];
8956 return ref;
8957 }
8958
8959 static void* precalc(void *arg)
8960 {
8961 PreCalcThread *t = (PreCalcThread*) arg;
8962 float time = 0.0;
8963 bool first = true;
8964 while(time <1000.0)
8965 {
8966 t->eff.ChangeTime(time);
8967 time+=100.0;
8968 MemoizeFaces m(t->fc);
8969 int num = m.NumFaces();
8970 for(int i=0;i<num;i++)
8971 {
8972 int p = m.NumPoints(i);
8973 for(int ii=0;ii<p;ii++)
8974 {
8975 m.FacePoint(i,ii);
8976 m.PointNormal(i,ii);
8977 }
8978 }
8979 pthread_mutex_lock(&t->mutex);
8980 t->framelist.push_back(m);
8981 pthread_mutex_unlock(&t->mutex);
8982 if (first) { pthread_mutex_unlock(&t->start_lock); first=false; }
8983 }
8984 return 0;
8985 }
8986 float Length() const { return eff.Length(); }
8987 void ChangeTime(float t) { time = t; }
8988 PreCalcThread(FaceCollection &fc, Effect &eff) : fc(fc), eff(eff)
8989 {
8990 pthread_mutex_init(&mutex, 0);
8991 pthread_mutex_init(&start_lock, 0);
8992 pthread_mutex_lock(&start_lock);
8993 pthread_create(&thread, 0, &precalc, this);
8994 }
8995 ~PreCalcThread()
8996 {
8997 pthread_mutex_destroy(&mutex);
8998 //pthread_destroy(&thread);
8999 }
9000private:
9001 FaceCollection &fc;
9002 Effect &eff;
9003 pthread_t thread;
9004 mutable pthread_mutex_t mutex;
9005 mutable pthread_mutex_t start_lock;
9006 std::vector<MemoizeFaces> framelist;
9007 float time;
9008};
9009
9010#endif
9011
9012#if 0
9013class RemovePolys : public Function<int, bool>
9014{
9015public:
9016 RemovePolys(BoxableFaceCollection &obj, BoxableFaceCollection &obj2, FaceType test=EDoNotDraw) : func(obj,obj2), equal(test), compose(func, equal) { }
9017 bool Index(int face) const { return compose.Index(face); }
9018private:
9019 RemovePolysFunc func;
9020 IsEqualFunc<FaceType> equal;
9021 ComposeFunc<int, FaceType, bool> compose;
9022};
9023#endif
9024
9025#if 0
9026class IntersectFaces : public FaceCollection
9027{
9028public:
9029 IntersectFaces(BoxableFaceCollection &obj1, BoxableFaceCollection &obj2) : func(obj1, obj2), isequal(EIntersect), compose(func, isequal), filter(obj1, compose), memo(filter) { }
9030 void Collect(CollectVisitor &vis)
9031 {
9032 }
9033 void HeavyPrepare() { }
9034
9035
9036 void Prepare() { }
9037 virtual int NumFaces() const { return memo.NumFaces(); }
9038 virtual int NumPoints(int face) const { return memo.NumPoints(face); }
9039 virtual Point FacePoint(int face, int point) const { return memo.FacePoint(face,point); }
9040 virtual Point EndFacePoint(int face, int point) const { return memo.EndFacePoint(face,point); }
9041 virtual unsigned int Color(int face, int point) const { return memo.Color(face, point); }
9042 virtual Point2d TexCoord(int face, int point) const { return memo.TexCoord(face, point); }
9043 virtual Vector PointNormal(int face, int point) const { return memo.PointNormal(face, point); }
9044 virtual float Attrib(int face, int point, int id) const { return memo.Attrib(face,point,id); }
9045 virtual int AttribI(int face, int point, int id) const
9046 {
9047 return memo.AttribI(face,point,id);
9048 }
9049
9050private:
9051 RemovePolysFunc func;
9052 IsEqualFunc<FaceType> isequal;
9053 ComposeFunc<int, FaceType, bool> compose;
9054 FilterFaces filter;
9055 MemoizeFaces memo;
9056};
9057#endif
9058
9059#if 0
9060class AndNotElem : public BoxableFaceCollection
9061{
9062public:
9063 AndNotElem(BoxableFaceCollection &o1, BoxableFaceCollection &o2) : o1(o1), o2(o2), rem(o1, o2), mem(o1.NumFaces(), rem), rem2(o2,o1, EDraw), mem2(o2.NumFaces(), rem2), f1(o1, mem), f2(o2, mem2), iface(o1,o2), iface2(o2,o1), split1(iface, iface2, o2, true), split2(iface2, iface, o1, false), or_elem(&f1, &f2, &split1, &split2)
9064 {
9065 }
9066 void Collect(CollectVisitor &vis) { o1.Collect(vis); o2.Collect(vis); }
9067 void HeavyPrepare() { }
9068 void Prepare() { o1.Prepare(); o2.Prepare(); }
9069 void DoSplitting()
9070 {
9071 split1.DoSplitting();
9072 split2.DoSplitting();
9073 }
9074 int NumFaces() const { return or_elem.NumFaces(); }
9075 int NumPoints(int face) const { return or_elem.NumPoints(face); }
9076 Point FacePoint(int face, int point) const { return or_elem.FacePoint(face,point); }
9077 unsigned int Color(int face, int point) const { return or_elem.Color(face,point); }
9078 Point2d TexCoord(int face, int point) const { return or_elem.TexCoord(face,point); }
9079 Vector PointNormal(int face, int point) const { return or_elem.PointNormal(face,point); }
9080 virtual float Attrib(int face, int point, int id) const { return or_elem.Attrib(face,point,id); }
9081 virtual int AttribI(int face, int point, int id) const
9082 {
9083 return or_elem.AttribI(face,point,id);
9084 }
9085
9086 void SetBox(Matrix b) { /*o1.SetBox(b); o2.SetBox(b);*/ }
9087 bool Inside(Point p) const { return o1.Inside(p) && !o2.Inside(p); }
9088private:
9089 BoxableFaceCollection &o1, &o2;
9090 RemovePolys rem;
9091 MemoizeFunction<bool> mem;
9092 RemovePolys rem2;
9093 MemoizeFunction<bool> mem2;
9094 FilterFaces f1;
9095 FilterFaces f2;
9096 IntersectFaces iface;
9097 IntersectFaces iface2;
9098 SplitPolygons split1;
9099 SplitPolygons split2;
9100 OrElem<FaceCollection> or_elem;
9101};
9102#endif
9104{
9105public:
9106 RectangleElem(float x, float y) : x(x/2.0), y(y/2.0) { }
9107 virtual std::string name() const { return "RectangleElem"; }
9109 {
9110 }
9111 void HeavyPrepare() { }
9112
9113 void Prepare() { }
9114 int NumFaces() const { return 1; }
9115 int NumPoints(int face) const { return 4; }
9116 Point FacePoint(int face, int point) const
9117 {
9118 switch(point)
9119 {
9120 case 1: return Point(-x,-y,0.0);
9121 case 2: return Point(-x,y,0.0);
9122 case 3: return Point(x,y,0.0);
9123 case 0: return Point(x,-y,0.0);
9124 };
9125 return Point(0.0,0.0,0.0);
9126 }
9127 unsigned int Color(int face, int point) const
9128 {
9129 return Color::White().Pixel();
9130 }
9131 virtual Point2d TexCoord(int face, int point) const
9132 {
9133 Point2d p;
9134 p.x = 0;
9135 p.y = 0;
9136 return p;
9137 }
9138
9139 Vector PointNormal(int face, int point) const
9140 {
9141 return Vector(1.0,0.0,0.0);
9142 }
9143 virtual int AttribI(int face, int point, int id) const
9144 {
9145 return 0;
9146 }
9147 float Attrib(int /*face*/, int point, int id) const
9148 {
9149 switch(id)
9150 {
9151 case AttrInternalX:
9152 switch(point)
9153 {
9154 case 0: return -1.0;
9155 case 1: return -1.0;
9156 case 2: return 1.0;
9157 case 3: return 1.0;
9158 };
9159 case AttrInternalY:
9160 switch(point)
9161 {
9162 case 0: return -1.0;
9163 case 1: return 1.0;
9164 case 2: return 1.0;
9165 case 3: return -1.0;
9166 };
9167 };
9168 return 0.0;
9169 }
9170 void SetBox(Matrix b) { }
9171 bool Inside(Point p) const { return false; }
9172private:
9173 float x,y;
9174};
9175
9177{
9178public:
9179 RenderBox(int sx, int sy, int sz, float sizex, float sizey, float sizez) : sx(sx), sy(sy), sz(sz), sizex(sizex), sizey(sizey), sizez(sizez) { }
9180 int NumFaces() const { return sx+sy+sz; }
9181 int NumPoints(int face) const { return 4; }
9182 Point FacePoint(int face, int point) const
9183 {
9184 if (face < sx)
9185 {
9186 int face2 = face - 0;
9187 float pos_x = (float(face2)/sx)*2.0-1.0;
9188 float p_y_0 = -1.0;
9189 float p_y_1 = 1.0;
9190 float p_z_0 = -1.0;
9191 float p_z_1 = 1.0;
9192 float p_y;
9193 float p_z;
9194 if (point == 0) { p_y = p_y_0; p_z = p_z_0; }
9195 if (point == 1) { p_y = p_y_1; p_z = p_z_0; }
9196 if (point == 2) { p_y = p_y_1; p_z = p_z_1; }
9197 if (point == 3) { p_y = p_y_0; p_z = p_z_1; }
9198 return InternalToVisible(Point(pos_x, p_y, p_z));
9199 }
9200 else if (face < sx+sy)
9201 {
9202 int face2 = face - sx;
9203 float p_x_0 = -1.0;
9204 float p_x_1 = 1.0;
9205 float pos_y = 2.0*float(face2)/sy-1.0;
9206 float p_z_0 = -1.0;
9207 float p_z_1 = 1.0;
9208 float p_x;
9209 float p_z;
9210 if (point == 0) { p_x = p_x_0; p_z = p_z_0; }
9211 if (point == 1) { p_x = p_x_1; p_z = p_z_0; }
9212 if (point == 2) { p_x = p_x_1; p_z = p_z_1; }
9213 if (point == 3) { p_x = p_x_0; p_z = p_z_1; }
9214 return InternalToVisible(Point(p_x, pos_y, p_z));
9215 }
9216 else
9217 {
9218 int face2 = face - sy - sx;
9219 float p_x_0 = -1.0;
9220 float p_x_1 = 1.0;
9221 float p_y_0 = -1.0;
9222 float p_y_1 = 1.0;
9223 float pos_z = 2.0*float(face2)/sz-1.0;
9224 float p_x;
9225 float p_y;
9226 if (point == 0) { p_x = p_x_0; p_y = p_y_0; }
9227 if (point == 1) { p_x = p_x_1; p_y = p_y_0; }
9228 if (point == 2) { p_x = p_x_1; p_y = p_y_1; }
9229 if (point == 3) { p_x = p_x_0; p_y = p_y_1; }
9230 return InternalToVisible(Point(p_x, p_y, pos_z));
9231 }
9232 }
9234 {
9235 p.x *= sizex;
9236 p.y *= sizey;
9237 p.z *= sizez;
9238 return p;
9239 }
9241 {
9242 p.x /= sizex;
9243 p.y /= sizey;
9244 p.z /= sizez;
9245 return p;
9246 }
9247
9248 unsigned int Color(int face, int point) const
9249 {
9250 return Color::White().Pixel();
9251 }
9252 virtual Point2d TexCoord(int face, int point) const
9253 {
9254 Point2d p;
9255 p.x = 0;
9256 p.y = 0;
9257 return p;
9258 }
9259
9260 Vector PointNormal(int face, int point) const
9261 {
9262 return Vector(1.0,0.0,0.0);
9263 }
9264 virtual int AttribI(int face, int point, int id) const
9265 {
9266 return 0;
9267 }
9268
9269 float Attrib(int face, int point, int id) const
9270 {
9271 Point p = FacePoint(face,point);
9272 Point p2 = VisibleToInternal(p);
9273
9274 float val=0.0;
9275 switch(id)
9276 {
9277 case AttrInternalX: val = p2.x; break;
9278 case AttrInternalY: val = p2.y; break;
9279 case AttrInternalZ: val = p2.z; break;
9280 case AttrInternalObjX:
9281 if (point == 0) { val = -1.0; }
9282 if (point == 1) { val = -1.0; }
9283 if (point == 2) { val = 1.0; }
9284 if (point == 3) { val = 1.0; }
9285 break;
9286 case AttrInternalObjY:
9287 if (point == 0) { val = -1.0; }
9288 if (point == 1) { val = 1.0; }
9289 if (point == 2) { val = 1.0; }
9290 if (point == 3) { val = -1.0; }
9291 break;
9292 };
9293
9294 return val;
9295 }
9296 void SetBox(Matrix b) { }
9297 bool Inside(Point p) const { return false; }
9298private:
9299 int sx,sy,sz;
9300 float sizex, sizey, sizez;
9301};
9302
9304{
9305public:
9306 SphereElem(int numfaces, int numfaces2) : numfaces(numfaces), numfaces2(numfaces2), center(Point(0.0,0.0,0.0)), radius(1.0) { }
9307 SphereElem(Point center, float radius, int numfaces1, int numfaces2);
9308 virtual std::string name() const { return "SphereElem"; }
9309
9310 virtual void SetBox(Matrix b) { /*box = b; inverted=false; */}
9312 {
9313 }
9314 void HeavyPrepare() { }
9315
9316 void Prepare() {}
9317 virtual int NumFaces() const;
9318 virtual int NumPoints(int face) const { return 4; }
9319 virtual Point FacePoint(int face, int point) const;
9320 virtual unsigned int Color(int face, int point) const
9321 {
9322 return Color::White().Pixel();
9323 }
9324 virtual bool has_texcoord() const { return true; }
9325 virtual Point2d TexCoord(int face, int point) const;
9326 virtual int AttribI(int face, int point, int id) const
9327 {
9328 return 0;
9329 }
9330
9331 virtual float Attrib(int face, int point, int id) const
9332 {
9333 return 0.0;
9334 }
9335 virtual bool Inside(Point p) const
9336 {
9337 p-=center;
9338 Vector v = p;
9339 //if (!inverted) { boxinv=Matrix::Inverse(box); inverted=true; }
9340 Point pp = v;
9341
9342 return pp.x*pp.x+pp.y*pp.y+pp.z*pp.z<radius*radius;
9343 }
9344
9345 virtual bool has_normal() const { return true; }
9346 virtual Vector PointNormal(int face, int point) const
9347 {
9348 Vector v = FacePoint(face, point);
9349 Point p = v;
9350 p-=center;
9351 Vector vv = p;
9352 //Vector center = Vector(box.matrix[3], box.matrix[7], box.matrix[11]);
9353 return vv; /*-center*/;
9354 }
9355private:
9356 //Matrix box;
9357 //mutable Matrix boxinv;
9358 int numfaces;
9359 int numfaces2;
9360 Point center;
9361 float radius;
9362 //mutable bool inverted;
9363};
9365#undef rad1
9366#undef rad2
9367
9369{
9370public:
9371 NormalizedPlane(Plane pl) : m_pl(pl) { m_pl.Normalize(); }
9373};
9374
9376{
9377public:
9378 ConeElem(int numfaces, Point p1, Point p2, float rad1, float rad2);
9379 ConeElem(int numfaces, Point p1, Point p2, float rad1, float rad2, Plane pl1_, Plane pl2_);
9380 virtual std::string name() const { return "ConeElem"; }
9382 {
9383 }
9384 void HeavyPrepare() { }
9385
9386 void Prepare() { }
9387 virtual void SetBox(Matrix b) { /*box = b;*/ }
9388 virtual int NumFaces() const { return numfaces; }
9389 virtual int NumPoints(int face) const { return 4; }
9390 virtual Point FacePoint(int face, int point) const;
9391 virtual unsigned int Color(int face, int point) const
9392 {
9393 return Color::White().Pixel();
9394 }
9395 virtual bool has_texcoord() const { return true; }
9396 virtual Point2d TexCoord(int face, int point) const
9397 {
9398 Point2d p;
9399 p.x = 0;
9400 p.y = 0;
9401 return p;
9402 }
9403 virtual int AttribI(int face, int point, int id) const
9404 {
9405 return 0;
9406 }
9407
9408 virtual float Attrib(int face, int point, int id) const
9409 {
9410 return 0.0;
9411 }
9412 virtual bool Inside(Point p) const
9413 {
9414 return false;
9415 }
9416
9417 virtual bool has_normal() const { return true; }
9418 virtual Vector PointNormal(int face, int point) const
9419 {
9420 Point pp1 = FacePoint(face,0);
9421 Point pp2 = FacePoint(face,1);
9422 Point pp3 = FacePoint(face,2);
9423 Vector u_x = pp2-pp1;
9424 Vector u_y = pp3-pp1;
9425 Vector v = Vector::CrossProduct(u_x, u_y);
9426 return v/v.Dist();
9427
9428 /*
9429 Point p;
9430 switch(point)
9431 {
9432 case 0: case 3: p=p1; break;
9433 case 1: case 2: p=p2; break;
9434 };
9435 Vector v = FacePoint(face, point);
9436 Vector center = p;
9437 return v-center;
9438 */
9439 }
9440private:
9441 //Matrix box;
9442 int numfaces;
9443 Point p1, p2;
9444 float rad1, rad2;
9445 LineProperties lp;
9446 NormalizedPlane pl1, pl2;
9447 Point2d pp = { 0.0, 0.0 };
9448 Circle c1,c2;
9449 PlaneCurveIn3d curve1,curve2;
9450 SampleCurve3d sample1, sample2;
9451};
9453
9454
9455
9457{
9458public:
9459 TransformPoints(const PointCollection &coll, Matrix m) : coll(coll), m(m) { }
9460 int Size() const { return coll.Size(); }
9461 Point Index(int i) const
9462 {
9463 return coll.Index(i)*m;
9464 }
9465private:
9466 const PointCollection &coll;
9467 Matrix m;
9468};
9470
9471class PointsGrid : public GridIn3d
9472{
9473public:
9474 PointsGrid(const PointVectorCollection &points, const BoxCollection &boxes) : points(points), boxes(boxes) { }
9475 virtual Point Index(int x, int y) const
9476 {
9477 Point p = points.Index(x).first;
9478 Matrix m = boxes.Index(y);
9479 return p*m;
9480 }
9481 virtual Point2d Texture(int x, int y) const { Point2d p; p.x = 0.0; p.y=0.0; return p; }
9482 virtual unsigned int Color(int x, int y) const
9483 {
9484 return Color::White().Pixel();
9485 }
9486 virtual Point2d TexCoord(int face, int point) const
9487 {
9488 Point2d p;
9489 p.x = 0;
9490 p.y = 0;
9491 return p;
9492 }
9493
9494 virtual bool has_normal() const { return true; }
9495 virtual Vector Normal(int x, int y) const
9496 {
9497 Vector v = points.Index(x).second;
9498 Matrix m = boxes.Index(y);
9499 return v*m;
9500 }
9501 virtual int AttribI(int face, int point, int id) const
9502 {
9503 return 0;
9504 }
9505 virtual float Attrib(int x, int y, int id) const { return 0.0; }
9506 virtual int XSize() const { return points.Size(); }
9507 virtual int YSize() const { return boxes.Size(); }
9508private:
9509 const PointVectorCollection &points; // x
9510 const BoxCollection &boxes; // y
9511};
9512
9514{
9515public:
9516 virtual void SetTime(float time)=0;
9517 virtual void SetMatrix(Matrix m)=0;
9518 virtual void RenderFaces(const FaceCollection &col)=0;
9519 virtual void RenderFaces(const FaceCollection &col, const TextureCoords &tex)=0;
9520 virtual void RenderFacesTexture(const FaceCollection &col)=0;
9521
9522 virtual void RenderLines(const LineCollection &col)=0;
9523 virtual void RenderPoly(const PointCollection &col)=0;
9524 virtual void* CreateState()=0;
9525 virtual void UpdateVBO(const FaceCollection &faces, void *state)=0;
9526 virtual void DrawVBO(void *state)=0;
9527 virtual void DestroyState(void *state)=0;
9528
9529 virtual void Show() { }
9530};
9531
9532class SDLRender : public Render
9533{
9534public:
9535 void SetTime(float time);
9536 void SetMatrix(Matrix m);
9537 void RenderFaces(const FaceCollection &col);
9538 void RenderFaces(const FaceCollection &col, const TextureCoords &tex);
9540 {
9541 FaceCollectionTextureCoords coords(col);
9542 RenderFaces(col, coords);
9543 }
9544 void RenderLines(const LineCollection &col);
9545 void RenderPoly(const PointCollection &col);
9546 void* CreateState();
9547 void UpdateVBO(const FaceCollection &faces, void *state);
9548 void DrawVBO(void *state);
9549 void DestroyState(void *state);
9550};
9551
9553{
9554public:
9555 RenderState(Render &r) : r(r) { state = r.CreateState(); }
9556 void *GetState() const { return state; }
9557 ~RenderState() { r.DestroyState(state); }
9558private:
9559 Render &r;
9560 void *state;
9561};
9562
9564void RenderOpenGl(const FaceCollection &col);
9565void RenderOpenGlTextures(const FaceCollection &col);
9566void RenderOpenGl(const FaceCollection &col, Function<int, bool> &removepolys);
9567void RenderOpenGl(const FaceCollection &col, ElementCollection &nums);
9568void RenderOpenGl(const FaceCollection &col, const BoxCollection &b, Boxable &elem);
9569
9570void RenderOpenGl(const FaceCollection &col, const TextureCoords &tex);
9571void RenderOpenGl(const FaceCollection &col, ElementCollection &nums, const TextureCoords &tex);
9572void RenderOpenGl(const FaceCollection &col, const BoxCollection &b, Boxable &elem, const TextureCoords &tex);
9573
9574void RenderOpenGlLines(const LineCollection &col);
9575void RenderOpenGlLines(const LineCollection &col, ElementCollection &nums);
9576void RenderOpenGlLines(const LineCollection &col, const BoxCollection &b, Boxable &elem);
9577
9578void RenderOpenGlPoly(const PointCollection &col);
9579void RenderOpenGl(const LineCollection &col);
9580void RenderOpenGl(const PointCollection &col);
9581
9582template<class T>
9584{
9585 int count = array.Size();
9586 for(int i=0;i<count;i++)
9587 {
9588 RenderOpenGl(*array.Index(i));
9589 }
9590}
9591
9592
9593class BoxCombine : public virtual ElementCollection
9594{
9595public:
9596 BoxCombine(const BoxCollection &b, Boxable &elem) : b(b), elem(elem) { }
9597
9598 virtual int NumElements() const { return b.NumBoxes(); }
9599 virtual void SetElemId(int id) { elem.SetBox(b.BoxIndex(id)); }
9600
9601private:
9602 const BoxCollection &b;
9603 Boxable &elem;
9604};
9605
9606class AnimBox : public virtual BoxCollection, public virtual Effect
9607{
9608public:
9609 AnimBox(const BoxCollection &c, const BoxCollection &c2, float length) : c(c), c2(c2), length(length) { }
9610 int Size() const { return c.NumBoxes(); }
9611 float Length() const { return length; }
9612 void ChangeTime(float t) { time = t; }
9613 Matrix Index(int box) const;
9614
9615private:
9616 const BoxCollection &c;
9617 const BoxCollection &c2;
9618 float time, length;
9619};
9620
9621class CubeGrid : public virtual BoxCollection
9622{
9623public:
9624 CubeGrid(int x, int y, int z, float dx, float dy, float dz, Matrix b)
9625 : x(x), y(y), z(z),
9626 dx(dx), dy(dy), dz(dz), b(b)
9627 { }
9628
9629 virtual int Size() const { return x*y*z; }
9630 virtual Matrix Index(int box) const;
9631
9632
9633private:
9634 int x,y,z;
9635 float dx,dy,dz;
9636 Matrix b;
9637};
9638class MatrixCollection : public virtual BoxCollection
9639{
9640public:
9641 template<class It>
9642 MatrixCollection(It beg, It end) : cont(beg, end) { }
9643 virtual int Size() const
9644 {
9645 return cont.size();
9646 }
9647 virtual Matrix Index(int box) const {
9648 return cont[box];
9649 }
9650private:
9651 std::vector<Matrix> cont;
9652
9653};
9654
9656{
9657public:
9659 int NumBoxes() const { return c.NumBoxes()*c2.NumBoxes(); }
9660 Matrix BoxIndex(int box) const
9661 {
9662 int bb = box / c2.NumBoxes();
9663 int bb2 = box - (bb*c2.NumBoxes());
9664 //std::cout << bb << " " << bb2 << std::endl;
9665 return c.BoxIndex(bb)*c2.BoxIndex(bb2);
9666 }
9667private:
9668 BoxCollection &c, &c2;
9669};
9670
9671class ArrayBox : public virtual BoxCollection
9672{
9673public:
9674 template<class It>
9675 ArrayBox(It beg, It end) : cont(beg, end) { }
9677 void push_back(BoxCollection* c) { cont.push_back(c); }
9678 virtual int Size() const
9679 {
9680 int count = 0;
9681 for(std::vector<BoxCollection*>::const_iterator i=cont.begin(); i!=cont.end();i++)
9682 count += (*i)->NumBoxes();
9683 return count;
9684 }
9685 virtual Matrix Index(int box) const {
9686 int count = 0;
9687 for(std::vector<BoxCollection*>::const_iterator i=cont.begin(); i!=cont.end();i++)
9688 {
9689 int oldcount = count;
9690 count += (*i)->NumBoxes();
9691 if (count > box) { return (*i)->BoxIndex(box-oldcount); }
9692 }
9694 return b;
9695 }
9696
9697private:
9698 std::vector<BoxCollection*> cont;
9699};
9700
9701class MatrixBox : public virtual BoxCollection
9702{
9703public:
9704 MatrixBox(BoxCollection &c, Matrix m) : m(m), c(c) { }
9705 virtual int Size() const { return c.NumBoxes(); }
9706 virtual Matrix Index(int box) const
9707 {
9708 Matrix b = c.BoxIndex(box);
9709 return b*m;
9710 }
9711private:
9712 Matrix m;
9713 BoxCollection &c;
9714};
9716
9717class UnitBox : public virtual BoxCollection
9718{
9719public:
9721 {
9722 b=Matrix::Identity();
9723 }
9724 UnitBox(Matrix m) { b=m; }
9725 virtual int Size() const { return 1; }
9726 virtual Matrix Index(int box) const { return b; }
9727private:
9728 Matrix b;
9729};
9730
9732{
9733public:
9734 SampleGrid(GridIn3d &grid, int texture) : grid(grid), texture(texture) { }
9735 virtual std::string name() const { return "SampleGrid"; }
9736
9737 int Texture(int face) const { return texture; }
9738 Point2d TexCoord(int face, int point) const
9739 {
9740 std::pair<int,int> p = Sample(face,point);
9741 Point2d pp = grid.Texture(p.first,p.second);
9742 return pp;
9743 }
9745 {
9746 }
9747 void HeavyPrepare() { }
9748 void Prepare() { }
9749 int NumFaces() const { return grid.XSize()*grid.YSize(); }
9750 int NumPoints(int face) const { return 4; }
9751 Point FacePoint(int face, int point) const
9752 {
9753 std::pair<int,int> p = Sample(face, point);
9754 Point pp = grid.Index(p.first, p.second);
9755 return pp;
9756 }
9757 unsigned int Color(int face, int point) const
9758 {
9759 std::pair<int,int> p = Sample(face, point);
9760 unsigned int color = grid.Color(p.first, p.second);
9761 return color;
9762 }
9763 Vector PointNormal(int face, int point) const
9764 {
9765 std::pair<int,int> p = Sample(face,point);
9766 Vector pp = grid.Normal(p.first, p.second);
9767 return pp;
9768 }
9769 virtual int AttribI(int face, int point, int id) const
9770 {
9771 std::pair<int,int> p = Sample(face,point);
9772 int pp = grid.AttribI(p.first, p.second, id);
9773 return pp;
9774 }
9775 virtual float Attrib(int face, int point, int id) const
9776 {
9777 std::pair<int,int> p = Sample(face,point);
9778 float pp = grid.Attrib(p.first, p.second, id);
9779 return pp;
9780 }
9781private:
9782 std::pair<int,int> Sample(int face, int point) const
9783 {
9784 int yindex = face/grid.XSize();
9785 int ddy = face - yindex*grid.XSize();
9786 int xindex = ddy;
9787 if (point==1 || point==2) xindex++;
9788 if (point==2 || point==3) yindex++;
9789 //if (xindex > grid.XSize()-1) xindex=grid.XSize()-1;
9790 //if (yindex > grid.YSize()-1) yindex=grid.YSize()-1;
9791 xindex = xindex % grid.XSize();
9792 yindex = yindex % grid.YSize();
9793 return std::make_pair(xindex, yindex);
9794 }
9795private:
9796 GridIn3d &grid;
9797 int texture;
9798};
9800
9802{
9803public:
9804 DiffVectorCollection(PointCollection &points, bool loops) : points(points), loops(loops) { }
9805 int Size() const { if (loops) return points.Size()+1; return points.Size(); }
9806 Vector Index(int index) const
9807 {
9808 if (index==Size()-1 && loops) return points.Index(0)-points.Index(index-1);
9809 if (index==0) return Vector(0.0,0.0,0.0);
9810 return points.Index(index)-points.Index(index-1);
9811 }
9812private:
9813 PointCollection &points;
9814 bool loops;
9815};
9816
9818{ // to be used with pointvectorrepeat
9819 // pos = [0..1]
9820public:
9821 PointVectorInterpolate(PointVectorCollection &coll, float pos) : coll(coll), pos(pos) { }
9822 int Size() const { return coll.Size(); }
9823 Point Index(int i) const
9824 {
9825 std::pair<Point,Vector> p = coll.Index(i);
9826 return p.first + p.second*pos;
9827 }
9828private:
9830 float pos;
9831};
9832
9834{
9835public:
9836 PointVectorRepeat(CurveIn2d &curve, Plane pl, int numobjects, bool loops) : curve3d(curve, pl), sample3d(curve3d, numobjects-1), diff3d(sample3d, loops) { }
9837 int Size() const
9838 {
9839 return sample3d.Size();
9840 }
9841 std::pair<Point,Vector> Index(int i) const
9842 {
9843 Point p = sample3d.Index(i);
9844 Vector v = diff3d.Index(i+1);
9845 return std::make_pair(p,v);
9846 }
9847
9848private:
9849 PlaneCurveIn3d curve3d;
9850 SampleCurve3d sample3d;
9851 DiffVectorCollection diff3d;
9852};
9853
9854
9855class SpanObject : public GridIn3d
9856{
9857public:
9858 SpanObject(PointCollection &points, PointCollection &points2, MatrixCurve &contobject) : points(points), vectors(diff), d(vectors), s(d, 0.0), contobject(contobject), id(1.0), diff(points2, true), points2(points2), dist(d.Sum()) { }
9859 SpanObject(PointCollection &points, PointCollection &points2) : points(points), vectors(diff), d(vectors), s(d, 0.0), contobject(id), id(1.0), diff(points2, true), points2(points2), dist(d.Sum()) { }
9860 Point Index(int x, int y) const
9861 {
9862 Point p = points.Points(x);
9863 //Matrix mm = Matrix::Identity();
9864 p += Vector(points2.Points(y)-points2.Points(0.0));
9865 //for(int yy=0;yy<y;yy++)
9866 //{
9867 // p += vectors.Vectors(yy);
9868 //mm = contobject.Index(s.Index(yy))*mm;
9869 // }
9870 Matrix m = contobject.Index(s.Index(y)/dist*contobject.Size());
9871 return p*m;
9872 }
9873 Point2d Texture(int x, int y) const
9874 {
9875 Point2d p;
9876 p.x = 0.0;
9877 p.y = 0.0;
9878 return p;
9879 }
9880 unsigned int Color(int x, int y) const
9881 {
9882 return Color::White().Pixel();
9883 }
9884 Vector Normal(int x, int y) const
9885 {
9886 Point p = Index(x,y);
9887 Point p2 = Index((x+1) % XSize(),y);
9888 Point p3 = Index(x,(y+1) % YSize());
9889 return -Vector::CrossProduct(p2-p, p3-p);
9890 }
9891
9892
9893 virtual float Attrib(int x, int y, int id) const
9894 {
9895 return 0.0;
9896 }
9897 virtual int AttribI(int x, int y, int id) const
9898 {
9899 return 0;
9900 }
9901 int XSize() const
9902 {
9903 return points.NumPoints();
9904 }
9905 int YSize() const
9906 {
9907 return vectors.NumVectors();
9908 }
9909private:
9910 PointCollection &points;
9911 VectorCollection &vectors;
9912 Distance d;
9914 const MatrixCurve &contobject;
9916 std::vector<Vector> v;
9918 PointCollection &points2;
9919 float dist;
9920};
9921
9922#if 0
9923class MoveInPair : public Function<std::pair<Point,Point>, std::pair<Point,Point> >
9924{
9925public:
9926 MoveSecondInPair(Vector firstmove, Vector secondmove) : firstmove(firstmove), secondmove(secondmove) { }
9927 std::pair<Point,Point> Index(std::pair<Point,Point> p)
9928 {
9929 return std::make_pair(p.first + firstmove, p.second + secondmove);
9930 }
9931};
9932#endif
9933
9934#if 0
9935class SpanObject2
9936{
9937private:
9938 SpanObject2(PointCollection &points, Vector v1, Vector v2) : distfunc(v1,v2), pointpair(points, points), distance(pointpair, distfunc) { }
9939
9940
9941 MoveInPair distfunc;
9942 ArrayPair<int, int, Point, Point> pointpair;
9943 ComposeArrays<int, std::pair<Point,Point>, std::pair<Point,Point> > distance;
9944};
9945#endif
9946
9948{
9949public:
9950 TorusElem(int numfaces1, int numfaces2, Point center, Vector u_x, Vector u_y, float radius1,
9951 Vector uu_x, Vector uu_y, float radius2)
9952 : numfaces1(numfaces1), numfaces2(numfaces2), center(center), u_x(u_x), u_y(u_y), radius1(radius1),
9953 uu_x(uu_x), uu_y(uu_y), radius2(radius2) { }
9954 virtual std::string name() const { return "TorusElem"; }
9955
9956 virtual int NumFaces() const { return numfaces1*numfaces2; }
9957 virtual int NumPoints(int face) const { return 4; }
9958 virtual Point FacePoint(int face, int point) const
9959 {
9960 int face1 = face / numfaces1;
9961 int face2 = face - (face1*numfaces1);
9962
9963 if (point==1 || point==2) face1++;
9964 if (point==2 || point==3) face2++;
9965
9966 float f1 = float(face1)/numfaces2;
9967 float f2 = float(face2)/numfaces1;
9968 // now [0..1]
9969 f1*=3.14159*2.0;
9970 f2*=3.14159*2.0;
9971 Point pos = Pos(f1,f2);
9972 return pos;
9973 }
9974 bool has_normal() const { return true; }
9975 virtual Vector PointNormal(int face, int point) const
9976 {
9977 Point p1 = FacePoint(face, 0);
9978 Point p2 = FacePoint(face, 1);
9979 Point p3 = FacePoint(face, 2);
9980 return Vector::CrossProduct(p2-p1,p3-p1);
9981 }
9982 virtual unsigned int Color(int face, int point) const { return 0xffffffff; }
9983 bool has_texcoord() const { return true; }
9984 virtual Point2d TexCoord(int face, int point) const
9985 {
9986 int face1 = face / numfaces1;
9987 int face2 = face - (face1*numfaces1);
9988
9989 if (point==1 || point==2) face1++;
9990 if (point==2 || point==3) face2++;
9991
9992 float f1 = float(face1)/numfaces2;
9993 float f2 = float(face2)/numfaces1;
9994 Point2d p = { f1,f2 };
9995 return p;
9996 }
9997 virtual float Attrib(int face, int point, int id) const { return 0.0; }
9998 virtual int AttribI(int face, int point, int id) const { return 0; }
9999
10000
10001 Point Pos(float angle1, float angle2) const
10002 {
10003 Point pos1 = center + radius1*u_x*cos(angle1) + radius1*u_y*sin(angle1);
10004 Vector normal = Vector::CrossProduct(u_x, u_y);
10005 normal /= normal.Dist();
10006 Matrix m = Matrix::RotateAroundAxis(normal, angle1);
10007 Vector vv_x = uu_x*m;
10008 Vector vv_y = uu_y*m;
10009 Point pos2 = pos1 + radius2*vv_x*cos(angle2) + radius2*vv_y*sin(angle2);
10010 return pos2;
10011 }
10012private:
10013 int numfaces1, numfaces2;
10014 Point center;
10015 Vector u_x, u_y;
10016 float radius1;
10017 Vector uu_x;
10018 Vector uu_y;
10019 float radius2;
10020};
10021
10022#if 0
10023class RingElem : public SingleForwardBoxableFaceCollection
10024{
10025public:
10026 RingElem(const PointVectorCollection &points, float x, int steps)
10027 : mcurve(x), sample(mcurve, steps), grid(points, sample), faces(grid, 0)
10028 { }
10029 void SetBox(Matrix m) { }
10030 void Collect(CollectVisitor &vis)
10031 {
10032 }
10033 void HeavyPrepare() { }
10034
10035 void Prepare() { }
10036 virtual int NumFaces() const { return faces.NumFaces(); }
10037 virtual int NumPoints(int face) const { return faces.NumPoints(face); }
10038 virtual Point FacePoint(int face, int point) const { return faces.FacePoint(face,point); }
10039 virtual Vector PointNormal(int face, int point) const { return faces.PointNormal(face,point); }
10040 virtual unsigned int Color(int face, int point) const { return faces.Color(face, point); }
10041 virtual Point2d TexCoord(int face, int point) const
10042 {
10043 Point2d p;
10044 p.x = 0;
10045 p.y = 0;
10046 return p;
10047 }
10048
10049 virtual float Attrib(int face, int point, int id) const { return faces.Attrib(face,point,id); }
10050 virtual int AttribI(int face, int point, int id) const
10051 {
10052 return faces.AttribI(face,point,id);
10053 }
10054
10055private:
10056 CircleMatrixCurve mcurve;
10057 SampleMatrixCurve sample;
10058 PointsGrid grid;
10059 SampleGrid faces;
10060};
10061
10063#endif
10064
10065class Blob
10066{
10067public:
10068 // x_0 = center of sphere1, x_1 = surface point of sphere1, x_2 = center of spehere2
10069 Point line(float t, Point x_0, Point x_1) { return x_0+Vector(x_1-x_0)*t; }
10070 float f(Point p, Point x_0, Point x_1, Point x_2) { return ((p.x-x_0.x)*(p.x-x_0.x)+(p.y-x_0.y)*(p.y-x_0.y)+(p.z-x_0.z)*(p.z-x_0.z)); }
10071 float g(Point p, Point x_0, Point x_1, Point x_2) { return ((p.x-x_2.x)*(p.x-x_2.x)+(p.y-x_2.y)*(p.y-x_2.y)+(p.z-x_2.z)*(p.z-x_2.z)); }
10072
10073 float h(Point p, Point x_0, Point x_1, Point x_2, float r)
10074 {
10075 float fp = f(p, x_0, x_1, x_2);
10076 float gp = g(p, x_0, x_1, x_2);
10077 if (fp < 1.0) fp = 1.0;
10078 if (gp < 1.0) gp = 1.0;
10079 return 1.0/(fp)+1.0/(gp)-r;
10080 }
10081
10082 //float h(Point p) { return 1.0*exp(-3.0*f(p))+1.0*exp(-3.0*g(p)) - r; }
10083 float H(float tt, Point x_0, Point x_1, Point x_2, float r)
10084 {
10085 return h(line(tt, x_0, x_1), x_0, x_1, x_2, r);
10086 }
10087#if 0
10088double FalsiMethod(double s, double t, double e, int m)
10089{
10090 int n,side=0;
10091 double r=t,fr,fs = H(s),ft = H(t);
10092
10093 for (n = 1; n <= m; n++)
10094 {
10095 r = (fs*t - ft*s) / (fs - ft);
10096 if (fabs(t-s) < e*fabs(t+s)) break;
10097 fr = H(r);
10098
10099 if (fr * ft > 0)
10100 {
10101 t = r; ft = fr;
10102 if (side==-1) fs /= 2;
10103 side = -1;
10104 }
10105 else if (fs * fr > 0)
10106 {
10107 s = r; fs = fr;
10108 if (side==+1) ft /= 2;
10109 side = +1;
10110 }
10111 else break;
10112 }
10113 return r;
10114}
10115double SecantMethod(double xn_1, double xn, double e, int m)
10116{
10117 int n;
10118 double d;
10119 for (n = 1; n <= m; n++)
10120 {
10121 d = (xn - xn_1) / (H(xn) - H(xn_1)) * H(xn);
10122 if (fabs(d) < e)
10123 return xn;
10124 xn_1 = xn;
10125 xn = xn - d;
10126 }
10127 return xn;
10128}
10129#endif
10130
10131 float t(float t_0, float t_1, Point x_0, Point x_1, Point x_2, float r)
10132 {
10133 //return SecantMethod(t_0, t_1, 0.001, 100);
10134 //std::cout << "Start" << std::endl;
10135 float t;
10136 t=t_0;
10137 for(;t<t_1;)
10138 {
10139 float Ht = H(t, x_0, x_1, x_2, r);
10140 if (Ht<0.1) return t;
10141 t+=Ht/20.0;
10142 }
10143 //std::cout << "(val,t_0) =" << val << "," << t_0 << std::endl;
10144
10145 return t_0;
10146 }
10147 // this returns replacement for x_1
10148 Point adjustpoint(Point x_0, Point x_1, Point x_2, float r)
10149 {
10150 float tt = t(1.0,5.0, x_0, x_1, x_2, r);
10151 return line(tt, x_0, x_1);
10152 }
10153};
10154
10155class Ray : public Function<float, Point>
10156{
10157public:
10158 Ray(Point p, Vector v) : p(p), v(v) { }
10159 Point Index(float x) const
10160 {
10161 //std::cout << "Ray: " << p << " " << x << " " << v << std::endl;
10162 Point pp = p + x*v;
10163 //std::cout << "Ray: " << x << " " << pp << std::endl;
10164 return pp;
10165 }
10166private:
10167 Point p;
10168 Vector v;
10169};
10170template<class T>
10171class SolvableCompose : public Function<float, float>
10172{
10173public:
10175 Function<T, float> &value)
10176 : compose(curve, value) { }
10177 float Index(float x) const { return compose.Index(x); }
10178private:
10180};
10182
10183float Solve(const Function<float, float> &func, float t_0, float t_1);
10184float SolveWithFailure(const Function<float, float> &func, float t_0, float t_1, bool &success);
10185
10186
10187class Distance4 : public Function<Point, float>
10188{
10189public:
10190 Distance4(Point center) : center(center) { }
10191 float Index(Point p) const { p-=Vector(center); return sqrt(p.x*p.x+p.y*p.y+p.z*p.z); }
10192private:
10193 Point center;
10194};
10195class Derivate : public Function<float,float>
10196{
10197public:
10198 Derivate(Function<float,float> &f, float dx) : f(f), dx(dx) { }
10199 float Index(float x) const
10200 {
10201 float rx = (f.Index(x+dx) - f.Index(x))/(dx);
10202 return rx;
10203 }
10204private:
10206 float dx;
10207};
10208template<class T>
10209class FuncCompose : public Function<float, float>
10210{
10211public:
10212 FuncCompose(Function<float,T> &f1, Function<T,float> &f2) : f1(f1), f2(f2) { }
10213 float Index(float x) const { return f2.Index(f1.Index(x)); }
10214private:
10217};
10218
10220{
10221public:
10222 struct DistRes {
10226 };
10227 DistRes MinDistanceFromCurve(Curve<Point> &p, Point center, float derivative_step=0.01) const;
10228};
10229
10230
10231
10232
10234{
10235public:
10236 Packing(int num, float dist) : num(num), dist(dist) { }
10237 int Size() const { return num; }
10238 Point2d Index(int i) const
10239 {
10240 if (i==0)
10241 {
10242 Point2d p;
10243 p.x=0.0;
10244 p.y=0.0;
10245 return p;
10246 }
10247 if (i==1)
10248 {
10249 return s(Index(0));
10250 }
10251 return k(Index(i-1), Index(i-2));
10252 }
10253
10254
10255
10256public:
10258 {
10259 float dist = (p2.x-p.x)*(p2.x-p.x)+(p2.y-p.y)*(p2.y-p.y);
10260 Circle c(p, dist);
10261 Point2d pp = c.Index(60.0*3.14159*2.0/360.0);
10262 return pp;
10263#if 0
10264 float dist = (p2.x-p.x)*(p2.x-p.x)+(p2.y-p.y)*(p2.y-p.y);
10265 Circle c(p,dist);
10266 Distance2d d(p2);
10267 FloatMove m(dist);
10270 float t = Solve(comp2, 0.0, 2.0*3.14159);
10271 Point2d p3 = c.Index(t);
10272 return p3;
10273#endif
10274 }
10276 {
10277 p.x += dist;
10278 return p;
10279 }
10280private:
10281 int num;
10282 float dist;
10283};
10285
10286class PointMap : public Function<Point,Point>
10287{
10288public:
10289 virtual ~PointMap() { }
10290 Point Index(Point p) const { return Convert(p); }
10291 virtual Point Convert(Point p) const=0;
10292};
10294{
10295public:
10298 {
10299 return p*m;
10300 }
10301private:
10302 Matrix m;
10303};
10304
10305class MatrixFunction : public InvertableFunction<Point,Point>
10306{
10307public:
10310 {
10311 return p*m;
10312 }
10313 std::vector<Point> Inverse(Point p) const
10314 {
10315 std::vector<Point> vec;
10316 vec.push_back(p*Matrix::Inverse(m));
10317 return vec;
10318 }
10319private:
10320 Matrix m;
10321};
10322class CX : public InvertableFunction<float, float>
10323{
10324public:
10325 CX(float c) : c(c) { }
10326 float Index(float x) const { return c*x; }
10327 std::vector<float> Inverse(float y) const
10328 {
10329 std::vector<float> v;
10330 v.push_back(y/c);
10331 return v;
10332 }
10333private:
10334 float c;
10335};
10336
10337class XPA : public InvertableFunction<float, float>
10338{
10339public:
10340 XPA(float c) : c(c) { }
10341 float Index(float x) const { return x+c; }
10342 std::vector<float> Inverse(float y) const
10343 {
10344 std::vector<float> v;
10345 v.push_back(y-c);
10346 return v;
10347 }
10348private:
10349 float c;
10350};
10351
10352class AMX : public InvertableFunction<float, float>
10353{
10354public:
10355 AMX(float c) : c(c) { }
10356 float Index(float x) const { return c-x; }
10357 std::vector<float> Inverse(float y) const
10358 {
10359 std::vector<float> v;
10360 v.push_back(c-y);
10361 return v;
10362 }
10363private:
10364 float c;
10365};
10366
10367
10368
10370{
10371public:
10372 BlobPointMap(Point center1, Point center2, float r) : center1(center1), center2(center2), r(r) { }
10374 {
10375 Blob b;
10376 return b.adjustpoint(center1, p, center2,r);
10377 }
10378private:
10379 Point center1, center2;
10380 float r;
10381};
10382
10384{
10385public:
10387 void Prepare() { coll.Prepare(); }
10388 void SetBox(Matrix m) { /*coll.SetBox(m);*/ }
10389 int NumFaces() const { return coll.NumFaces(); }
10390 int NumPoints(int face) const { return coll.NumPoints(face); }
10391 Point FacePoint(int face, int point) const
10392 {
10393 return pm.Convert(coll.FacePoint(face,point));
10394 }
10395 unsigned int Color(int face, int point) const
10396 {
10397 return coll.Color(face, point);
10398 }
10399 virtual Point2d TexCoord(int face, int point) const
10400 {
10401 return coll.TexCoord(face,point);
10402 }
10403
10404 Vector PointNormal(int face, int point) const
10405 {
10406 return coll.PointNormal(face,point);
10407 }
10408 float Attrib(int face, int point, int id) const
10409 {
10410 return coll.Attrib(face,point,id);
10411 }
10412 virtual int AttribI(int face, int point, int id) const
10413 {
10414 return coll.AttribI(face,point,id);
10415 }
10416private:
10418 PointMap &pm;
10419};
10421
10422class CubeEffect : public FrameAnim
10423{
10424public:
10425 CubeEffect(Render *render) : FrameAnim(render) { }
10426 bool Frame(float time);
10427};
10429{
10430public:
10431 CylinderEffect(Render *render);
10432 bool Frame(float time);
10433};
10435{
10436public:
10437 SphereEffect(Render *render) : FrameAnim(render) { }
10438 bool Frame(float time);
10439};
10440class RoboEffect : public FrameAnim
10441{
10442public:
10443 RoboEffect(Render *render);
10444 ~RoboEffect();
10445 bool Frame(float time);
10446private:
10447 EmptyVertexPiece empty;
10448 GouraudPiece gouraud;
10449 PieceShader piece;
10450};
10452{
10453public:
10454 MoleculeEffect(Render *render);
10455 void Init();
10456 void Cleanup();
10457 void PreFrame(float time);
10458 bool Frame(float time);
10459private:
10460 //unsigned int texture;
10461 GlobalTexturePiece globpiece;
10462 TexturePiece texturepiece;
10463 PhongPiece phongpiece;
10464 NormalPiece normalpiece;
10465 PieceShader shader;
10466};
10468{
10469public:
10471 bool Frame(float time);
10472};
10473//class MoleculeInsideEffect2 : public Effect
10474//{
10475//public:
10476// FaceCollection &Collection() const { return coll; }
10477//private:
10478// FaceCollection &coll;
10479//};
10480
10482{
10483public:
10484 TitleEffect(Render *render) : FrameAnim(render) { }
10485 bool Frame(float time);
10486};
10487class TestEffect : public FrameAnim
10488{
10489public:
10490 TestEffect(Render *render) : FrameAnim(render) { }
10491 bool Frame(float time);
10492private:
10493 static bool first;
10494};
10496{
10497public:
10498 TunnelEffect(Render *render) : FrameAnim(render) { }
10499
10500 bool Frame(float time);
10501};
10502
10504{
10505public:
10507 float XRot() const { return 0.0; }
10508 float YRot() const { return 1.0; }
10509 float ZRot() const { return 1.0*sin(40.0*3.14159*2.0/360.0); }
10510 bool Frame(float time);
10511private:
10512 //unsigned int texture;
10513};
10514
10515class PathEffect : public FrameAnim
10516{
10517public:
10518 PathEffect(Render *render) : FrameAnim(render) { }
10519
10520 bool Frame(float time);
10521};
10522
10523
10525{
10526public:
10527 virtual ~VBORanges() { }
10528 virtual int NumObjects()const =0;
10529 virtual int StartRange(int obj) const=0;
10530 virtual int EndRange(int obj) const=0;
10531
10532 virtual int StartRangeIndex(int obj) const=0;
10533 virtual int EndRangeIndex(int obj) const=0;
10534
10535};
10537{
10538public:
10539 virtual int NumPoints() const = 0;
10540 //virtual int NumPoints(int face) const=0; // always returns 3.
10541
10542 // (x,y,z)
10543 virtual void UpdateVertexList(int start, int end, float *array) const=0;
10544 // (nx, ny, nz)
10545 virtual void UpdateNormalList(int start, int end, float *array) const=0;
10546 // (tx, ty)
10547 virtual void UpdateTextureCoordList(int start, int end, float *array) const=0;
10548 // (r, g, b)
10549 virtual void UpdateColorList(int start, int end, char *array) const=0;
10550 virtual void UpdateAttrib(int start, int end, float *array, int id) const=0;
10551 virtual void UpdateAttribI(int start, int end, short *array, int id) const=0;
10552
10553 // (i)
10554 virtual int IndexSize() const = 0;
10555 virtual void UpdateIndexList(int start, int end, int *array) const=0;
10556 //virtual Point FacePoint(int face, int point) const=0;
10557 //virtual Vector PointNormal(int face, int point) const=0;
10558 // returns face number
10559};
10561{
10562public:
10564 virtual int NumPoints() const { return o.NumPoints(); }
10565 //virtual int NumPoints(int face) const=0; // always returns 3.
10566
10567 // (x,y,z)
10568 virtual void UpdateVertexList(int start, int end, float *array) const
10569 {
10570 //std::cout << start << " " << end << std::endl;
10571 float *arr = array + start*3;
10572 for(int i=start;i<end;i++)
10573 {
10574 Point p = o.FacePoint(i);
10575 //std::cout << i << " " << p << std::endl;
10576 arr[0] = p.x;
10577 arr[1] = p.y;
10578 arr[2] = p.z;
10579 arr+=3;
10580 }
10581 }
10582 // (nx, ny, nz)
10583 virtual void UpdateNormalList(int start, int end, float *array) const
10584 {
10585 float *arr = array + start*3;
10586 for(int i=start;i<end;i++)
10587 {
10588 Vector v = o.PointNormal(i);
10589 arr[0] = v.dx;
10590 arr[1] = v.dy;
10591 arr[2] = v.dz;
10592 arr+=3;
10593 }
10594 }
10595 // (tx, ty)
10596 virtual void UpdateTextureCoordList(int start, int end, float *array) const
10597 {
10598 float *arr = array + start*2;
10599 for(int i=start;i<end;i++)
10600 {
10601 Point2d p = o.TexCoord(i);
10602 arr[0] = p.x;
10603 arr[1] = p.y;
10604 arr+=2;
10605 }
10606 }
10607 // (r, g, b)
10608 virtual void UpdateColorList(int start, int end, char *array) const
10609 {
10610 char *arr = array + start;
10611 for(int i=start;i<end;i++)
10612 {
10613 unsigned int v = o.Color(i);
10614 arr[0]=char(v); // r
10615 arr[1]=char(v>>8); // g
10616 arr[2]=char(v>>16); // b
10617 arr[3]=char(v>>24); // a
10618 arr+=4;
10619 }
10620
10621 }
10622 virtual void UpdateAttrib(int start, int end, float *array, int id) const
10623 {
10624 float *arr = array + start;
10625 for(int i=start;i<end;i++)
10626 {
10627 float v = o.Attrib(i, id);
10628 //std::cout << i << " " << v << std::endl;
10629 arr[0]=v;
10630 arr+=1;
10631 }
10632 }
10633 virtual void UpdateAttribI(int start, int end, short *array, int id) const
10634 {
10635 short *arr = array + start;
10636 for(int i=start;i<end;i++)
10637 {
10638 int v = o.AttribI(i, id);
10639 //std::cout << i << " " << v << std::endl;
10640 arr[0]=v;
10641 arr+=1;
10642 }
10643 }
10644 // (i1,i2,i3)
10645 virtual int IndexSize() const { return o.NumFaces(); }
10646 virtual void UpdateIndexList(int start, int end, int *array) const
10647 {
10648 int *arr = array;
10649 for(int i=start;i<end;i++)
10650 {
10651 int i1 = o.Index(o.IndexToFace(i),0);
10652 int i2 = o.Index(o.IndexToFace(i),1);
10653 int i3 = o.Index(o.IndexToFace(i),2);
10654 //std::cout << "Index: " << i << " F" << o.IndexToFace(i) << ":" << i1 << " " << i2 << " " << i3 << std::endl;
10655 arr[0] = i1;
10656 arr[1] = i2;
10657 arr[2] = i3;
10658 arr+=3;
10659 }
10660 }
10661 //virtual Point FacePoint(int face, int point) const=0;
10662 //virtual Vector PointNormal(int face, int point) const=0;
10663 // returns face number
10664 virtual int NumObjects()const { return o.NumObjects(); }
10665 virtual int StartRange(int obj) const { return o.PointsStartRange(obj); }
10666 virtual int EndRange(int obj) const { return o.PointsEndRange(obj); }
10667
10668 virtual int StartRangeIndex(int obj) const { return o.IndexStartRange(obj); }
10669 virtual int EndRangeIndex(int obj) const { return o.IndexEndRange(obj); }
10670private:
10672};
10674
10689
10690
10691
10692class VBOStatePriv;
10694{
10695public:
10696 VBOState();
10697 ~VBOState();
10698private:
10699 VBOStatePriv *impl;
10700 friend void UpdateVBO(const FaceCollectionVBO &faces, int obj, VBOState &state, VBOUpdate u, const std::vector<Attrib> &attribs);
10701 friend void UpdateVBO(const FaceCollectionVBO &faces, VBOState &state, VBOUpdate u, const std::vector<Attrib> &attribs);
10702 friend void UpdateVBO(const FaceCollection &faces, VBOState &state, VBOUpdate u, const std::vector<Attrib> &attribs);
10703 friend void DrawVBO(int obj, VBOState &state, VBOUpdate u, const std::vector<Attrib> &attribs);
10704 friend void DrawVBO(VBOState &state, VBOUpdate u, const std::vector<Attrib> &attribs);
10705};
10706
10707
10708void UpdateVBO(const FaceCollectionVBO &faces, int obj, VBOState &state, VBOUpdate u=UpdateAll, const std::vector<Attrib> &attribs=std::vector<Attrib>());
10709void UpdateVBO(const FaceCollectionVBO &faces, VBOState &state, VBOUpdate u=UpdateAll, const std::vector<Attrib> &attribs=std::vector<Attrib>());
10710void UpdateVBO(const FaceCollection &faces, VBOState &state, VBOUpdate u=UpdateAll, const std::vector<Attrib> &attribs=std::vector<Attrib>());
10711void DrawVBO(int obj, VBOState &state, VBOUpdate u=UpdateAll, const std::vector<Attrib> &attribs=std::vector<Attrib>());
10712void DrawVBO(VBOState &state, VBOUpdate u=UpdateAll, const std::vector<Attrib> &attribs=std::vector<Attrib>());
10714void RenderOpenGlObjects(const ObjectDataArray &arr, VBOState &vbostat, VBOUpdate u, ShaderUse *use);
10715
10716
10717
10719{
10720public:
10721 virtual int Count() const=0;
10722 virtual int ObjectId(int index) const=0;
10723 virtual Matrix ObjectPos(int index) const=0;
10724};
10725
10727{
10728public:
10729 virtual void cmd()=0;
10730};
10731class DrawVBOCmd : public Command
10732{
10733public:
10735 : /*faces(faces),*/ obj(obj), state(state), u(u) { }
10736 virtual void cmd()
10737 {
10738 DrawVBO(obj, state, u);
10739 }
10740private:
10741 //FaceCollectionVBO &faces;
10742 int obj;
10743 VBOState &state;
10744 VBOUpdate u;
10745};
10746class MatrixVBOCmd : public Command
10747{
10748public:
10749 MatrixVBOCmd(Command &c, Matrix m) : c(c), m(m) { }
10750 virtual void cmd();
10751
10752private:
10753 Command &c;
10754 Matrix m;
10755
10756};
10757
10759{
10760public:
10761 virtual int NumConnections() const =0;
10762 virtual Matrix Transform(int conn1, int conn2)=0;
10763};
10764
10766{
10767public:
10768 Camera(MatrixCurve &curve, float time);
10769 ~Camera();
10770};
10771
10773{
10774public:
10775 virtual void PreCalc()=0;
10776 virtual void Execute()=0;
10777};
10779{
10780public:
10781 FrameAnimCmds(FrameAnim &fa, float time) : fa(fa) { }
10782 void PreCalc() { fa.Init(); }
10783 void Execute() { fa.PreFrame(time); fa.Frame(time); }
10784private:
10785 FrameAnim &fa;
10786 float time;
10787};
10788
10789class TexturePlugin;
10790
10792{
10793public:
10794 RenderToTexture(TexturePlugin *plugin, OpenGlCommands &cmds, bool in_precalc) : plugin(plugin), cmds(cmds), in_precalc(in_precalc) { }
10795 void PreCalc();
10796 void Execute();
10797private:
10798 TexturePlugin *plugin;
10800 bool in_precalc;
10801};
10802
10804{
10805public:
10806 ColorCmds(OpenGlCommands &cmds, Color c) : cmds(cmds), c(c) { }
10807 void PreCalc() { cmds.PreCalc(); }
10808 void Execute();
10809private:
10811 Color c;
10812};
10814{
10815public:
10816 TransparencyCmds(OpenGlCommands &inner_cmds) : inner_cmds(inner_cmds) { }
10817 void PreCalc() { inner_cmds.PreCalc(); }
10818 void Execute();
10819private:
10820 OpenGlCommands &inner_cmds;
10821};
10823{
10824public:
10825 FaceRenderCmds(FaceCollection &coll) : coll(coll), coords(0) { }
10826 FaceRenderCmds(FaceCollection &coll, TextureCoords &coord) : coll(coll), coords(&coord) { }
10827 void PreCalc() { }
10828 void Execute()
10829 {
10830 if (coords)
10831 RenderOpenGl(coll, *coords);
10832 else
10833 RenderOpenGl(coll);
10834 }
10835private:
10836 FaceCollection &coll;
10837 TextureCoords *coords;
10838};
10839
10841{
10842public:
10843 RenderOpenGlCmds(const FaceCollection &col) : col(col) { }
10844 void PreCalc() { }
10845 void Execute();
10846private:
10847 const FaceCollection &col;
10848};
10849
10851{
10852public:
10853 TextureCommands(OpenGlCommands &cmds) : cmds(cmds) { }
10854 void PreCalc() { cmds.PreCalc(); }
10855 void Execute();
10856private:
10858};
10860{
10861public:
10862 DisplayListCmds(OpenGlCommands &cmds) : priv(0), cmds(cmds) { }
10863 void PreCalc();
10864 void Execute();
10866private:
10867 void *priv;
10869};
10871{
10872public:
10873 ShaderCmds(OpenGlCommands &cmds, PieceShader &piece, ShaderPiece &shader, ShaderParameters *params, ShaderAttributes *attrs) : cmds(cmds), piece(piece), params(params), attrs(attrs)
10874 {
10875 piece.push_back(&shader);
10876 }
10877 void SetParams(ShaderParameters *p) { params = p; }
10878 void SetAttribs(ShaderAttributes *a) { attrs = a; }
10879 void PreCalc()
10880 {
10881 piece.config();
10882 cmds.PreCalc();
10883 }
10884 void Execute()
10885 {
10886 piece.use();
10887 if (params)
10888 piece.set_params(*params);
10889 if (attrs)
10890 piece.set_attribs(*attrs);
10891 cmds.Execute();
10892 piece.unuse();
10893 }
10895private:
10897 PieceShader &piece;
10898 ShaderParameters *params;
10899 ShaderAttributes *attrs;
10900};
10901
10905
10907{
10908public:
10910 ~ScopeMatrix();
10911};
10912
10913class VBOEffect : public FrameAnim
10914{
10915public:
10916 VBOEffect(Render *r);
10917 ~VBOEffect();
10918 void Init();
10919 bool Frame(float time);
10920private:
10921 VBOState vbostate;
10922 EmptyVertexPiece empty;
10923 //RandomPositionPiece empty;
10924 PhongPiece phong;
10925 BlobPiece blob;
10926 PieceShader piece;
10927};
10929{
10930public:
10931 CircleEffect(Render *render) : FrameAnim(render) { }
10932
10933 void Init();
10934 bool Frame(float time);
10935private:
10936 VBOState vbostate;
10937};
10939{
10940public:
10941 BlobEffect(Render *r);
10942 ~BlobEffect();
10943 bool Frame(float time);
10944private:
10945 GlobalTexturePiece globpiece;
10946 TexturePiece texturepiece;
10947 PhongPiece phongpiece;
10948 NormalPiece normalpiece;
10949 PieceShader shader;
10950};
10951
10953{
10954public:
10956 void Init()
10957 {
10958 int size = arr.Size();
10959 for(int i=0;i<size;i++)
10960 {
10961 FrameAnim* fa = arr.Index(i);
10962 fa->Init();
10963 }
10964 }
10965 void Cleanup()
10966 {
10967 int size = arr.Size();
10968 for(int i=0;i<size;i++)
10969 {
10970 FrameAnim* fa = arr.Index(i);
10971 fa->Init();
10972 }
10973 }
10974 void PreFrame(float time)
10975 {
10976 int size = arr.Size();
10977 for(int i=0;i<size;i++)
10978 {
10979 FrameAnim* fa = arr.Index(i);
10980 fa->PreFrame(time);
10981 }
10982 }
10983 bool Frame(float time)
10984 {
10985 int size = arr.Size();
10986 //std::cout << "Frame: " << size << std::endl;
10987 for(int i=0;i<size;i++)
10988 {
10989 FrameAnim* fa = arr.Index(i);
10990 fa->Frame(time);
10991 }
10992 return false;
10993 }
10995 {
10996 int size = arr.Size();
10997 for(int i=0;i<size;i++)
10998 {
10999 FrameAnim* fa = arr.Index(i);
11000 fa->PostFrame();
11001 }
11002 }
11003private:
11005};
11007{
11008public:
11009 DefaultFrameAnim(FaceCollection &faces, float time, Render *r) : FrameAnim(r), faces(faces), time(time) { }
11010 float Time() const { return time; }
11011 void Init()
11012 {
11013 //UpdateVBO(faces, vbostate);
11014 }
11015 bool Frame(float time)
11016 {
11017 //std::cout << "Frame" << std::endl;
11018 BoxableFaceCollectionConvert conv(faces);
11019 MatrixElem me(conv, Matrix::Scale(300.0,300.0,300.0));
11020 RenderOpenGl(me);
11021 //DrawVBO(vbostate);
11022
11023 return false;
11024 }
11025private:
11026 FaceCollection &faces;
11027 VBOState vbostate;
11028 float time;
11029};
11030
11032{
11033public:
11035 {
11036 }
11037 float Time() const {
11038 float time = 0.0;
11039 for(int i=0;i<arr.Size();i++)
11040 {
11041 time += arr.Index(i)->Time();
11042 }
11043 return time;
11044 }
11045 void Init()
11046 {
11047 for(int i=0;i<arr.Size();i++)
11048 {
11049 arr.Index(i)->Init();
11050 }
11051 }
11052 bool Frame(float time)
11053 {
11054 float totaltime = 0.0;
11055 for(int i=0;i<arr.Size();i++)
11056 {
11057 float oldtotal = totaltime;
11058 float t = arr.Index(i)->Time();
11059 totaltime += t;
11060 if (totaltime > time)
11061 {
11062 return arr.Index(i)->Frame(time-oldtotal);
11063 }
11064 }
11065 return false;
11066 }
11067private:
11068 const Array<int, FrameAnim*> &arr;
11069};
11070
11072{
11073public:
11076 void Init();
11077 bool Frame(float time);
11078private:
11079 VBOState vbostate;
11080 WaterPiece water;
11081 PhongPiece phong;
11082 PieceShader shader;
11083};
11084class RingEffect : public FrameAnim
11085{
11086public:
11087 RingEffect(Render *render) : FrameAnim(render) { }
11088 void Init();
11089 bool Frame(float time);
11090private:
11091 VBOState vbostate;
11092};
11094{
11095public:
11096 MovementEffect(Render *render) : FrameAnim(render) { }
11097 bool Frame(float time);
11098};
11100{
11101public:
11102 SinusEffect(Render *render) : FrameAnim(render) { }
11103 void Init();
11104 bool Frame(float time);
11105private:
11106 VBOState vbostate;
11107};
11108
11110{
11111public:
11112 TunnelEffect2(Render *render) : FrameAnim(render) { }
11113 void Init();
11114 bool Frame(float time);
11115private:
11116 VBOState vbostate;
11117};
11118
11120{
11121public:
11122 WalkCubeEffect(Render *render) : FrameAnim(render) { }
11123 bool Frame(float time);
11124};
11125
11127void DisplayFrame(FrameAnim &f, Low_SDL_Surface *screen, float time);
11129Low_SDL_Surface *InitSDL(int scr_x, int scr_y, bool vsync, bool antialias=false);
11130Low_SDL_Surface *InitSDL2(int scr_x, int scr_y, bool vsync, bool antialias=false, bool resize=false, bool vr_init=false);
11131
11132
11133#if 0
11134class CubeAnim : public Anim
11135{
11136public:
11137 CubeAnim() : coll(0), coll2(0) { }
11138 int NumFrames() const { return 50; }
11139 FaceCollection *Frame(int framenum) const
11140 {
11141 //std::cout << framenum << std::endl;
11142 delete coll;
11143 delete coll2;
11144 coll = new CubeElem;
11145 coll2 = new MatrixElem(*coll, Matrix::Scale(50+framenum,50+framenum,50+framenum));
11146 return coll2;
11147 }
11148private:
11149 mutable BoxableFaceCollection *coll, *coll2;
11150};
11151#endif
11152
11153class Frames : public AnimSelectI
11154{
11155public:
11156 Frames(int frames) : as(frames), fs(as),frames(frames) { }
11157 void set_frame(int framenum)
11158 {
11159 while(framenum > frames)
11160 framenum-=frames;
11161 fs.set_frame(framenum);
11162 }
11163public:
11164 int Size() const { return as.Size(); }
11165 int *SelectArray() const { return as.SelectArray(); }
11166private:
11167 AnimSelect as;
11168 FrameSelect fs;
11169 int frames;
11170};
11171
11173{
11174public:
11175 AnimFrameAnim(Anim &a, ShaderFile &f, float length) : FrameAnim(&rend), a(a), fr(a.NumFrames()),s(f), length(length) { }
11176 void Init()
11177 {
11178 UpdateAnim(a, s);
11179 }
11180 bool Frame(float time)
11181 {
11182 int framenum = time / length*a.NumFrames();
11183 //std::cout << time << " " << length << " " << a.NumFrames() << " " << framenum << std::endl;
11184 //fr.set_frame(framenum);
11185 while (framenum > a.NumFrames())
11186 framenum-=a.NumFrames();
11187 DrawAnim(framenum-0.5, framenum+0.5, s);
11188 return false;
11189 }
11190private:
11191 Anim &a;
11192 Frames fr;
11193 AnimState s;
11194 float length;
11195 SDLRender rend;
11196};
11197
11198class ContinuousObjectMovementArrays : public Array<int, float>
11199{
11200public:
11201 ContinuousObjectMovementArrays(Array<int, float> &time_lengths, float current_time) : time_lengths(time_lengths), current_time(current_time) { }
11202 int Size() const { return time_lengths.Size(); }
11203 float Index(int i) const
11204 {
11205 float t = 0.0;
11206 int size = time_lengths.Size();
11207 for(int ii=0;ii<size;ii++)
11208 {
11209 t+=time_lengths.Index(ii);
11210 if (t > current_time)
11211 {
11212 if (i < ii) return 1.0;
11213 if (i == ii) return (time_lengths.Index(ii) - t + current_time)/time_lengths.Index(ii);
11214 if (i > ii) return 0.0;
11215 }
11216 }
11217 return 1.0;
11218 }
11219private:
11220 Array<int, float> &time_lengths;
11221 float current_time;
11222};
11223
11225{
11226public:
11228 Array<int, float> &arr2) : arr(arr), arr2(arr2) { }
11229
11231 {
11232 if (arr.Size() != arr2.Size())
11233 {
11234 std::cout << "ContinuousObjectMovement::array size problem" << std::endl;
11235 return Matrix::Identity();
11236 }
11237 int size = arr.Size();
11238 Matrix res = Matrix::Identity();
11239 for(int i=0;i<size;i++)
11240 {
11241 Function<float,Matrix> *func = arr.Index(i);
11242 float pos = arr2.Index(i);
11243 res *= func->Index(pos);
11244 }
11245 return res;
11246 }
11247
11248private:
11250 Array<int, float> &arr2;
11251};
11252
11254
11255class Mesh
11256{
11257public:
11258 virtual int NumFrames() const=0;
11259 virtual int NumFaces(int framenum) const=0;
11260 virtual int NumPoints() const=0;
11261 virtual Point FacePoint(int framenum, int statenum, int face, int point) const=0;
11262
11263 virtual int NumStates() const=0;
11264 virtual int StateNum(int framenum, int face) const=0;
11265 virtual ~Mesh() { }
11266};
11267
11268class FaceArrayMesh : public Mesh
11269{
11270public:
11271 FaceArrayMesh(FaceCollection **array, int size) : array(array), size(size) { }
11272 virtual int NumStates() const { return NumStates(size); }
11273 virtual int NumStates(int frames) const
11274 {
11275 std::map<int,int>::iterator i = cache.find(frames);
11276 if (i!=cache.end())
11277 {
11278 return i->second;
11279 }
11280 int s = size;
11281 int currentstate = -1;
11282 int count = 0;
11283 for(int frame=0;frame<s&&frame<frames;frame++)
11284 {
11285 FaceCollection *framecoll = array[frame];
11286 int faces = framecoll->NumFaces();
11287 for(int face = 0;face<faces;face++)
11288 {
11289 int texture = framecoll->FaceTexture(face);
11290 if (texture != currentstate)
11291 {
11292 count++;
11293 currentstate = texture;
11294 }
11295 }
11296 }
11297 cache[frames]=count;
11298 return count;
11299 }
11300
11301 virtual int StateNum(int frame, int face2) const
11302 {
11303 int states_before = NumStates(frame);
11304 int count = states_before;
11305 FaceCollection *framecoll = array[frame];
11306 if (!framecoll->NumTextures()) return states_before;
11307 int faces = framecoll->NumFaces();
11308 int currentstate = -1;
11309 for(int face = 0;face<faces&&face<face2;face++)
11310 {
11311 int texture = framecoll->FaceTexture(face);
11312 if (texture != currentstate)
11313 {
11314 count++;
11315 currentstate = texture;
11316 }
11317 }
11318 return count;
11319 }
11320
11321 virtual int NumFrames() const { return size; }
11322 virtual int NumFaces(int framenum) const
11323 {
11324 int val = array[framenum]->NumFaces();
11325 //std::cout << "NumFaces: " << framenum << ":" << val << std::endl;
11326 return val;
11327 }
11328 virtual int NumPoints() const
11329 {
11330 return array[0]->NumPoints(0);
11331 }
11332 virtual Point FacePoint(int framenum, int statenum, int face, int point) const
11333 {
11334 Point p = array[framenum]->FacePoint(face,point);
11335 //std::cout << framenum << " " << face << " " << point << ":" << p << std::endl;
11336 return p;
11337 }
11338
11339private:
11340 FaceCollection **array;
11341 int size;
11342 mutable std::map<int,int> cache;
11343};
11344
11346{
11347public:
11348 virtual int NumFrames() const { return 0; }
11349 virtual Vector PointNormal(int framenum, int statenum, int face, int point) const { return Vector(0.0,0.0,0.0); }
11350 virtual ~MeshNormals() { }
11351};
11352
11354{
11355public:
11356 FaceArrayMeshNormals(FaceCollection **array, int size) : array(array), size(size) { }
11357 virtual int NumFrames() const { return size; }
11358 virtual Vector PointNormal(int framenum, int statenum, int face, int point) const
11359 { return array[framenum]->PointNormal(face,point); }
11360private:
11361 FaceCollection **array;
11362 int size;
11363};
11364
11366{
11367public:
11368 virtual int NumFrames() const { return 0; }
11369 virtual Point2d TexCoord(int framenum, int statenum, int face, int point) const { Point2d p = { 0.0, 0.0 }; return p; }
11370 virtual ~MeshTexCoords() { }
11371
11372};
11373
11375{
11376public:
11377 FaceArrayMeshTexCoords(FaceCollection **array, int size) : array(array), size(size) { }
11378 virtual int NumFrames() const { return size; }
11379 virtual Point2d TexCoord(int framenum, int statenum, int face, int point) const
11380 {
11381 return array[framenum]->TexCoord(face,point);
11382 }
11383private:
11384 FaceCollection **array;
11385 int size;
11386};
11387
11389{
11390public:
11391 virtual int NumFrames() const { return 0; }
11392 virtual unsigned int VertexColor(int framenum, int statenum, int face, int point) const { return 0; }
11393 virtual ~MeshColors() { }
11394};
11395
11397{
11398public:
11399 FaceArrayMeshColors(FaceCollection **array, int size) : array(array), size(size) { }
11400 virtual int NumFrames() const { return size; }
11401 virtual unsigned int VertexColor(int framenum, int statenum, int face, int point) const
11402 { return array[framenum]->Color(face,point); }
11403private:
11404 FaceCollection **array;
11405 int size;
11406};
11407
11409{
11410public:
11411 virtual int NumTextures() const { return 0; }
11412 virtual void GenTexture(int num) { }
11413 virtual BufferRef TextureBuf(int num) const { BufferRef ref; ref.buffer = 0; return ref; }
11414 virtual ~MeshTextures() { }
11415};
11416
11417class FaceArrayMeshTextures : public MeshTextures, public Function<int,int>
11418{
11419public:
11420 FaceArrayMeshTextures(FaceCollection **array, int size, int frame) : array(array), /*size(size),*/ frame(frame) { }
11421 virtual int NumTextures() const { return array[frame]->NumTextures(); }
11422 virtual void GenTexture(int num)
11423 {
11424 array[frame]->GenTexture(num);
11425 }
11426 virtual BufferRef TextureBuf(int num) const { return array[frame]->TextureBuf(num); }
11427 virtual int Index(int texnum) const
11428 {
11429 int s = array[frame]->NumFaces();
11430 for(int i=0;i<s;i++)
11431 {
11432 int tex = array[frame]->FaceTexture(i);
11433 if (tex==texnum) return i;
11434 }
11435 return -1;
11436 }
11437private:
11438 FaceCollection **array;
11439 //int size;
11440 int frame;
11441};
11442
11444{
11445public:
11446 virtual int NumFrames() const { return 0; }
11447 virtual unsigned int VertexColor(int framenum, int statenum, int face, int point, int id) const { return 0; }
11449};
11450
11451
11452
11453template<class T>
11454class Bitmap;
11455
11456struct LowApi;
11457extern LowApi *g_low;
11458
11459
11461{
11462public:
11467 ~ArrayRender();
11468 int NumFaces(FaceCollection &coll);
11469 int NumVertices(FaceCollection &coll);
11470 void Alloc(int numfaces, int numvertices);
11471 void Alloc(int numfaces, int numvertices, int vertexframes, int normalframes, int colorframes, int texcoordframes);
11472 void AllocTexture(int count);
11473 std::pair<int,int> Insert(FaceCollection &coll);
11474 std::pair<int,int> InsertMesh(Mesh &mesh, int frame);
11475 std::vector<std::pair<int,int> > InsertAll(Mesh &mesh, MeshNormals &normal, MeshTexCoords &coord, MeshColors &color);
11476 void UpdatePos(FaceCollection &coll, std::pair<int,int> p);
11477 void UpdateNormals(Mesh &mesh, MeshNormals &normal, std::pair<int,int> p, int frame);
11478 void UpdateTexCoord(Mesh &mesh, MeshTexCoords &coord, std::pair<int,int> p, int frame);
11479 void UpdateColors(Mesh &mesh, MeshColors &color, std::pair<int,int> p, int frame);
11481 void UpdateTexture(MeshTextures &texture, int num, bool textrender=false);
11482 void EnableTexture(int num);
11483 void DisableTexture();
11484 void Prepare();
11485 void Render(bool normal, bool color, bool texcoord) { Render(normal, color, texcoord, 0, used_vertex_count[0]); }
11486 void Render(bool normal, bool color, bool texcoord, int vertex_pos, int vertex_size);
11487 void Render(int vertexframe, int normalframe, int colorframe, int texcoordframe, int vertex_pos, int vertex_size);
11488 void Render(int vertexframe, int normalframe, int colorframe, int texcoordframe) { Render(vertexframe, normalframe, colorframe, texcoordframe, 0, used_vertex_count[vertexframe]); }
11489
11490 int VertexArrayStep() const { return 3; }
11491 int NormalArrayStep() const { return 3; }
11492 int ColorArrayStep() const { return 4; }
11493 int TexCoordArrayStep() const { return 2; }
11494
11495 int TextureCount() const { return texture_count; }
11496public:
11498 float *vertex_array; // 3 * float per vertex
11502 float *normal_array; // 3 * float per vertex
11503 unsigned char *color_array; // 4 * unsigned char per vertex
11504 float *tex_coord_array; // 2 * float per vertex
11505 bool quads;
11506
11507 int *index_array; // DO NOT MODIFY, indexed by face number
11508
11513
11521 unsigned int buffer[5];
11523 float *q_vertex_array; // 3 * float per vertex
11524 float *q_normal_array; // 3 * float per vertex
11525 unsigned char *q_color_array; // 4 * unsigned char per vertex
11526 float *q_tex_coord_array; // 2 * float per vertex
11527 unsigned int vao[4];
11528};
11529
11531{
11532 std::vector<std::pair<int,int> > vec;
11535};
11536class Mesh;
11537
11538void PreCalcMesh(Mesh &mesh, ArrayRender &r, PrecalcStore &prestore);
11539void PreCalcFaceStore(void (*fptr)(FaceStore &s, float time, float repeat_length), float repeat_duration, int repeat_framecount, ArrayRender &r, PrecalcStore &prestore);
11540void ExecuteFaceStore(ArrayRender &r, PrecalcStore &prestore, int frame);
11541
11542
11543class DynamicMesh : public Mesh
11544{
11545public:
11546 DynamicMesh() : numframes(0), numpoints(0) { }
11547 virtual int NumFrames() const { return numframes; }
11548 virtual int NumFaces(int framenum) const
11549 {
11550 //std::cout << "framenum: " << framenum << " " << numfaces[framenum] << std::endl;
11551 return numfaces[framenum];
11552 }
11553 virtual int NumPoints() const
11554 {
11555 return numpoints;
11556 }
11557 virtual Point FacePoint(int framenum, int statenum, int face, int point) const
11558 {
11559 Key k = { framenum, face, point };
11560 return vec[k];
11561#if 0
11562 int s = vec.size();
11563 for(int i=0;i<s;i++)
11564 {
11565 const Key &k = vec[i];
11566 if (k.framenum == framenum && k.face==face && k.point==point)
11567 {
11568 return k.p;
11569 }
11570 }
11571 return Point(0.0,0.0,0.0);
11572#endif
11573 }
11574 struct Key { int framenum; int face; int point;
11575 friend bool operator<(const Key &k1, const Key &k2)
11576 {
11577 if (k1.framenum < k2.framenum) return true;
11578 if (k1.framenum > k2.framenum) return false;
11579
11580 if (k1.face < k2.face) return true;
11581 if (k1.face > k2.face) return false;
11582
11583 if (k1.point < k2.point) return true;
11584 if (k1.point > k2.point) return false;
11585 return false;
11586 }
11587 };
11588
11589 void push_frame() { numframes++; }
11590 void push_back(const FaceCollection &coll)
11591 {
11592 std::cout << "numfaces insert" << std::endl;
11593 numfaces.push_back(coll.NumFaces());
11594 if (numpoints==0) numpoints = coll.NumPoints(0);
11595 int faces = coll.NumFaces();
11596 for(int i=0;i<faces;i++)
11597 {
11598 for(int j=0;j<numpoints;j++)
11599 {
11600 Key k = { numframes, i, j };
11601 //vec.push_back(k);
11602 vec[k] = coll.FacePoint(i,j);
11603 }
11604 }
11605 }
11606 virtual int NumStates() const { return 0; }
11607 virtual int StateNum(int framenum, int face) const { return 0; }
11608
11609private:
11610 int numframes;
11611 std::vector<int> numfaces;
11612 int numpoints;
11613 mutable std::map<Key,Point> vec;
11614 //std::vector<Key> vec;
11615};
11616
11618{
11619public:
11620 MeshFaceCollection(Mesh &mesh, int framenum) : mesh(mesh), texcoord(0), framenum(framenum) { }
11621 MeshFaceCollection(Mesh &mesh, MeshTexCoords &coord, int framenum) : mesh(mesh), texcoord(&coord), framenum(framenum) { }
11622 virtual std::string name() const { return "MeshFaceCollection"; }
11623
11625 {
11626 }
11627 void HeavyPrepare() { }
11628
11629 void Prepare() { }
11630 virtual int NumFaces() const { return mesh.NumFaces(framenum); }
11631 virtual int NumPoints(int face) const { return mesh.NumPoints(); }
11632 virtual Point FacePoint(int face, int point) const
11633 {
11634 return mesh.FacePoint(framenum, 0, face, point);
11635 }
11636 virtual bool has_normal() const { return true; }
11637 virtual bool has_attrib() const { return false; }
11638 virtual bool has_color() const { return false; }
11639 virtual bool has_texcoord() const { return true; }
11640 virtual bool has_skeleton() const { return false; }
11641
11642 virtual Vector PointNormal(int face, int point) const
11643 {
11644 Point p1 = mesh.FacePoint(framenum, 0, face, 0);
11645 Point p2 = mesh.FacePoint(framenum, 0, face, 1);
11646 Point p3 = mesh.FacePoint(framenum, 0, face, 2);
11647 return -Vector::CrossProduct(p2-p1, p3-p1);
11648 }
11649 virtual float Attrib(int face, int point, int id) const
11650 { return 0.0; }
11651 virtual int AttribI(int face, int point, int id) const { return 0; }
11652 virtual unsigned int Color(int face, int point) const
11653 {
11654 return Color::White().Pixel();
11655 }
11656 virtual Point2d TexCoord(int face, int point) const
11657 {
11658 if (!texcoord) {
11659 Point2d p;
11660 p.x = 0;
11661 p.y = 0;
11662 return p;
11663 } else {
11664 return texcoord->TexCoord(framenum, 0, face, point);
11665 }
11666 }
11667
11668private:
11669 Mesh &mesh;
11670 MeshTexCoords *texcoord;
11671 int framenum;
11672};
11673
11675{
11676public:
11677 SDLArrayRender() : rend(g_low) { }
11678 void SetTime(float time);
11679 void SetMatrix(Matrix m);
11680 void RenderFaces(const FaceCollection &col);
11681 void RenderFaces(const FaceCollection &col, const TextureCoords &tex);
11682 void RenderFacesTexture(const FaceCollection &col);
11683
11684 void RenderLines(const LineCollection &col);
11685 void RenderPoly(const PointCollection &col);
11686 void* CreateState();
11687 void UpdateVBO(const FaceCollection &faces, void *state);
11688 void DrawVBO(void *state);
11689 void DestroyState(void *state);
11690public:
11691 void Show();
11692private:
11693 ArrayRender rend;
11694 PrecalcStore s;
11695 DynamicMesh dyn;
11697};
11698void PreCalcExecute(Render &rend, FrameAnim &f, float duration, int numframes);
11699
11700
11702{
11703public:
11704 ArrayEffect(Render *render) : FrameAnim(render), rend(g_low) { }
11705 float XRot() const { return 0.0; }
11706 float YRot() const { return 1.0; }
11707 float ZRot() const { return 0.0; }
11708
11709 void Init();
11710
11711 bool Frame(float time);
11712private:
11713 ArrayRender rend;
11714 PrecalcStore s;
11715};
11716
11718{
11719public:
11720 int face_num(int face) const { return face/2; }
11721 int point_map(int face, int point) const {
11722 int f = face/2;
11723 int ff = face-f*2;
11724 int p =0;
11725 if (ff)
11726 {
11727 if (point==0) p=0;
11728 if (point==1) p=1;
11729 if (point==2) p=2;
11730 }
11731 else
11732 {
11733 if (point==0) p=0;
11734 if (point==1) p=2;
11735 if (point==2) p=3;
11736 }
11737 return p;
11738 }
11739};
11740
11741class MeshToTriangles : public Mesh
11742{
11743public:
11744 MeshToTriangles(Mesh &m) : m(m) { }
11745 virtual int NumStates() const { return 0; }
11746 virtual int StateNum(int frame, int face) const { return 0; }
11747
11748 virtual int NumFrames() const
11749 {
11750 return m.NumFrames();
11751 }
11752 virtual int NumFaces(int framenum) const
11753 {
11754 //std::cout << "NumFaces " << m.NumFaces(framenum) << std::endl;
11755 if (m.NumPoints()==4) return m.NumFaces(framenum)*2;
11756 return m.NumFaces(framenum);
11757 }
11758 virtual int NumPoints() const
11759 {
11760 return 3;
11761 }
11762 virtual Point FacePoint(int framenum, int statenum, int face, int point) const
11763 {
11764 if (m.NumPoints()==4)
11765 {
11766 int f = count.face_num(face);
11767 int p = count.point_map(face, point);
11768 Point pp = m.FacePoint(framenum, statenum, f, p);
11769 //std::cout << framenum << " " << statenum << ":" << face << " " << point << ":" << pp << std::endl;
11770 return pp;
11771 }
11772 return m.FacePoint(framenum, statenum, face, point);
11773 }
11774private:
11775 Mesh &m;
11777};
11779{
11780public:
11781 MeshNormalsToTriangles(MeshNormals &n, bool b) : n(n), b(b) { }
11782 virtual int NumFrames() const { return n.NumFrames(); }
11783 virtual Vector PointNormal(int framenum, int statenum, int face, int point) const
11784 {
11785 if (b)
11786 {
11787 int f = count.face_num(face);
11788 int p = count.point_map(face, point);
11789 return n.PointNormal(framenum, statenum, f,p);
11790 }
11791 return n.PointNormal(framenum, statenum, face, point);
11792 }
11793private:
11794 MeshNormals &n;
11795 bool b;
11797};
11798
11800{
11801public:
11802 MeshTexCoordsToTriangles(MeshTexCoords &n, bool b) : n(n), b(b) { }
11803 virtual int NumFrames() const { return n.NumFrames(); }
11804 virtual Point2d TexCoord(int framenum, int statenum, int face, int point) const
11805 {
11806 if (b)
11807 {
11808 int f = count.face_num(face);
11809 int p = count.point_map(face, point);
11810 return n.TexCoord(framenum, statenum, f, p);
11811 }
11812 return n.TexCoord(framenum, statenum, face, point);
11813 }
11814
11815private:
11816 MeshTexCoords &n;
11817 bool b;
11819};
11820
11822{
11823public:
11824 MeshColorsToTriangles(MeshColors &n, bool b) : n(n), b(b) { }
11825 virtual int NumFrames() const { return n.NumFrames(); }
11826 virtual unsigned int VertexColor(int framenum, int statenum, int face, int point) const
11827 {
11828 if (b)
11829 {
11830 int f = count.face_num(face);
11831 int p = count.point_map(face, point);
11832 return n.VertexColor(framenum, statenum, f, p);
11833 }
11834 return n.VertexColor(framenum, statenum, face, point);
11835 }
11836private:
11837 MeshColors &n;
11838 bool b;
11840};
11841
11842//
11843// VBO usage, try 2
11844//
11845#if 0
11846struct VertexElem
11847{
11848 float x,y,z;
11849};
11850struct NormalElem
11851{
11852 float nx,ny,nz;
11853};
11854struct ColorElem2
11855{
11856 unsigned char r,g,b,a;
11857};
11858struct TexCoordElem
11859{
11860 float tx,ty;
11861};
11862struct DataBlock
11863{
11864 DataBlock() : type(0), orig_ptr(0), size_in_bytes(1), adjusted_buffer(0), adjusted_size(0), cleanup((char*)0) { }
11865 template<class T>
11866 DataBlock(int type, T *ptr,int count) : type(type), orig_ptr((char*)ptr), size_in_bytes(count*sizeof(T)), adjusted_buffer(0), adjusted_size(0), cleanup(ptr) { }
11867 DataBlock(const DataBlock &b)
11868 {
11869 adjusted_buffer = new char[b.adjusted_size];
11870 adjusted_size = b.adjusted_size;
11871 std::copy(b.adjusted_buffer, b.adjusted_buffer+adjusted_size, adjusted_buffer);
11872 orig_ptr = b.orig_ptr;
11873 type = b.type;
11874 size_in_bytes = b.size_in_bytes;
11875 }
11876 std::pair<char*, int> BufferPosPart() const { return std::make_pair(adjusted_buffer, adjusted_size); }
11877 int type;
11878 char *orig_ptr;
11879 int size_in_bytes;
11880 void OrigToAdjusted(int size_in_bytes);
11881 char *adjusted_buffer;
11882 int adjusted_size;
11883 ~DataBlock();
11884 std::shared_ptr<void> cleanup;
11885};
11886
11887struct DataFrames
11888{
11889 std::vector<DataBlock> vec;
11890
11891 void SetFrames(int frames) { vec.resize(frames); }
11892 int NumBytes(); // just one of them
11893 int Count();
11894 void OrigToAdjusted(int frame, int bytes) { vec[frame].OrigToAdjusted(bytes); }
11895 std::pair<char*, int> BufferPosPart(int frame) const
11896 {
11897 return vec[frame].BufferPosPart();
11898 }
11899};
11900
11901struct DataTypes
11902{
11903 DataFrames vertex;
11904 DataFrames normal;
11905 DataFrames color;
11906 DataFrames texcoord;
11907 void SetFrames(int type, int frames);
11908
11909 void OrigToAdjusted(bool has_normal, bool has_color, bool has_texcoord);
11910 std::pair<char*, int> BufferPosPart(int type, int frame)
11911 {
11912 switch(type) {
11913 case 0: return vertex.BufferPosPart(frame);
11914 case 1: return normal.BufferPosPart(frame);
11915 case 2: return color.BufferPosPart(frame);
11916 case 3: return texcoord.BufferPosPart(frame);
11917 };
11918 return std::make_pair((char*)0,0);
11919 }
11920};
11921struct VBOObjects
11922{
11923 VBOObjects();
11924 ~VBOObjects();
11925 void SetObjectCount(int count) { objs.resize(count); }
11926 void MeshToOrig(int objnum, Mesh &mesh);
11927 void MeshNormalsToOrig(int objnum, Mesh &mesh, MeshNormals &normals);
11928 void MeshColorsToOrig(int objnum, Mesh &mesh, MeshColors &colors);
11929 void MeshTexCoordsToOrig(int objnum, Mesh &mesh, MeshTexCoords &texcoords);
11930 void OrigToAdjusted(bool has_normal, bool has_color, bool has_texcoord);
11931 void AllocWholeBuffer(bool has_normal, bool has_color, bool has_texcoord);
11932 void CopyPartsToWholeBuffer(int vertex, int normal, int color, int texcoord);
11933 void BlitWholeBufferToGPU();
11934 void CopyPartToGPU(int obj_num, int vertex, int normal, int color, int texcoord);
11935 void BlitGPUToScreen();
11936public:
11937 void AllocTexture(int count);
11938 void UpdateTexture(MeshTextures &tex, int frame, int pos);
11939 void EnableTexture(int frame);
11940 void DisableTexture();
11941
11942
11943private:
11944 std::vector<DataTypes> objs;
11945 char *wholebuffer;
11946 int wholebuffer_vertex_size;
11947 int wholebuffer_normal_size;
11948 int wholebuffer_color_size;
11949 int wholebuffer_texcoord_size;
11950 bool m_has_normal;
11951 bool m_has_color;
11952 bool m_has_texcoord;
11953 bool m_quads;
11954
11955 struct Priv;
11956 Priv *priv;
11957 friend class BlitWholeInterface;
11958 friend class BlitPartInterface;
11959
11960 std::pair<char*, int> BufferPosPart(int type, int obj_num, int frame);
11961 std::pair<int,int> BufferPosWhole(int type, int obj_num);
11962 void SetFrameCount(int obj_num, int type, int num_frames);
11963
11964 int *texture;
11965};
11966#endif
11967
11968
11969template<class T>
11971{
11972 int sz = arr.Size();
11973 *result = new T[sz];
11974 for(int i=0;i<sz;i++)
11975 {
11976 (*result)[i] = arr.Index(i);
11977 }
11978}
11979
11980
11981#if 0
11982class FaceCollectionBuffer
11983{
11984public:
11985 FaceCollectionBuffer(FaceCollection &coll,
11986 bool vertex, bool normal, bool color, bool texcoord) : coll(&coll), m_vertex(vertex), m_normal(normal), m_color(color), m_texcoord(texcoord) { }
11987 void AddAttrib(int id) { attrib_ids.push_back(id); }
11988 void CalculateSizes();
11989 void CreateBuffers();
11990 const Buffer<float> &VertexBuffer() const { return *vertex_buffer; }
11991 const Buffer<float> &NormalBuffer() const { return *normal_buffer; }
11992 const Buffer<unsigned int> &ColorBuffer() const { return *color_buffer; }
11993 const Buffer<float> &TexCoordBuffer() const { return *texcoord_buffer; }
11994 const Buffer<float> &Attrib_buffer(int id) const
11995 {
11996 int s = attrib_ids.size();
11997 for(int i=0;i<s;i++)
11998 if (attrib_ids[i]==id) return *attrib_buffers[i];
11999 return *attrib_buffers[0];
12000 }
12001private:
12002 FaceCollection *coll;
12003 bool m_vertex;
12004 bool m_normal;
12005 bool m_color;
12006 bool m_texcoord;
12007 int vertex_size;
12008 int normal_size;
12009 int color_size;
12010 int texcoord_size;
12011 Buffer<float> *vertex_buffer;
12012 Buffer<float> *normal_buffer;
12013 Buffer<unsigned int> *color_buffer;
12014 Buffer<float> *texcoord_buffer;
12015 Buffer<float> **attrib_buffers;
12016 std::vector<int> attrib_ids;
12017};
12018
12019class RenderBuffers
12020{
12021public:
12022 void SetupVertex(const Buffer<float> &buf, int pos);
12023 void SetupNormal(const Buffer<float> &buf, int pos);
12024 void SetupColor(const Buffer<unsigned int> &buf, int pos);
12025 void SetupTexCoord(const Buffer<float> &buf, int pos);
12026 void SetupAttrib(int id, const Buffer<float> &buf, int pos);
12027 void Render(bool quads, int start_elem, int numitems);
12028 //void RenderOne(int start_elem, int numitems);
12029 void DisableAll();
12030private:
12031 bool vertex,normal,color,texcoord;
12032 std::vector<int> attrib_ids;
12033};
12034
12035#endif
12036
12037// shader time has to reset on state change
12038// 1) Empty in vertex array solves problems
12039// 2) time has to be continuous
12040// 3) shaders describe path of single point to get continuous time
12041// 4) vertex arrays describe all _possible_ changes in the path
12042// or jumps in the positions
12043
12044#if 0
12045struct TimedPoint
12046{
12047 float start_time;
12048 float end_time;
12049
12050};
12051#endif
12052
12054{
12055public:
12056 virtual Point FacePoint(int face, int point);
12057 virtual int SpecialTimesCount() const=0;
12058 virtual float SpecialTimes(int special_time)=0; // returns time
12059 // TODO: PATH SELECTION
12060 virtual int SpecialPathNum() const=0; // which path to choose
12061 virtual Point PathData(int special_time, int num) const=0;
12062};
12063
12064
12066{
12067public:
12068 VertexArrayFaceCollection(float *v_array, int v_size,
12069 float *n_array, int n_size,
12070 unsigned int *c_array, int c_size,
12071 float *tex_array, int tex_size,
12072 float **attrib_array, int a_size1, int a_size2)
12073 : v_array(v_array), v_size(v_size),
12074 n_array(n_array), /*n_size(n_size),*/
12075 c_array(c_array), /*c_size(c_size),*/
12076 tex_array(tex_array), /*tex_size(tex_size),*/
12077 attrib_array(attrib_array) /*, attrib_size1(a_size1), attrib_size2(a_size2)*/
12078 {
12079 }
12080
12081 virtual int NumFaces() const { return v_size/3/3; }
12082 virtual int NumPoints(int face) const { return 3; }
12083 virtual Point FacePoint(int face, int point) const
12084 {
12085 float x = 0.0;
12086 float y = 0.0;
12087 float z = 0.0;
12088 if (v_array)
12089 {
12090 x = v_array[face*3*3+point*3+0];
12091 y = v_array[face*3*3+point*3+1];
12092 z = v_array[face*3*3+point*3+2];
12093 }
12094 return Point(x,y,z);
12095 }
12096 virtual Vector PointNormal(int face, int point) const
12097 {
12098 float x = 0.0;
12099 float y = 0.0;
12100 float z = 0.0;
12101 if (n_array)
12102 {
12103 x = n_array[face*3*3+point*3+0];
12104 y = n_array[face*3*3+point*3+1];
12105 z = n_array[face*3*3+point*3+2];
12106 }
12107 return Vector(x,y,z);
12108 }
12109 virtual float Attrib(int face, int point, int id) const
12110 {
12111 if (attrib_array)
12112 return attrib_array[id][face*3*1+point*1];
12113 else
12114 {
12115 return 0.0;
12116 }
12117 }
12118 virtual int AttribI(int face, int point, int id) const
12119 {
12120 return 0;
12121 }
12122 virtual unsigned int Color(int face, int point) const
12123 {
12124 if (c_array)
12125 return c_array[face*3+point];
12126 else
12127 return 0xffffffff;
12128 }
12129 virtual Point2d TexCoord(int face, int point) const
12130 {
12131 float x = 0.0;
12132 float y = 0.0;
12133 if (tex_array)
12134 {
12135 x = tex_array[face*3*2+point*2 +0];
12136 y = tex_array[face*3*2+point*2 +1];
12137 }
12138 Point2d p = { x,y };
12139 return p;
12140 }
12141 virtual int NumTextures() const { return 0; }
12142 virtual void GenTexture(int num) { }
12143 virtual BufferRef TextureBuf(int num) const {
12144 BufferRef ref; ref.buffer = 0; return ref;
12145 }
12146 virtual int FaceTexture(int face) const { return -1; }
12147private:
12148 float *v_array;
12149 int v_size;
12150 float *n_array;
12151 //int n_size;
12152 unsigned int *c_array;
12153 //int c_size;
12154 float *tex_array;
12155 //int tex_size;
12156 float **attrib_array;
12157 //int attrib_size1, attrib_size2;
12158};
12159
12161{
12162public:
12164 void Generate_Vertex(float **vertex, int *size)
12165 {
12166 }
12167 void Generate_Normal(float **normal, int *size);
12168 void Generate_Color(unsigned int **color, int *size);
12169 void Generate_Tex(float **texture, int *size);
12170 void Generate_Attrib(int id, float *array, int *size);
12171 void Generate_Attrib_Array(float **attrib_array, int *asize1, int *asize2);
12172
12173private:
12174 FaceCollection &coll;
12175};
12176
12178{
12179public:
12181 void save(std::string filename)
12182 {
12183 std::ofstream file(filename);
12184 int s = coll->NumFaces();
12185 for(int i=0;i<s;i++)
12186 {
12187 int ss = coll->NumPoints(i);
12188 for(int j=0;j<ss;j++)
12189 {
12190 Point p = coll->FacePoint(i,j);
12191 unsigned int p2 = coll->Color(i,j);
12192 Color c(p2);
12193 if (std::isnan(p.x)) p.x=0.0;
12194 if (std::isnan(p.y)) p.y=0.0;
12195 if (std::isnan(p.z)) p.z=0.0;
12196 file << "v " << p.x << " " << p.y << " " << p.z << " " << c.r << " " << c.g << " " << c.b << std::endl;
12197 }
12198 }
12199 for(int i=0;i<s;i++)
12200 {
12201 int ss = coll->NumPoints(i);
12202 for(int j=0;j<ss;j++)
12203 {
12204 Vector p = coll->PointNormal(i,j);
12205 if (std::isnan(p.dx)) p.dx=0.0;
12206 if (std::isnan(p.dy)) p.dy=0.0;
12207 if (std::isnan(p.dz)) p.dz=0.0;
12208 file << "vn " << p.dx << " " << p.dy << " " << p.dz << std::endl;
12209 }
12210 }
12211 for(int i=0;i<s;i++)
12212 {
12213 int ss = coll->NumPoints(i);
12214 for(int j=0;j<ss;j++)
12215 {
12216 Point2d p = coll->TexCoord(i,j);
12217 float p2 = coll->TexCoord3(i,j);
12218 if (std::isnan(p.x)) p.x=0.0;
12219 if (std::isnan(p.y)) p.y=0.0;
12220 if (std::isnan(p2)) p2=0.0;
12221
12222 file << "vt " << p.x << " " << p.y << " " << p2 << std::endl;
12223 }
12224 }
12225#if 0
12226 for(int i=0;i<s;i++)
12227 {
12228 int ss = coll->NumPoints(i);
12229 for(int j=0;j<ss;j++)
12230 {
12231 unsigned int p = coll->Color(i,j);
12232 Color c(p);
12233
12234 file << "vc " << c.r << " " << c.g << " " << c.b << " " << c.alpha << std::endl;
12235 }
12236 }
12237#endif
12238 int counter =1;
12239 for(int i=0;i<s;i++)
12240 {
12241 file << "f ";
12242 int ss = coll->NumPoints(i);
12243 for(int j=0;j<ss;j++)
12244 {
12245 file << counter << "/" << counter << "/" << counter;
12246 if (j!=ss-1) file << " ";
12247 counter++;
12248 }
12249 file << std::endl;
12250 }
12251 }
12252
12253private:
12254 FaceCollection *coll;
12255};
12256
12257int filesize(std::string filename);
12258
12259
12261{
12262public:
12263 LoadObjModelFaceCollection(LoadStream * file_data, int objcount, std::vector<std::string> material_names);
12264 void Prepare();
12265 void check_invalidate() const;
12266 void check_invalidate2();
12267 void Load() const;
12268 void Load2();
12269 virtual int NumFaces() const;
12270 virtual int NumPoints(int face) const;
12271 virtual Point FacePoint(int face, int point) const;
12272 virtual Vector PointNormal(int face, int point) const;
12273 virtual float Attrib(int face, int point, int id) const;
12274 virtual int AttribI(int face, int point, int id) const;
12275 virtual unsigned int Color(int face, int point) const;
12276 virtual float TexCoord3(int face, int point) const;
12277 virtual Point2d TexCoord(int face, int point) const;
12278 int Count(int face, int point) const;
12279private:
12280 LoadStream *file_data;
12281 std::vector<Point> vertex_data;
12282 std::vector<Point2d> texcoord_data;
12283 std::vector<float> texcoord3_data;
12284 std::vector<Vector> normal_data;
12285 std::vector<unsigned int> color_data;
12286 std::vector<int> vertex_index;
12287 std::vector<int> texture_index;
12288 std::vector<int> normal_index;
12289 std::vector<int> face_counts;
12290 int obj_num;
12291 mutable std::vector<int> counts;
12292 mutable bool firsttime;
12293 std::vector<std::string> material_names_external;
12294 std::vector<std::string> material_names_internal;
12295};
12296
12297#endif
int mapping(char c)
Definition test.cpp:18
P func(int c, EveryApi &ev)
Definition test.cpp:59
Env e
Definition Common.cc:2
Color2 colors[]
Definition Effect.cc:56
LowApi * g_low
Definition GameApi_low.cc:1684
FunctionImpl1< Point2d, Element< Point > *, Plane, PlaneIn3d > PlaneIn3dFunction
Definition Effect.hh:2242
void confirm_texture_usage(FaceCollection *coll)
Definition GameApi_dep_env.cc:1956
FunctionImpl1< MatrixCurve *, BoxCollection *, int, SampleMatrixCurve > SampleMatrixCurveFunction
Definition Effect.hh:5837
FunctionImpl0< Point2d, Function< Point2d, float > *, Distance2d > Distance2dFunction
Definition Effect.hh:2120
FunctionImpl1< BoxableFaceCollection *, BoxableFaceCollection *, Matrix, MatrixElem > MatrixElemFunction
Definition Effect.hh:8318
FunctionImpl0< Array< float, Matrix > *, MatrixCurve *, MatrixCurveConvert > MatrixCurveConvertFunction
Definition Effect.hh:1705
FunctionImplT0< Waveform *, SinWaveform > SinWaveformFunction
Definition Effect.hh:5410
FunctionImpl3< SurfaceIn3d *, FaceCollection *, int, int, int, SampleSurfaceIn3d > SampleSurfaceIn3dFunction
Definition Effect.hh:6382
FunctionImpl0< VectorCollection *, FloatArray *, Distance > DistanceFunction
Definition Effect.hh:3075
FunctionImpl1< PointCollection2d *, PointCollection *, Plane, PlanePointsIn3d > PlanePointsIn3dFunction
Definition Effect.hh:2999
FunctionImpl0< float, MatrixCurve *, SpiralMatrixCurve > SpiralMatrixCurveFunction
Definition Effect.hh:1694
void ExecuteFaceStore(ArrayRender &r, PrecalcStore &prestore, int frame)
Definition Effect.cc:3226
void PrecalcRenderCmds(OpenGlCommands &cmds)
Definition Effect.cc:2942
VBOUpdate
Definition Effect.hh:10676
@ UpdateAll
Definition Effect.hh:10682
@ UpdateAllColor
Definition Effect.hh:10686
@ UpdateVertexNormalIndex
Definition Effect.hh:10684
@ UpdateColor
Definition Effect.hh:10680
@ UpdateIndex
Definition Effect.hh:10681
@ UpdateTexture
Definition Effect.hh:10679
@ UpdateVertexNormal
Definition Effect.hh:10683
@ UpdateAllTexture
Definition Effect.hh:10687
@ UpdateVertex
Definition Effect.hh:10677
@ UpdateVertexIndex
Definition Effect.hh:10685
@ UpdateNormal
Definition Effect.hh:10678
void Execute(FrameAnim &f, Low_SDL_Surface *screen)
Definition Main.cc:1603
FunctionImpl1< BoxCollection *, BoxableFaceCollection *, BoxableFaceCollection &, BoxedElem > BoxedElemFunction
Definition Effect.hh:6244
FunctionImpl2< FaceCollection *, TextureCoords *, int, Point, SphericalTexCoords > SphericalTexCoordsFunction
Definition Effect.hh:4926
FunctionImpl1< Waveform *, FloatArray *, int, SampleWaveform > SampleWaveformFunction
Definition Effect.hh:5306
AttribId
Definition Effect.hh:71
@ AttrCenterZ
Definition Effect.hh:74
@ AttrInternalNY_X
Definition Effect.hh:84
@ AttrInternalNY_Y
Definition Effect.hh:85
@ AttrFace
Definition Effect.hh:87
@ AttrInternalNX_Z
Definition Effect.hh:83
@ AttrInternalNX_Y
Definition Effect.hh:82
@ AttrInternalNY_Z
Definition Effect.hh:86
@ AttrInternalNX_X
Definition Effect.hh:81
@ AttrPart
Definition Effect.hh:89
@ AttrCenterY
Definition Effect.hh:73
@ AttrFrame
Definition Effect.hh:88
@ AttrObjectId
Definition Effect.hh:80
@ AttrInternalY
Definition Effect.hh:76
@ AttrInternalX
Definition Effect.hh:75
@ AttrCenterX
Definition Effect.hh:72
@ AttrInternalObjX
Definition Effect.hh:78
@ AttrInternalZ
Definition Effect.hh:77
@ AttrInternalObjY
Definition Effect.hh:79
FunctionImpl0< FaceCollection *, FaceCollectionTri *, TrisToTris > TrisToTrisFunction
Definition Effect.hh:4369
FunctionImpl2< FaceCollection *, FaceCollection *, int, int, SplitQuads > SplitQuadsFunction
Definition Effect.hh:6588
void AllocToNativeArray(Array< int, T > &arr, T ***result)
FunctionImpl0< FaceCollectionTriWithObjects *, FaceCollectionVBO *, VBO > VBOFunction
Definition Effect.hh:10673
float SolveWithFailure(const Function< float, float > &func, float t_0, float t_1, bool &success)
Definition Effect.cc:1879
void CleanupFrameAnim(FrameAnim &f, Low_SDL_Surface *surf)
Definition Main.cc:1714
FunctionImpl0< Array< int, Matrix >, BoxCollection *, BoxCollectionConvert > BoxCollectionConvertFunction
Definition Effect.hh:5496
void AttachBoxes(const BoxCollection &c, const std::vector< Boxable * > &v)
Definition Effect.cc:187
FunctionImpl0< CurveIn3d *, MatrixCurve *, CurveMovement > CurveMovementFunction
Definition Effect.hh:4579
FunctionImplT2< PointCollection2d *, int, int, Packing > PackingFunction
Definition Effect.hh:10284
FunctionImpl1< GridIn3d *, FaceCollection *, int, SampleGrid > SampleGridFunction
Definition Effect.hh:9799
void DrawVBO(int obj, VBOState &state, VBOUpdate u=UpdateAll, const std::vector< Attrib > &attribs=std::vector< Attrib >())
Definition Effect.cc:2541
void TextureGeneration(FaceCollection &coll, FrameAnimPlugins &plugins)
Definition Effect.cc:3317
FunctionImpl1< PointCollection *, PointCollection *, Matrix, TransformPoints > TransformPointsFunction
Definition Effect.hh:9469
FunctionImplT0< BoxableFaceCollection *, CylinderElem > CylinderElemFunction
Definition Effect.hh:7649
BufferRef LoadImage(std::string filename, bool &success)
Definition Main.cc:1816
BufferRef CopyFromSDLSurface(Low_SDL_Surface *surf)
Definition Main.cc:1901
SolvableCompose< Point > SolvableComposePoint
Definition Effect.hh:10181
FunctionImpl0< Array< int, Vector > *, VectorCollection *, VectorCollectionConvert > VectorCollectionConvertFunction
Definition Effect.hh:3018
FunctionImpl0< Point, Element< Matrix > *, TranslateElement > TranslateElementFunction
Definition Effect.hh:1658
FunctionImplT2< BoxableFaceCollection *, int, int, DiskElem > DiskElemFunction
Definition Effect.hh:7701
FaceType
Definition Effect.hh:8388
@ EDoNotDraw
Definition Effect.hh:8389
@ EIntersect
Definition Effect.hh:8391
@ EDraw
Definition Effect.hh:8390
std::ostream & operator<<(std::ostream &o, const Array< I, T > &arr)
Definition Effect.hh:994
FunctionImpl0< std::pair< Point, Point >, Element< Matrix > *, Direction > DirectionFunction
Definition Effect.hh:4562
FunctionImplT2< Waveform *, float, float, ConstantWaveform > ConstantWaveformFunction
Definition Effect.hh:5440
FunctionImpl0< std::pair< Point, Vector >, Element< std::pair< Point, Point > > *, VectorPoints > VectorPointsFunction
Definition Effect.hh:4842
void RenderOpenGlPoly(const PointCollection &col)
Definition Effect.cc:675
FunctionImpl1< FaceCollection *, TextureCoords *, int, HorizTexCoords > HorixTexCoordsFunction
Definition Effect.hh:4980
FunctionImpl0< PointCollection *, BoxCollection *, PointsToBoxCollection > PointsToBoxCollectionFunction
Definition Effect.hh:5674
FunctionImpl0< CurveIn3d *, MatrixCurve *, TranslateToMatrixCurve > TranslateToMatrixCurveFunction
Definition Effect.hh:1673
void RenderOpenGl(const FaceCollection &col)
Definition Effect.cc:594
FunctionImpl1< BoxCollection *, BoxCollection *, Matrix, MatrixBox > MatrixBoxFunction
Definition Effect.hh:9715
FunctionImpl1< MatrixCurve *, CurveIn3d *, Vector, MatrixCurveToCurveIn3d > MatrixCurveToCurveIn3dFunction
Definition Effect.hh:1761
FunctionImpl1< Point2d, CurveIn2d *, float, Circle > CircleFunction
Definition Effect.hh:2076
Low_SDL_Surface * InitSDL2(int scr_x, int scr_y, bool vsync, bool antialias=false, bool resize=false, bool vr_init=false)
Definition Main.cc:548
int filesize(std::string filename)
Definition GameApi_pl.cc:14757
FunctionImpl1< PointCollection *, LineCollection *, bool, ContinuousLines > ContinuousLinesFunction
Definition Effect.hh:4667
float Solve(const Function< float, float > &func, float t_0, float t_1)
Definition Effect.cc:1836
FunctionImpl0< FaceCollection *, FaceCollection *, FlipNormals > FlipNormalsFunction
Definition Effect.hh:4625
void RenderOpenGlTextures(const FaceCollection &col)
Definition Effect.cc:588
FunctionImplT0< BoxableFaceCollection *, CubeElem > CubeElemFunction
Definition Effect.hh:7586
FunctionImpl1< CurveIn2d *, CurveIn3d *, Plane, PlaneCurveIn3d > PlaneCurveIn3dFunction
Definition Effect.hh:2262
FunctionImpl1< FaceCollection *, TextureCoords *, int, SimpleTexCoords > SimpleTexCoordsFunction
Definition Effect.hh:5001
BufferRef LoadImageFromString(const std::vector< unsigned char > &buffer, bool &success)
Definition Main.cc:1770
FunctionImpl1< BoxableFaceCollection *, BoxableFaceCollection *, PointMap &, ModifyObject > ModifyObjectFunction
Definition Effect.hh:10420
FunctionImpl1< BoxableFaceCollection *, BoxableFaceCollection *, Vector, Move > MoveFunction
Definition Effect.hh:8356
ArrayConvert< PointCollection2d, int, Point2d > PointCollection2dConvert
Definition Effect.hh:2666
FunctionImpl1< float, CurveIn2d *, float, AnimCircle > AnimCircleFunction
Definition Effect.hh:2168
FunctionImpl1< Waveform *, Waveform *, int, RepeatWaveform > RepeatWaveformFunction
Definition Effect.hh:5396
ArrayConvert< FaceCollectionArray, int, const FaceCollection * > FaceCollectionArrayConvert
Definition Effect.hh:3563
FunctionImpl3< Waveform *, Waveform *, float, float,float, FitWaveform > FitWaveformFunction
Definition Effect.hh:5427
void PreCalcMesh(Mesh &mesh, ArrayRender &r, PrecalcStore &prestore)
Definition Effect.cc:3166
void RenderOpenGlObjects(const BoxCollectionWithObject &coll, VBOState &vbostate, VBOUpdate u=UpdateVertexNormal)
Definition Effect.cc:729
FunctionImpl0< FaceCollection *, FaceCollectionTri *, QuadsToTris > QuadsToTrisFunction
Definition Effect.hh:4468
void UpdateVBO(const FaceCollectionVBO &faces, int obj, VBOState &state, VBOUpdate u=UpdateAll, const std::vector< Attrib > &attribs=std::vector< Attrib >())
Definition Effect.cc:2085
FunctionImpl0< Array< int, float > *, FloatArray *, FloatArrayConvert > FloatArrayConvertFunction
Definition Effect.hh:2056
FunctionImplT0< Waveform *, SawWaveform > SawWaveformFunction
Definition Effect.hh:5464
void DisplayFrame(FrameAnim &f, Low_SDL_Surface *screen, float time)
Definition Main.cc:1689
void InitFrameAnim(FrameAnim &f, Low_SDL_Surface *screen)
Definition Main.cc:1682
FunctionImpl0< FaceCollection *, LineCollection *, OutlineFaces > OutlineFacesFunction
Definition Effect.hh:4753
FunctionImpl0< GridIn3d *, PointCollection *, PointCollectionFromGrid > PointCollectionFromGridFunction
Definition Effect.hh:3139
FunctionImpl2< CurveIn2d *, CurveIn2d *, float, float, ScaleCurveIn2d > ScaleCurveIn2dFunction
Definition Effect.hh:2149
void PreCalcFaceStore(void(*fptr)(FaceStore &s, float time, float repeat_length), float repeat_duration, int repeat_framecount, ArrayRender &r, PrecalcStore &prestore)
Definition Effect.cc:3196
FunctionImpl0< float, Function< float, float > *, FloatMove > FloatMoveFunction
Definition Effect.hh:2131
FunctionImplT2< BoxableFaceCollection *, int, int, SphereElem > SphereElemFunction
Definition Effect.hh:9364
FunctionImpl1< CurveIn3d *, PointCollection *, int, SampleCurve3d > SampleCurve3dFunction
Definition Effect.hh:4528
FunctionImpl0< FaceCollection *, PointCollection *, FaceCenterPoints > FaceCenterPointsFunction
Definition Effect.hh:4795
Curve< std::pair< Point, Vector > > CurveWithNormal
Definition Effect.hh:1396
void RenderOpenGlLines(const LineCollection &col)
Definition Effect.cc:661
FunctionImpl0< Vector, VectorCollection *, SimpleVectorCollection > SimpleVectorCollectionFunction
Definition Effect.hh:3029
Low_SDL_Surface * InitSDL(int scr_x, int scr_y, bool vsync, bool antialias=false)
Definition Main.cc:852
void PrecalcCmds(OpenGlCommands &cmds)
Definition Effect.cc:2940
void RenderCmds(OpenGlCommands &cmds)
Definition Effect.cc:2941
void PreCalcExecute(Render &rend, FrameAnim &f, float duration, int numframes)
Definition Main.cc:1719
FunctionImpl1< std::pair< Point, Vector >, Element< std::pair< Point, Vector > > *, float, AdvanceVector > AdvanceVectorFunction
Definition Effect.hh:4828
FunctionImpl1< FaceCollection *, BoxCollection *, float, FacesToBoxCollection > FacesToBoxCollectionFunction
Definition Effect.hh:5518
FunctionImpl2< SurfaceIn3d *, GridIn3d *, int, int, SampleSurfaceForGrid > SampleSurfaceForGridFunction
Definition Effect.hh:6285
Time< Point > TimedPoint
Definition Event.hh:34
PT Map(PT p, int face, int point, void *data)
Definition GameApiTest.cc:19
pthread_t thread
Definition GameApi.cc:869
GameApi::ML part(GameApi::EveryApi &ev, GameApi::ML ml, float x_trans, float y_rot, int x, int y, int mode=0)
Definition GameApi.cc:38016
bool operator<(const Dep &a1, const Dep &a2)
Definition GameApi_dep_add_find.cc:2905
size dy
Definition GameApi_gui.cc:1727
Complex ln(Complex z)
Definition GameApi_pl.cc:31431
float arg(Complex z)
Definition GameApi_pl.cc:31413
Complex exp(Complex z, int n)
Definition GameApi_pl.cc:31416
char * cmds[]
Definition Interpreter.hh:5
void UpdateAnim(Anim &anim, AnimState &state, const std::vector< Attrib > &attribs)
Definition Shader.cc:6821
void DrawAnim(float start, float end, AnimState &state, const std::vector< Attrib > &attribs)
Definition Shader.cc:6839
float Dist(const Point &a, const Point &b)
Definition VectorTools.cc:78
FlexibleCube box(Point p1, float sx, float sy, float sz)
Definition VectorTools.cc:1529
PML or_elem(PML p1, PML p2)
Definition accel.cc:820
unsigned int color_1(int pointnum, PT pos)
Definition test.cpp:7
void use(T)
Definition boxed_cast_test.cpp:8
AMX(float c)
Definition Effect.hh:10355
float Index(float x) const
Definition Effect.hh:10356
std::vector< float > Inverse(float y) const
Definition Effect.hh:10357
Definition compiled_tests.cpp:1189
Definition Effect.hh:4817
AdvanceVector(const std::pair< Point, Vector > &v, float val)
Definition Effect.hh:4819
std::pair< Point, Vector > Elem() const
Definition Effect.hh:4820
bool Index(int a) const
Definition Effect.hh:8372
AndFunc(Function< int, bool > &f, Function< int, bool > &f2)
Definition Effect.hh:8371
void ChangeTime(float t)
Definition Effect.hh:9612
AnimBox(const BoxCollection &c, const BoxCollection &c2, float length)
Definition Effect.hh:9609
Matrix Index(int box) const
Definition Effect.cc:1799
int Size() const
Definition Effect.hh:9610
float Length() const
Definition Effect.hh:9611
AnimCircle(float time, float count)
Definition Effect.hh:2154
float Size() const
Definition Effect.hh:2163
Point2d Index(float angle) const
Definition Effect.hh:2155
virtual float Size() const
Definition Effect.hh:2356
AnimCurveIn3d(CurveIn3d &c1, CurveIn3d &c2, float time, float length)
Definition Effect.hh:2347
virtual Point Index(float pos) const
Definition Effect.hh:2348
AnimFaceCollectionArray(const Anim &a)
Definition Effect.hh:3553
const FaceCollection * Index(int i) const
Definition Effect.hh:3555
int Size() const
Definition Effect.hh:3554
void Init()
Definition Effect.hh:11176
bool Frame(float time)
Definition Effect.hh:11180
AnimFrameAnim(Anim &a, ShaderFile &f, float length)
Definition Effect.hh:11175
Definition Effect.hh:3454
virtual int Size() const =0
virtual int * SelectArray() const =0
Definition Effect.hh:3475
int Size() const
Definition Effect.hh:3493
AnimSelect(int size)
Definition Effect.hh:3477
int * SelectArray() const
Definition Effect.hh:3492
~AnimSelect()
Definition Effect.hh:3485
void Set(int index, bool b)
Definition Effect.hh:3486
Definition Effect.hh:3448
virtual void Set(int index, bool b)=0
Definition Effect.hh:3441
virtual int NumFrames() const =0
virtual FaceCollection * Frame(int framenum) const =0
int Size() const
Definition Effect.hh:895
ApplyParameterArray(Array< int, Array< P, T > * > &arr, P p)
Definition Effect.hh:894
T Index(int i) const
Definition Effect.hh:896
Definition Effect.hh:1009
virtual I1 SizeX() const =0
virtual I2 SizeY() const =0
Definition Effect.hh:1334
J Index(I i) const
Definition Effect.hh:1337
ArrayArraySizes(ArrayArray< I, J, T > &arr)
Definition Effect.hh:1336
I Size() const
Definition Effect.hh:1341
Definition Effect.hh:1299
virtual Matrix Index(int box) const
Definition Effect.hh:9685
ArrayBox()
Definition Effect.hh:9676
void push_back(BoxCollection *c)
Definition Effect.hh:9677
ArrayBox(It beg, It end)
Definition Effect.hh:9675
virtual int Size() const
Definition Effect.hh:9678
Definition Effect.hh:919
int Size() const
Definition Effect.hh:922
T Index(int i) const
Definition Effect.hh:923
ArrayConvert(const Array< I, T > &arr)
Definition Effect.hh:921
Definition Effect.hh:1200
T Index(I i) const
Definition Effect.hh:1208
I Size() const
Definition Effect.hh:1203
ArrayDiagonal(Array< std::pair< I, I >, T > &arr)
Definition Effect.hh:1202
float XRot() const
Definition Effect.hh:11705
ArrayEffect(Render *render)
Definition Effect.hh:11704
float YRot() const
Definition Effect.hh:11706
bool Frame(float time)
Definition Effect.cc:2994
float ZRot() const
Definition Effect.hh:11707
void Init()
Definition Effect.cc:2988
void Init()
Definition Effect.hh:10956
void PostFrame()
Definition Effect.hh:10994
ArrayFrameAnim(Array< int, FrameAnim * > &arr, Render *r)
Definition Effect.hh:10955
void PreFrame(float time)
Definition Effect.hh:10974
bool Frame(float time)
Definition Effect.hh:10983
void Cleanup()
Definition Effect.hh:10965
Definition Effect.hh:1218
std::pair< T1, T2 > Index(std::pair< I1, I2 > i) const
Definition Effect.hh:1225
ArrayPair2(const Array< I1, T1 > &arr1, const Array< I2, T2 > &arr2)
Definition Effect.hh:1220
std::pair< I1, I2 > Size() const
Definition Effect.hh:1221
Definition Effect.hh:1238
std::pair< T1, T2 > Index(I i) const
Definition Effect.hh:1242
I Size() const
Definition Effect.hh:1241
ArrayPair(Array< I, T1 > &a1, Array< I, T2 > &a2)
Definition Effect.hh:1240
Definition Effect.hh:11461
unsigned char * color_array
Definition Effect.hh:11503
void EnableTexture(int num)
Definition GameApi_dep_arr_render.cc:304
int TextureCount() const
Definition Effect.hh:11495
unsigned char * q_color_array
Definition Effect.hh:11525
int TexCoordArrayStep() const
Definition Effect.hh:11493
int vertex_array_size
Definition Effect.hh:11499
void UpdateTexCoord(Mesh &mesh, MeshTexCoords &coord, std::pair< int, int > p, int frame)
Definition GameApi_dep_arr_render.cc:127
void Alloc(int numfaces, int numvertices)
Definition GameApi_dep_arr_render.cc:415
int m_normal_frames
Definition Effect.hh:11510
int * used_face_count
Definition Effect.hh:11501
std::vector< std::pair< int, int > > InsertAll(Mesh &mesh, MeshNormals &normal, MeshTexCoords &coord, MeshColors &color)
Definition GameApi_dep_arr_render.cc:348
int NormalArrayStep() const
Definition Effect.hh:11491
unsigned int vao[4]
Definition Effect.hh:11527
int * index_array
Definition Effect.hh:11507
int NumFaces(FaceCollection &coll)
Definition GameApi_dep_arr_render.cc:15
int m_texcoord_frames
Definition Effect.hh:11512
int * tex_size_x
Definition Effect.hh:11518
~ArrayRender()
Definition GameApi_dep_arr_render.cc:437
int q_num_vertices
Definition Effect.hh:11522
int * texture
Definition Effect.hh:11514
void Render(int vertexframe, int normalframe, int colorframe, int texcoordframe)
Definition Effect.hh:11488
LowApi * g_low
Definition Effect.hh:11497
BufferRef ** textures
Definition Effect.hh:11517
int texture_count
Definition Effect.hh:11515
void AllocTexture(int count)
Definition GameApi_dep_arr_render.cc:152
int * used_vertex_count
Definition Effect.hh:11500
int ColorArrayStep() const
Definition Effect.hh:11492
float * vertex_array
Definition Effect.hh:11498
std::pair< int, int > Insert(FaceCollection &coll)
Definition GameApi_dep_arr_render.cc:19
int VertexArrayStep() const
Definition Effect.hh:11490
float * q_normal_array
Definition Effect.hh:11524
void Render(bool normal, bool color, bool texcoord)
Definition Effect.hh:11485
int m_color_frames
Definition Effect.hh:11511
float * q_tex_coord_array
Definition Effect.hh:11526
float * normal_array
Definition Effect.hh:11502
int NumVertices(FaceCollection &coll)
Definition GameApi_dep_arr_render.cc:11
bool quads
Definition Effect.hh:11505
void Prepare()
Definition GameApi_dep_arr_render.cc:490
unsigned int buffer[5]
Definition Effect.hh:11521
bool buffer_allocated
Definition Effect.hh:11520
float * tex_coord_array
Definition Effect.hh:11504
float * q_vertex_array
Definition Effect.hh:11523
int m_vertex_frames
Definition Effect.hh:11509
std::pair< int, int > InsertMesh(Mesh &mesh, int frame)
Definition GameApi_dep_arr_render.cc:84
void UpdateColors(Mesh &mesh, MeshColors &color, std::pair< int, int > p, int frame)
Definition GameApi_dep_arr_render.cc:318
void UpdateAllTextures(MeshTextures &texture)
Definition GameApi_dep_arr_render.cc:168
void UpdateNormals(Mesh &mesh, MeshNormals &normal, std::pair< int, int > p, int frame)
Definition GameApi_dep_arr_render.cc:387
ArrayRender(LowApi *g_low)
Definition Effect.hh:11463
void DisableTexture()
Definition GameApi_dep_arr_render.cc:312
void UpdatePos(FaceCollection &coll, std::pair< int, int > p)
Definition GameApi_dep_arr_render.cc:64
int previous_frame
Definition Effect.hh:11516
int * tex_size_y
Definition Effect.hh:11519
virtual float Index(float val) const
Definition Effect.hh:5236
virtual float Max() const
Definition Effect.hh:5235
virtual float Min() const
Definition Effect.hh:5234
ArrayWaveform2(float *array, int size, float samplelength, float m_min, float m_max)
Definition Effect.hh:5232
virtual float Length() const
Definition Effect.hh:5233
WaveformPart * Index(int i) const
Definition Effect.hh:5213
ArrayWaveform(float *array, int size, float samplelength)
Definition Effect.hh:5211
int Size() const
Definition Effect.hh:5212
Definition EffectI.hh:22
virtual I Size() const =0
Definition Effect.hh:245
virtual A InvMap(A a, int num) const =0
virtual B Map(A a) const =0
Definition compiled_tests.cpp:1200
B()=default
virtual int AttribI(int index, int id) const
Definition Effect.hh:3831
virtual unsigned int Color(int index) const
Definition Effect.hh:3819
virtual int NumPoints() const
Definition Effect.hh:3805
virtual int IndexCount() const
Definition Effect.hh:3840
BatchGeneration(FaceCollectionTri &tri, int batchsize)
Definition Effect.hh:3802
virtual int Index(int face, int point) const
Definition Effect.hh:3835
virtual Point FacePoint(int index) const
Definition Effect.hh:3811
virtual int IndexToFace(int index) const
Definition Effect.hh:3841
int Size() const
Definition Effect.hh:3886
const FaceCollectionTri * Index(int i) const
Definition Effect.hh:3887
virtual int NumFaces() const
Definition Effect.hh:3804
virtual Point2d TexCoord(int index) const
Definition Effect.hh:3823
virtual Vector PointNormal(int index) const
Definition Effect.hh:3815
virtual float Attrib(int index, int id) const
Definition Effect.hh:3827
virtual float YSize() const
Definition Effect.hh:1934
Point Pos(float x, float y) const
Definition Effect.hh:1936
BetweenSurface(SurfaceIn3d &next, CurveIn3d &first, CurveIn3d &second)
Definition Effect.hh:1931
virtual Point Index(float x, float y) const
Definition Effect.hh:1932
virtual float XSize() const
Definition Effect.hh:1933
Definition Effect.hh:2679
float bin(float pos, int i, int n) const
Definition Effect.hh:2692
int ni(int n, int i) const
Definition Effect.hh:2696
float Size() const
Definition Effect.hh:2702
Bezier2d(PointCollection2d &p)
Definition Effect.hh:2681
Point2d Index(float pos) const
Definition Effect.hh:2682
BezierPointCollection2d(PointCollection2d &p, int count)
Definition Effect.hh:2887
Point2d Index(int i) const
Definition Effect.hh:2889
int Size() const
Definition Effect.hh:2888
Definition GraphI.hh:826
bool Frame(float time)
Definition Effect.cc:1534
BlobEffect(Render *r)
Definition Effect.cc:1508
~BlobEffect()
Definition Effect.cc:1530
int Size() const
Definition Effect.hh:5594
BlobParameterArray(PointCollection &center_points, PointCollection &center2_points, FloatArray &radius)
Definition Effect.hh:5592
~BlobParameterArray()
Definition Effect.hh:5593
ShaderParameters * Index(int i) const
Definition Effect.hh:5595
Definition Shader.hh:732
Point Convert(Point p) const
Definition Effect.hh:10373
BlobPointMap(Point center1, Point center2, float r)
Definition Effect.hh:10372
Definition Effect.hh:10066
Point adjustpoint(Point x_0, Point x_1, Point x_2, float r)
Definition Effect.hh:10148
float t(float t_0, float t_1, Point x_0, Point x_1, Point x_2, float r)
Definition Effect.hh:10131
Point line(float t, Point x_0, Point x_1)
Definition Effect.hh:10069
float f(Point p, Point x_0, Point x_1, Point x_2)
Definition Effect.hh:10070
float H(float tt, Point x_0, Point x_1, Point x_2, float r)
Definition Effect.hh:10083
float g(Point p, Point x_0, Point x_1, Point x_2)
Definition Effect.hh:10071
float h(Point p, Point x_0, Point x_1, Point x_2, float r)
Definition Effect.hh:10073
Definition Effect.hh:61
virtual bool Inside(Point p) const
Definition Effect.hh:64
virtual ~BooleanOps()
Definition Effect.hh:63
Definition Effect.hh:5484
BoxCollectionConvert(const Array< int, Matrix > &c2)
Definition Effect.hh:5486
int Size() const
Definition Effect.hh:5487
Matrix Index(int i) const
Definition Effect.hh:5492
Definition Effect.hh:5548
std::pair< Matrix, int > Index(int box) const
Definition Effect.hh:5553
virtual int BoxObject(int box) const =0
int Size() const
Definition Effect.hh:5552
virtual int NumBoxes() const =0
virtual ~BoxCollectionWithObject()
Definition Effect.hh:5550
virtual Matrix BoxIndex(int box) const =0
Definition Effect.hh:5476
virtual ~BoxCollection()
Definition Effect.hh:5478
Matrix BoxIndex(int box) const
Definition Effect.hh:5481
int NumBoxes() const
Definition Effect.hh:5480
BoxCombine(const BoxCollection &b, Boxable &elem)
Definition Effect.hh:9596
virtual int NumElements() const
Definition Effect.hh:9598
virtual void SetElemId(int id)
Definition Effect.hh:9599
Definition Effect.hh:5467
Vector u_z
Definition Effect.hh:5472
Point BoxPoint(float x, float y, float z) const
Definition Effect.cc:384
Vector u_x
Definition Effect.hh:5472
Vector u_y
Definition Effect.hh:5472
Point center
Definition Effect.hh:5471
Definition Effect.hh:6023
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:6041
virtual bool Inside(Point p) const
Definition Effect.hh:6045
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:6040
virtual void Prepare()
Definition Effect.hh:6034
virtual int NumFaces() const
Definition Effect.hh:6035
void HeavyPrepare()
Definition Effect.hh:6032
virtual std::string name() const
Definition Effect.hh:6026
void Collect(CollectVisitor &vis)
Definition Effect.hh:6028
virtual float TexCoord3(int face, int point) const
Definition Effect.hh:6044
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:6039
virtual int NumPoints(int face) const
Definition Effect.hh:6036
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:6042
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:6037
virtual void SetBox(Matrix b)
Definition Effect.hh:6046
BoxableFaceCollectionConvert(FaceCollection &coll)
Definition Effect.hh:6025
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:6043
virtual Point EndFacePoint(int face, int point) const
Definition Effect.hh:6038
Definition Effect.hh:67
Definition Effect.hh:5840
virtual ~Boxable()
Definition Effect.hh:5842
virtual void SetBox(Matrix b)=0
BoxedElem(BoxCollection &coll, BoxableFaceCollection &item)
Definition Effect.hh:6147
Vector PointNormal(int face, int point) const
Definition Effect.hh:6221
int NumPoints(int face) const
Definition Effect.hh:6196
float Attrib(int face, int point, int id) const
Definition Effect.hh:6227
FaceObject FindFace(int face) const
Definition Effect.hh:6175
Point FacePoint(int face, int point) const
Definition Effect.hh:6202
unsigned int Color(int face, int point) const
Definition Effect.hh:6208
void Prepare()
Definition Effect.hh:6149
BoxedElem(BoxCollection &coll, ObjectSelection &sel)
Definition Effect.hh:6148
void SetBox(Matrix m)
Definition Effect.hh:6150
Point2d TexCoord(int face, int point) const
Definition Effect.hh:6214
int AttribI(int face, int point, int id) const
Definition Effect.hh:6233
int NumFaces() const
Definition Effect.hh:6160
BreakPaths(PathCollection &coll, PathVisibility &p)
Definition Effect.hh:5728
int NumPaths(float posinpath) const
Definition Effect.hh:5730
int Mapping(float posinpath, int ii) const
Definition Effect.hh:5745
Matrix Index(float posinpath, int path) const
Definition Effect.hh:5741
float PathLength() const
Definition Effect.hh:5729
Definition Buffer.hh:73
float Index(float x) const
Definition Effect.hh:10326
std::vector< float > Inverse(float y) const
Definition Effect.hh:10327
CX(float c)
Definition Effect.hh:10325
Camera(MatrixCurve &curve, float time)
Definition Effect.cc:536
~Camera()
Definition Effect.cc:551
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:3429
ChangePoints(FaceCollection &coll, Function< Point, Point > &f)
Definition Effect.hh:3427
void Init()
Definition Effect.cc:1698
CircleEffect(Render *render)
Definition Effect.hh:10931
bool Frame(float time)
Definition Effect.cc:1666
virtual float Size() const
Definition Effect.hh:1740
virtual Matrix Index(float pos) const
Definition Effect.hh:1734
CircleMatrixCurve2(float x, float time)
Definition Effect.hh:1733
virtual Matrix Index(float pos) const
Definition Effect.hh:1721
virtual float Size() const
Definition Effect.hh:1725
CircleMatrixCurve(float x)
Definition Effect.hh:1720
Definition Effect.hh:2060
Circle(Point2d center, float r)
Definition Effect.hh:2063
float Size() const
Definition Effect.hh:2071
Point2d Index(float angle) const
Definition Effect.hh:2064
Circle()
Definition Effect.hh:2062
int Size() const
Definition Effect.hh:2760
ClosedLoopPointCollection2d(PointCollection2d &coll)
Definition Effect.hh:2759
Point2d Index(int i) const
Definition Effect.hh:2761
Definition Effect.hh:10220
DistRes MinDistanceFromCurve(Curve< Point > &p, Point center, float derivative_step=0.01) const
Definition Effect.cc:1848
Definition GraphI.hh:612
virtual void Collect(CollectVisitor &vis)=0
Definition GameApi.cc:43596
virtual void HeavyPrepare()=0
Definition GraphI.hh:622
virtual void register_obj(CollectInterface *i)=0
void PreCalc()
Definition Effect.hh:10807
void Execute()
Definition Effect.cc:496
ColorCmds(OpenGlCommands &cmds, Color c)
Definition Effect.hh:10806
Definition GameApi_pl.cc:4411
virtual bool has_color() const
Definition Effect.hh:7872
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:7885
void HeavyPrepare()
Definition Effect.hh:7863
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:7873
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:7868
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:7877
virtual int NumPoints(int face) const
Definition Effect.hh:7867
void Collect(CollectVisitor &vis)
Definition Effect.hh:7859
ColorElem(BoxableFaceCollection &next, unsigned int color)
Definition Effect.hh:7856
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:7893
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:7889
void Prepare()
Definition Effect.hh:7864
virtual std::string name() const
Definition Effect.hh:7857
virtual void SetBox(Matrix b)
Definition Effect.hh:7865
virtual int NumFaces() const
Definition Effect.hh:7866
void SetElemId(int id)
Definition Effect.cc:776
int NumElements() const
Definition Effect.hh:5047
ColorElement(It beg, It end, ElementCollection &ec)
Definition Effect.hh:5045
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:7923
virtual bool has_color() const
Definition Effect.hh:7921
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:7945
ColorFaceElem(BoxableFaceCollection &next, unsigned int color_1, unsigned int color_2, unsigned int color_3, unsigned int color_4)
Definition Effect.hh:7906
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:7934
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:7949
virtual void SetBox(Matrix b)
Definition Effect.hh:7914
virtual int NumFaces() const
Definition Effect.hh:7915
virtual std::string name() const
Definition Effect.hh:7912
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:7953
virtual int NumPoints(int face) const
Definition Effect.hh:7916
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:7917
Definition VectorTools.hh:380
static unsigned int Interpolate(unsigned int pixel1, unsigned int pixel2, float val)
Definition VectorTools.hh:667
unsigned int Pixel()
Definition VectorTools.hh:426
int r
Definition VectorTools.hh:744
int alpha
Definition VectorTools.hh:745
int g
Definition VectorTools.hh:744
static Color White()
Definition VectorTools.hh:476
int b
Definition VectorTools.hh:744
bool ItemInFirstArray(int i) const
Definition Effect.hh:946
CombineArrays(const Array< int, T > &a1, const Array< int, T > &a2)
Definition Effect.hh:932
bool ItemInSecondArray(int i) const
Definition Effect.hh:950
T Index(int i) const
Definition Effect.hh:934
int Size() const
Definition Effect.hh:933
Matrix BoxIndex(int box) const
Definition Effect.hh:9660
CombineBoxCollection(BoxCollection &c, BoxCollection &c2)
Definition Effect.hh:9658
int NumBoxes() const
Definition Effect.hh:9659
CombineBoxesAndObjects(BoxCollection &box, ObjectCollection &obj)
Definition Effect.hh:5651
int BoxObject(int b) const
Definition Effect.hh:5654
Matrix BoxIndex(int b) const
Definition Effect.hh:5653
int NumBoxes() const
Definition Effect.hh:5652
ObjectData Index(int i) const
Definition Effect.hh:5631
CombineObjectData(BoxCollection &box, ObjectCollection &obj, ShaderParameterArray &params)
Definition Effect.hh:5629
int Size() const
Definition Effect.hh:5630
CombineParameterArrays(ShaderParameterArray &arr, ShaderParameterArray &arr2)
Definition Effect.hh:5576
int Size() const
Definition Effect.hh:5577
ShaderParameters * Index(int i) const
Definition Effect.hh:5578
Definition Shader.hh:247
Definition Effect.hh:10727
virtual void cmd()=0
Definition Effect.hh:1017
C Index(A a) const
Definition Effect.hh:1021
ComposeArrays(Array< A, B > &a1, Function< B, C > &a2)
Definition Effect.hh:1019
A Size() const
Definition Effect.hh:1020
Definition Effect.hh:1029
ComposeChain(Array< A, T1 > &a1, Function< T1, T2 > &f1, Function< T2, T3 > &f2, Function< T3, T4 > &f3, Function< T4, C > &f4)
Definition Effect.hh:1050
ComposeChain(Array< A, T1 > &a1, Function< T1, T2 > &f1, Function< T2, T3 > &f2, Function< T3, C > &f3)
Definition Effect.hh:1043
C Index(A a) const
Definition Effect.hh:1074
ComposeChain(Array< A, T1 > &a1, Function< T1, C > &f1)
Definition Effect.hh:1032
ComposeChain(Array< A, T1 > &a1, Function< T1, T2 > &f1, Function< T2, T3 > &f2, Function< T3, T4 > &f3, Function< T4, T5 > &f4, Function< T5, T6 > &f5, Function< T6, C > &f6)
Definition Effect.hh:1065
ComposeChain(Array< A, T1 > &a1, Function< T1, T2 > &f1, Function< T2, C > &f2)
Definition Effect.hh:1037
A Size() const
Definition Effect.hh:1073
ComposeChain(Array< A, T1 > &a1, Function< T1, T2 > &f1, Function< T2, T3 > &f2, Function< T3, T4 > &f3, Function< T4, T5 > &f4, Function< T5, C > &f5)
Definition Effect.hh:1058
T Index(float pos) const
Definition Effect.hh:1807
ComposeCurve(std::vector< Base * > vec)
Definition Effect.hh:1805
float Pos(float pos, int i)
Definition Effect.hh:1831
float Length() const
Definition Effect.hh:1821
ComposeCurve(It beg, It end)
Definition Effect.hh:1804
ComposeFunc(Function< A, B > &a, Function< B, C > &b)
Definition Effect.hh:8408
C Index(A aa) const
Definition Effect.hh:8411
static Matrix Compose(Matrix m, Matrix m2)
Definition Effect.hh:1796
static Matrix Identity()
Definition Effect.hh:1795
static Point2d Identity()
Definition Effect.hh:1781
static Point2d Compose(Point2d p, Point2d p2)
Definition Effect.hh:1782
static Point Compose(Point p, Point p2)
Definition Effect.hh:1774
static Point Identity()
Definition Effect.hh:1773
Definition Effect.hh:1766
T Index(int i) const
Definition Effect.hh:1383
CompressArrayArray(ArrayArray< int, int, T > &arr)
Definition Effect.hh:1382
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:3692
virtual int NumFaces() const
Definition Effect.hh:3621
CompressObject(FaceCollectionArray &arr)
Definition Effect.hh:3615
void Prepare()
Definition Effect.hh:3616
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:3719
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:3660
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:3645
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:3706
virtual int NumPoints(int face) const
Definition Effect.hh:3633
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:3674
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:9403
void Prepare()
Definition Effect.hh:9386
virtual Point FacePoint(int face, int point) const
Definition Effect.cc:268
virtual bool has_normal() const
Definition Effect.hh:9417
void HeavyPrepare()
Definition Effect.hh:9384
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:9418
virtual int NumFaces() const
Definition Effect.hh:9388
void Collect(CollectVisitor &vis)
Definition Effect.hh:9381
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:9396
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:9391
virtual void SetBox(Matrix b)
Definition Effect.hh:9387
virtual bool has_texcoord() const
Definition Effect.hh:9395
virtual bool Inside(Point p) const
Definition Effect.hh:9412
ConeElem(int numfaces, Point p1, Point p2, float rad1, float rad2)
Definition Effect.cc:263
virtual std::string name() const
Definition Effect.hh:9380
virtual int NumPoints(int face) const
Definition Effect.hh:9389
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:9408
int BoxObject(int) const
Definition Effect.hh:5541
int NumObjects() const
Definition Effect.hh:5540
ConstantObjectCollection(int count, int object)
Definition Effect.hh:5539
Definition Effect.hh:6133
ConstantObjectSelection(BoxableFaceCollection *face)
Definition Effect.hh:6135
BoxableFaceCollection * Select(int index)
Definition Effect.hh:6136
Definition Effect.hh:3106
int Size() const
Definition Effect.hh:3109
float Index(int x) const
Definition Effect.hh:3110
ConstantSampling(int count, float dist)
Definition Effect.hh:3108
float PosAtLength(float length) const
Definition Effect.hh:1549
float LengthAtPos(float pos2) const
Definition Effect.hh:1531
Point Index(float len) const
Definition Effect.hh:1526
float Size() const
Definition Effect.hh:1522
ConstantSpeedCurve(CurveIn3d &curve, int divs)
Definition Effect.hh:1520
float Max() const
Definition Effect.hh:5434
float Index(float xx) const
Definition Effect.hh:5436
float Length() const
Definition Effect.hh:5435
ConstantWaveform(float val, float length=1000.0)
Definition Effect.hh:5432
float Min() const
Definition Effect.hh:5433
ContinuousLines(PointCollection *p, bool loops)
Definition Effect.hh:4650
void Collect(CollectVisitor &vis)
Definition Effect.hh:4651
ContinuousLines(PointCollection &p, bool loops)
Definition Effect.hh:4649
Point LinePoint(int line, int point) const
Definition Effect.hh:4657
void HeavyPrepare()
Definition Effect.hh:4654
int NumLines() const
Definition Effect.hh:4656
float Index(int i) const
Definition Effect.hh:11203
int Size() const
Definition Effect.hh:11202
ContinuousObjectMovementArrays(Array< int, float > &time_lengths, float current_time)
Definition Effect.hh:11201
Matrix get_matrix() const
Definition Effect.hh:11230
ContinuousObjectMovement(Array< int, Function< float, Matrix > * > &arr, Array< int, float > &arr2)
Definition Effect.hh:11227
Definition Effect.hh:2370
virtual Plane Index(float x)=0
virtual ~ContinuousPlanes()
Definition Effect.hh:2372
Definition Effect.hh:3516
virtual Coords coord() const =0
CopyArray(Array< int, T > &arr)
Definition Effect.hh:1148
void Generate()
Definition Effect.hh:1152
bool Frame(float time)
Definition Effect.cc:896
CubeEffect(Render *render)
Definition Effect.hh:10425
virtual int NumPoints(int face) const
Definition Effect.hh:7539
virtual Point FacePoint(int face, int point) const
Definition Effect.cc:357
virtual bool has_normal() const
Definition Effect.hh:7543
CubeElem()
Definition Effect.hh:7502
virtual void SetBox(Matrix b)
Definition Effect.hh:7537
virtual std::string name() const
Definition Effect.hh:7520
void HeavyPrepare()
Definition Effect.hh:7534
void Prepare()
Definition Effect.hh:7536
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:7554
CubeElem(Point p111, Point p112, Point p121, Point p122, Point p211, Point p212, Point p221, Point p222)
Definition Effect.hh:7510
virtual Point2d TexCoord(int face, int point) const
Definition Effect.cc:334
virtual Coords coord() const
Definition Effect.hh:7522
void Collect(CollectVisitor &vis)
Definition Effect.hh:7531
virtual int NumFaces() const
Definition Effect.hh:7538
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:7564
bool has_texcoord() const
Definition Effect.hh:7558
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:7544
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:7560
virtual int Size() const
Definition Effect.hh:9629
virtual Matrix Index(int box) const
Definition Effect.cc:1816
CubeGrid(int x, int y, int z, float dx, float dy, float dz, Matrix b)
Definition Effect.hh:9624
Curry2a(const Function2< A, B, C > &func2, A a)
Definition Effect.hh:590
C Index(B b) const
Definition Effect.hh:591
Curry2b(const Function2< A, B, C > &func2, B b)
Definition Effect.hh:601
C Index(A a) const
Definition Effect.hh:602
Curry(const Function< A, B > &func, A a)
Definition Effect.hh:580
B Elem() const
Definition Effect.hh:581
CurveArrayConvert(Array< int, CurveIn3d * > &arr)
Definition Effect.hh:1480
int Size() const
Definition Effect.hh:1481
Array< float, Point > * Index(int i) const
Definition Effect.hh:1482
Definition Effect.hh:1577
Definition Effect.hh:1573
int Size() const
Definition Effect.hh:1404
CurveConvert(const Array< float, T > &arr)
Definition Effect.hh:1403
T Index(float i) const
Definition Effect.hh:1405
Point2d Index(float i) const
Definition Effect.hh:1451
CurveIn2dConvert(const Array< float, Point2d > &c2)
Definition Effect.hh:1449
float Size() const
Definition Effect.hh:1450
Definition EffectI.hh:41
CurveIn3dConvert(const Array< float, Point > &c2)
Definition Effect.hh:1493
Point Index(float i) const
Definition Effect.hh:1495
float Size() const
Definition Effect.hh:1494
Definition EffectI.hh:49
float Size() const
Definition Effect.hh:2008
CurveInSurface(SurfaceIn3d &surf, CurveIn2d &curve)
Definition Effect.hh:2006
Point Index(float x) const
Definition Effect.hh:2012
CurveMovement(const CurveIn3d &curve)
Definition Effect.hh:4567
float Size() const
Definition Effect.hh:4568
Matrix Index(float x) const
Definition Effect.hh:4569
unsigned int Color(float x, float y) const
Definition Effect.hh:2183
float YSize() const
Definition Effect.hh:2211
void Collect(CollectVisitor &vis)
Definition Effect.hh:2174
virtual float Attrib(float x, float y, int id) const
Definition Effect.hh:2200
Point Index(float x, float y) const
Definition Effect.hh:2176
void HeavyPrepare()
Definition Effect.hh:2175
Point2d Texture(float x, float y) const
Definition Effect.hh:2182
float XSize() const
Definition Effect.hh:2210
CurveMultiply(MatrixCurve &curve, CurveIn3d &curve2)
Definition Effect.hh:2173
virtual int AttribI(float x, float y, int id) const
Definition Effect.hh:2196
Vector Normal(float x, float y) const
Definition Effect.hh:2187
Definition EffectI.hh:30
CylinderEffect(Render *render)
Definition Effect.cc:783
bool Frame(float time)
Definition Effect.cc:835
virtual int NumPoints(int face) const
Definition Effect.hh:7610
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:7637
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:7614
virtual Point FacePoint(int face, int point) const
Definition Effect.cc:318
void Collect(CollectVisitor &vis)
Definition Effect.hh:7603
virtual void SetBox(Matrix b)
Definition Effect.hh:7608
void Prepare()
Definition Effect.hh:7607
virtual Coords coord() const
Definition Effect.hh:7592
virtual int NumFaces() const
Definition Effect.hh:7609
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:7620
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:7633
void HeavyPrepare()
Definition Effect.hh:7606
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:7625
virtual bool has_normal() const
Definition Effect.hh:7613
CylinderElem(int numfaces)
Definition Effect.hh:7602
virtual std::string name() const
Definition Effect.hh:7591
bool Frame(float time)
Definition Effect.hh:11015
void Init()
Definition Effect.hh:11011
float Time() const
Definition Effect.hh:11010
DefaultFrameAnim(FaceCollection &faces, float time, Render *r)
Definition Effect.hh:11009
Derivate(Function< float, float > &f, float dx)
Definition Effect.hh:10198
float Index(float x) const
Definition Effect.hh:10199
Matrix Index(float, int path) const
Definition Effect.hh:5775
DiagonalPathCollection(float length, BoxCollection &box)
Definition Effect.hh:5768
int NumPaths(float posinpath) const
Definition Effect.hh:5770
float PathLength() const
Definition Effect.hh:5769
Definition Effect.hh:9802
DiffVectorCollection(PointCollection &points, bool loops)
Definition Effect.hh:9804
Vector Index(int index) const
Definition Effect.hh:9806
int Size() const
Definition Effect.hh:9805
Definition Effect.hh:4543
Direction(const std::pair< Point, Point > &p)
Definition Effect.hh:4545
Matrix Elem() const
Definition Effect.hh:4546
virtual int NumPoints(int face) const
Definition Effect.hh:7665
virtual bool has_normal() const
Definition Effect.hh:7680
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:7691
virtual void SetBox(Matrix b)
Definition Effect.hh:7663
virtual std::string name() const
Definition Effect.hh:7656
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:7668
DiskElem(int numfaces, float disk_pos)
Definition Effect.hh:7655
virtual Point FacePoint(int face, int point) const
Definition Effect.cc:297
void Collect(CollectVisitor &vis)
Definition Effect.hh:7657
virtual int NumFaces() const
Definition Effect.hh:7664
void HeavyPrepare()
Definition Effect.hh:7660
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:7681
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:7672
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:7687
void Prepare()
Definition Effect.hh:7662
~DisplayListCmds()
Definition Effect.cc:513
DisplayListCmds(OpenGlCommands &cmds)
Definition Effect.hh:10862
void PreCalc()
Definition Effect.cc:518
void Execute()
Definition Effect.cc:530
Definition Effect.hh:2113
Distance2d(Point2d center)
Definition Effect.hh:2115
float Index(Point2d p) const
Definition Effect.hh:2116
Distance4(Point center)
Definition Effect.hh:10190
float Index(Point p) const
Definition Effect.hh:10191
Definition Effect.hh:3054
int Size() const
Definition Effect.hh:3057
float Index(int x) const
Definition Effect.hh:3058
float Sum() const
Definition Effect.hh:3063
Distance(VectorCollection &coll)
Definition Effect.hh:3056
DrawVBOCmd(FaceCollectionVBO &faces, int obj, VBOState &state, VBOUpdate u)
Definition Effect.hh:10734
virtual void cmd()
Definition Effect.hh:10736
T Index(int i) const
Definition Effect.hh:1110
DupArray(Array< int, T > &orig, int count)
Definition Effect.hh:1108
int Size() const
Definition Effect.hh:1109
T Index(S index) const
Definition Effect.hh:1098
DuplicateArray(const T &t, const S &s)
Definition Effect.hh:1096
S Size() const
Definition Effect.hh:1097
DuplicateObject(const FaceCollection &coll, int count)
Definition Effect.hh:3600
const FaceCollection * Index(int i) const
Definition Effect.hh:3603
int Size() const
Definition Effect.hh:3602
Definition Effect.hh:2852
int Size() const
Definition Effect.hh:2854
Point2d Index(int i) const
Definition Effect.hh:2855
void push_back(Point2d p)
Definition Effect.hh:2859
Definition Effect.hh:11544
virtual int NumFaces(int framenum) const
Definition Effect.hh:11548
virtual Point FacePoint(int framenum, int statenum, int face, int point) const
Definition Effect.hh:11557
virtual int StateNum(int framenum, int face) const
Definition Effect.hh:11607
DynamicMesh()
Definition Effect.hh:11546
virtual int NumFrames() const
Definition Effect.hh:11547
virtual int NumPoints() const
Definition Effect.hh:11553
void push_frame()
Definition Effect.hh:11589
virtual int NumStates() const
Definition Effect.hh:11606
void push_back(const FaceCollection &coll)
Definition Effect.hh:11590
Definition Effect.hh:96
virtual void ChangeTime(float time)=0
virtual float Length() const =0
virtual ~Effect()
Definition Effect.hh:98
D Index(Union< C1, C2 > u) const
Definition Effect.hh:504
EitherFunction(Function< C1, D > &f1, Function< C2, D > &f2)
Definition Effect.hh:503
Definition Effect.hh:5034
virtual void SetElemId(int id)=0
virtual int NumElements() const =0
virtual ~ElementCollection()
Definition Effect.hh:5036
Definition Effect.hh:776
T Index(Element< T > *e) const
Definition Effect.hh:778
Definition Effect.hh:571
virtual ~Element()
Definition Effect.hh:573
virtual T Elem() const =0
Definition Effect.hh:6073
void Prepare()
Definition Effect.hh:6078
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:6096
virtual int NumFaces() const
Definition Effect.hh:6079
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:6082
virtual int NumObjects() const
Definition Effect.hh:6098
bool HasBatchMap() const
Definition Effect.hh:6102
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:6088
virtual int NumPoints(int face) const
Definition Effect.hh:6080
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:6097
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:6083
virtual std::pair< int, int > GetObject(int o) const
Definition Effect.hh:6099
virtual std::string name() const
Definition Effect.hh:6075
virtual FaceBufferRef BatchMap(int start_face, int end_face) const
Definition Effect.hh:6105
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:6081
void SetBox(Matrix b)
Definition Effect.hh:6077
Definition Shader.hh:521
Matrix Index(float posinpath, int path) const
Definition Effect.hh:5709
int NumPaths(float posinpath) const
Definition Effect.hh:5708
float PathLength() const
Definition Effect.hh:5707
EqualPaths(PathCollection &p1, PathCollection &p2)
Definition Effect.hh:5704
bool Index(std::pair< Function< X, bool > *, X > p) const
Definition Effect.hh:661
EvaluationCharacteristicFunction(Function< Function< X, bool > *, Function< X, bool > * > &id)
Definition Effect.hh:660
Definition Effect.hh:651
Evaluation(Function< Function< B, Y > *, Function< B, Y > * > &id)
Definition Effect.hh:653
Definition Effect.hh:636
ExponentiationI(Function< X, Function< B, Y > * > &func)
Definition Effect.hh:638
Y Index(std::pair< X, B > &p) const
Definition Effect.hh:639
Definition Effect.hh:617
Exponentiation(Function< std::pair< X, B >, Y > &f)
Definition Effect.hh:619
Function< B, Y > * Index(X x) const
Definition Effect.hh:620
Y Map(B b) const
Definition Effect.hh:625
virtual int NumFrames() const
Definition Effect.hh:11400
FaceArrayMeshColors(FaceCollection **array, int size)
Definition Effect.hh:11399
virtual unsigned int VertexColor(int framenum, int statenum, int face, int point) const
Definition Effect.hh:11401
virtual Vector PointNormal(int framenum, int statenum, int face, int point) const
Definition Effect.hh:11358
virtual int NumFrames() const
Definition Effect.hh:11357
FaceArrayMeshNormals(FaceCollection **array, int size)
Definition Effect.hh:11356
virtual int NumFrames() const
Definition Effect.hh:11378
FaceArrayMeshTexCoords(FaceCollection **array, int size)
Definition Effect.hh:11377
virtual Point2d TexCoord(int framenum, int statenum, int face, int point) const
Definition Effect.hh:11379
virtual int Index(int texnum) const
Definition Effect.hh:11427
FaceArrayMeshTextures(FaceCollection **array, int size, int frame)
Definition Effect.hh:11420
virtual void GenTexture(int num)
Definition Effect.hh:11422
virtual int NumTextures() const
Definition Effect.hh:11421
virtual BufferRef TextureBuf(int num) const
Definition Effect.hh:11426
virtual Point FacePoint(int framenum, int statenum, int face, int point) const
Definition Effect.hh:11332
virtual int NumFrames() const
Definition Effect.hh:11321
virtual int StateNum(int frame, int face2) const
Definition Effect.hh:11301
virtual int NumPoints() const
Definition Effect.hh:11328
FaceArrayMesh(FaceCollection **array, int size)
Definition Effect.hh:11271
virtual int NumFaces(int framenum) const
Definition Effect.hh:11322
virtual int NumStates(int frames) const
Definition Effect.hh:11273
virtual int NumStates() const
Definition Effect.hh:11272
Definition Effect.hh:4776
Point Index(int face) const
Definition Effect.hh:4780
int Size() const
Definition Effect.hh:4779
FaceCenterPoints(FaceCollection &faces)
Definition Effect.hh:4778
Definition Effect.hh:3547
Definition Effect.hh:12054
virtual Point FacePoint(int face, int point)
virtual Point PathData(int special_time, int num) const =0
virtual int SpecialPathNum() const =0
virtual float SpecialTimes(int special_time)=0
virtual int SpecialTimesCount() const =0
Definition Effect.hh:5880
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:5959
void Prepare()
Definition Effect.hh:5890
void Add(const FaceCollection &coll, bool textures)
Definition Effect.hh:5896
FacePointStruct & find(int face, int point) const
Definition Effect.hh:5969
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:5954
virtual int NumFaces() const
Definition Effect.hh:5934
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:5936
void Collect(CollectVisitor &vis)
Definition Effect.hh:5885
void Add(const FaceCollection &coll)
Definition Effect.hh:5892
int FaceTexture(int face) const
Definition Effect.hh:5966
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:5941
BufferRef TextureBuf(int num) const
Definition Effect.hh:5965
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:5946
void HeavyPrepare()
Definition Effect.hh:5888
virtual int NumPoints(int face) const
Definition Effect.hh:5935
FaceCollectionStore()
Definition Effect.hh:5882
void SetTextures(bool b)
Definition Effect.hh:5884
virtual std::string name() const
Definition Effect.hh:5883
int NumTextures() const
Definition Effect.hh:5964
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:5950
Definition Effect.hh:4892
int Texture(int face) const
Definition Effect.hh:4895
FaceCollectionTextureCoords(const FaceCollection &coll)
Definition Effect.hh:4894
Point2d TexCoord(int face, int point) const
Definition Effect.hh:4899
Definition Effect.hh:3899
virtual int PointsStartRange(int obj) const =0
virtual int NumObjects() const =0
virtual int IndexEndRange(int obj) const =0
virtual int PointsEndRange(int obj) const =0
virtual int IndexStartRange(int obj) const =0
Definition Effect.hh:3740
virtual int IndexToFace(int index) const =0
virtual Point FacePoint(int index) const =0
virtual unsigned int Color(int index) const =0
virtual float Attrib(int index, int id) const =0
virtual int IndexCount() const =0
virtual int AttribI(int index, int id) const =0
virtual int NumPoints() const =0
virtual int NumFaces() const =0
virtual ~FaceCollectionTri()
Definition Effect.hh:3742
virtual int Index(int face, int point) const =0
virtual Vector PointNormal(int index) const =0
virtual Point2d TexCoord(int index) const =0
Definition Effect.hh:10537
virtual void UpdateTextureCoordList(int start, int end, float *array) const =0
virtual int IndexSize() const =0
virtual int NumPoints() const =0
virtual void UpdateVertexList(int start, int end, float *array) const =0
virtual void UpdateNormalList(int start, int end, float *array) const =0
virtual void UpdateColorList(int start, int end, char *array) const =0
virtual void UpdateAttribI(int start, int end, short *array, int id) const =0
virtual void UpdateAttrib(int start, int end, float *array, int id) const =0
virtual void UpdateIndexList(int start, int end, int *array) const =0
void Generate_Attrib_Array(float **attrib_array, int *asize1, int *asize2)
void Generate_Color(unsigned int **color, int *size)
void Generate_Vertex(float **vertex, int *size)
Definition Effect.hh:12164
void Generate_Tex(float **texture, int *size)
void Generate_Attrib(int id, float *array, int *size)
FaceCollectionVertexArray(FaceCollection &coll)
Definition Effect.hh:12163
void Generate_Normal(float **normal, int *size)
Definition EffectI.hh:212
virtual BufferRef TextureBuf(int num) const
Definition EffectI.hh:264
virtual VEC4 Joints(int face, int point) const
Definition EffectI.hh:239
virtual Vector PointNormal(int face, int point) const =0
virtual Point FacePoint(int face, int point) const =0
virtual void Prepare()=0
virtual float EndTexCoord3(int face, int point) const
Definition EffectI.hh:257
virtual Point2d EndTexCoord(int face, int point) const
Definition EffectI.hh:256
virtual float EndAttrib(int face, int point, int id) const
Definition EffectI.hh:253
virtual void HeavyPrepare()=0
virtual bool IsMatrixElem() const
Definition EffectI.hh:269
virtual int FaceTexture(int face) const
Definition EffectI.hh:265
virtual float Attrib(int face, int point, int id) const =0
virtual unsigned int Color(int face, int point) const =0
virtual int EndAttribI(int face, int point, int id) const
Definition EffectI.hh:254
virtual VEC4 Weights(int face, int point) const
Definition EffectI.hh:240
virtual int NumPoints(int face) const =0
virtual Point2d TexCoord(int face, int point) const =0
virtual int NumFaces() const =0
virtual void Collect(CollectVisitor &vis)=0
virtual void GenTexture(int num)
Definition EffectI.hh:263
virtual Vector EndPointNormal(int face, int point) const
Definition EffectI.hh:252
virtual unsigned int EndColor(int face, int point) const
Definition EffectI.hh:255
virtual float TexCoord3(int face, int point) const
Definition EffectI.hh:238
virtual int NumTextures() const
Definition EffectI.hh:262
virtual Point EndFacePoint(int face, int point) const
Definition EffectI.hh:251
virtual int AttribI(int face, int point, int id) const =0
Definition Effect.hh:3142
int array[5]
Definition Effect.hh:3144
int elems_used
Definition Effect.hh:3145
Definition Effect.hh:4798
FaceNormals(FaceCollection &faces)
Definition Effect.hh:4800
Vector Index(int face) const
Definition Effect.hh:4802
int Size() const
Definition Effect.hh:4801
FaceRenderCmds(FaceCollection &coll)
Definition Effect.hh:10825
void PreCalc()
Definition Effect.hh:10827
void Execute()
Definition Effect.hh:10828
FaceRenderCmds(FaceCollection &coll, TextureCoords &coord)
Definition Effect.hh:10826
Definition Effect.hh:5849
virtual void Add(const FaceCollection &coll)=0
FacesToBoxCollection(FaceCollection &coll, float dist)
Definition Effect.hh:5501
Matrix Index(int i) const
Definition Effect.hh:5503
int Size() const
Definition Effect.hh:5502
int Size() const
Definition Effect.hh:965
FilterArray(Array< int, T > &arr, Function< T, bool > &b)
Definition Effect.hh:964
T Index(int ii) const
Definition Effect.hh:976
~FindNearestPoint()
Definition Effect.hh:2655
Point Index(int ii) const
Definition Effect.hh:2634
FindNearestPoint(PointCollection &coll)
Definition Effect.hh:2624
int Size() const
Definition Effect.hh:2633
FitWaveform(Waveform &v, float x, float ymin, float ymax)
Definition Effect.hh:5415
float x
Definition Effect.hh:5424
Waveform & v
Definition Effect.hh:5425
float Index(float xx) const
Definition Effect.hh:5422
float ymax
Definition Effect.hh:5424
float Min() const
Definition Effect.hh:5419
float ymin
Definition Effect.hh:5424
float Max() const
Definition Effect.hh:5420
float Length() const
Definition Effect.hh:5421
float Attrib(int face, int point, int id) const
Definition Effect.hh:4596
int NumPoints(int face) const
Definition Effect.hh:4591
Vector PointNormal(int face, int point) const
Definition Effect.hh:4593
virtual bool HasBatchMap() const
Definition Effect.hh:4598
int NumFaces() const
Definition Effect.hh:4590
void Collect(CollectVisitor &vis)
Definition Effect.hh:4588
int AttribI(int face, int point, int id) const
Definition Effect.hh:4597
virtual std::string name() const
Definition Effect.hh:4586
void HeavyPrepare()
Definition Effect.hh:4589
virtual FaceBufferRef BatchMap(int start_face, int end_face) const
Definition Effect.hh:4615
FlipNormals(FaceCollection &coll)
Definition Effect.hh:4584
Point FacePoint(int face, int point) const
Definition Effect.hh:4592
void change_normal(Vector **pos, int numvertices) const
Definition Effect.hh:4602
~FlipNormals()
Definition Effect.hh:4585
Definition Effect.hh:2048
float Index(int i) const
Definition Effect.hh:2052
FloatArrayConvert(const Array< int, float > &c2)
Definition Effect.hh:2050
int Size() const
Definition Effect.hh:2051
FloatArrayToPointCollection2d(FloatArray &array, Point2d p, Vector2d v_x, Vector2d v_y)
Definition Effect.hh:5312
Point2d Index(int i) const
Definition Effect.hh:5314
int Size() const
Definition Effect.hh:5313
Definition Effect.hh:2039
virtual ~FloatArray()
Definition Effect.hh:2041
int NumFloats() const
Definition Effect.hh:2042
Definition Effect.hh:2124
float Index(float p) const
Definition Effect.hh:2127
FloatMove(float val)
Definition Effect.hh:2126
ForLoop(int repeat, Function2< int, A, A > &a)
Definition Effect.hh:533
A Index(A a) const
Definition Effect.hh:534
ForLoop(int repeat, Function< A, A > &a)
Definition Effect.hh:532
Definition Effect.hh:3217
virtual BufferRef TextureBuf(int num) const
Definition Effect.hh:3254
BBOX GetBoundingBox(bool &success) const
Definition Effect.hh:3220
ForwardBoxableFaceCollection(FaceCollection &coll)
Definition Effect.hh:3219
virtual bool has_skeleton() const
Definition Effect.hh:3248
virtual bool IsTransparent() const
Definition Effect.hh:3226
virtual bool has_texcoord() const
Definition Effect.hh:3247
virtual int NumObjects() const
Definition Effect.hh:3257
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:3236
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:3237
virtual std::pair< int, int > GetObject(int o) const
Definition Effect.hh:3258
virtual void Prepare()
Definition Effect.hh:3227
virtual bool has_color() const
Definition Effect.hh:3246
void Collect(CollectVisitor &vis)
Definition Effect.hh:3224
virtual void PrepareDone()
Definition Effect.hh:3228
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:3238
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:3234
virtual VEC4 Joints(int face, int point) const
Definition Effect.hh:3241
virtual float TexCoord3(int face, int point) const
Definition Effect.hh:3239
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:3235
virtual bool has_normal() const
Definition Effect.hh:3244
virtual int NumFaces() const
Definition Effect.hh:3229
virtual int NumPoints(int face) const
Definition Effect.hh:3230
virtual int NumTextures() const
Definition Effect.hh:3252
virtual int FaceTexture(int face) const
Definition Effect.hh:3255
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:3231
virtual bool has_attrib() const
Definition Effect.hh:3245
virtual VEC4 Weights(int face, int point) const
Definition Effect.hh:3242
void HeavyPrepare()
Definition Effect.hh:3225
virtual Point EndFacePoint(int face, int point) const
Definition Effect.hh:3232
virtual void GenTexture(int num)
Definition Effect.hh:3253
Definition Effect.hh:3171
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:3192
virtual int FaceTexture(int face) const
Definition Effect.hh:3211
void Collect(CollectVisitor &vis)
Definition Effect.hh:3177
virtual BufferRef TextureBuf(int num) const
Definition Effect.hh:3210
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:3193
BBOX GetBoundingBox(bool &success) const
Definition Effect.hh:3174
virtual int NumPoints(int face) const
Definition Effect.hh:3185
virtual void PrepareDone()
Definition Effect.hh:3183
void HeavyPrepare()
Definition Effect.hh:3178
virtual bool Ready() const
Definition Effect.hh:3179
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:3190
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:3186
virtual int NumFaces() const
Definition Effect.hh:3184
virtual bool has_texcoord() const
Definition Effect.hh:3201
virtual float TexCoord3(int face, int point) const
Definition Effect.hh:3194
virtual VEC4 Joints(int face, int point) const
Definition Effect.hh:3195
virtual int NumTextures() const
Definition Effect.hh:3208
virtual bool IsTransparent() const
Definition Effect.hh:3180
virtual VEC4 Weights(int face, int point) const
Definition Effect.hh:3196
virtual int NumObjects() const
Definition Effect.hh:3205
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:3191
virtual std::pair< int, int > GetObject(int o) const
Definition Effect.hh:3206
virtual void GenTexture(int num)
Definition Effect.hh:3209
virtual bool has_skeleton() const
Definition Effect.hh:3202
virtual bool has_color() const
Definition Effect.hh:3200
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:3189
virtual void Prepare()
Definition Effect.hh:3181
virtual bool has_attrib() const
Definition Effect.hh:3199
virtual void SetDoneCount(int i)
Definition Effect.hh:3182
ForwardFaceCollection(FaceCollection &coll)
Definition Effect.hh:3173
virtual bool has_normal() const
Definition Effect.hh:3198
virtual Point EndFacePoint(int face, int point) const
Definition Effect.hh:3187
ForwardFunction(T *obj, B(T::*fptr)(A) const)
Definition Effect.hh:326
B Index(A a) const
Definition Effect.hh:327
void Execute()
Definition Effect.hh:10783
void PreCalc()
Definition Effect.hh:10782
FrameAnimCmds(FrameAnim &fa, float time)
Definition Effect.hh:10781
Definition Effect.hh:2388
std::vector< FramePlugin * > plugins
Definition Effect.hh:2415
void Cleanup()
Definition Effect.hh:2395
FrameAnimPlugins(Render *render)
Definition Effect.hh:2390
void PreFrame(float time)
Definition Effect.hh:2399
virtual ~FrameAnimPlugins()
Definition Effect.hh:2409
void Init()
Definition Effect.hh:2391
void PostFrame()
Definition Effect.hh:2404
Definition Effect.hh:108
void RenderOpenGl(const FaceCollection &col)
Definition Effect.cc:3313
void RenderOpenGlLines(const LineCollection &col)
Definition Effect.cc:3314
virtual bool Frame(float time)=0
FrameAnim(Render *render)
Definition Effect.hh:110
virtual void Cleanup()
Definition Effect.hh:114
virtual void PreFrame(float time)
Definition Effect.hh:115
virtual float Time() const
Definition Effect.hh:112
virtual void PostFrame()
Definition Effect.hh:117
virtual void Init()
Definition Effect.hh:113
virtual ~FrameAnim()
Definition Effect.hh:111
virtual float ZRot() const
Definition Effect.hh:120
virtual float RotSpeed() const
Definition Effect.hh:121
virtual float XRot() const
Definition Effect.hh:118
Render * GetRender() const
Definition Effect.hh:123
virtual float YRot() const
Definition Effect.hh:119
void RenderOpenGlPoly(const PointCollection &col)
Definition Effect.cc:3315
Definition Effect.hh:134
virtual void PostFrame()
Definition Effect.hh:140
virtual void Init()
Definition Effect.hh:137
virtual void Cleanup()
Definition Effect.hh:138
virtual void PreFrame(float time)
Definition Effect.hh:139
virtual ~FramePlugin()
Definition Effect.hh:136
Definition Effect.hh:3500
FrameSelect(AnimSet &s)
Definition Effect.hh:3502
void set_frame(int framenum)
Definition Effect.hh:3503
Definition Effect.hh:11154
int Size() const
Definition Effect.hh:11164
int * SelectArray() const
Definition Effect.hh:11165
void set_frame(int framenum)
Definition Effect.hh:11157
Frames(int frames)
Definition Effect.hh:11156
virtual float Index(float val) const
Definition Effect.hh:5091
virtual float Max() const
Definition Effect.hh:5090
virtual float Length() const
Definition Effect.hh:5088
virtual float Min() const
Definition Effect.hh:5089
FreqChangeWaveform(Waveform *wv, float old_freq, float new_freq)
Definition Effect.hh:5087
I Size() const
Definition Effect.hh:1256
T1 Index(I i) const
Definition Effect.hh:1257
FstArray(Array< I, std::pair< T1, T2 > > &arr)
Definition Effect.hh:1255
float Index(float x) const
Definition Effect.hh:10213
FuncCompose(Function< float, T > &f1, Function< T, float > &f2)
Definition Effect.hh:10212
Definition Effect.hh:518
std::pair< A, B > Domain
Definition Effect.hh:520
C CoDomain
Definition Effect.hh:521
virtual ~Function2()
Definition Effect.hh:524
C Index(const std::pair< A, B > &p)
Definition Effect.hh:522
virtual C Index(A a, B b) const =0
I Size() const
Definition Effect.hh:910
T Index(I i) const
Definition Effect.hh:911
FunctionArray(I size, Function< I, T > &func)
Definition Effect.hh:909
Definition Effect.hh:490
C Index(A a) const
Definition Effect.hh:493
FunctionCompose(Function< A, B > &f1, Function< B, C > &f2)
Definition Effect.hh:492
Point2d Index(float x) const
Definition Effect.hh:1432
float Size() const
Definition Effect.hh:1431
FunctionCurveIn2d(Function< float, float > &f, float size, Point2d p, Vector2d u_x, Vector2d u_y)
Definition Effect.hh:1430
Point Index(float x) const
Definition Effect.hh:1462
FunctionCurveIn3d(Function< float, float > &f, float size, Point p, Vector u_x, Vector u_y)
Definition Effect.hh:1460
float Size() const
Definition Effect.hh:1461
Definition Effect.hh:414
~FunctionImpl0()
Definition Effect.hh:423
FunctionImpl0()
Definition Effect.hh:416
K Index(T a) const
Definition Effect.hh:417
Definition Effect.hh:431
K Index(T a) const
Definition Effect.hh:434
FunctionImpl1(P p)
Definition Effect.hh:433
~FunctionImpl1()
Definition Effect.hh:440
Definition Effect.hh:448
FunctionImpl2(P1 p1, P2 p2)
Definition Effect.hh:450
~FunctionImpl2()
Definition Effect.hh:457
K Index(T a) const
Definition Effect.hh:451
Definition Effect.hh:467
K Index(T a) const
Definition Effect.hh:470
~FunctionImpl3()
Definition Effect.hh:476
FunctionImpl3(P1 p1, P2 p2, P3 p3)
Definition Effect.hh:469
Definition Effect.hh:344
Definition Effect.hh:375
Definition EffectI.hh:11
std::string contents
Definition parser.cc:16
virtual B Index(A a) const =0
Point LinePoint(int line, int point) const
Definition Effect.hh:4849
int NumLines() const
Definition Effect.hh:4848
Fur(FaceCollection &face, int numlines, int numlines2, float length)
Definition Effect.hh:4847
Definition Shader.hh:847
Definition Shader.hh:340
Definition Effect.hh:2023
virtual int AttribI(int x, int y, int id) const =0
virtual ~GridIn3d()
Definition Effect.hh:2025
virtual int YSize() const =0
virtual Vector Normal(int x, int y) const =0
virtual int XSize() const =0
virtual unsigned int Color(int x, int y) const =0
virtual Point Index(int x, int y) const =0
virtual float Attrib(int x, int y, int id) const =0
virtual Point2d Texture(int x, int y) const =0
float XRot() const
Definition Effect.hh:10507
float ZRot() const
Definition Effect.hh:10509
HeightMapEffect(Render *r)
Definition Effect.cc:1449
float YRot() const
Definition Effect.hh:10508
bool Frame(float time)
Definition Effect.cc:1482
virtual Point Index(float x, float y) const
Definition Effect.hh:5356
virtual float Attrib(float x, float y, int id) const
Definition Effect.hh:5362
HeightMapSurface(Array2< float, float, float > &array, Point p, UnitVectors u)
Definition Effect.hh:5355
virtual float XSize() const
Definition Effect.hh:5371
virtual int AttribI(float x, float y, int id) const
Definition Effect.hh:5363
virtual float YSize() const
Definition Effect.hh:5372
virtual Point2d Texture(float x, float y) const
Definition Effect.hh:5361
virtual Vector Normal(float xx, float yy) const
Definition Effect.hh:5364
virtual int NumPoints(int face) const
Definition Effect.hh:7787
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:7839
Point GetPoint(float xx, float yy) const
Definition Effect.hh:7813
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:7843
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:7805
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:7823
void Prepare()
Definition Effect.hh:7784
unsigned int Color(int face, int point) const
Definition Effect.hh:7801
virtual void SetBox(Matrix b)
Definition Effect.hh:7785
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:7788
HeightMap(int x, int y, Function2< float, float, float > &func)
Definition Effect.hh:7783
virtual int NumFaces() const
Definition Effect.hh:7786
HorizTexCoords(FaceCollection &coll, int texture)
Definition Effect.hh:4955
Point2d TexCoord(int face, int point) const
Definition Effect.hh:4957
int Texture(int face) const
Definition Effect.hh:4956
virtual int NumFaces() const
Definition Effect.hh:3575
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:3579
int Size() const
Definition Effect.hh:3569
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:3577
const FaceCollection * Index(int object) const
Definition Effect.hh:3570
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:3584
IdentifyObjectsFromArray(FaceCollectionArray &array)
Definition Effect.hh:3568
virtual int NumPoints(int face) const
Definition Effect.hh:3576
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:3578
Definition Effect.hh:7706
virtual T Index(T a) const
Definition Effect.hh:7708
Definition Effect.hh:1708
IdentityMatrixCurve(float length)
Definition Effect.hh:1710
float Size() const
Definition Effect.hh:1712
Matrix Index(float pos) const
Definition Effect.hh:1711
Definition Effect.hh:5281
float Min() const
Definition Effect.hh:5284
float Length() const
Definition Effect.hh:5283
float Index(float val) const
Definition Effect.hh:5286
float Max() const
Definition Effect.hh:5285
Definition Effect.hh:1347
IndexMap(Array< int, int > &arr)
Definition Effect.hh:1350
std::pair< int, int > Index(int i) const
Definition Effect.hh:1351
int Size() const
Definition Effect.hh:1363
float Index(float x) const
Definition Effect.hh:257
InterpolateFunction(Function< float, float > &f1, Function< float, float > &f2, float pos)
Definition Effect.hh:254
Point p12_13(float x, float y) const
Definition Effect.hh:2522
InterpolateTriangle(Point p1, Point p2, Point p3)
Definition Effect.hh:2518
Point p21_23(float x, float y) const
Definition Effect.hh:2530
Point p31_32(float x, float y) const
Definition Effect.hh:2538
float Index(float time) const
Definition Effect.cc:1893
float Max() const
Definition Effect.hh:5450
InterpolateWaveform(It beg, It end, float length, float ymin, float ymax)
Definition Effect.hh:5446
float Min() const
Definition Effect.hh:5449
float Length() const
Definition Effect.hh:5451
InterpolationPathCollection(float pathlength, BoxCollection &dom, BoxCollection &cod, Function< int, int > &mapping)
Definition Effect.hh:7715
int NumPaths(float) const
Definition Effect.hh:7716
float PathLength() const
Definition Effect.hh:7717
Matrix Index(float posinpath, int path) const
Definition Effect.hh:7718
Point FacePoint(int face, int point) const
Definition Effect.hh:4759
InverseOutlineFaces(FaceCollection &previous, LineCollection &coll)
Definition Effect.hh:4758
Definition Effect.hh:269
virtual std::vector< T > Inverse(K k) const =0
virtual K Index(T t) const =0
IsEqualFunc(T t)
Definition Effect.hh:8398
bool Index(T tt) const
Definition Effect.hh:8399
Definition Effect.hh:695
N Index(N n) const
Definition Effect.hh:703
Function< N, N > * Index(int n) const
Definition Effect.hh:698
Iteration(Function< N, N > &succ)
Definition Effect.hh:697
IteratorArray(const Array< T, K > &arr)
Definition Effect.hh:1170
const_iterator end() const
Definition Effect.hh:1192
const_iterator begin() const
Definition Effect.hh:1191
Definition Effect.hh:145
virtual T get() const =0
virtual ~LazyValue()
Definition Effect.hh:148
LinWaveformPart(float start_x, float end_x, float delta_y)
Definition Effect.hh:5197
float Delta(float x) const
Definition Effect.hh:5198
Definition EffectI.hh:305
virtual void Collect(CollectVisitor &vis)=0
virtual void HeavyPrepare()=0
virtual int NumLines() const =0
virtual Point LinePoint(int line, int point) const =0
Definition Graph.hh:5821
float Size() const
Definition Graph.hh:5824
Point2d p2
Definition Graph.hh:5830
Point2d Index(float x) const
Definition Graph.hh:5825
LineIn2d(Point2d p1, Point2d p2)
Definition Graph.hh:5823
Point2d p1
Definition Graph.hh:5830
Definition Effect.hh:1866
virtual float Size() const
Definition Effect.hh:1873
LineIn3d(Point p1, Point p2)
Definition Effect.hh:1868
virtual Point Index(float pos) const
Definition Effect.hh:1869
Definition VectorTools.hh:799
int BoxObject(int obj) const
Definition Effect.hh:5532
LinearObjectCollection(int count)
Definition Effect.hh:5530
int NumObjects() const
Definition Effect.hh:5531
void Prepare()
Definition Effect.hh:2783
void Collect(CollectVisitor &vis)
Definition Effect.hh:2781
Point2d TexCoord(int face, int point) const
Definition Effect.hh:2804
LinkPointCollections(PointCollection &p1, PointCollection &p2)
Definition Effect.hh:2780
int NumPoints(int face) const
Definition Effect.hh:2785
Point FacePoint(int face, int point) const
Definition Effect.hh:2786
float TexCoord3(int face, int point) const
Definition Effect.hh:2805
void HeavyPrepare()
Definition Effect.hh:2782
int NumFaces() const
Definition Effect.hh:2784
unsigned int Color(int face, int point) const
Definition Effect.hh:2803
Vector PointNormal(int face, int point) const
Definition Effect.hh:2798
Definition Effect.hh:10759
virtual int NumConnections() const =0
virtual Matrix Transform(int conn1, int conn2)=0
void Load() const
Definition Effect.cc:4229
void check_invalidate() const
Definition Effect.cc:4205
virtual int AttribI(int face, int point, int id) const
Definition Effect.cc:4513
virtual Point FacePoint(int face, int point) const
Definition Effect.cc:4484
void Load2()
Definition Effect.cc:4230
virtual unsigned int Color(int face, int point) const
Definition Effect.cc:4515
virtual float TexCoord3(int face, int point) const
Definition Effect.cc:4527
LoadObjModelFaceCollection(LoadStream *file_data, int objcount, std::vector< std::string > material_names)
Definition Effect.cc:4192
virtual int NumFaces() const
Definition Effect.cc:4480
virtual Vector PointNormal(int face, int point) const
Definition Effect.cc:4496
void Prepare()
Definition Effect.cc:4196
virtual float Attrib(int face, int point, int id) const
Definition Effect.cc:4510
void check_invalidate2()
Definition Effect.cc:4206
virtual int NumPoints(int face) const
Definition Effect.cc:4482
virtual Point2d TexCoord(int face, int point) const
Definition Effect.cc:4551
int Count(int face, int point) const
Definition Effect.cc:4566
Definition GraphI.hh:3114
MapArray(Array< I, A > &arr, Function< A, B > &func)
Definition Effect.hh:803
I Size() const
Definition Effect.hh:804
B Index(I i) const
Definition Effect.hh:805
virtual int Size() const
Definition Effect.hh:9705
virtual Matrix Index(int box) const
Definition Effect.hh:9706
MatrixBox(BoxCollection &c, Matrix m)
Definition Effect.hh:9704
virtual Matrix Index(int box) const
Definition Effect.hh:9647
virtual int Size() const
Definition Effect.hh:9643
MatrixCollection(It beg, It end)
Definition Effect.hh:9642
Definition Effect.hh:1697
Matrix Index(float i) const
Definition Effect.hh:1701
float Size() const
Definition Effect.hh:1700
MatrixCurveConvert(const Array< float, Matrix > &c2)
Definition Effect.hh:1699
Definition Effect.hh:1603
Matrix Index(float x) const
Definition Effect.hh:1618
float Size() const
Definition Effect.hh:1613
void push_back(float starttime, float len, MatrixCurve *c)
Definition Effect.hh:1606
float Size() const
Definition Effect.hh:1755
Point Index(float pos) const
Definition Effect.hh:1751
MatrixCurveToCurveIn3d(const MatrixCurve &curve, Vector v)
Definition Effect.hh:1750
Definition Effect.hh:1582
virtual ~MatrixCurve()
Definition Effect.hh:1584
Definition Effect.hh:8076
BBOX GetBoundingBox(bool &success) const
Definition Effect.hh:8138
~MatrixElem()
Definition Effect.hh:8080
FaceCollection * get_next() const
Definition Effect.hh:8206
virtual std::string name() const
Definition Effect.hh:8079
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:8125
virtual bool IsMatrixElem() const
Definition Effect.hh:8089
virtual Point EndFacePoint(int face, int point) const
Definition Effect.hh:8115
void change_pos(Point **pos, int numvertices) const
Definition Effect.hh:8223
void Collect(CollectVisitor &vis)
Definition Effect.hh:8090
virtual void Prepare()
Definition Effect.hh:8102
virtual FaceBufferRef BatchMap(int start_face, int end_face) const
Definition Effect.hh:8290
MatrixElem(FaceCollection &next, Matrix m)
Definition Effect.hh:8078
virtual int NumPoints(int face) const
Definition Effect.hh:8104
void change_normal(Vector **pos, int numvertices) const
Definition Effect.hh:8263
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:8105
Matrix get_matrix() const
Definition Effect.hh:8198
virtual int NumFaces() const
Definition Effect.hh:8103
void change_pos2(Point **pos, int numvertices) const
Definition Effect.hh:8243
virtual bool HasBatchMap() const
Definition Effect.hh:8213
void HeavyPrepare()
Definition Effect.hh:8095
std::vector< Point > Inverse(Point p) const
Definition Effect.hh:10313
MatrixFunction(Matrix m)
Definition Effect.hh:10308
Point Index(Point p) const
Definition Effect.hh:10309
Point Convert(Point p) const
Definition Effect.hh:10297
MatrixPointMap(Matrix m)
Definition Effect.hh:10296
MatrixVBOCmd(Command &c, Matrix m)
Definition Effect.hh:10749
virtual void cmd()
Definition Effect.cc:2636
Definition VectorTools.hh:279
static Matrix XRotation(float rot)
Definition VectorTools.cc:498
static Matrix YRotation(float rot)
Definition VectorTools.cc:526
static Matrix Translate(float x, float y, float z)
Definition VectorTools.cc:547
static Matrix Inverse(const Matrix &m)
Definition VectorTools.cc:859
static Matrix RotateAroundAxis(const Vector &v, float angle)
Definition VectorTools.cc:718
static Matrix ZRotation(float rot)
Definition VectorTools.cc:537
static Matrix Identity()
Definition VectorTools.cc:487
static Matrix Interpolate(const Matrix &m1, const Matrix &m2, float t)
Definition VectorTools.cc:983
static Matrix KeepRotation(const Matrix &m)
Definition VectorTools.cc:509
static Matrix Scale(float x, float y, float z)
Definition VectorTools.cc:556
static Matrix RotateAroundAxisPoint(const Point &p, const Vector &v, float angle)
Definition VectorTools.cc:711
float Index(float x) const
Definition Effect.hh:2947
MaxCurve(Function< float, float > &f1, Function< float, float > &f2)
Definition Effect.hh:2946
MemoizeArray(int count, Array< int, A > &func)
Definition Effect.hh:8660
A Index(int val) const
Definition Effect.hh:8665
int Size() const
Definition Effect.hh:8674
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:8843
void MemoizeAll()
Definition Effect.hh:8722
virtual BufferRef TextureBuf(int num) const
Definition Effect.hh:8849
virtual std::string name() const
Definition Effect.hh:8692
virtual int NumTextures() const
Definition Effect.hh:8847
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:8839
Vector PointNormal(int face, int point) const
Definition Effect.hh:8821
Point EndFacePoint(int face, int point) const
Definition Effect.hh:8780
virtual void GenTexture(int num)
Definition Effect.hh:8848
void Reset()
Definition Effect.hh:8711
virtual int FaceTexture(int face) const
Definition Effect.hh:8851
void operator=(const MemoizeFaces &c)
Definition Effect.hh:8700
int NumPoints(int face) const
Definition Effect.hh:8748
int NumFaces() const
Definition Effect.hh:8737
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:8816
void Collect(CollectVisitor &vis)
Definition Effect.hh:8693
Point FacePoint(int face, int point) const
Definition Effect.hh:8762
MemoizeFaces(FaceCollection &c)
Definition Effect.hh:8688
unsigned int Color(int face, int point) const
Definition Effect.hh:8798
void HeavyPrepare()
Definition Effect.hh:8697
void Prepare()
Definition Effect.hh:8699
A Index(int val) const
Definition Effect.hh:8641
MemoizeFunction(int count, Function< int, A > &func)
Definition Effect.hh:8636
MeshColorsToTriangles(MeshColors &n, bool b)
Definition Effect.hh:11824
virtual unsigned int VertexColor(int framenum, int statenum, int face, int point) const
Definition Effect.hh:11826
virtual int NumFrames() const
Definition Effect.hh:11825
Definition Effect.hh:11389
virtual unsigned int VertexColor(int framenum, int statenum, int face, int point) const
Definition Effect.hh:11392
virtual int NumFrames() const
Definition Effect.hh:11391
virtual ~MeshColors()
Definition Effect.hh:11393
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:11632
virtual bool has_normal() const
Definition Effect.hh:11636
void Collect(CollectVisitor &vis)
Definition Effect.hh:11624
virtual bool has_texcoord() const
Definition Effect.hh:11639
virtual std::string name() const
Definition Effect.hh:11622
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:11651
void HeavyPrepare()
Definition Effect.hh:11627
virtual int NumFaces() const
Definition Effect.hh:11630
MeshFaceCollection(Mesh &mesh, MeshTexCoords &coord, int framenum)
Definition Effect.hh:11621
virtual bool has_attrib() const
Definition Effect.hh:11637
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:11656
virtual bool has_color() const
Definition Effect.hh:11638
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:11642
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:11649
MeshFaceCollection(Mesh &mesh, int framenum)
Definition Effect.hh:11620
virtual int NumPoints(int face) const
Definition Effect.hh:11631
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:11652
void Prepare()
Definition Effect.hh:11629
virtual bool has_skeleton() const
Definition Effect.hh:11640
MeshNormalsToTriangles(MeshNormals &n, bool b)
Definition Effect.hh:11781
virtual int NumFrames() const
Definition Effect.hh:11782
virtual Vector PointNormal(int framenum, int statenum, int face, int point) const
Definition Effect.hh:11783
Definition Effect.hh:11346
virtual int NumFrames() const
Definition Effect.hh:11348
virtual ~MeshNormals()
Definition Effect.hh:11350
virtual Vector PointNormal(int framenum, int statenum, int face, int point) const
Definition Effect.hh:11349
Definition Effect.hh:11444
virtual int NumFrames() const
Definition Effect.hh:11446
virtual unsigned int VertexColor(int framenum, int statenum, int face, int point, int id) const
Definition Effect.hh:11447
virtual ~MeshShaderParameters()
Definition Effect.hh:11448
virtual int NumFrames() const
Definition Effect.hh:11803
MeshTexCoordsToTriangles(MeshTexCoords &n, bool b)
Definition Effect.hh:11802
virtual Point2d TexCoord(int framenum, int statenum, int face, int point) const
Definition Effect.hh:11804
Definition Effect.hh:11366
virtual Point2d TexCoord(int framenum, int statenum, int face, int point) const
Definition Effect.hh:11369
virtual int NumFrames() const
Definition Effect.hh:11368
virtual ~MeshTexCoords()
Definition Effect.hh:11370
Definition Effect.hh:11409
virtual void GenTexture(int num)
Definition Effect.hh:11412
virtual BufferRef TextureBuf(int num) const
Definition Effect.hh:11413
virtual ~MeshTextures()
Definition Effect.hh:11414
virtual int NumTextures() const
Definition Effect.hh:11411
Definition Effect.hh:11718
int point_map(int face, int point) const
Definition Effect.hh:11721
int face_num(int face) const
Definition Effect.hh:11720
virtual Point FacePoint(int framenum, int statenum, int face, int point) const
Definition Effect.hh:11762
virtual int NumFaces(int framenum) const
Definition Effect.hh:11752
virtual int NumFrames() const
Definition Effect.hh:11748
virtual int StateNum(int frame, int face) const
Definition Effect.hh:11746
MeshToTriangles(Mesh &m)
Definition Effect.hh:11744
virtual int NumStates() const
Definition Effect.hh:11745
virtual int NumPoints() const
Definition Effect.hh:11758
Definition Effect.hh:11256
virtual int NumPoints() const =0
virtual Point FacePoint(int framenum, int statenum, int face, int point) const =0
virtual int NumFaces(int framenum) const =0
virtual int NumFrames() const =0
virtual int NumStates() const =0
virtual int StateNum(int framenum, int face) const =0
virtual ~Mesh()
Definition Effect.hh:11265
virtual float Max() const
Definition Effect.hh:5144
virtual float Length() const
Definition Effect.hh:5136
virtual float Min() const
Definition Effect.hh:5140
virtual float Index(float val) const
Definition Effect.hh:5148
MixWaveform(Waveform *orig, float pos, Waveform *sample)
Definition Effect.hh:5135
void Prepare()
Definition Effect.hh:10387
int NumPoints(int face) const
Definition Effect.hh:10390
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:10399
float Attrib(int face, int point, int id) const
Definition Effect.hh:10408
ModifyObject(BoxableFaceCollection &coll, PointMap &pm)
Definition Effect.hh:10386
int NumFaces() const
Definition Effect.hh:10389
Point FacePoint(int face, int point) const
Definition Effect.hh:10391
unsigned int Color(int face, int point) const
Definition Effect.hh:10395
void SetBox(Matrix m)
Definition Effect.hh:10388
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:10412
Vector PointNormal(int face, int point) const
Definition Effect.hh:10404
bool Frame(float time)
Definition Effect.cc:1038
void Init()
Definition Effect.cc:971
void PreFrame(float time)
Definition Effect.cc:993
MoleculeEffect(Render *render)
Definition Effect.cc:920
void Cleanup()
Definition Effect.cc:983
MoleculeInsideEffect(Render *render)
Definition Effect.hh:10470
bool Frame(float time)
Definition Effect.cc:1145
virtual Point Index(float x, float y) const
Definition Effect.hh:1917
void Move(Point &p) const
Definition Effect.hh:1922
MoveSurfaceIn3d(SurfaceIn3d &next, Vector v)
Definition Effect.hh:1916
bool Frame(float time)
Definition Effect.cc:2770
MovementEffect(Render *render)
Definition Effect.hh:11096
A Index(std::pair< N, A > &p) const
Definition Effect.hh:736
~Mul()
Definition Effect.hh:765
Function< int, A > * Index(A a) const
Definition Effect.hh:756
Mul(Function< std::pair< A, A >, A > &plus, A zero)
Definition Effect.hh:735
virtual int AttribI(float x, float y, int id) const
Definition Effect.hh:2295
virtual float Attrib(float x, float y, int id) const
Definition Effect.hh:2299
virtual float XSize() const
Definition Effect.hh:2308
void HeavyPrepare()
Definition Effect.hh:2273
virtual Point Index(float x, float y) const
Definition Effect.hh:2274
virtual float YSize() const
Definition Effect.hh:2309
virtual Vector Normal(float x, float y) const
Definition Effect.hh:2283
virtual Point2d Texture(float x, float y) const
Definition Effect.hh:2278
virtual unsigned int Color(float x, float y) const
Definition Effect.hh:2279
void Collect(CollectVisitor &vis)
Definition Effect.hh:2268
MultiplyCurves(const CurveIn3d &c1, const CurveIn3d &c2)
Definition Effect.hh:2267
MultiplyMatrixCurve(MatrixCurve &c1, MatrixCurve &c2)
Definition Effect.hh:1678
Matrix Index(float x) const
Definition Effect.hh:1680
float Size() const
Definition Effect.hh:1679
int Size() const
Definition Effect.hh:792
T Index(int i) const
Definition Effect.hh:793
NativeArray(T *array, int size)
Definition Effect.hh:791
NativeFunction2(C(*fptr)(A, B))
Definition Effect.hh:563
C Index(A a, B b) const
Definition Effect.hh:564
B Index(A a) const
Definition Effect.hh:337
NativeFunction(B(*fptr)(A))
Definition Effect.hh:336
Definition Shader.hh:412
Definition Effect.hh:9369
Plane m_pl
Definition Effect.hh:9372
NormalizedPlane(Plane pl)
Definition Effect.hh:9371
NotFunc(Function< int, bool > &f)
Definition Effect.hh:8381
bool Index(int a) const
Definition Effect.hh:8382
virtual Point2d TexCoord(int index) const
Definition Effect.hh:4005
virtual int AttribI(int index, int id) const
Definition Effect.hh:4051
virtual int NumPoints() const
Definition Effect.hh:3963
virtual int NumFaces() const
Definition Effect.hh:3952
virtual int Index(int face, int point) const
Definition Effect.hh:4093
virtual Point FacePoint(int index) const
Definition Effect.hh:3973
virtual int PointsEndRange(int obj) const
Definition Effect.hh:3928
virtual Vector PointNormal(int index) const
Definition Effect.hh:4023
virtual float Attrib(int index, int id) const
Definition Effect.hh:4037
int NumObjects() const
Definition Effect.hh:3913
virtual unsigned int Color(int index) const
Definition Effect.hh:3991
virtual int PointsStartRange(int obj) const
Definition Effect.hh:3914
ObjectArray2(Array< int, FaceCollectionTri * > &arr)
Definition Effect.hh:3912
virtual int IndexEndRange(int obj) const
Definition Effect.hh:3947
virtual int IndexStartRange(int obj) const
Definition Effect.hh:3932
virtual int IndexToFace(int index) const
Definition Effect.hh:4075
virtual int IndexCount() const
Definition Effect.hh:4065
virtual int NumPoints() const
Definition Effect.hh:4168
virtual int Index(int face, int point) const
Definition Effect.hh:4283
virtual Point2d TexCoord(int index) const
Definition Effect.hh:4204
virtual int IndexToFace(int index) const
Definition Effect.hh:4266
virtual float Attrib(int index, int id) const
Definition Effect.hh:4235
virtual int NumFaces() const
Definition Effect.hh:4158
virtual unsigned int Color(int index) const
Definition Effect.hh:4190
ObjectArray(It beg, It end)
Definition Effect.hh:4119
virtual int PointsEndRange(int obj) const
Definition Effect.hh:4135
virtual int IndexEndRange(int obj) const
Definition Effect.hh:4153
virtual int IndexStartRange(int obj) const
Definition Effect.hh:4139
virtual int IndexCount() const
Definition Effect.hh:4262
virtual Point FacePoint(int index) const
Definition Effect.hh:4177
virtual int PointsStartRange(int obj) const
Definition Effect.hh:4122
virtual Vector PointNormal(int index) const
Definition Effect.hh:4222
virtual int AttribI(int index, int id) const
Definition Effect.hh:4248
virtual int NumObjects() const
Definition Effect.hh:4121
Definition Effect.hh:5521
virtual int BoxObject(int obj) const =0
virtual int NumObjects() const =0
virtual ~ObjectCollection()
Definition Effect.hh:5523
Definition Effect.hh:5623
Definition Effect.hh:10719
virtual Matrix ObjectPos(int index) const =0
virtual int ObjectId(int index) const =0
virtual int Count() const =0
Definition Effect.hh:6127
virtual BoxableFaceCollection * Select(int index)=0
Definition Effect.hh:10773
virtual void Execute()=0
virtual void PreCalc()=0
Point2d Index(int i) const
Definition Effect.hh:2736
OrArrayPointCollection2d(std::vector< PointCollection2d * > vec)
Definition Effect.hh:2728
int Size() const
Definition Effect.hh:2729
unsigned char * combine_indices_char(unsigned char *p1, unsigned char *p2, int numfaces1, int numfaces2, int numvertices1, int numvertices2) const
Definition Effect.hh:6811
VEC4 * combine_joints(VEC4 *p1, VEC4 *p2, int numvertices1, int numvertices2) const
Definition Effect.hh:6920
Vector * combine_normal(Vector *p1, Vector *p2, int numvertices1, int numvertices2) const
Definition Effect.hh:6887
virtual std::string name() const
Definition Effect.hh:6595
OrElem2(FaceCollection *coll1, FaceCollection *coll2)
Definition Effect.hh:6594
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:6726
void swap2(T **ptr, T *val) const
Definition Effect.hh:6943
virtual unsigned int EndColor(int face, int point) const
Definition Effect.hh:6778
unsigned short * combine_indices_short(unsigned short *p1, unsigned short *p2, int numfaces1, int numfaces2, int numvertices1, int numvertices2) const
Definition Effect.hh:6828
virtual std::pair< int, int > GetObject(int o) const
Definition Effect.hh:6694
virtual bool has_texcoord() const
Definition Effect.hh:6742
Point * combine_texcoord(Point *p1, Point *p2, int numvertices1, int numvertices2) const
Definition Effect.hh:6909
virtual float TexCoord3(int face, int point) const
Definition Effect.hh:6750
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:6746
virtual bool has_skeleton() const
Definition Effect.hh:6754
FaceCollection * get_elem2(int face) const
Definition Effect.hh:6689
virtual float Duration() const
Definition Effect.hh:6788
virtual Point2d EndTexCoord(int face, int point) const
Definition Effect.hh:6781
int get_index2(int face) const
Definition Effect.hh:6684
virtual BufferRef TextureBuf(int num) const
Definition Effect.hh:6794
virtual float EndTexCoord3(int face, int point) const
Definition Effect.hh:6784
virtual int FaceTexture(int face) const
Definition Effect.hh:6797
unsigned int * combine_indices_int(unsigned int *p1, unsigned int *p2, int numfaces1, int numfaces2, int numvertices1, int numvertices2) const
Definition Effect.hh:6846
virtual bool has_color() const
Definition Effect.hh:6734
virtual int NumPoints(int face) const
Definition Effect.hh:6706
virtual bool has_attrib() const
Definition Effect.hh:6722
int get_index(int face) const
Definition Effect.hh:6675
FaceCollection * get_elem(int face) const
Definition Effect.hh:6680
VEC4 * combine_weights(VEC4 *p1, VEC4 *p2, int numvertices1, int numvertices2) const
Definition Effect.hh:6931
virtual float EndAttrib(int face, int point, int id) const
Definition Effect.hh:6772
virtual bool has_normal() const
Definition Effect.hh:6714
Point * combine_pos(Point *p1, Point *p2, int numvertices1, int numvertices2) const
Definition Effect.hh:6865
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:6710
virtual void GenTexture(int num)
Definition Effect.hh:6791
BBOX GetBoundingBox(bool &success) const
Definition Effect.hh:6622
void Prepare()
Definition Effect.hh:6666
Point * combine_pos2(Point *p1, Point *p2, int numvertices1, int numvertices2) const
Definition Effect.hh:6876
FaceBufferRef BatchMap(int start_x, int end_x) const
Definition Effect.hh:6949
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:6718
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:6730
void Collect(CollectVisitor &vis)
Definition Effect.hh:6651
virtual int EndAttribI(int face, int point, int id) const
Definition Effect.hh:6775
~OrElem2()
Definition Effect.hh:6597
void HeavyPrepare()
Definition Effect.hh:6657
virtual int NumObjects() const
Definition Effect.hh:6693
virtual int NumFaces() const
Definition Effect.hh:6705
virtual int NumTextures() const
Definition Effect.hh:6790
unsigned int * combine_color(unsigned int *p1, unsigned int *p2, int numvertices1, int numvertices2) const
Definition Effect.hh:6898
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:6738
virtual VEC4 Weights(int face, int point) const
Definition Effect.hh:6761
virtual Vector EndPointNormal(int face, int point) const
Definition Effect.hh:6769
virtual VEC4 Joints(int face, int point) const
Definition Effect.hh:6758
bool HasBatchMap() const
Definition Effect.hh:6803
virtual Point EndFacePoint(int face, int point) const
Definition Effect.hh:6766
bool Inside(Point p) const
Definition Effect.hh:7073
virtual bool has_attrib() const
Definition Effect.hh:7127
virtual int NumPoints(int face) const
Definition Effect.hh:7198
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:7217
virtual VEC4 Joints(int face, int point) const
Definition Effect.hh:7236
virtual int NumFaces() const
Definition Effect.hh:7186
virtual VEC4 Weights(int face, int point) const
Definition Effect.hh:7241
OrElem(It beg, It end)
Definition Effect.hh:7025
int AttribI(int face, int point, int id) const
Definition Effect.hh:7260
virtual bool has_texcoord() const
Definition Effect.hh:7109
virtual bool has_skeleton() const
Definition Effect.hh:7099
virtual bool has_normal() const
Definition Effect.hh:7136
void Prepare()
Definition Effect.hh:7093
virtual float TexCoord3(int face, int point) const
Definition Effect.hh:7230
OrElem()
Definition Effect.hh:7023
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:7204
virtual std::string name() const
Definition Effect.hh:7035
virtual std::pair< int, int > GetObject(int o) const
Definition Effect.hh:7176
void update_faces_cache() const
Definition Effect.hh:7037
virtual void GenTexture(int num)
Definition Effect.hh:7282
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:7248
void Collect(CollectVisitor &vis)
Definition Effect.hh:7083
OrElem(T *o1, T *o2, T *o3, T *o4)
Definition Effect.hh:7026
virtual int NumObjects() const
Definition Effect.hh:7098
virtual BufferRef TextureBuf(int num) const
Definition Effect.hh:7292
void SetBox(Matrix b)
Definition Effect.hh:7080
void push_back(T *ptr)
Definition Effect.hh:7069
virtual int NumTextures() const
Definition Effect.hh:7271
virtual bool has_color() const
Definition Effect.hh:7118
void HeavyPrepare()
Definition Effect.hh:7089
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:7224
float Attrib(int face, int point, int id) const
Definition Effect.hh:7254
virtual Point EndFacePoint(int face, int point) const
Definition Effect.hh:7210
virtual int FaceTexture(int face) const
Definition Effect.hh:7304
BBOX GetBoundingBox(bool &success) const
Definition Effect.hh:7147
bool Index(int a) const
Definition Effect.hh:8362
OrFunc(Function< int, bool > &f, Function< int, bool > &f2)
Definition Effect.hh:8361
Point2d Index(int i) const
Definition Effect.hh:2716
int Size() const
Definition Effect.hh:2715
OrPointCollection2d(PointCollection2d &p1, PointCollection2d &p2)
Definition Effect.hh:2714
Definition Effect.hh:5677
virtual int NumBoxes()
Definition Effect.hh:5679
virtual Matrix BoxIndex(int box)
Definition Effect.hh:5680
void Collect(CollectVisitor &vis)
Definition Effect.hh:4721
OutlineFaces(FaceCollection &c)
Definition Effect.hh:4717
int NumLines() const
Definition Effect.cc:4601
Point LinePoint(int line, int point) const
Definition Effect.cc:4609
void HeavyPrepare()
Definition Effect.hh:4722
unsigned int LineColor(int line, int point) const
Definition Effect.cc:4624
void Prepare()
Definition Effect.cc:4581
Packing(int num, float dist)
Definition Effect.hh:10236
Point2d k(Point2d p, Point2d p2) const
Definition Effect.hh:10257
Point2d s(Point2d p) const
Definition Effect.hh:10275
int Size() const
Definition Effect.hh:10237
Point2d Index(int i) const
Definition Effect.hh:10238
std::pair< C, D > Index(std::pair< A, B > p) const
Definition Effect.hh:673
PairFunction(Function< A, C > &f1, Function< B, D > &f2)
Definition Effect.hh:672
float Max() const
Definition Effect.hh:5264
float Min() const
Definition Effect.hh:5263
float Index(float val) const
Definition Effect.hh:5265
PartWaveform(Waveform &base, Array< int, WaveformPart * > &arr)
Definition Effect.hh:5261
float Length() const
Definition Effect.hh:5262
Definition Effect.hh:5806
Matrix Index(float pos) const
Definition Effect.hh:5809
float Size() const
Definition Effect.hh:5810
PathProjection(PathCollection &path)
Definition Effect.hh:5808
void SetPath(int path_)
Definition Effect.hh:5811
Definition Effect.hh:5795
void SetTime(float time_)
Definition Effect.hh:5798
Matrix Index(int box) const
Definition Effect.hh:5800
TimeProjection(PathCollection &path)
Definition Effect.hh:5797
int Size() const
Definition Effect.hh:5799
BoxCollection * ChooseTime(float pos) const
Definition Effect.hh:5790
PathCollection & path
Definition Effect.hh:5816
TimeProjection timeproj
Definition Effect.hh:5817
BoxCollection * Dom() const
Definition Effect.hh:5789
PathCollectionUser(PathCollection &path)
Definition Effect.hh:5787
PathProjection pathproj
Definition Effect.hh:5818
BoxCollection * Cod() const
Definition Effect.hh:5788
MatrixCurve * ChoosePath(int path) const
Definition Effect.hh:5791
Definition Effect.hh:5686
virtual Matrix Index(float posinpath, int path) const =0
virtual int NumPaths(float posinpath) const =0
virtual ~PathCollection()
Definition Effect.hh:5688
virtual float PathLength() const =0
bool Frame(float time)
Definition Effect.cc:1732
PathEffect(Render *render)
Definition Effect.hh:10518
Definition Effect.hh:5695
virtual bool Visible(float posinpath, int path)=0
Definition Shader.hh:444
Definition Shader.hh:1251
Definition Effect.hh:2245
float Size() const
Definition Effect.hh:2249
PlaneCurveIn3d(CurveIn2d *c, Plane p)
Definition Effect.hh:2248
PlaneCurveIn3d(CurveIn2d &c, Plane p)
Definition Effect.hh:2247
Point Index(float angle) const
Definition Effect.hh:2250
PlaneIn3d2(Plane pl)
Definition Effect.hh:2232
Point Index(Point2d p) const
Definition Effect.hh:2233
Definition Effect.hh:2218
Point Elem() const
Definition Effect.hh:2221
PlaneIn3d(Point2d p, Plane pl)
Definition Effect.hh:2220
Point Index(int i) const
Definition Effect.hh:2771
int Size() const
Definition Effect.hh:2770
PlanePointCollectionFrom2d(PointCollection2d &coll, float z)
Definition Effect.hh:2769
int Size() const
Definition Effect.hh:2988
PlanePointsIn3d(PointCollection2d &pc, Plane p)
Definition Effect.hh:2987
Point Index(int num) const
Definition Effect.hh:2989
Point2d TexCoord(int face, int point) const
Definition Effect.hh:4933
int Texture(int face) const
Definition Effect.hh:4932
PlaneTexCoords(FaceCollection &coll, int texture, Point center, Vector x, Vector y)
Definition Effect.hh:4931
Definition VectorTools.hh:350
Vector u_x
Definition VectorTools.hh:375
Vector u_y
Definition VectorTools.hh:376
Point u_p
Definition VectorTools.hh:374
Plane Index(float xx)
Definition Effect.hh:2381
PlanesFromCurve(CurveIn3d &center, CurveIn3d &x, CurveIn3d &y)
Definition Effect.hh:2379
N Index(std::pair< N, N > &p) const
Definition Effect.hh:722
Plus(Function< N, N > &succ)
Definition Effect.hh:721
int Size() const
Definition Effect.hh:2672
PointArrayPointCollection2d(std::vector< Point2d > vec)
Definition Effect.hh:2671
Point2d Index(int i) const
Definition Effect.hh:2673
Definition Effect.hh:2663
PointCollectionArray(It beg, It end)
Definition Effect.hh:4474
virtual Point Index(int index) const
Definition Effect.hh:4476
virtual int Size() const
Definition Effect.hh:4475
int Size() const
Definition Effect.hh:2482
PointCollection * Index(int i) const
Definition Effect.hh:2483
PointCollectionConvertArray(Array< int, Array< int, Point > * > &arr)
Definition Effect.hh:2481
~PointCollectionConvertArray()
Definition Effect.hh:2490
PointCollectionFromGrid(GridIn3d &grid)
Definition Effect.hh:3125
Point Index(int index) const
Definition Effect.hh:3128
int Size() const
Definition Effect.hh:3126
Definition Effect.hh:2456
Point Points(int index) const
Definition Effect.hh:2460
int NumPoints() const
Definition Effect.hh:2459
virtual ~PointCollection()
Definition Effect.hh:2458
Definition Effect.hh:10287
virtual Point Convert(Point p) const =0
virtual ~PointMap()
Definition Effect.hh:10289
Point Index(Point p) const
Definition Effect.hh:10290
std::pair< Point, Vector > Index(int i) const
Definition Effect.hh:3048
int Size() const
Definition Effect.hh:3047
PointVectorCollectionConvert(const Array< int, std::pair< Point, Vector > > &c2)
Definition Effect.hh:3046
Definition Effect.hh:3039
Definition Effect.hh:309
Vector Index(Point v) const
Definition Effect.hh:311
Definition Effect.hh:3036
PointVectorInterpolate(PointVectorCollection &coll, float pos)
Definition Effect.hh:9821
Point Index(int i) const
Definition Effect.hh:9823
int Size() const
Definition Effect.hh:9822
std::pair< Point, Vector > Index(int i) const
Definition Effect.hh:9841
int Size() const
Definition Effect.hh:9837
PointVectorRepeat(CurveIn2d &curve, Plane pl, int numobjects, bool loops)
Definition Effect.hh:9836
virtual Point2d Texture(int x, int y) const
Definition Effect.hh:9481
virtual int YSize() const
Definition Effect.hh:9507
virtual int XSize() const
Definition Effect.hh:9506
virtual unsigned int Color(int x, int y) const
Definition Effect.hh:9482
virtual Point Index(int x, int y) const
Definition Effect.hh:9475
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:9501
PointsGrid(const PointVectorCollection &points, const BoxCollection &boxes)
Definition Effect.hh:9474
virtual bool has_normal() const
Definition Effect.hh:9494
virtual Vector Normal(int x, int y) const
Definition Effect.hh:9495
virtual float Attrib(int x, int y, int id) const
Definition Effect.hh:9505
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:9486
virtual Matrix Index(int box) const
Definition Effect.hh:5666
virtual int Size() const
Definition Effect.hh:5665
PointsToBoxCollection(PointCollection &p)
Definition Effect.hh:5664
Point2d Index(int i) const
Definition Effect.hh:2908
int Size() const
Definition Effect.hh:2904
PolyFromCurve2d(Function< float, float > &curve, float y, float start_x, float end_x, int x_numpoints)
Definition Effect.hh:2903
Point2d Index(int i) const
Definition Effect.hh:2968
int Size() const
Definition Effect.hh:2964
PolyFromTwoCurves2d(Function< float, float > &curve1, Function< float, float > &curve2, float start_x, float end_x, int x_numpoints)
Definition Effect.hh:2959
PolygonEdges1(PointCollection &coll)
Definition Effect.hh:2554
float Index(int ii) const
Definition Effect.hh:2559
int Size() const
Definition Effect.hh:2555
float Size() const
Definition Effect.hh:2582
Point Index(float x) const
Definition Effect.hh:2596
PolygonEdges2(PointCollection &coll)
Definition Effect.hh:2581
void push_back(Point p)
Definition Effect.hh:7468
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:7479
PolygonElem()
Definition Effect.hh:7466
virtual int FaceTexture(int face) const
Definition Effect.hh:7493
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:7471
virtual int NumTextures() const
Definition Effect.hh:7490
virtual std::string name() const
Definition Effect.hh:7467
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:7480
virtual int NumPoints(int face) const
Definition Effect.hh:7470
virtual int NumFaces() const
Definition Effect.hh:7469
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:7485
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:7475
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:7481
virtual BufferRef TextureBuf(int num) const
Definition Effect.hh:7492
virtual void GenTexture(int num)
Definition Effect.hh:7491
Definition Containment.hh:40
virtual float Width() const =0
virtual float Height() const =0
virtual Matrix PortalMatrix() const =0
virtual ~Portal()
Definition Effect.hh:5056
void Collect(CollectVisitor &vis)
Definition Effect.hh:7330
virtual int NumFaces() const
Definition Effect.hh:7333
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:7378
void HeavyPrepare()
Definition Effect.hh:7331
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:7345
virtual void SetBox(Matrix b)
Definition Effect.hh:7332
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:7382
virtual std::string name() const
Definition Effect.hh:7329
virtual bool has_texcoord() const
Definition Effect.hh:7355
virtual bool has_normal() const
Definition Effect.hh:7344
QuadElem(Point p1, Point p2, Point p3, Point p4)
Definition Effect.hh:7328
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:7337
virtual int NumPoints(int face) const
Definition Effect.hh:7334
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:7356
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:7351
int Size() const
Definition Effect.hh:2834
QuadPointCollection2d(Point2d p1, Point2d p2, Point2d p3, Point2d p4)
Definition Effect.hh:2833
Point2d Index(int i) const
Definition Effect.hh:2835
int Size() const
Definition Effect.hh:4383
QuadsToPlanes(const FaceCollection &coll)
Definition Effect.hh:4373
Plane Index(int i) const
Definition Effect.hh:4374
Definition Effect.hh:6388
int Size() const
Definition Effect.hh:6396
const SurfaceIn3d * Index(int i) const
Definition Effect.hh:6395
virtual float YSize() const
Definition Effect.hh:6458
virtual unsigned int Color(float x, float y) const
Definition Effect.hh:6400
virtual Point Index(float x, float y) const
Definition Effect.hh:6398
virtual int AttribI(float x, float y, int id) const
Definition Effect.hh:6408
void HeavyPrepare()
Definition Effect.hh:6394
void Collect(CollectVisitor &vis)
Definition Effect.hh:6391
QuadsToSurfaces(FaceCollection &coll)
Definition Effect.hh:6390
virtual float XSize() const
Definition Effect.hh:6457
virtual Point2d Texture(float x, float y) const
Definition Effect.hh:6399
virtual float Attrib(float x, float y, int id) const
Definition Effect.hh:6412
virtual Vector Normal(float x, float y) const
Definition Effect.hh:6449
virtual int NumPoints() const
Definition Effect.hh:4396
virtual int NumFaces() const
Definition Effect.hh:4392
QuadsToTris(const FaceCollection &coll)
Definition Effect.hh:4391
virtual int IndexToFace(int index) const
Definition Effect.hh:4459
virtual int IndexCount() const
Definition Effect.hh:4453
virtual unsigned int Color(int index) const
Definition Effect.hh:4412
virtual Vector PointNormal(int index) const
Definition Effect.hh:4406
virtual Point FacePoint(int index) const
Definition Effect.hh:4400
virtual float Attrib(int index, int id) const
Definition Effect.hh:4426
virtual int AttribI(int index, int id) const
Definition Effect.hh:4432
virtual int Index(int face, int point) const
Definition Effect.hh:4438
virtual Point2d TexCoord(int index) const
Definition Effect.hh:4419
Definition Effect.hh:206
static std::pair< A, B > * EqualizerCheck(RangeFunction< A, B > &f1, RangeFunction< A, B > &f2, int i1, int i2)
Definition Effect.hh:225
void push_back(A start, A end, B val)
Definition Effect.hh:220
virtual B Index(A a) const
Definition Effect.hh:208
Definition Effect.hh:1305
Range(T s, T e)
Definition Effect.hh:1308
T end
Definition Effect.hh:1310
Range()
Definition Effect.hh:1307
T start
Definition Effect.hh:1309
Ray(Point p, Vector v)
Definition Effect.hh:10158
Point Index(float x) const
Definition Effect.hh:10159
Vector PointNormal(int face, int point) const
Definition Effect.hh:3324
virtual bool has_normal() const
Definition Effect.hh:3323
virtual std::string name() const
Definition Effect.hh:3321
RecalculateNormals(FaceCollection &coll)
Definition Effect.hh:3320
void Prepare()
Definition Effect.hh:9113
Point FacePoint(int face, int point) const
Definition Effect.hh:9116
void Collect(CollectVisitor &vis)
Definition Effect.hh:9108
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:9143
virtual std::string name() const
Definition Effect.hh:9107
int NumFaces() const
Definition Effect.hh:9114
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:9131
float Attrib(int, int point, int id) const
Definition Effect.hh:9147
bool Inside(Point p) const
Definition Effect.hh:9171
unsigned int Color(int face, int point) const
Definition Effect.hh:9127
void HeavyPrepare()
Definition Effect.hh:9111
RectangleElem(float x, float y)
Definition Effect.hh:9106
Vector PointNormal(int face, int point) const
Definition Effect.hh:9139
void SetBox(Matrix b)
Definition Effect.hh:9170
int NumPoints(int face) const
Definition Effect.hh:9115
virtual std::string name() const
Definition Effect.hh:3283
virtual Point FacePoint(int face, int point) const
Definition Effect.cc:4178
ReflectFaceCollection(FaceCollection &coll, Point pos, Vector u_x, Vector u_y, Vector ref_vec)
Definition Effect.hh:3282
FaceType Index(int face) const
Definition Effect.hh:8441
RemovePolysFunc(BoxableFaceCollection &obj, BoxableFaceCollection &obj2)
Definition Effect.hh:8438
void SetBox(Matrix b)
Definition Effect.hh:8440
Definition Effect.hh:609
virtual B Map(A a) const =0
B Index(A a) const
Definition Effect.hh:611
int NumFaces() const
Definition Effect.hh:9180
Point FacePoint(int face, int point) const
Definition Effect.hh:9182
Point VisibleToInternal(Point p) const
Definition Effect.hh:9240
unsigned int Color(int face, int point) const
Definition Effect.hh:9248
Point InternalToVisible(Point p) const
Definition Effect.hh:9233
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:9252
RenderBox(int sx, int sy, int sz, float sizex, float sizey, float sizez)
Definition Effect.hh:9179
float Attrib(int face, int point, int id) const
Definition Effect.hh:9269
Vector PointNormal(int face, int point) const
Definition Effect.hh:9260
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:9264
int NumPoints(int face) const
Definition Effect.hh:9181
bool Inside(Point p) const
Definition Effect.hh:9297
void SetBox(Matrix b)
Definition Effect.hh:9296
RenderOpenGlCmds(const FaceCollection &col)
Definition Effect.hh:10843
void PreCalc()
Definition Effect.hh:10844
void Execute()
Definition Effect.cc:436
void * GetState() const
Definition Effect.hh:9556
~RenderState()
Definition Effect.hh:9557
RenderState(Render &r)
Definition Effect.hh:9555
void PreCalc()
Definition Effect.cc:440
void Execute()
Definition Effect.cc:459
RenderToTexture(TexturePlugin *plugin, OpenGlCommands &cmds, bool in_precalc)
Definition Effect.hh:10794
Definition Effect.hh:9514
virtual void RenderPoly(const PointCollection &col)=0
virtual void * CreateState()=0
virtual void Show()
Definition Effect.hh:9529
virtual void UpdateVBO(const FaceCollection &faces, void *state)=0
virtual void DrawVBO(void *state)=0
virtual void RenderFacesTexture(const FaceCollection &col)=0
virtual void RenderFaces(const FaceCollection &col)=0
virtual void SetTime(float time)=0
virtual void RenderLines(const LineCollection &col)=0
virtual void RenderFaces(const FaceCollection &col, const TextureCoords &tex)=0
virtual void SetMatrix(Matrix m)=0
virtual void DestroyState(void *state)=0
float Index(float val) const
Definition Effect.hh:5386
float Max() const
Definition Effect.hh:5385
float Min() const
Definition Effect.hh:5384
RepeatWaveform(Waveform &w, int times)
Definition Effect.hh:5382
float Length() const
Definition Effect.hh:5383
Point Index(float i) const
Definition Effect.hh:1505
RepositionCurve(CurveIn3d &curve, Point new_start_point)
Definition Effect.hh:1503
float Size() const
Definition Effect.hh:1504
int Size() const
Definition Effect.hh:848
T Index(int i) const
Definition Effect.hh:849
ResizeArray(Array< int, T > &arr, T def, int size)
Definition Effect.hh:847
bool Frame(float time)
Definition Effect.cc:2748
RingEffect(Render *render)
Definition Effect.hh:11087
void Init()
Definition Effect.cc:2717
~RoboEffect()
Definition Effect.cc:1262
bool Frame(float time)
Definition Effect.cc:1266
RoboEffect(Render *render)
Definition Effect.cc:1255
float Size() const
Definition Effect.hh:3525
RotateAroundEdge(Matrix m, FaceCollection &obj, int face, int point1, int point2, float speed, float length)
Definition Effect.hh:3524
Matrix Index(float time) const
Definition Effect.hh:3526
void Show()
Definition Effect.cc:3281
void RenderFacesTexture(const FaceCollection &col)
Definition Effect.cc:3252
void DestroyState(void *state)
Definition Effect.cc:3277
void UpdateVBO(const FaceCollection &faces, void *state)
Definition Effect.cc:3267
void SetTime(float time)
Definition Effect.cc:3236
void DrawVBO(void *state)
Definition Effect.cc:3273
void RenderLines(const LineCollection &col)
Definition Effect.cc:3257
SDLArrayRender()
Definition Effect.hh:11677
void SetMatrix(Matrix m)
Definition Effect.cc:3240
void RenderPoly(const PointCollection &col)
Definition Effect.cc:3260
void * CreateState()
Definition Effect.cc:3263
void RenderFaces(const FaceCollection &col)
Definition Effect.cc:3243
Definition Effect.hh:9533
void RenderLines(const LineCollection &col)
Definition Effect.cc:2968
void RenderFacesTexture(const FaceCollection &col)
Definition Effect.hh:9539
void DestroyState(void *state)
Definition Effect.cc:2979
void RenderFaces(const FaceCollection &col)
Definition Effect.cc:2965
void UpdateVBO(const FaceCollection &faces, void *state)
Definition Effect.cc:2971
void DrawVBO(void *state)
Definition Effect.cc:2975
void SetTime(float time)
Definition Effect.cc:2963
void RenderPoly(const PointCollection &col)
Definition Effect.cc:2969
void SetMatrix(Matrix m)
Definition Effect.cc:2964
void * CreateState()
Definition Effect.cc:2970
Definition Effect.hh:4506
Point Index(int index) const
Definition Effect.hh:4512
SampleCurve3d(const CurveIn3d &curve, const FloatArray &arr)
Definition Effect.hh:4510
SampleCurve3d(const CurveIn3d &curve, int count)
Definition Effect.hh:4508
SampleCurve3d(const CurveIn3d *curve, int count)
Definition Effect.hh:4509
int Size() const
Definition Effect.hh:4511
Definition Effect.hh:2866
SampleCurveIn2d(const CurveIn2d &curve, int count, float length)
Definition Effect.hh:2868
int Size() const
Definition Effect.hh:2869
Point2d Index(int i) const
Definition Effect.hh:2873
SampleFunction(Function< int, float > &a, Function< float, C > &b)
Definition Effect.hh:8420
virtual std::string name() const
Definition Effect.hh:9735
Point2d TexCoord(int face, int point) const
Definition Effect.hh:9738
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:9769
void HeavyPrepare()
Definition Effect.hh:9747
Vector PointNormal(int face, int point) const
Definition Effect.hh:9763
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:9775
Point FacePoint(int face, int point) const
Definition Effect.hh:9751
unsigned int Color(int face, int point) const
Definition Effect.hh:9757
int NumPoints(int face) const
Definition Effect.hh:9750
int NumFaces() const
Definition Effect.hh:9749
int Texture(int face) const
Definition Effect.hh:9737
SampleGrid(GridIn3d &grid, int texture)
Definition Effect.hh:9734
void Prepare()
Definition Effect.hh:9748
void Collect(CollectVisitor &vis)
Definition Effect.hh:9744
Matrix Index(int box) const
Definition Effect.hh:5826
SampleMatrixCurve(const MatrixCurve &curve, int count)
Definition Effect.hh:5824
int Size() const
Definition Effect.hh:5825
virtual int YSize() const
Definition Effect.hh:6277
virtual float Attrib(int x1, int y1, int id) const
Definition Effect.hh:6267
virtual Point2d Texture(int x1, int y1) const
Definition Effect.hh:6255
static float Sample(int val, int size, float sizef)
Definition Effect.hh:6279
virtual unsigned int Color(int x1, int y1) const
Definition Effect.hh:6263
virtual Vector Normal(int x1, int y1) const
Definition Effect.hh:6259
virtual int XSize() const
Definition Effect.hh:6276
virtual Point Index(int x1, int y1) const
Definition Effect.hh:6251
virtual int AttribI(int x1, int y1, int id) const
Definition Effect.hh:6271
SampleSurfaceForGrid(const SurfaceIn3d &surf, int x, int y)
Definition Effect.hh:6250
Definition Effect.hh:6289
virtual std::string name() const
Definition Effect.hh:6292
SampleSurfaceIn3d(const SurfaceIn3d &surf, int texture, int x, int y)
Definition Effect.hh:6291
bool has_color() const
Definition Effect.hh:6324
virtual int NumFaces() const
Definition Effect.hh:6311
bool has_texcoord() const
Definition Effect.hh:6303
int AttribI(int face, int point, int id) const
Definition Effect.hh:6346
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:6326
void Collect(CollectVisitor &vis)
Definition Effect.hh:6293
void HeavyPrepare()
Definition Effect.hh:6297
void Prepare()
Definition Effect.hh:6299
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:6333
virtual Point EndFacePoint(int face, int point) const
Definition Effect.hh:6320
float Attrib(int face, int point, int id) const
Definition Effect.hh:6339
virtual int Texture(int face) const
Definition Effect.hh:6302
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:6304
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:6313
bool has_normal() const
Definition Effect.hh:6332
virtual int NumPoints(int face) const
Definition Effect.hh:6312
float Sample(int i) const
Definition Effect.hh:5298
float Index(int i) const
Definition Effect.hh:5294
SampleWaveform(Waveform &wave, int count)
Definition Effect.hh:5292
int Size() const
Definition Effect.hh:5293
Definition Effect.hh:8424
Sample(float zero, float succ)
Definition Effect.hh:8426
float Index(int i) const
Definition Effect.hh:8427
int Size() const
Definition Effect.hh:4534
SampledLine(Point p1, Point p2, int count)
Definition Effect.hh:4533
Point Index(int i) const
Definition Effect.hh:4535
SaveObjModelFaceCollection(FaceCollection *coll)
Definition Effect.hh:12180
void save(std::string filename)
Definition Effect.hh:12181
SawWaveform()
Definition Effect.hh:5460
ScaleCurveIn2d(CurveIn2d &curve, float x, float y)
Definition Effect.hh:2136
Point2d Index(float angle) const
Definition Effect.hh:2138
float Size() const
Definition Effect.hh:2137
float Size() const
Definition Effect.hh:1416
ScaleCurve(Curve< T > &curve, float target_length)
Definition Effect.hh:1415
T Index(float x) const
Definition Effect.hh:1417
ScopeMatrix(Matrix m)
Definition Effect.cc:2943
~ScopeMatrix()
Definition Effect.cc:2956
const FaceCollectionTri * Index(int i) const
Definition Effect.hh:3781
SeparateArrayElements(const Array< int, const FaceCollectionTri * > &arr)
Definition Effect.hh:3759
~SeparateArrayElements()
Definition Effect.hh:3787
int Size() const
Definition Effect.hh:3780
void Init()
Definition Effect.hh:11045
float Time() const
Definition Effect.hh:11037
SequentialFrameAnim(const Array< int, FrameAnim * > &arr, Render *r)
Definition Effect.hh:11034
bool Frame(float time)
Definition Effect.hh:11052
Definition Shader.hh:241
void PreCalc()
Definition Effect.hh:10879
ShaderCmds(OpenGlCommands &cmds, PieceShader &piece, ShaderPiece &shader, ShaderParameters *params, ShaderAttributes *attrs)
Definition Effect.hh:10873
~ShaderCmds()
Definition Effect.hh:10894
void Execute()
Definition Effect.hh:10884
void SetAttribs(ShaderAttributes *a)
Definition Effect.hh:10878
void SetParams(ShaderParameters *p)
Definition Effect.hh:10877
Definition Shader.hh:1466
int Size() const
Definition Effect.hh:5567
ShaderParameterArrayConvert(const Array< int, ShaderParameters * > &c2)
Definition Effect.hh:5566
ShaderParameters * Index(int i) const
Definition Effect.hh:5568
Definition Effect.hh:5561
Definition Shader.hh:236
Definition Shader.hh:328
Definition Shader.hh:1242
ShadowFaceCollection(FaceCollection &coll, Point pos, Vector u_x, Vector u_y, Vector light_vec)
Definition Effect.hh:3268
virtual Point FacePoint(int face, int point) const
Definition Effect.cc:4170
virtual std::string name() const
Definition Effect.hh:3269
void SetTexture(int tex)
Definition Effect.hh:4986
int Texture(int face) const
Definition Effect.hh:4987
SimpleTexCoords(FaceCollection &coll, int texture)
Definition Effect.hh:4985
Point2d TexCoord(int face, int point) const
Definition Effect.hh:4988
SimpleVectorCollection(Vector v)
Definition Effect.hh:3023
Vector Index(int index) const
Definition Effect.hh:3025
int Size() const
Definition Effect.hh:3024
float Max() const
Definition Effect.hh:5404
float Min() const
Definition Effect.hh:5403
float Length() const
Definition Effect.hh:5402
float Index(float val) const
Definition Effect.hh:5405
SinWaveform(float length, float freq)
Definition Effect.hh:5401
Definition Effect.hh:3163
void Prepare()
Definition Effect.hh:3165
void Collect(CollectVisitor &vis)
Definition Effect.hh:3166
void HeavyPrepare()
Definition Effect.hh:3167
Definition Effect.hh:3156
void Collect(CollectVisitor &vis)
Definition Effect.hh:3159
void Prepare()
Definition Effect.hh:3158
void HeavyPrepare()
Definition Effect.hh:3160
SingleInt(int a)
Definition Effect.hh:814
int Index(int i) const
Definition Effect.hh:816
int Sum() const
Definition Effect.hh:817
int Size() const
Definition Effect.hh:815
virtual int Size() const
Definition Effect.hh:1086
virtual T Index(int index) const
Definition Effect.hh:1087
SingletonArray(T t)
Definition Effect.hh:1085
bool Frame(float time)
Definition Effect.cc:2839
void Init()
Definition Effect.cc:2826
SinusEffect(Render *render)
Definition Effect.hh:11102
Vector PointNormal(int face, int point) const
Definition Effect.hh:3391
SmoothNormals(FaceCollection &coll)
Definition Effect.hh:3390
SndArray(Array< I, std::pair< T1, T2 > > &arr)
Definition Effect.hh:1269
I Size() const
Definition Effect.hh:1270
T2 Index(I i) const
Definition Effect.hh:1271
Definition Effect.hh:10172
SolvableCompose(Function< float, T > &curve, Function< T, float > &value)
Definition Effect.hh:10174
float Index(float x) const
Definition Effect.hh:10177
SpaceTexCoords(FaceCollection &coll, int texture, Point p, Vector x, Vector y)
Definition Effect.hh:5006
int Texture(int face) const
Definition Effect.hh:5007
Point2d TexCoord(int face, int point) const
Definition Effect.hh:5008
SpanObject(PointCollection &points, PointCollection &points2)
Definition Effect.hh:9859
Vector Normal(int x, int y) const
Definition Effect.hh:9884
unsigned int Color(int x, int y) const
Definition Effect.hh:9880
virtual int AttribI(int x, int y, int id) const
Definition Effect.hh:9897
int YSize() const
Definition Effect.hh:9905
Point2d Texture(int x, int y) const
Definition Effect.hh:9873
virtual float Attrib(int x, int y, int id) const
Definition Effect.hh:9893
Point Index(int x, int y) const
Definition Effect.hh:9860
int XSize() const
Definition Effect.hh:9901
SpanObject(PointCollection &points, PointCollection &points2, MatrixCurve &contobject)
Definition Effect.hh:9858
SphereEffect(Render *render)
Definition Effect.hh:10437
bool Frame(float time)
Definition Effect.cc:866
void Prepare()
Definition Effect.hh:9316
void HeavyPrepare()
Definition Effect.hh:9314
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:9326
virtual int NumPoints(int face) const
Definition Effect.hh:9318
virtual Point2d TexCoord(int face, int point) const
Definition Effect.cc:233
virtual int NumFaces() const
Definition Effect.cc:197
virtual Point FacePoint(int face, int point) const
Definition Effect.cc:198
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:9331
virtual void SetBox(Matrix b)
Definition Effect.hh:9310
SphereElem(int numfaces, int numfaces2)
Definition Effect.hh:9306
void Collect(CollectVisitor &vis)
Definition Effect.hh:9311
virtual std::string name() const
Definition Effect.hh:9308
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:9346
virtual bool has_normal() const
Definition Effect.hh:9345
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:9320
virtual bool has_texcoord() const
Definition Effect.hh:9324
virtual bool Inside(Point p) const
Definition Effect.hh:9335
SphericalTexCoords(FaceCollection &coll, int texture, Point center)
Definition Effect.hh:4907
int Texture(int face) const
Definition Effect.hh:4909
Point2d TexCoord(int face, int point) const
Definition Effect.hh:4910
float Size() const
Definition Effect.hh:1689
SpiralMatrixCurve(float rot)
Definition Effect.hh:1688
Matrix Index(float x) const
Definition Effect.hh:1690
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:6575
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:6532
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:6559
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:6513
void HeavyPrepare()
Definition Effect.hh:6505
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:6541
virtual int NumFaces() const
Definition Effect.hh:6507
virtual int NumPoints(int face) const
Definition Effect.hh:6512
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:6567
virtual float TexCoord3(int face, int point) const
Definition Effect.hh:6549
virtual std::string name() const
Definition Effect.hh:6503
void Collect(CollectVisitor &vis)
Definition Effect.hh:6504
virtual Point EndFacePoint(int face, int point) const
Definition Effect.hh:6522
void Prepare()
Definition Effect.hh:6506
SplitQuads(FaceCollection &faces, int x, int y)
Definition Effect.hh:6502
int Size() const
Definition Effect.hh:4485
StarCurve(float r1, float r2, int numpoints)
Definition Effect.hh:4484
Point Index(int i) const
Definition Effect.hh:4486
Definition Effect.hh:2419
virtual ~Storage()
Definition Effect.hh:2421
virtual Vector & IndexVector(int i) const =0
virtual int PointCount() const =0
virtual int MatrixCount() const =0
virtual Matrix & IndexMatrix(int i) const =0
virtual float & IndexFloat(int i) const =0
virtual int VectorCount() const =0
virtual int FloatCount() const =0
virtual Point & IndexPoint(int i) const =0
SubArrayArray(Array< int, Range< int > > &ranges, Array< int, T > &contents)
Definition Effect.hh:1317
~SubArrayArray()
Definition Effect.hh:1325
Array< int, T > * Index(int i) const
Definition Effect.hh:1318
Definition Effect.hh:1282
SubArray(const Array< I, T > &arr, int start_index, int length)
Definition Effect.hh:1284
I Size() const
Definition Effect.hh:1285
T Index(int i) const
Definition Effect.hh:1286
SubSelect(AnimSet &s, int start, int size)
Definition Effect.hh:3463
void Set(int index, bool b)
Definition Effect.hh:3464
Definition Effect.hh:684
N Index(N n) const
Definition Effect.hh:686
SurfaceBetweenSurfaces(SurfaceIn3d &next, SurfaceIn3d &plane1, SurfaceIn3d &plane2, CurveIn2d &curve)
Definition Effect.hh:1951
virtual Point Index(float x, float y) const
Definition Effect.hh:1952
~SurfaceEffect()
Definition Effect.cc:2655
SurfaceEffect(Render *r)
Definition Effect.cc:2647
bool Frame(float time)
Definition Effect.cc:2687
void Init()
Definition Effect.cc:2659
virtual void Prepare()
Definition Effect.hh:1900
virtual int AttribI(float x, float y, int id) const
Definition Effect.hh:1904
virtual Vector Normal(float x, float y) const
Definition Effect.hh:1905
virtual Point2d Texture(float x, float y) const
Definition Effect.hh:1902
virtual float Attrib(float x, float y, int id) const
Definition Effect.hh:1903
SurfaceIn3dImpl(SurfaceIn3d &next)
Definition Effect.hh:1899
virtual unsigned int Color(float x, float y) const
Definition Effect.hh:1906
virtual float YSize() const
Definition Effect.hh:1908
virtual float XSize() const
Definition Effect.hh:1907
virtual Point Index(float x, float y) const
Definition Effect.hh:1901
Definition Effect.hh:1880
virtual float YSize() const =0
virtual void Prepare()
Definition Effect.hh:1883
virtual Point Index(float x, float y) const =0
virtual int AttribI(float x, float y, int id) const =0
virtual ~SurfaceIn3d()
Definition Effect.hh:1882
virtual unsigned int Color(float x, float y) const =0
virtual Vector Normal(float x, float y) const =0
virtual Point2d Texture(float x, float y) const =0
virtual float Attrib(float x, float y, int id) const =0
virtual float XSize() const =0
SwapIndexesArray(Array< I, Array< I2, T > * > &arr)
Definition Effect.hh:865
~SwapIndexesArray()
Definition Effect.hh:867
Array< I, T > * Index(I2 index) const
Definition Effect.hh:868
I2 Size() const
Definition Effect.hh:866
TestEffect(Render *render)
Definition Effect.hh:10490
bool Frame(float time)
Definition Effect.cc:1352
void PreCalc()
Definition Effect.hh:10854
TextureCommands(OpenGlCommands &cmds)
Definition Effect.hh:10853
void Execute()
Definition Effect.cc:489
Definition Effect.hh:4884
virtual ~TextureCoords()
Definition Effect.hh:4886
virtual Point2d TexCoord(int face, int point) const =0
virtual int Texture(int face) const =0
TextureElem2(FaceCollection &next, BufferRefReq &ref, TextureCoords &coords)
Definition Effect.hh:8014
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:8025
virtual void SetBox(Matrix b)
Definition Effect.hh:8018
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:8021
virtual int FaceTexture(int face) const
Definition Effect.hh:8061
void HeavyPrepare()
Definition Effect.hh:8017
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:8040
virtual void GenTexture(int num)
Definition Effect.hh:8049
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:8044
void Collect(CollectVisitor &vis)
Definition Effect.hh:8016
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:8031
virtual std::string name() const
Definition Effect.hh:8015
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:8036
virtual int NumTextures() const
Definition Effect.hh:8048
virtual bool has_texcoord() const
Definition Effect.hh:8029
virtual int NumPoints(int face) const
Definition Effect.hh:8020
virtual BufferRef TextureBuf(int num) const
Definition Effect.hh:8053
virtual int NumFaces() const
Definition Effect.hh:8019
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:7998
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:7990
void Collect(CollectVisitor &vis)
Definition Effect.hh:7971
virtual bool has_texcoord() const
Definition Effect.hh:7984
void HeavyPrepare()
Definition Effect.hh:7972
virtual int NumPoints(int face) const
Definition Effect.hh:7975
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:7976
virtual int NumFaces() const
Definition Effect.hh:7974
virtual void SetBox(Matrix b)
Definition Effect.hh:7973
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:7985
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:7980
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:7994
TextureElem(const BoxableFaceCollection &next, TextureCoords &coords)
Definition Effect.hh:7970
Definition Effect.hh:3149
int id
Definition Effect.hh:3151
Definition Shader.hh:945
int Index(int i) const
Definition Effect.hh:837
int Sum() const
Definition Effect.hh:838
int Size() const
Definition Effect.hh:836
ThreeInts(int a, int b, int c)
Definition Effect.hh:835
TitleEffect(Render *render)
Definition Effect.hh:10484
bool Frame(float time)
Definition Effect.cc:1341
bool has_texcoord() const
Definition Effect.hh:9983
bool has_normal() const
Definition Effect.hh:9974
virtual int NumPoints(int face) const
Definition Effect.hh:9957
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:9958
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:9998
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:9982
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:9984
virtual int NumFaces() const
Definition Effect.hh:9956
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:9997
Point Pos(float angle1, float angle2) const
Definition Effect.hh:10001
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:9975
TorusElem(int numfaces1, int numfaces2, Point center, Vector u_x, Vector u_y, float radius1, Vector uu_x, Vector uu_y, float radius2)
Definition Effect.hh:9950
virtual std::string name() const
Definition Effect.hh:9954
TransformPoints(const PointCollection &coll, Matrix m)
Definition Effect.hh:9459
int Size() const
Definition Effect.hh:9460
Point Index(int i) const
Definition Effect.hh:9461
Definition Effect.hh:1651
Matrix Elem() const
Definition Effect.hh:1654
TranslateElement(Point p)
Definition Effect.hh:1653
TranslateToMatrixCurve(CurveIn3d &curve)
Definition Effect.hh:1663
float Size() const
Definition Effect.hh:1669
Matrix Index(float pos) const
Definition Effect.hh:1664
void Execute()
Definition Effect.cc:478
TransparencyCmds(OpenGlCommands &inner_cmds)
Definition Effect.hh:10816
void PreCalc()
Definition Effect.hh:10817
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:7421
TriElem(Point p1, Point p2, Point p3)
Definition Effect.hh:7400
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:7425
virtual void SetBox(Matrix b)
Definition Effect.hh:7403
virtual int NumFaces() const
Definition Effect.hh:7404
virtual std::string name() const
Definition Effect.hh:7401
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:7432
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:7415
virtual int NumPoints(int face) const
Definition Effect.hh:7405
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:7436
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:7408
virtual bool has_normal() const
Definition Effect.hh:7414
Point2d Index(int i) const
Definition Effect.hh:2816
TriPointCollection2d(Point2d p1, Point2d p2, Point2d p3)
Definition Effect.hh:2814
int Size() const
Definition Effect.hh:2815
Point Index(int i) const
Definition Effect.hh:2502
Triangle(Point p1, Point p2, Point p3)
Definition Effect.hh:2500
int Size() const
Definition Effect.hh:2501
virtual unsigned int Color(int index) const
Definition Effect.hh:4321
virtual int IndexCount() const
Definition Effect.hh:4356
virtual int AttribI(int index, int id) const
Definition Effect.hh:4346
virtual Point2d TexCoord(int index) const
Definition Effect.hh:4327
virtual Vector PointNormal(int index) const
Definition Effect.hh:4334
TrisToTris(const FaceCollection &coll)
Definition Effect.hh:4306
virtual int NumPoints() const
Definition Effect.hh:4311
virtual float Attrib(int index, int id) const
Definition Effect.hh:4340
virtual Point FacePoint(int index) const
Definition Effect.hh:4315
virtual int Index(int face, int point) const
Definition Effect.hh:4352
virtual int IndexToFace(int index) const
Definition Effect.hh:4360
virtual int NumFaces() const
Definition Effect.hh:4307
bool Frame(float time)
Definition Effect.cc:1125
TunnelEffect2(Render *render)
Definition Effect.hh:11112
void Init()
Definition Effect.cc:1120
TunnelEffect(Render *render)
Definition Effect.hh:10498
bool Frame(float time)
Definition Effect.cc:1084
int Size() const
Definition Effect.hh:825
TwoInts(int a, int b)
Definition Effect.hh:824
int Index(int i) const
Definition Effect.hh:826
int Sum() const
Definition Effect.hh:827
Definition Effect.hh:153
A a
Definition Effect.hh:167
bool is_a
Definition Effect.hh:165
Union(B b)
Definition Effect.hh:156
union Union::@026032061203250075374141105343172236003035312235 either
Union(const Union< A, B > &c)
Definition Effect.hh:158
Union(A a)
Definition Effect.hh:155
Union(A a, B b, bool is_a)
Definition Effect.hh:157
B b
Definition Effect.hh:168
virtual int Size() const
Definition Effect.hh:9725
virtual Matrix Index(int box) const
Definition Effect.hh:9726
UnitBox()
Definition Effect.hh:9720
UnitBox(Matrix m)
Definition Effect.hh:9724
VBOEffect(Render *r)
Definition Effect.cc:1581
~VBOEffect()
Definition Effect.cc:1603
void Init()
Definition Effect.cc:1589
bool Frame(float time)
Definition Effect.cc:1607
Definition Effect.hh:10525
virtual int StartRange(int obj) const =0
virtual int EndRange(int obj) const =0
virtual ~VBORanges()
Definition Effect.hh:10527
virtual int StartRangeIndex(int obj) const =0
virtual int NumObjects() const =0
virtual int EndRangeIndex(int obj) const =0
Definition Effect.cc:1968
Definition Effect.hh:10694
VBOState()
Definition Effect.cc:2003
friend void DrawVBO(int obj, VBOState &state, VBOUpdate u, const std::vector< Attrib > &attribs)
Definition Effect.cc:2541
friend void UpdateVBO(const FaceCollectionVBO &faces, int obj, VBOState &state, VBOUpdate u, const std::vector< Attrib > &attribs)
Definition Effect.cc:2085
~VBOState()
Definition Effect.cc:2033
virtual int EndRange(int obj) const
Definition Effect.hh:10666
virtual int NumObjects() const
Definition Effect.hh:10664
virtual int StartRange(int obj) const
Definition Effect.hh:10665
virtual int EndRangeIndex(int obj) const
Definition Effect.hh:10669
virtual void UpdateAttrib(int start, int end, float *array, int id) const
Definition Effect.hh:10622
virtual int IndexSize() const
Definition Effect.hh:10645
virtual void UpdateColorList(int start, int end, char *array) const
Definition Effect.hh:10608
virtual void UpdateNormalList(int start, int end, float *array) const
Definition Effect.hh:10583
virtual void UpdateAttribI(int start, int end, short *array, int id) const
Definition Effect.hh:10633
virtual int StartRangeIndex(int obj) const
Definition Effect.hh:10668
virtual void UpdateTextureCoordList(int start, int end, float *array) const
Definition Effect.hh:10596
virtual void UpdateVertexList(int start, int end, float *array) const
Definition Effect.hh:10568
virtual int NumPoints() const
Definition Effect.hh:10564
VBO(FaceCollectionTriWithObjects &o)
Definition Effect.hh:10563
virtual void UpdateIndexList(int start, int end, int *array) const
Definition Effect.hh:10646
Definition VectorTools.hh:119
float w
Definition VectorTools.hh:121
float y
Definition VectorTools.hh:121
float x
Definition VectorTools.hh:121
float z
Definition VectorTools.hh:121
Definition Effect.hh:1122
VectorArray(It beg, It end)
Definition Effect.hh:1126
void clear()
Definition Effect.hh:1138
void push_back(T t)
Definition Effect.hh:1131
virtual int Size() const
Definition Effect.hh:1127
const T * get_whole_array() const
Definition Effect.hh:1139
T & operator[](int index)
Definition Effect.hh:1130
VectorArray()
Definition Effect.hh:1124
T pop_back()
Definition Effect.hh:1132
virtual T Index(int index) const
Definition Effect.hh:1128
Definition Effect.hh:3010
int Size() const
Definition Effect.hh:3013
VectorCollectionConvert(const Array< int, Vector > &c2)
Definition Effect.hh:3012
Vector Index(int i) const
Definition Effect.hh:3014
Definition Effect.hh:3002
Vector Vectors(int index) const
Definition Effect.hh:3006
int NumVectors() const
Definition Effect.hh:3005
virtual ~VectorCollection()
Definition Effect.hh:3004
Definition Effect.hh:3032
Point2d Index(Point2d t) const
Definition Effect.hh:279
std::vector< Point2d > Inverse(Point2d k) const
Definition Effect.hh:284
VectorInvertableFunction2d(Vector2d vec)
Definition Effect.hh:278
Definition Effect.hh:296
Point Index(Vector v) const
Definition Effect.hh:298
Definition Effect.hh:4831
std::pair< Point, Point > Elem() const
Definition Effect.hh:4834
VectorPoints(const std::pair< Point, Vector > &vec)
Definition Effect.hh:4833
Definition VectorTools.hh:125
static float Angle(const Vector &aVec, const Vector &aVec2)
Definition VectorTools.cc:81
float Dist() const
Definition VectorTools.cc:141
float dy
Definition VectorTools.hh:268
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
float dz
Definition VectorTools.hh:268
float dx
Definition VectorTools.hh:268
virtual int NumFaces() const
Definition Effect.hh:12081
virtual int FaceTexture(int face) const
Definition Effect.hh:12146
virtual int NumTextures() const
Definition Effect.hh:12141
virtual unsigned int Color(int face, int point) const
Definition Effect.hh:12122
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:12109
virtual int NumPoints(int face) const
Definition Effect.hh:12082
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:12096
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:12118
VertexArrayFaceCollection(float *v_array, int v_size, float *n_array, int n_size, unsigned int *c_array, int c_size, float *tex_array, int tex_size, float **attrib_array, int a_size1, int a_size2)
Definition Effect.hh:12068
virtual Point2d TexCoord(int face, int point) const
Definition Effect.hh:12129
virtual void GenTexture(int num)
Definition Effect.hh:12142
virtual BufferRef TextureBuf(int num) const
Definition Effect.hh:12143
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:12083
VolumeRampWaveform(Waveform *orig, float old_y_value, float x_pos1, float x_pos2, float y_pos1, float y_pos2)
Definition Effect.hh:5103
virtual float Max() const
Definition Effect.hh:5106
virtual float Min() const
Definition Effect.hh:5105
virtual float Index(float val) const
Definition Effect.hh:5107
virtual float Length() const
Definition Effect.hh:5104
bool Frame(float time)
Definition Effect.cc:2916
WalkCubeEffect(Render *render)
Definition Effect.hh:11122
Definition Shader.hh:992
float Index(float x, float y) const
Definition Effect.hh:7748
Water(float time)
Definition Effect.hh:7736
Definition Effect.hh:5329
Definition Effect.hh:5332
WaveformFunction(WaveformCurve &curve)
Definition Effect.hh:5338
float Index(float x, float y) const
Definition Effect.hh:5339
float SizeY() const
Definition Effect.hh:5346
float SizeX() const
Definition Effect.hh:5345
Definition Effect.hh:5173
virtual ~WaveformPart()
Definition Effect.hh:5176
virtual float Delta(float x) const =0
Definition Effect.hh:5073
virtual bool Update(MainLoopEnv &e)
Definition Effect.hh:5077
virtual float Length() const =0
virtual void HandleEvent(MainLoopEvent &event)
Definition Effect.hh:5076
virtual float Index(float val) const =0
virtual float Min() const =0
virtual float Max() const =0
virtual ~Waveform()
Definition Effect.hh:5075
Definition Effect.hh:3078
int Size() const
Definition Effect.hh:3090
float Index(int x) const
Definition Effect.hh:3091
WeightedSampling(FloatArray &weights, float start)
Definition Effect.hh:3080
XPA(float c)
Definition Effect.hh:10340
float Index(float x) const
Definition Effect.hh:10341
std::vector< float > Inverse(float y) const
Definition Effect.hh:10342
float Size() const
Definition Effect.hh:1593
Matrix Index(float x) const
Definition Effect.hh:1594
XRotate(float angle)
Definition Effect.hh:1592
Definition Equalizer.hh:1800
Definition Equalizer.hh:1807
float Max() const
Definition Effect.hh:5166
float Length() const
Definition Effect.hh:5164
float Index(float val) const
Definition Effect.hh:5167
ZeroWaveform(float length_x, float min_y, float max_y)
Definition Effect.hh:5163
float Min() const
Definition Effect.hh:5165
frame( $arr, $width, $height, $data, $i, $homepage, $noheaders, $seamless, $transparent)
Definition emscripten_frame.php:18
border radius
Definition gameapi_example.php:45
let delta_y
Definition gameapi_example.php:63
background color
Definition gameapi_example.php:46
P g(unsigned int c, EveryApi &ev)
Definition test.cpp:19
PT func2(int face, int point, EveryApi &ev)
Definition test.cpp:27
convert($d)
Definition mesh_api.php:35
d
Definition meshpage.php:3895
n< br > font size
Definition meshpage.php:3536
store
Definition meshpage_bootstrap.php:1758
Object filter(Container c, Function f)
Takes elements from Container c that match function f, return them.
void equal(Module &m)
Definition operators.hpp:102
size_t count(const T &t_target, const typename T::key_type &t_key)
Definition bootstrap_stl.hpp:104
double f(const std::string &, double, bool) noexcept
Definition profile_cpp_calls_2.cpp:4
BM grid(EveryApi &ev, int sx, int sy, int cell_x, int cell_y)
Definition test.cpp:32
int f2(char c)
Definition test.cpp:51
Definition Shader.hh:1500
Definition EffectI.hh:56
float start_y
Definition EffectI.hh:59
float end_z
Definition EffectI.hh:62
float start_x
Definition EffectI.hh:57
float end_x
Definition EffectI.hh:58
float start_z
Definition EffectI.hh:61
float end_y
Definition EffectI.hh:60
Definition Effect.hh:6171
int face
Definition Effect.hh:6173
int object
Definition Effect.hh:6172
Definition Buffer.hh:32
unsigned int * buffer
Definition Buffer.hh:33
static BufferRef NewBuffer(int width, int height)
Definition Buffer.cc:36
Definition GameApi.h:30
Definition Effect.hh:10222
float distance
Definition Effect.hh:10223
float pos_in_curve
Definition Effect.hh:10225
Point pos
Definition Effect.hh:10224
Definition VectorTools.hh:755
Vector u_y
Definition VectorTools.hh:762
Point center
Definition VectorTools.hh:761
Vector u_x
Definition VectorTools.hh:762
Vector u_z
Definition VectorTools.hh:762
Definition Effect.hh:7452
Point p122
Definition Effect.hh:7456
Point p212
Definition Effect.hh:7458
Point p112
Definition Effect.hh:7454
Point p111
Definition Effect.hh:7453
Point p222
Definition Effect.hh:7460
Point p221
Definition Effect.hh:7459
Point p121
Definition Effect.hh:7455
Point p211
Definition Effect.hh:7457
Definition GameApi.h:57
Definition Effect.hh:11574
int point
Definition Effect.hh:11574
int face
Definition Effect.hh:11574
int framenum
Definition Effect.hh:11574
friend bool operator<(const Key &k1, const Key &k2)
Definition Effect.hh:11575
Definition EffectI.hh:171
unsigned char * indices_char
Definition EffectI.hh:175
unsigned int * color
Definition EffectI.hh:182
int numfaces
Definition EffectI.hh:172
Point * texcoords
Definition EffectI.hh:183
Vector * pointnormal
Definition EffectI.hh:181
unsigned short * indices_short
Definition EffectI.hh:176
VEC4 * joints
Definition EffectI.hh:184
unsigned int * indices_int
Definition EffectI.hh:177
Point * facepoint2
Definition EffectI.hh:180
VEC4 * weights
Definition EffectI.hh:185
Point * facepoint
Definition EffectI.hh:179
int numvertices
Definition EffectI.hh:173
Definition Effect.hh:5866
int point
Definition Effect.hh:5868
int face
Definition Effect.hh:5867
friend bool operator<(const FaceIndexStruct &i1, const FaceIndexStruct &i2)
Definition Effect.hh:5869
Definition Effect.hh:5855
int attrib_id[10]
Definition Effect.hh:5859
Vector normal
Definition Effect.hh:5857
int attribI_id[10]
Definition Effect.hh:5860
float attrib[10]
Definition Effect.hh:5858
Point2d tex_coord
Definition Effect.hh:5862
unsigned int color
Definition Effect.hh:5861
Point vec_point
Definition Effect.hh:5856
Definition GameApi.h:58
Definition Effect.hh:1172
int difference_type
Definition Effect.hh:1186
void operator++()
Definition Effect.hh:1174
K operator*() const
Definition Effect.hh:1187
const_iterator(const Array< T, K > &arr, T index)
Definition Effect.hh:1173
int & reference
Definition Effect.hh:1184
friend int operator-(const const_iterator &i, const const_iterator &i2)
Definition Effect.hh:1178
T index
Definition Effect.hh:1189
const Array< T, K > & arr
Definition Effect.hh:1188
int pointer
Definition Effect.hh:1183
K value_type
Definition Effect.hh:1185
void operator-=(int i)
Definition Effect.hh:1177
std::random_access_iterator_tag iterator_category
Definition Effect.hh:1182
void operator+=(int i)
Definition Effect.hh:1176
void operator--()
Definition Effect.hh:1175
Definition FreeType2.cc:432
Definition GameApi_low.hh:812
Definition GameApi_low.hh:679
Definition GraphI.hh:1502
Definition GraphI.hh:1562
Definition test.cpp:13
virtual void SetBox(Matrix b)
Definition Effect.hh:8325
virtual bool Inside(Point p) const
Definition Effect.hh:8348
virtual int NumFaces() const
Definition Effect.hh:8326
Move(BoxableFaceCollection &coll, float x, float y, float z)
Definition Effect.hh:8324
int y
Definition test.cpp:14
virtual Vector PointNormal(int face, int point) const
Definition Effect.hh:8335
virtual int AttribI(int face, int point, int id) const
Definition Effect.hh:8343
virtual float Attrib(int face, int point, int id) const
Definition Effect.hh:8339
virtual Point FacePoint(int face, int point) const
Definition Effect.hh:8328
Move(BoxableFaceCollection &coll, Vector v)
Definition Effect.hh:8323
int x
Definition test.cpp:14
virtual int NumPoints(int face) const
Definition Effect.hh:8327
Definition Effect.hh:5615
int object
Definition Effect.hh:5617
Matrix matrix
Definition Effect.hh:5616
friend std::ostream & operator<<(std::ostream &o, const ObjectData &od)
Definition Effect.cc:49
ShaderParameters * params
Definition Effect.hh:5618
Definition GameApi.h:23
Definition VectorTools.hh:910
float x
Definition VectorTools.hh:911
float y
Definition VectorTools.hh:911
static Point2d FromVector(const Vector2d &v)
Definition VectorTools.hh:1035
Definition Parser.cc:60
float x
Definition Parser.cc:60
float y
Definition Parser.cc:60
float z
Definition Parser.cc:60
Definition Effect.hh:11531
int framecount
Definition Effect.hh:11534
int vertex_size
Definition Effect.hh:11533
std::vector< std::pair< int, int > > vec
Definition Effect.hh:11532
Definition GameApi.h:39
Definition Effect.hh:3761
virtual Point FacePoint(int index) const
Definition Effect.hh:3765
virtual int NumPoints() const
Definition Effect.hh:3764
virtual float Attrib(int index, int id) const
Definition Effect.hh:3770
virtual Vector PointNormal(int index) const
Definition Effect.hh:3766
virtual unsigned int Color(int index) const
Definition Effect.hh:3767
virtual int IndexToFace(int index) const
Definition Effect.hh:3774
Arr(const FaceCollectionTri &tri, const Array< int, const FaceCollectionTri * > &arr, int t)
Definition Effect.hh:3762
virtual int NumFaces() const
Definition Effect.hh:3763
virtual Point2d TexCoord(int index) const
Definition Effect.hh:3768
virtual int Index(int face, int point) const
Definition Effect.hh:3772
virtual int IndexCount() const
Definition Effect.hh:3773
virtual int AttribI(int index, int id) const
Definition Effect.hh:3771
Definition Effect.hh:875
I Size() const
Definition Effect.hh:877
Array< I, Array< I2, T > * > & arr
Definition Effect.hh:882
T Index(I i) const
Definition Effect.hh:878
InnerArray(Array< I, Array< I2, T > * > &arr, I2 index)
Definition Effect.hh:876
I2 index
Definition Effect.hh:883
Definition GameApi.h:42
Definition VectorTools.hh:749
Definition VectorTools.hh:972
static Vector2d FromPoint(const Point2d &p)
Definition VectorTools.hh:991
num
Definition view.php:2821