GameApi 28
Library used by GameApi Builder tool
Loading...
Searching...
No Matches
Graph.hh
Go to the documentation of this file.
1//
2// Copyright (C) 2009 Tero Pulkkinen
3// Released under LFPL 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 GRAPH_HH
23#define GRAPH_HH
24
25#include "Effect.hh"
26#include "VolumeObjects.hh"
27#include "Shader.hh"
28#include "GraphI.hh"
29#include <set>
30#include <iostream>
31#include <string>
32#include <fstream>
33#include <vector>
34
35#ifndef ARM
36#ifndef NO_THREADS
37#define THREADS 1
38#endif
39#endif
40
41
42Quad QuadInterpolation(const Quad &q1, const Quad &q2, float val);
43
44
45class QuadInterpolationFunction : public Function<std::pair<Quad,Quad>, Quad>
46{ // val = [0..1]
47public:
48 QuadInterpolationFunction(float val) : val(val) { }
49 Quad Index(std::pair<Quad,Quad> p) const
50 {
51 return QuadInterpolation(p.first,p.second, val);
52 }
53private:
54 float val;
55};
56
57struct PointI
58{
59 int x,y,z;
60};
61
62class Rect
63{
64public:
65 std::pair<Rect,Rect> SplitX()
66 {
67 Rect r1;
68 Rect r2;
69 r1.tl.x = tl.x;
70 r1.tl.y = tl.y;
71 r1.br.x = (tl.x+br.x)/2;
72 r1.br.y = br.y;
73 r2.tl.x = (tl.x+br.x)/2;
74 r2.tl.y = tl.y;
75 r2.br.x = br.x;
76 r2.br.y = br.y;
77 return std::make_pair(r1,r2);
78 }
80 {
81 if (p.x < tl.x) return false;
82 if (p.y < tl.y) return false;
83 if (p.x >= br.x) return false;
84 if (p.y >= br.y) return false;
85 return true;
86 }
88 {
89 Point2d p2;
90 p2.x = p.x - tl.x;
91 p2.y = p.y - tl.y;
92 return p2;
93 }
96};
97class Region : public Array<int,Rect>
98{
99};
101
102
103class CubicInterpolate : public Function<float,float>, public DFunction<float,float>
104{
105public:
106 CubicInterpolate(float f_0, float f_1, float df_0, float df_1) : f_0(f_0), f_1(f_1), df_0(df_0), df_1(df_1) { }
107 float Index(float x) const
108 {
109 float a = 2.0*f_0-2.0*f_1+df_0+df_1;
110 float b = -3.0*f_0+3.0*f_1-3.0*df_0-df_1;
111 float c = df_0;
112 float d = f_0;
113 return a*x*x*x + b*x*x + c*x + d;
114 }
115 float DIndex(float x) const
116 {
117 float a = 2.0*f_0-2.0*f_1+df_0+df_1;
118 float b = -3.0*f_0+3.0*f_1-3.0*df_0-df_1;
119 float c = df_0;
120 return 3.0*a*x*x + 2.0*b*x + c;
121 }
122private:
123 float f_0,f_1,df_0,df_1;
124};
125
126
127
128template<class C>
129class LinearInterpolation2 : public Function<float,C>
130{
131public:
132 LinearInterpolation2(C c1, C c2) : c1(c1), c2(c2) { }
133 C Interpolate(float pos) const
134 {
135 return c1*(1.0-pos)+c2*pos;
136 }
137private:
138 C c1;
139 C c2;
140};
141class WaveformInterpolate : public Function<float,float>
142{
143public:
145 float Interpolate(float pos)
146 {
147 float val = w.Index(pos*w.Length());
148 return val;
149 }
150private:
151 Waveform &w;
152};
153
154
155
156
157class WaveformBitmap : public Bitmap<Color>
158{
159public:
160 WaveformBitmap(Waveform &wv, float start_x, float end_x, float start_y, float end_y, int sx, int sy, Color true_color, Color false_color) : wv(wv), start_x(start_x), end_x(end_x), start_y(start_y), end_y(end_y), sx(sx), sy(sy), true_color(true_color), false_color(false_color) { }
161 void Collect(CollectVisitor &vis) { }
162 void HeavyPrepare() { }
163 void Prepare() { }
164 virtual int SizeX() const { return sx; }
165 virtual int SizeY() const { return sy; }
166 virtual Color Map(int x, int y) const
167 {
168 float pos = float(x)/float(sx)*(end_x-start_x)+start_x;
169 float val = wv.Index(pos);
170 val -= start_y;
171 val /= end_y-start_y;
172 val *= float(sy);
173 float start_range = start_y;
174 start_range -= start_y;
175 start_range /= end_y-start_y;
176 start_range *= float(sy);
177 float end_range = val;
178 if (start_range > end_range) { std::swap(start_range, end_range); }
179 if (y >= start_range && y <= end_range)
180 {
181 return true_color;
182 }
183 return false_color;
184 }
185
186private:
187 Waveform &wv;
188 float start_x, end_x, start_y, end_y;
189 int sx,sy;
190 Color true_color, false_color;
191 //void *data;
192};
193
194class Object3dRender : public Bitmap<bool>
195{
196public:
197 Object3dRender(VolumeObject &o, int sx, int sy, Point p, float min_z, float max_z) : o(o), sx(sx), sy(sy), p(p), min_z(min_z), max_z(max_z)
198 {
199 done = BufferRefMask::NewBuffer(sx,sy);
200 render(p,p.z);
201 }
202 void Prepare() { }
203 int SizeX() const { return sx; }
204 int SizeY() const { return sy; }
205 bool Map(int x, int y) const
206 {
207 return done.operator[](y)[x] == 1;
208 }
210 Point2d pp;
211 pp.x = p.x;
212 pp.y = p.y;
213 return pp;
214 }
215 void render(Point p, float startz) {
216 Point2d pp = projection(p);
217 if (pp.y<0.0) return;
218 if (pp.x<0.0) return;
219 if (pp.x>=sx) return;
220 if (pp.y>=sy) return;
221 if (done.operator[]((int)pp.y)[(int)pp.x]==1) return;
222 if (o.Inside(p)) {
223 done.operator[]((int)pp.y)[(int)pp.x] = 1;
224 render(p+Vector(1.0,0.0,0.0), startz);
225 render(p+Vector(0.0,1.0,0.0), startz);
226 render(p+Vector(-1.0,0.0,0.0), startz);
227 render(p+Vector(0.0,-1.0,0.0), startz);
228 return;
229 }
230 if (p.z>=startz && p.z < max_z)
231 render(p+Vector(0.0,0.0,1.0), startz);
232 if (p.z<=startz && p.z > min_z)
233 render(p+Vector(0.0,0.0,-1.0), startz);
234 }
235private:
237 VolumeObject &o;
238 int sx,sy;
239 Point p;
240 float min_z, max_z;
241};
242
243class FloatRangeBitmap : public Bitmap<bool>
244{
245public:
246 FloatRangeBitmap(Bitmap<float> &fb, float rs, float re) : fb(fb), rs(rs), re(re) { }
248 fb.Collect(vis);
249 }
250 void HeavyPrepare() { }
251
252 void Prepare() { fb.Prepare(); }
253 virtual int SizeX() const { return fb.SizeX(); }
254 virtual int SizeY() const { return fb.SizeY(); }
255 virtual bool Map(int x, int y) const
256 {
257 float val = fb.Map(x,y);
258 return val >= rs && val <= re;
259 }
260private:
261 Bitmap<float> &fb;
262 float rs;
263 float re;
264};
265
266#if 0
267class SectionsBoolBitmap : public Bitmap<bool>
268{
269public:
270 SectionsBoolBitmap(int sx, int sy, float x, float y, std::function<bool (float angle)> f) : sx(sx), sy(sy), x(x), y(y), f(f) { }
271 void Collect(CollectVisitor &vis) {
272 }
273 void HeavyPrepare() { }
274 void Prepare() { }
275
276 virtual int SizeX() const { return sx; }
277 virtual int SizeY() const { return sy; }
278
279 bool Map(int ax, int ay) const
280 {
281 float xx = ax;
282 float yy = ay;
283 xx-=x;
284 yy-=y;
285 float angle_in_rad = atan2(yy,xx);
286 float angle_in_deg = angle_in_rad*360.0/2.0/3.14159;
287 bool b = f(angle_in_deg);
288 return b;
289 }
290
291private:
292 int sx,sy;
293 float x,y;
294 std::function<bool (float)> f;
295};
296#endif
297
298#if 0
299class ConicalGradientBitmap : public Bitmap<Color>
300{
301public:
302 ConicalGradientBitmap(int sx, int sy, float x, float y, float angle1, float angle2, unsigned int color_1, unsigned int color_2) : sx(sx), sy(sy), x(x), y(y), angle1(angle1), angle2(angle2), color_1(color_1), color_2(color_2) { }
303 void Collect(CollectVisitor &vis) {
304 }
305 void HeavyPrepare() { }
306
307 void Prepare() { }
308 virtual int SizeX() const { return sx; }
309 virtual int SizeY() const { return sy; }
310
311 Color Map(int ax, int ay) const
312 {
313 float xx = ax;
314 float yy = ay;
315 xx-=x;
316 yy-=y;
317 float angle_in_rad = atan2(yy,xx);
318 float angle_in_deg = angle_in_rad*360.0/2.0/3.14159;
319 angle_in_deg -= angle1;
320 angle_in_deg /= (angle2-angle1);
321
322 //std::cout << "angle_in_deg: " << angle_in_deg << std::endl;
323 // now [0..1]
324 if (angle_in_deg < 0.0) return 0;
325 if (angle_in_deg > 1.0) return 0;
326
327 return Color(Color::Interpolate(color_1, color_2, angle_in_deg));
328 }
329
330private:
331 int sx,sy;
332 float x,y;
333 float angle1,angle2;
334 unsigned int color_1, color_2;
335};
336#endif
337
338class PartCircleBoolBitmap : public Bitmap<bool>
339{
340public:
341 PartCircleBoolBitmap(int sx, int sy, float x, float y, float start_angle, float end_angle, float start_rad, float end_rad) : sx(sx), sy(sy), x(x), y(y), sa(start_angle), ea(end_angle), sr(start_rad), er(end_rad) { }
343 }
344 void HeavyPrepare() { }
345 void Prepare() { }
346
347 virtual int SizeX() const { return sx; }
348 virtual int SizeY() const { return sy; }
349
350 bool Map(int ax, int ay) const
351 {
352 ax-=x;
353 ay-=y;
354 float r = sqrtf(float(ax)*float(ax)+float(ay)*float(ay));
355 float angle = atan2f(float(ay),float(ax));
356 if (angle<sa || angle>ea) return false;
357 if (r<sr || r>er) return false;
358 return true;
359 }
360private:
361 int sx,sy;
362 float x,y;
363 float sa,ea;
364 float sr,er;
365};
366
368{
369public:
371 float range_start,
372 float range_end)
373 :
374 bm(bm2),
375 range_start(range_start),
376 range_end(range_end)
377 { }
379 bm.Collect(vis);
380 }
381 void HeavyPrepare() { }
382 void Prepare() { bm.Prepare(); }
383
384 virtual int SizeX() const { return bm.SizeX(); }
385 virtual int SizeY() const { return bm.SizeY(); }
386 virtual bool Map(int x, int y) const
387 {
388 float val = bm.Map(x,y);
389 return range_start<=val && val <= range_end;
390 }
391
392private:
393 Bitmap<float> &bm;
394 float range_start, range_end;
395};
396
398{
399public:
400 GrayScaleBitmapFromFloatBitmap(Bitmap<float> &bm, Color c1, Color c2) : bm(bm), c1(c1), c2(c2) { }
402 bm.Collect(vis);
403 }
404 void HeavyPrepare() { }
405
406 void Prepare() { bm.Prepare(); }
407
408 virtual int SizeX() const { return bm.SizeX(); }
409 virtual int SizeY() const { return bm.SizeY(); }
410 virtual Color Map(int x, int y) const
411 {
412 float val = bm.Map(x,y);
413 return Color::Interpolate(c2,c1,val);
414 }
415
416private:
417 Bitmap<float> &bm;
418 Color c1, c2;
419};
420
422{
423public:
424 FloatBitmapFromBoolBitmap(Bitmap<bool> &bm, int csx, int csy) : bm(bm), csx(csx), csy(csy) { }
426 bm.Collect(vis);
427 }
428 void HeavyPrepare() { }
429
430 void Prepare() { bm.Prepare(); }
431
432 virtual int SizeX() const { return bm.SizeX()/csx+1; }
433 virtual int SizeY() const { return bm.SizeY()/csy+1; }
434 virtual float Map(int x, int y) const
435 {
436 int sx = csx;
437 int sy = csy;
438 float val = 0.0;
439 for(int xx=0;xx<sx;xx++)
440 for(int yy=0;yy<sy;yy++)
441 {
442 if (x*csx+xx < bm.SizeX() && y*csy+yy<bm.SizeY())
443 val+=bm.Map(x*csx+xx,y*csy+yy)?1.0:0.0;
444 }
445 val/=csx*csy;
446 return val;
447 }
448
449private:
450 Bitmap<bool> &bm;
451 int csx,csy;
452};
453
454template<class T>
455class ChooseTBitmap : public Bitmap<T>
456{
457public:
458 ChooseTBitmap(Bitmap<bool> &bm, T false_t, T true_t) : bm(bm), false_t(false_t), true_t(true_t) { }
460 bm.Collect(vis);
461 }
462 void HeavyPrepare() { }
463
464 void Prepare() { bm.Prepare(); }
465
466 virtual int SizeX() const { return bm.SizeX(); }
467 virtual int SizeY() const { return bm.SizeY(); }
468 virtual T Map(int x, int y) const
469 {
470 if (bm.Map(x,y)) return true_t;
471 return false_t;
472 }
473
474private:
475 Bitmap<bool> &bm;
476 T false_t, true_t;
477};
478
479template<class T>
481{
482public:
483 FontCharacterString(T def, int x_gap) : def(def), x_gap(x_gap) { }
485 int s = vec.size();
486 for(int i=0;i<s;i++)
487 {
488 vec[i]->Collect(vis);
489 }
490 }
491 void HeavyPrepare() { }
492 void Prepare() {
493 int s = vec.size();
494 for(int i=0;i<s;i++)
495 {
496 vec[i]->Prepare();
497 }
498 }
499
500 void push_back(Bitmap<T> *bm, int top, int ascender, int height, int advance_x, int descender, int left)
501 {
502 vec.push_back(bm);
503 topt.push_back(top);
504 asc.push_back(ascender);
505 hgt.push_back(height);
506 adv.push_back(advance_x);
507 desc.push_back(descender);
508 lefts.push_back(left);
509 }
510 virtual int SizeX() const
511 {
512 int sz=vec.size();
513 int pixels = 0;
514 for(int i=0;i<sz;i++) { pixels+=adv[i] + lefts[i]/*vec[i]->SizeX()*/ +x_gap; }
515 return pixels;
516 }
517 virtual int SizeY() const
518 {
519 return PositiveDelta()+ Height();
520 }
521 virtual T Map(int x, int y) const
522 {
523 y-=PositiveDelta();
524 int sz=vec.size();
525 int pixels = 0;
526 int oldpixels = 0;
527 int i=0;
528 for(;i<sz;i++)
529 {
530 pixels+=adv[i] + lefts[i]/*vec[i]->SizeX()*/ +x_gap;
531 if (pixels>x) break;
532 oldpixels = pixels;
533 }
534 if (i==sz) { return def; }
535 int delta = -(topt[i]);
536 if (y<delta) return def;
537 if (y>=delta+vec[i]->SizeY()) return def;
538 if (x -lefts[i]-oldpixels<0) return def;
539 if (x-lefts[i]-oldpixels>=vec[i]->SizeX()) return def;
540 return vec[i]->Map(x-lefts[i]-oldpixels,y-delta);
541 }
542 int PositiveDelta() const
543 {
544 int sz = topt.size();
545 int min_delta=0;
546 for(int i=0;i<sz;i++)
547 {
548 int delta = -asc[i]; //(-topt[i]);
549 //int delta = asc[i];
550 //std::cout << "delta=" << delta << std::endl;
551 if (delta<min_delta) min_delta=delta;
552 }
553 return -min_delta;
554 }
555 int Height() const
556 {
557 int sz = topt.size();
558 int max_height=0;
559 for(int i=0;i<sz;i++)
560 {
561 int height = (-topt[i])+vec[i]->SizeY();
562 if (height>max_height) max_height=height;
563 }
564 return max_height;
565 }
566private:
567 std::vector<Bitmap<T>*> vec;
568 std::vector<int> topt;
569 std::vector<int> asc;
570 std::vector<int> hgt;
571 std::vector<int> adv;
572 std::vector<int> desc;
573 std::vector<int> lefts;
574 T def;
575 int x_gap;
576};
577
578class NotBitmap : public Bitmap<bool>
579{
580public:
581 NotBitmap(Bitmap<bool> &bm) : bm(bm) { }
583 bm.Collect(vis);
584 }
585 void HeavyPrepare() { }
586
587 void Prepare() { bm.Prepare(); }
588
589 virtual int SizeX() const { return bm.SizeX(); }
590 virtual int SizeY() const { return bm.SizeY(); }
591 bool Map(int x, int y) const { return !bm.Map(x,y); }
592private:
593 Bitmap<bool> &bm;
594};
595
596class OrBitmap : public Bitmap<bool>
597{
598public:
599 OrBitmap(Bitmap<bool> &bm1, Bitmap<bool> &bm2) : bm1(bm1), bm2(bm2) { }
601 bm1.Collect(vis);
602 bm2.Collect(vis);
603 }
604 void HeavyPrepare() { }
605 void Prepare() {
606 bm1.Prepare();
607 bm2.Prepare();
608 }
609
610 virtual int SizeX() const { return bm1.SizeX(); }
611 virtual int SizeY() const { return bm1.SizeY(); }
612 bool Map(int x, int y) const { return bm1.Map(x,y)||bm2.Map(x,y); }
613private:
614 Bitmap<bool> &bm1;
615 Bitmap<bool> &bm2;
616};
617class XorBitmap : public Bitmap<bool>
618{
619public:
620 XorBitmap(Bitmap<bool> &bm1, Bitmap<bool> &bm2) : bm1(bm1), bm2(bm2) { }
622 bm1.Collect(vis);
623 bm2.Collect(vis);
624 }
625 void HeavyPrepare() { }
626 void Prepare() {
627 bm1.Prepare();
628 bm2.Prepare();
629 }
630
631 virtual int SizeX() const { return bm1.SizeX(); }
632 virtual int SizeY() const { return bm1.SizeY(); }
633 bool Map(int x, int y) const { return bm1.Map(x,y) ^ bm2.Map(x,y); }
634private:
635 Bitmap<bool> &bm1;
636 Bitmap<bool> &bm2;
637};
638
639class AndNotBitmap : public Bitmap<bool>
640{
641public:
642 AndNotBitmap(Bitmap<bool> &bm1, Bitmap<bool> &bm2) : bm1(bm1), bm2(bm2) { }
644 bm1.Collect(vis);
645 bm2.Collect(vis);
646 }
647 void HeavyPrepare() { }
648
649 void Prepare() {
650 bm1.Prepare();
651 bm2.Prepare();
652 }
653
654 virtual int SizeX() const { return bm1.SizeX(); }
655 virtual int SizeY() const { return bm1.SizeY(); }
656 bool Map(int x, int y) const { return bm1.Map(x,y) && !bm2.Map(x,y); }
657private:
658 Bitmap<bool> &bm1;
659 Bitmap<bool> &bm2;
660};
661
663{
664public:
665 EquivalenceClassIntBitmap(Bitmap<int> &bm, int val) : bm(bm), val(val) { }
667 bm.Collect(vis);
668 }
669 void HeavyPrepare() { }
670 void Prepare() {
671 bm.Prepare();
672 }
673
674 virtual int SizeX() const { return bm.SizeX(); }
675 virtual int SizeY() const { return bm.SizeY(); }
676 virtual bool Map(int x, int y) const
677 {
678 return bm.Map(x,y)==val;
679 }
680private:
681 Bitmap<int> &bm;
682 int val;
683};
684
686{
687public:
688 EquivalenceClassColorBitmap(Bitmap<Color> &bm, Color val) : bm(bm), val(val) { }
690 bm.Collect(vis);
691 }
692 void HeavyPrepare() { }
693
694 void Prepare() {
695 bm.Prepare();
696 }
697
698 virtual int SizeX() const { return bm.SizeX(); }
699 virtual int SizeY() const { return bm.SizeY(); }
700 virtual bool Map(int x, int y) const
701 {
702 Color c = bm.Map(x,y);
703 return c.r==val.r && c.g==val.g && c.b == val.b;
704 }
705
706private:
707 Bitmap<Color> &bm;
708 Color val;
709};
710
711
712template<class T, class K>
713class CombineBitmaps : public Bitmap<std::pair<T,K> >
714{
715public:
716 CombineBitmaps(Bitmap<T> &bm1, Bitmap<K> &bm2) : bm1(bm1), bm2(bm2) { }
718 {
719 bm1.Collect(vis);
720 bm2.Collect(vis);
721 }
722 void HeavyPrepare() { }
723
724 void Prepare() {
725 bm1.Prepare();
726 bm2.Prepare();
727 }
728
729 virtual int SizeX() const { return bm1.SizeX(); }
730 virtual int SizeY() const { return bm1.SizeY(); }
731 virtual std::pair<T,K> Map(int x, int y) const
732 {
733 return std::make_pair(bm1.Map(x,y), bm2.Map(x,y));
734 }
735
736private:
737 Bitmap<T> &bm1;
738 Bitmap<K> &bm2;
739};
740
741template<class T>
742class ChooseBitmap : public Bitmap<T>
743{
744public:
745 ChooseBitmap(Bitmap<T> &bm1, Bitmap<T> &bm2, Bitmap<bool> &which) : bm1(bm1), bm2(bm2), which(which) { }
746 void Prepare() {
747 bm1.Prepare();
748 bm2.Prepare();
749 which.Prepare();
750 }
751
752 virtual int SizeX() const { return bm1.SizeX(); }
753 virtual int SizeY() const { return bm1.SizeY(); }
754 virtual T Map(int x, int y) const
755 {
756 if (which.Map(x,y)) return bm2.Map(x,y);
757 return bm1.Map(x,y);
758 }
759
760private:
761 Bitmap<T> &bm1;
762 Bitmap<T> &bm2;
763 Bitmap<bool> &which;
764};
765
766
772
773template<class T>
774class InverseMapBitmap : public Bitmap<T>
775{
776public:
777 InverseMapBitmap(Bitmap<T> &bm, std::pair<int,int> (*fptr)(std::pair<int,int>), int sx, int sy) : bm(bm), fptr(fptr),sx(sx), sy(sy) { }
778 void Prepare() {
779 bm.Prepare();
780 }
781
782 virtual int SizeX() const { return sx; }
783 virtual int SizeY() const { return sy; }
784 virtual T Map(int x, int y) const
785 {
786 std::pair<int,int> p = fptr(std::make_pair(x,y));
787 return bm.Map(p.first,p.second);
788 }
789private:
790 Bitmap<T> &bm;
791 std::pair<int,int> (*fptr)(std::pair<int,int>);
792 int sx,sy;
793};
794
795
796
797#if 0
798class PointNDim : public NDim<float, Point>
799{
800public:
801 PointNDim(Point p) : p(p) { }
802 virtual std::vector<float> Count() const { return std::vector<float>(); }
803 virtual Point Map(float *array, int size) const
804 {
805 if (size != 0) { std::cout << "PointNDIm dimension error!" << std::endl; }
806 return p;
807 }
808 virtual NDim<float,Point> *Interpolate(const NDim<float,Point>& b1, const NDim<float,Point> & b2, float val) const
809 {
810 const PointNDim *dim1 = dynamic_cast<const PointNDim*>(&b1);
811 const PointNDim *dim2 = dynamic_cast<const PointNDim*>(&b2);
812 Point p1 = dim1->p;
813 Point p2 = dim2->p;
814 return new PointNDim(Point::Interpolate(p1,p2,val));
815 }
816public:
817 Point p;
818};
819#endif
820
821#if 0
822template<class I, class B>
823class NextNDim : public NDim<I, B>
824{
825public:
826 NextNDim(NDim<I,B> &start, NDim<I,B> &end, I length) : start(start), end(end), length(length), middle_1(0), middle_2(0) { }
827 virtual std::vector<I> Count() const
828 {
829 std::vector<I> vec = start.Count();
830 vec.push_back(length);
831 return vec;
832 }
833 virtual B Map(I *array, int size) const
834 {
835 NDim<I,B> *d_middle = start.Interpolate(start, end, array[size-1]);
836 B pos = d_middle->Map(array, size-1);
837 delete d_middle;
838 return pos;
839 }
840 virtual NDim<I,B> *Interpolate(const NDim<I,B> &b1, const NDim<I,B> &b2, I val) const
841 {
842 const NextNDim *dim1 = dynamic_cast<const NextNDim<I,B>*>(&b1);
843 const NextNDim *dim2 = dynamic_cast<const NextNDim<I,B>*>(&b2);
844 delete middle_1;
845 delete middle_2;
846 middle_1 = dim1->start.Interpolate(dim1->start, dim1->end, val);
847 middle_2 = dim2->start.Interpolate(dim2->start, dim2->end, val);
848 return new NextNDim(*middle_1, *middle_2, length);
849 }
850 ~NextNDim() { delete middle_1; delete middle_2; }
851private:
852 NDim<I,B> &start;
853 NDim<I,B> &end;
854 I length;
855 mutable NDim<I,B> *middle_1;
856 mutable NDim<I,B> *middle_2;
857};
858#endif
859
860
861template<class C>
862class BitmapArray : public Array<int, C>
863{
864public:
865 BitmapArray(Bitmap<C> &bm) : bm(bm) { }
866 void Prepare() {
867 bm.Prepare();
868 }
869
870 int Size() const { return bm.SizeX()*bm.SizeY(); }
871 C Index(int i) const
872 {
873 int sx = bm.SizeX();
874 int y = i / sx;
875 int x = i - y*sx;
876 return bm.Map(x,y);
877 }
878private:
879 Bitmap<C> &bm;
880};
881
882class RectBitmap : public Bitmap<TRect>
883{
884};
885
887{
888public:
890 float width, float height, float x_gap, float y_gap,
891 int sx, int sy) :
892 p1(p1),
893 width(width), height(height), x_gap(x_gap), y_gap(y_gap),
894 u_x(u_x), u_y(u_y),
895 sx(sx), sy(sy) { }
896 virtual int SizeX() const { return sx; }
897 virtual int SizeY() const { return sy; }
898 virtual TRect Map(int x, int y) const
899 {
900 float xx = p1.x + (width+x_gap)*u_x.dx*x+(height+y_gap)*u_y.dx*y;
901 float yy = p1.y + (width+x_gap)*u_x.dy*x+(height+y_gap)*u_y.dy*y;
902 TRect r;
903 r.x = xx;
904 r.y = yy;
905 r.width = width;
906 r.height = height;
907 return r;
908 }
909private:
910 Point2d p1;
911 float width, height, x_gap, y_gap;
912 Vector2d u_x, u_y;
913 int sx,sy;
914};
915class RectCubeFunction : public Function<TRect, CubeCoords>
916{
917public:
918 RectCubeFunction(Point p, Vector u_x, Vector u_y, Vector u_z, float z) : p(p), u_x(u_x), u_y(u_y), u_z(u_z),z(z) { }
920 {
921 CubeCoords c;
922 c.p111 = p;
923 c.p112 = p+z*u_z;
924 c.p121 = p+r.y*u_y;
925 c.p122 = p+r.y*u_y+z*u_z;
926 c.p211 = p + r.x*u_x;
927 c.p212 = p+z*u_z+ r.x*u_x;
928 c.p221 = p+r.y*u_y+ r.x*u_x;
929 c.p222 = p+r.y*u_y+z*u_z+ r.x*u_x;
930 return c;
931 }
932private:
933 Point p;
934 Vector u_x, u_y;
935 Vector u_z;
936 float z;
937};
938
939
940class LighterBitmap : public Bitmap<Color>
941{
942public:
943 LighterBitmap(Bitmap<Color> &orig, Bitmap<float> &light, Point2d pos) : orig(orig), light(light),pos(pos) { }
944 void Prepare() {
945 orig.Prepare();
946 light.Prepare();
947 }
948
949 virtual int SizeX() const { return orig.SizeX(); }
950 virtual int SizeY() const { return orig.SizeY(); }
951 virtual Color Map(int x, int y) const
952 {
953 if (x<pos.x) return orig.Map(x,y);
954 if (y<pos.y) return orig.Map(x,y);
955 if (x>=pos.x+light.SizeX()) return orig.Map(x,y);
956 if (y>=pos.y+light.SizeY()) return orig.Map(x,y);
957 return Color::Lighter(orig.Map(x,y), light.Map(x-pos.x, y-pos.y));
958 }
959private:
960 Bitmap<Color> &orig;
961 Bitmap<float> &light;
962 Point2d pos;
963};
964
965class DarkerBitmap : public Bitmap<Color>
966{
967public:
968 DarkerBitmap(Bitmap<Color> &orig, Bitmap<float> &dark, Point2d pos) : orig(orig), dark(dark),pos(pos) { }
969 void Prepare() {
970 orig.Prepare();
971 dark.Prepare();
972 }
973
974 virtual int SizeX() const { return orig.SizeX(); }
975 virtual int SizeY() const { return orig.SizeY(); }
976 virtual Color Map(int x, int y) const
977 {
978 if (x<pos.x) return orig.Map(x,y);
979 if (y<pos.y) return orig.Map(x,y);
980 if (x>=pos.x+dark.SizeX()) return orig.Map(x,y);
981 if (y>=pos.y+dark.SizeY()) return orig.Map(x,y);
982 return Color::Darker(orig.Map(x,y), dark.Map(x-pos.x, y-pos.y));
983 }
984private:
985 Bitmap<Color> &orig;
986 Bitmap<float> &dark;
987 Point2d pos;
988};
989
990
991template<class T>
992class DynBitmap : public Bitmap<T>
993{
994public:
995 DynBitmap(int sx, int sy) : vec(sx*sy), sx(sx), sy(sy) { }
996 void Prepare() { }
997
998 virtual int SizeX() const { return sx; }
999 virtual int SizeY() const { return sy; }
1000 virtual T Map(int x, int y) const
1001 {
1002 return vec[x+sx*y];
1003 }
1004 const T &At(int x, int y) const
1005 {
1006 return vec[x+sx*y];
1007 }
1008 T &At(int x, int y)
1009 {
1010 return vec[x+sx*y];
1011 }
1012
1013private:
1014 std::vector<T> vec;
1015 int sx, sy;
1016};
1017
1018std::string MB(long i);
1019class MemoizeBitmap : public Bitmap<Color>
1020{
1021public:
1023 {
1024
1025 }
1027 bm.Collect(vis);
1028 vis.register_obj(this);
1029 }
1031 int width = bm.SizeX();
1032 int height = bm.SizeY();
1033 buf = BufferRef::NewBuffer(width, height);
1034 //std::cout << "MemoizeBitmap " << width << "x" << height << "=" << MB(width*height*sizeof(unsigned int)) << std::endl;
1035 for(int j=0;j<height;j++)
1036 for(int i=0;i<width;i++)
1037 {
1038 buf.buffer[i+j*buf.ydelta] = 0xfefefefe;
1039 }
1040
1041 }
1042
1043 void Prepare() {
1044 bm.Prepare();
1045
1046 int width = bm.SizeX();
1047 int height = bm.SizeY();
1048 buf = BufferRef::NewBuffer(width, height);
1049 //std::cout << "MemoizeBitmap " << width << "x" << height << "=" << MB(width*height*sizeof(unsigned int)) << std::endl;
1050 for(int j=0;j<height;j++)
1051 for(int i=0;i<width;i++)
1052 {
1053 buf.buffer[i+j*buf.ydelta] = 0xfefefefe;
1054 }
1055
1056 }
1057
1060 {
1061 int sx=SizeX();
1062 int sy=SizeY();
1063 for(int x=0;x<sx;x++)
1064 for(int y=0;y<sy;y++)
1065 {
1066 Map(x,y);
1067 }
1068 }
1069 virtual int SizeX() const { return buf.width; }
1070 virtual int SizeY() const { return buf.height; }
1071 virtual Color Map(int x, int y) const
1072 {
1073 //std::cout << x << " " << y << std::endl;
1074 if (x<0 || x >= int(buf.width) || y <0 || y>=int(buf.height))
1075 return Color(0x00000000);
1076 if (buf.buffer[x+y*buf.ydelta] == 0xfefefefe)
1077 {
1078 Color c = bm.Map(x,y);
1079 unsigned int cc = c.Pixel();
1080 buf.buffer[x+y*buf.ydelta] = cc;
1081 }
1082 return Color(buf.buffer[x+y*buf.ydelta]);
1083 }
1084
1085private:
1086 Bitmap<Color> &bm;
1087 BufferRef buf;
1088};
1089
1090class InterpolateBitmap : public Bitmap<Color>
1091{
1092public:
1093 InterpolateBitmap(Bitmap<Color> &c1, Bitmap<Color> &c2, float xx) :c1(c1), c2(c2),xx(xx) { }
1095 {
1096 c1.Collect(vis);
1097 c2.Collect(vis);
1098 }
1099 void HeavyPrepare() { }
1100
1101 void Prepare() {
1102 c1.Prepare();
1103 c2.Prepare();
1104 }
1105
1106 virtual int SizeX() const { return std::min(c1.SizeX(),c2.SizeX()); }
1107 virtual int SizeY() const { return std::min(c1.SizeY(),c2.SizeY()); }
1108 virtual Color Map(int x, int y) const
1109 {
1110 Color cc1 = c1.Map(x,y);
1111 Color cc2 = c2.Map(x,y);
1112 return Color::Interpolate(cc1,cc2,xx);
1113 }
1114
1115private:
1116 Bitmap<Color> &c1;
1117 Bitmap<Color> &c2;
1118 float xx;
1119};
1120#if 0
1121class BitmapNDim : public NDim<float, Color>
1122{
1123public:
1124 BitmapNDim(Bitmap<Color> &bm) : bm(bm), middle(0) { }
1125 virtual std::vector<float> Count() const { std::vector<float> vec; vec.push_back(float(bm.SizeX())); vec.push_back(float(bm.SizeY())); return vec; }
1126 virtual Color Map(float *array, int size) const
1127 {
1128 if (size != 2) std::cout << "BitmapNDim error dimensions" << std::endl;
1129 return bm.Map(int(array[0]), int(array[1]));
1130 }
1131 virtual NDim<float,Color> *Interpolate(const NDim<float,Color>& b1, const NDim<float,Color> & b2, float val) const
1132 {
1133 const BitmapNDim *dim1 = dynamic_cast<const BitmapNDim*>(&b1);
1134 const BitmapNDim *dim2 = dynamic_cast<const BitmapNDim*>(&b2);
1135 Bitmap<Color> &bm1 = dim1->bm;
1136 Bitmap<Color> &bm2 = dim2->bm;
1137 delete middle;
1138 middle = new InterpolateBitmap(bm1, bm2, val);
1139 return new BitmapNDim(*middle);
1140 }
1141 ~BitmapNDim() { delete middle; }
1142private:
1143 Bitmap<Color> &bm;
1144 mutable Bitmap<Color> *middle;
1145};
1146#endif
1147
1148class GraphBitmap : public Bitmap<Color>
1149{
1150public:
1151 GraphBitmap(Function<float,float> &f, Color top, Color middle, Color bottom, float up_delta, float down_delta, float start_x, float end_x, float start_y, float end_y, int size_x, int size_y) : f(f), top(top), middle(middle), bottom(bottom), up(up_delta), down(down_delta), start_x(start_x), end_x(end_x), start_y(start_y), end_y(end_y), size_x(size_x), size_y(size_y) { }
1152 void Prepare() { }
1153
1154 virtual int SizeX() const { return size_x; }
1155 virtual int SizeY() const { return size_y; }
1156
1157 Color Map(int x, int y) const
1158 {
1159 float xx = x;
1160 float yy = y;
1161 xx/=size_x;
1162 yy/=size_y;
1163 xx *= (end_x-start_x);
1164 yy *= (end_y-start_y);
1165 xx += start_x;
1166 yy += start_y;
1167 float val = f.Index(xx);
1168 if (yy < val-up) return top;
1169 if (yy < val+down) return middle;
1170 return bottom;
1171 }
1172private:
1174 Color top, middle, bottom;
1175 float up, down;
1176 float start_x, end_x;
1177 float start_y, end_y;
1178 int size_x, size_y;
1179};
1180
1181
1182class BorderBitmap : public Bitmap<Color>
1183{
1184public:
1186 Color left, Color right, Color top, Color bottom,
1187 int left_border, int right_border, int top_border, int bottom_border) : next(next), left(left), right(right), top(top), bottom(bottom),
1188 left_border(left_border), right_border(right_border),
1189 top_border(top_border), bottom_border(bottom_border) { }
1191 next.Collect(vis);
1192 }
1193 void HeavyPrepare() { }
1194
1195 void Prepare() { next.Prepare(); }
1196
1197 virtual int SizeX() const { return left_border + next.SizeX() + right_border; }
1198 virtual int SizeY() const { return top_border + next.SizeY() + bottom_border; }
1199 virtual Color Map(int x, int y) const
1200 {
1201 if (x < left_border) return left;
1202 if (y < top_border) return top;
1203 if (x > SizeX()-right_border) return right;
1204 if (y > SizeY()-bottom_border) return bottom;
1205 return next.Map(x-left_border, y-top_border);
1206 }
1207
1208private:
1209 Bitmap<Color> &next;
1210 Color left, right, top, bottom;
1211 int left_border, right_border, top_border, bottom_border;
1212};
1213
1214template<class T>
1215class ModifyBitmap : public Bitmap<T>
1216{
1217public:
1218 ModifyBitmap(Bitmap<T> &bm, Bitmap<T> &bm2, int x, int y) : bm(bm), bm2(bm2), x(x), y(y) { }
1220 {
1221 bm.Collect(vis); bm2.Collect(vis);
1222 }
1223 void HeavyPrepare() { }
1224 void Prepare() { bm.Prepare(); bm2.Prepare(); }
1225
1226 virtual int SizeX() const { return bm.SizeX(); }
1227 virtual int SizeY() const { return bm.SizeY(); }
1228 virtual T Map(int xx, int yy) const
1229 {
1230 if (xx>=x && xx<x+bm2.SizeX())
1231 if (yy>=y && yy<y+bm2.SizeY())
1232 {
1233 return bm2.Map(xx-x,yy-y);
1234 }
1235 return bm.Map(xx,yy);
1236 }
1237private:
1238 Bitmap<T> &bm;
1239 Bitmap<T> &bm2;
1240 int x,y;
1241};
1242
1243class BlitBitmapClass : public Bitmap<Color>
1244{
1245public:
1246 BlitBitmapClass(Bitmap<Color> &bm, Bitmap<Color> &bm2, int x, int y) : bm(bm), bm2(bm2), x(x), y(y) { }
1248 {
1249 bm.Collect(vis);
1250 bm2.Collect(vis);
1251 vis.register_obj(this);
1252 }
1253 void HeavyPrepare() { Prepare(); }
1254 void Prepare() {
1255 bm.Prepare();
1256 bm2.Prepare();
1257 }
1258
1259 virtual int SizeX() const { return bm.SizeX(); }
1260 virtual int SizeY() const { return bm.SizeY(); }
1261 virtual Color Map(int xx, int yy) const;
1262private:
1263 Bitmap<Color> &bm;
1264 Bitmap<Color> &bm2;
1265 int x,y;
1266};
1267
1268class BlitBitmapClassMasked : public Bitmap<Color>
1269{
1270public:
1271 BlitBitmapClassMasked(Bitmap<Color> &bm, Bitmap<Color> &bm2, int x, int y, Bitmap<float> &mask) : bm(bm), bm2(bm2), x(x), y(y), mask(mask) { }
1273 bm.Collect(vis);
1274 bm2.Collect(vis);
1275 mask.Collect(vis);
1276 vis.register_obj(this);
1277 }
1278 void HeavyPrepare() { Prepare(); }
1279 void Prepare() {
1280 bm.Prepare();
1281 bm2.Prepare();
1282 mask.Prepare();
1283 }
1284
1285 virtual int SizeX() const { return bm.SizeX(); }
1286 virtual int SizeY() const { return bm.SizeY(); }
1287 virtual Color Map(int xx, int yy) const
1288 {
1289 Color c1 = bm.Map(xx,yy);
1290 Color c2(0,0,0,0);
1291 float val = 0.0;
1292 if (xx>=x && xx<x+bm2.SizeX())
1293 if (yy>=y && yy<y+bm2.SizeY())
1294 {
1295 c2 = bm2.Map(xx-x, yy-y);
1296 val = mask.Map(xx-x,yy-y);
1297 }
1298 return Color::Interpolate(c1,c2,val);
1299 }
1300private:
1301 Bitmap<Color> &bm;
1302 Bitmap<Color> &bm2;
1303 int x,y;
1304 Bitmap<float> &mask;
1305};
1306
1307class BlitBitmapClassMasked2 : public Bitmap<Color>
1308{
1309public:
1310 BlitBitmapClassMasked2(Bitmap<Color> &bm, Bitmap<Color> &bm2, int x, int y, Bitmap<bool> &mask) : bm(bm), bm2(bm2), x(x), y(y), mask(mask) { }
1312 bm.Collect(vis);
1313 bm2.Collect(vis);
1314 mask.Collect(vis);
1315 vis.register_obj(this);
1316 }
1317 void HeavyPrepare() { Prepare(); }
1318 void Prepare() {
1319 bm.Prepare();
1320 bm2.Prepare();
1321 mask.Prepare();
1322 }
1323
1324 virtual int SizeX() const { return bm.SizeX(); }
1325 virtual int SizeY() const { return bm.SizeY(); }
1326 virtual Color Map(int xx, int yy) const
1327 {
1328 Color c1 = bm.Map(xx,yy);
1329 Color c2(0,0,0,0);
1330 bool val = false;
1331 if (xx>=x && xx<x+bm2.SizeX())
1332 if (yy>=y && yy<y+bm2.SizeY())
1333 {
1334 c2 = bm2.Map(xx-x, yy-y);
1335 val = mask.Map(xx-x,yy-y);
1336 }
1337 if (!val) {
1338 return c1;
1339 }
1340 else
1341 {
1342 return c2;
1343 }
1344 }
1345private:
1346 Bitmap<Color> &bm;
1347 Bitmap<Color> &bm2;
1348 int x,y;
1349 Bitmap<bool> &mask;
1350};
1351
1352
1353void BlitBitmap(BufferRef ref, int x, int y, Bitmap<Color> &color);
1354
1355template<class T>
1356class SubBitmap : public Bitmap<T>
1357{
1358public:
1359 SubBitmap(Bitmap<T> &bm, int x, int y, int width, int height) : bm(bm), x(x), y(y), width(width), height(height) { }
1361 bm.Collect(vis);
1362 vis.register_obj(this);
1363 }
1364 void HeavyPrepare() { Prepare(); }
1365
1366 void Prepare() { bm.Prepare(); }
1367
1368 int SizeX() const { return width; }
1369 int SizeY() const { return height; }
1370 T Map(int mx, int my) const
1371 {
1372 return bm.Map(x+mx, y+my);
1373 }
1374
1375private:
1376 Bitmap<T> &bm;
1377 int x,y,width, height;
1378};
1379template<class T>
1380class GrowBitmap : public Bitmap<T>
1381{
1382public:
1383 GrowBitmap(Bitmap<T> &bm, int l, int t, int r, int b,
1384 T bg_color) : bm(bm), l(l), t(t), r(r),b(b),bg_color(bg_color)
1385 {
1386 }
1388 bm.Collect(vis);
1389 vis.register_obj(this);
1390 }
1391 void HeavyPrepare() { Prepare(); }
1392
1393 void Prepare() { bm.Prepare(); }
1394
1395 virtual int SizeX() const { return l+bm.SizeX()+r; }
1396 virtual int SizeY() const { return t+bm.SizeY()+b; }
1397 virtual T Map(int x, int y) const
1398 {
1399 if (x<l || y<t || x>=l+bm.SizeX()||y>=t+bm.SizeY())
1400 {
1401 return bg_color;
1402 }
1403 return bm.Map(x-l,y-t);
1404 }
1405
1406private:
1407 Bitmap<T> &bm;
1408 int l,t,r,b;
1409 T bg_color;
1410};
1411
1412
1413template<class T>
1414class TileBitmap : public SubBitmap<T>
1415{
1416public:
1417 TileBitmap(Bitmap<T> &bm, int tile_sx, int tile_sy, int x, int y) : SubBitmap<T>(bm, tile_sx*x, tile_sy*y, tile_sx, tile_sy) { }
1418};
1419
1420template<class T>
1421class TileBitmap2 : public Function<Pos, Bitmap<T>*>
1422{
1423public:
1424 TileBitmap2(Bitmap<T> &bm, int tile_sx, int tile_sy) : bm(bm), tile_sx(tile_sx), tile_sy(tile_sy) { }
1426 {
1427 Bitmap<T> *val = new TileBitmap<T>(bm, tile_sx, tile_sy, p.x, p.y);
1428 vec.push_back(val);
1429 return val;
1430 }
1432 {
1433 DeleteAll();
1434 }
1436 {
1437 int s = vec.size();
1438 for (int i=0;i<s; i++)
1439 {
1440 delete vec[i];
1441 }
1442 vec.clear();
1443 }
1444private:
1445 mutable std::vector<Bitmap<T> *> vec;
1446 Bitmap<T> &bm;
1447 int tile_sx, tile_sy;
1448};
1449
1450class QuadBitmapFromSphere : public Bitmap<Quad>
1451{
1452public:
1453 QuadBitmapFromSphere(Point center, float radius, int sx, int sy)
1454 : sx(sx), sy(sy), sphere(sx,sy), mat(sphere, Matrix::Scale(radius,radius,radius)*Matrix::Translate(center.x,center.y,center.z)) { }
1455 void Prepare() { }
1456
1457 int SizeX() const { return sx; }
1458 int SizeY() const { return sy; }
1459 Quad Map(int x, int y) const
1460 {
1461 int face = x + y*sx;
1462 Quad q;
1463 q.p1 = mat.FacePoint(face, 0);
1464 q.p2 = mat.FacePoint(face, 1);
1465 q.p3 = mat.FacePoint(face, 2);
1466 q.p4 = mat.FacePoint(face, 3);
1467 return q;
1468 }
1469
1470private:
1471 int sx,sy;
1473 MatrixElem mat;
1474};
1475
1476class QuadBitmapFromObjects : public Bitmap<Quad>
1477{
1478public:
1479 QuadBitmapFromObjects(FaceCollection &coll, Array<int,Point> &pos) : coll(coll), pos(pos) { }
1480 void Prepare() { coll.Prepare(); }
1481
1482 int SizeX() const { return pos.Size(); }
1483 int SizeY() const { return coll.NumFaces(); }
1484 Quad Map(int x, int y) const
1485 {
1486 Point p = pos.Index(x);
1487 Quad q;
1488 q.p1 = p + coll.FacePoint(y,0);
1489 q.p2 = p + coll.FacePoint(y,1);
1490 q.p3 = p + coll.FacePoint(y,2);
1491 q.p4 = p + coll.FacePoint(y,3);
1492 return q;
1493 }
1494private:
1495 FaceCollection &coll;
1496 Array<int,Point> &pos;
1497};
1498template<class T>
1499class BitmapStore : public Bitmap<T>
1500{
1501public:
1502 void Prepare() { }
1503
1504 virtual int SizeX() const { return width; }
1505 virtual int SizeY() const { return height; }
1506 virtual T Map(int x, int y) const { return array[x+y*height]; }
1507
1509 {
1510 width = t.SizeX();
1511 height = t.SizeY();
1512 delete array;
1513 array = new T[width*height];
1514 for(int y=0;y<height;y++)
1515 {
1516 for(int x=0;x<width;x++)
1517 {
1518 array[x+y*width] = t.Map(x,y);
1519 }
1520 }
1521 }
1522 ~BitmapStore() { delete [] array; }
1523private:
1524 T *array;
1525 int width;
1526 int height;
1527};
1528
1529
1530
1532
1533template<class T, class K>
1534class ConvertBitmap : public Bitmap<K>
1535{
1536public:
1537 ConvertBitmap(Bitmap<T> &bm) : bm(bm) { }
1538 void Collect(CollectVisitor &vis) { bm.Collect(vis); }
1539 void HeavyPrepare() { }
1540 void Prepare() { bm.Prepare(); }
1541 virtual int SizeX() const { return bm.SizeX(); }
1542 virtual int SizeY() const { return bm.SizeY(); }
1543 virtual K Map(int x, int y) const
1544 {
1545 return bm.Map(x,y); // implicit convesion T->K
1546 }
1547
1548private:
1549 Bitmap<T> &bm;
1550};
1551
1552class PosBitmap : public Bitmap<Pos>
1553{
1554public:
1555 PosBitmap(int sx, int sy) : sx(sx), sy(sy) { }
1557 void HeavyPrepare() { }
1558 void Prepare() { }
1559 virtual int SizeX() const { return sx; }
1560 virtual int SizeY() const { return sy; }
1561 virtual Pos Map(int x, int y) const
1562 {
1563 Pos p;
1564 p.x = x;
1565 p.y = y;
1566 return p;
1567 }
1568private:
1569 int sx,sy;
1570};
1571
1572class SubPos : public Function<Pos,Pos>
1573{
1574public:
1575 SubPos(int x, int y) : x(x), y(y) { }
1576 Pos Index(Pos p) const
1577 {
1578 p.x+=x;
1579 p.y+=y;
1580 return p;
1581 }
1582private:
1583 int x,y;
1584};
1585
1586template<class T>
1587class BitmapFunction : public Function<Pos,T>
1588{
1589public:
1590 BitmapFunction(Bitmap<T> &bm) : bm(bm) { }
1591 T Index(Pos p) const
1592 {
1593 return bm.Map(p.x,p.y);
1594 }
1595private:
1596 Bitmap<T> &bm;
1597};
1598
1599template<class T, class K>
1600class StructBitmap : public Bitmap<std::pair<T,K> >
1601{
1602public:
1603 StructBitmap(Array<int, T> &a1, Array<int,K> &a2) : a1(a1), a2(a2) { }
1604 void Prepare() { }
1605
1606 int SizeX() const { return a1.Size(); }
1607 int SizeY() const { return a2.Size(); }
1608 std::pair<T,K> Map(int x, int y) const { return std::make_pair(a1.Index(x),a2.Index(y)); }
1609private:
1610 Array<int,T> &a1;
1611 Array<int,K> &a2;
1612};
1613
1614class ColumnRowBitmap : public Bitmap<Size>
1615{
1616public:
1617 ColumnRowBitmap(Array<int, int> &column_x, Array<int, int> &row_y) : x(column_x), y(row_y) { }
1618 void Prepare() { }
1619
1620 int SizeX() const { return x.Size(); }
1621 int SizeY() const { return y.Size(); }
1622 Size Map(int xx, int yy) const { Size s; s.sx = x.Index(xx); s.sy = y.Index(yy); return s; }
1623private:
1624 Array<int,int> &x;
1625 Array<int,int> &y;
1626};
1627
1628template<class T>
1629class MBitmap : public Bitmap<T>
1630{
1631public:
1632 MBitmap(int x, int y) : bm(new T[x*y]), sx(x), sy(y) { }
1633 void Prepare() { }
1634
1635 int SizeX() const { return sx; }
1636 int SizeY() const { return sy; }
1637 T Map(int xx, int yy) const
1638 {
1639 return bm[xx+yy*sx];
1640 }
1641 T &Mod(int xx, int yy) { return bm[xx+yy*sx]; }
1643 {
1644 bm=new T[t.sx*t.sy];
1645 std::copy(t.bm,t.bm+t.sx*t.sy, bm);
1646 sx=t.sx;
1647 sy=t.sy;
1648 return *this;
1649 }
1650 MBitmap(const MBitmap<T> &t) : bm(new T[t.sx*t.sy]), sx(t.sx), sy(t.sy)
1651 {
1652 std::copy(t.bm,t.bm+sx*sy,bm);
1653 }
1654private:
1655 T *bm;
1656 int sx,sy;
1657};
1658
1659template<class T>
1660class MFunction : public Function<Size, MBitmap<T> >
1661{
1662public:
1664 {
1665 MBitmap<T> bm(s.sx,s.sy);
1666 return bm;
1667 }
1668};
1669
1670template<class T1, class K, class T2 = T1>
1671class MapBitmap : public Bitmap<K>
1672{ // T1 => T2 conversion needs to exists
1673 // TODO: x and y are not passed to f().
1674public:
1675 MapBitmap(Bitmap<T1> &bm, Function<T2,K> &f) : bm(bm), f(f) { }
1677 {
1678 bm.Collect(vis);
1679 }
1680 void HeavyPrepare() { }
1681
1682 void Prepare() { bm.Prepare();}
1683
1684 int SizeX() const { return bm.SizeX(); }
1685 int SizeY() const { return bm.SizeY(); }
1686 K Map(int x, int y) const { return f.Index(bm.Map(x,y)); }
1687private:
1688 Bitmap<T1> &bm;
1690};
1691
1692class MapRectBitmap : public MapBitmap<TRect, CubeCoords>
1693{
1694public:
1695 MapRectBitmap(Bitmap<TRect> &bm, Point p, Vector u_x, Vector u_y, Vector u_z, float z) : MapBitmap<TRect, CubeCoords>(bm, func), func(p,u_x,u_y,u_z,z) { }
1696private:
1698};
1699class MapRectArray : public MapArray<int, TRect, CubeCoords>
1700{
1701public:
1702 MapRectArray(Array<int,TRect> &arr, Point p, Vector u_x, Vector u_y, Vector u_z, float z) : MapArray<int,TRect,CubeCoords>(arr,func), func(p,u_x,u_y,u_z,z) { }
1703
1704private:
1706};
1707
1708
1709
1710template<class C>
1711class ConstantBitmap : public Bitmap<C>
1712{
1713public:
1714 ConstantBitmap(C c, int x, int y) : c(c), x(x), y(y) { }
1716 {
1717 }
1718 void HeavyPrepare() { }
1719
1720 void Prepare() { }
1721
1722 int SizeX() const { return x; }
1723 int SizeY() const { return y; }
1724 C Map(int , int ) const
1725 {
1726 return c;
1727 }
1728private:
1729 C c;
1730 int x,y;
1731};
1732
1733class ConstantBitmap_Color : public Bitmap<Color>
1734{
1735public:
1736 ConstantBitmap_Color(Color c, int x, int y) : c(c), x(x), y(y) { }
1738 void HeavyPrepare() { }
1739 void Prepare() { }
1740
1741 int SizeX() const { return x; }
1742 int SizeY() const { return y; }
1743 Color Map(int , int ) const
1744 {
1745 return c;
1746 }
1747private:
1748 Color c;
1749 int x,y;
1750};
1751
1752class ConstantBitmap_bool : public Bitmap<bool>
1753{
1754public:
1755 ConstantBitmap_bool(bool c, int x, int y) : c(c), x(x), y(y) { }
1757 void HeavyPrepare() { }
1758 void Prepare() { }
1759
1760 int SizeX() const { return x; }
1761 int SizeY() const { return y; }
1762 bool Map(int , int ) const
1763 {
1764 return c;
1765 }
1766private:
1767 bool c;
1768 int x,y;
1769};
1770
1771class ConstantBitmap_float : public Bitmap<float>
1772{
1773public:
1774 ConstantBitmap_float(float c, int x, int y) : c(c), x(x), y(y) { }
1776 void HeavyPrepare() { }
1777 void Prepare() { }
1778
1779 int SizeX() const { return x; }
1780 int SizeY() const { return y; }
1781 float Map(int , int ) const
1782 {
1783 return c;
1784 }
1785private:
1786 float c;
1787 int x,y;
1788};
1789
1790
1791
1792template<class C>
1793class BitmapRelation : public Bitmap<C>
1794{
1795public:
1796 BitmapRelation(Bitmap<C> &bm, C unknown_value, int xx, int yy) : bm(bm),xx(xx), yy(yy), val(bm.Map(xx,yy)), unknown_value(unknown_value) { }
1797 BitmapRelation(Bitmap<C> &bm, C unknown_value, C value) : bm(bm), val(value), unknown_value(unknown_value) { }
1798 void Prepare() { bm.Prepare(); }
1799
1800 int SizeX() const { return bm.SizeX(); }
1801 int SizeY() const { return bm.SizeY(); }
1802 C Map(int x, int y) const
1803 {
1804 C c = bm.Map(x,y);
1805 if (val==c)
1806 {
1807 return c;
1808 }
1809 else
1810 {
1811 return unknown_value;
1812 }
1813 }
1814private:
1815 Bitmap<C> &bm;
1816 C val;
1817 C unknown_value;
1818 int xx,yy;
1819};
1820
1821class RandomBitmap : public Bitmap<float>
1822{
1823public:
1824 void Prepare() { }
1825
1826 int SizeX() const { return x; }
1827 int SizeY() const { return y; }
1828 float Map(int xx, int yy) const { return bitmap[xx+x*yy]; }
1829 RandomBitmap(int x, int y, float min, float max) : x(x), y(y), min(min), max(max)
1830 {
1831 bitmap = new float[x*y];
1832 for(int yy=0;yy<y;yy++)
1833 {
1834 for(int xx=0;xx<x;xx++)
1835 {
1836 bitmap[xx+x*yy] = Rand();
1837 }
1838 }
1839 }
1840 ~RandomBitmap() { delete [] bitmap; }
1841 float Rand()
1842 {
1843 float rn = float(r.next());
1844 rn /= r.maximum();
1845 rn *= max-min;
1846 rn += min;
1847 return rn;
1848 }
1849private:
1850 float *bitmap;
1851 int x;
1852 int y;
1853 float min;
1854 float max;
1855 Random r;
1856};
1857
1858template<class C>
1859class RepeatBitmap : public Bitmap<C>
1860{
1861public:
1862 RepeatBitmap(Bitmap<C> &bm, int times_x, int times_y) : bm(bm), times_x(times_x), times_y(times_y) { }
1864 bm.Collect(vis);
1865 }
1866 void HeavyPrepare() { }
1867 void Prepare() { bm.Prepare(); }
1868
1869 int SizeX() const { return times_x*bm.SizeX(); }
1870 int SizeY() const { return times_y*bm.SizeY(); }
1871 C Map(int x, int y) const
1872 {
1873 if (bm.SizeX()>1 && bm.SizeY()>1) {
1874 int xx = x % bm.SizeX();
1875 int yy = y % bm.SizeY();
1876 return bm.Map(xx,yy);
1877 } else return C();
1878 }
1879private:
1880 Bitmap<C> &bm;
1881 int times_x, times_y;
1882};
1883
1884template<class C, class T>
1886{
1887public:
1888 // all bitmaps returned by func() must be same size
1889 SubstituteBitmapPixels(Bitmap<T> &bm, Function<T, Bitmap<C>*> &func, int sx, int sy) : bm(bm), func(func),sx(sx),sy(sy) { }
1890 void Prepare() { bm.Prepare(); }
1891
1892 virtual int SizeX() const { return bm.SizeX()*sx; }
1893 virtual int SizeY() const { return bm.SizeY()*sy; }
1894 virtual C Map(int x, int y) const
1895 {
1896 int tx = x/sx;
1897 int ty = y/sy;
1898 T pixel = bm.Index(tx,ty);
1899 int rx = x-tx*sx;
1900 int ry = y-ty*sy;
1901 C pixel2 = func->Index(pixel)->Map(rx,ry);
1902 return pixel2;
1903 }
1904
1905private:
1906 Bitmap<T> &bm;
1908 int sx,sy;
1909};
1910
1911template<class C>
1912class RotateZoomer : public Bitmap<C>
1913{
1914public:
1915 RotateZoomer(Bitmap<C> &bm, int sx, int sy, Point2d p1, Vector2d vx, Vector2d vy, C outside) : bm(bm), sx(sx),sy(sy), p1(p1), vx(vx), vy(vy),outside(outside) { }
1916 void Prepare() { bm.Prepare(); }
1917
1918 virtual int SizeX() const { return sx; }
1919 virtual int SizeY() const { return sy; }
1920 virtual C Map(int x, int y) const
1921 {
1922 Point2d p = p1+vx*(float(x)/sx)+vy*(float(y)/sy);
1923 if (p.x < 0.0 || p.x >= bm.SizeX()) return outside;
1924 if (p.y < 0.0 || p.y >= bm.SizeY()) return outside;
1925 return bm.Map(int(p.x),int(p.y));
1926 }
1927
1928private:
1929 Bitmap<C> &bm;
1930 int sx,sy;
1931 Point2d p1;
1932 Vector2d vx;
1933 Vector2d vy;
1934 C outside;
1935};
1936
1937
1938template<class C>
1939class CombineBitmapX : public Bitmap<C>
1940{
1941public:
1942 CombineBitmapX(Bitmap<C> &bm, Bitmap<C> &bm2) : bm(bm), bm2(bm2) { }
1944 {
1945 bm.Collect(vis); bm2.Collect(vis);
1946 }
1947 void HeavyPrepare() { }
1948 void Prepare() { bm.Prepare(); bm2.Prepare(); }
1949
1950 int SizeX() const { return bm.SizeX()+bm2.SizeX(); }
1951 int SizeY() const { return std::min(bm.SizeY(), bm.SizeY()); }
1952 C Map(int x, int y) const
1953 {
1954 if (x<bm.SizeX())
1955 {
1956 return bm.Map(x,y);
1957 }
1958 else
1959 {
1960 return bm2.Map(x-bm.SizeX(), y);
1961 }
1962 }
1963private:
1964 Bitmap<C> &bm;
1965 Bitmap<C> &bm2;
1966};
1967
1968class FloatPointBitmap : public Bitmap<float>
1969{
1970public:
1974 {
1975 }
1976 void HeavyPrepare() { }
1977 void Prepare() { }
1978
1979 int SizeX() const { return 1; }
1980 int SizeY() const { return 3; }
1981 float Map(int x, int y) const
1982 {
1983 switch(y)
1984 {
1985 case 0: return p.x;
1986 case 1: return p.y;
1987 case 2: return p.z;
1988 }
1989 return 0.0;
1990 }
1991private:
1992 Point p;
1993};
1994
1995class RowMultiply : public Bitmap<float>
1996{
1997public:
1998 RowMultiply(Bitmap<float> &bm, int row, float val) : bm(bm), row(row), val(val) { }
2000 {
2001 bm.Collect(vis);
2002 }
2003 void HeavyPrepare() { }
2004
2005 void Prepare() { bm.Prepare(); }
2006
2007 virtual int SizeX() const { return bm.SizeX(); }
2008 virtual int SizeY() const { return bm.SizeY(); }
2009 virtual float Map(int x, int y) const
2010 {
2011 if (y==row)
2012 {
2013 return val*bm.Map(x,y);
2014 }
2015 else
2016 {
2017 return bm.Map(x,y);
2018 }
2019 }
2020
2021private:
2022 Bitmap<float> &bm;
2023 int row;
2024 float val;
2025};
2026
2027class RowAddition : public Bitmap<float>
2028{
2029public:
2030 RowAddition(Bitmap<float> &bm, int row1, int row2, float val_for_row2) : bm(bm), row1(row1), row2(row2), val(val_for_row2) { }
2032 {
2033 bm.Collect(vis);
2034 }
2035 void HeavyPrepare() { }
2036
2037 void Prepare() { bm.Prepare(); }
2038
2039 virtual int SizeX() const { return bm.SizeX(); }
2040 virtual int SizeY() const { return bm.SizeY(); }
2041 virtual float Map(int x, int y) const
2042 {
2043 if (y==row1)
2044 {
2045 return bm.Map(x,row1) + val*bm.Map(x,row2);
2046 }
2047 else
2048 {
2049 return bm.Map(x,y);
2050 }
2051 }
2052private:
2053 Bitmap<float> &bm;
2054 int row1;
2055 int row2;
2056 float val;
2057};
2058
2059class NodeToOne : public Bitmap<float>
2060{
2061public:
2062 NodeToOne(Bitmap<float> &bm, int x_and_y) : m(bm, x_and_y, 1.0/bm.Map(x_and_y, x_and_y)) { }
2064 {
2065 m.Collect(vis);
2066 }
2067 void HeavyPrepare() { }
2068 void Prepare() { m.Prepare(); }
2069
2070 virtual int SizeX() const { return m.SizeX(); }
2071 virtual int SizeY() const { return m.SizeY(); }
2072 virtual float Map(int x, int y) const
2073 {
2074 return m.Map(x,y);
2075 }
2076private:
2077 RowMultiply m;
2078};
2079class NodeToZero : public Bitmap<float>
2080{ // assumes bm.Map(x,x) has diagonal as 1.0
2081public:
2082 NodeToZero(Bitmap<float> &bm, int x, int y) : add(bm, y, x, -bm.Map(x,y)) { }
2084 {
2085 add.Collect(vis);
2086 }
2087 void HeavyPrepare() { }
2088 void Prepare() { add.Prepare(); }
2089
2090 int SizeX() const { return add.SizeX(); }
2091 int SizeY() const { return add.SizeY(); }
2092 float Map(int x, int y) const { return add.Map(x,y); }
2093private:
2095};
2096Line PlanePlaneIntersection(const Plane &p1, const Plane &p2);
2097
2098
2099
2100struct Cube3
2101{
2104};
2105
2107{
2108public:
2109 HeightMapCubesFromBitmap(Bitmap<float> &bm_min, Bitmap<float> &bm_max, float sx, float sy, float sz) : bm_min(bm_min), bm_max(bm_max) { }
2110 int SizeX() const { return bm_min.SizeX(); }
2111 int SizeY() const { return bm_min.SizeY(); }
2112 void Prepare() { bm_min.Prepare(); bm_max.Prepare(); }
2113 Cube3 Map(int x, int y) const
2114 {
2115 Cube3 c;
2116 c.minx = sx*x/SizeX();
2117 c.maxx = sx*(x+1)/SizeX();
2118 c.miny = sy*y/SizeY();
2119 c.maxy = sy*(y+1)/SizeY();
2120 c.minz = sz*bm_min.Map(x,y);
2121 c.maxz = sz*bm_max.Map(x,y);
2122 return c;
2123 }
2124private:
2125 Bitmap<float> &bm_min;
2126 Bitmap<float> &bm_max;
2127 float sx,sy,sz;
2128};
2129
2130#if 0
2131class Cube3Cube : public BoxableFaceCollection
2132{
2133public:
2134 Cube3Cube(Cube3 c) : mat(cube, Matrix::Identity()) { SetCube(c); }
2135 void Prepare() { }
2136 void SetCube(const Cube3 &c)
2137 {
2138 mat.SetMatrix(Matrix::Scale(c.maxx-c.minx, c.maxy-c.miny, c.maxz-c.minz)
2139 *Matrix::Translate(c.minx, c.miny, c.minz));
2140 }
2141 virtual void SetBox(Matrix b) { /*box = b;*/ }
2142 virtual int NumFaces() const { return mat.NumFaces(); }
2143 virtual int NumPoints(int face) const { return mat.NumPoints(face); }
2144 virtual Point FacePoint(int face, int point) const { return mat.FacePoint(face,point); }
2145 virtual Vector PointNormal(int face, int point) const
2146 {
2147 return mat.PointNormal(face,point);
2148 }
2149 virtual unsigned int Color(int face, int point) const
2150 {
2151 return mat.Color(face,point);
2152 }
2153 virtual Point2d TexCoord(int face, int point) const
2154 {
2155 return mat.TexCoord(face,point);
2156 }
2157 virtual float Attrib(int face, int point, int id) const
2158 {
2159 return mat.Attrib(face,point,id);
2160 }
2161 virtual int AttribI(int face, int point, int id) const
2162 {
2163 return mat.AttribI(face,point,id);
2164 }
2165private:
2166 CubeElem cube;
2167 MatrixElem mat;
2168};
2169#endif
2170
2171#if 0
2172class BitmapCubeArray : public FaceCollectionArray
2173{
2174public:
2175 BitmapCubeArray(Bitmap<Cube3> &cubes) : cubes(cubes),c(Cube3()) { }
2176 int Size() const { return cubes.SizeX()*cubes.SizeY(); }
2177 const FaceCollection *Index(int i) const
2178 {
2179 int x = i / cubes.SizeY();
2180 int y = i - x*cubes.SizeY();
2181 Cube3 cc = cubes.Map(x,y);
2182 const_cast<Cube3Cube&>(c).SetCube(cc);
2183 return &c;
2184 }
2185private:
2186 Bitmap<Cube3> &cubes;
2187 Cube3Cube c;
2188};
2189#endif
2190
2191#if 0
2192class CubePlane : public BoxableFaceCollection
2193{
2194public:
2195 CubePlane(int x, int y, float sx, float sy, float sz) : bit(x,y, 0.0, sz), bitzero(x,y,0.0,0.0), height(bitzero, bit, sx/x, sy/y, 1.0), cubearray(height), mat(cubearray) { }
2196 virtual void SetBox(Matrix b) { /*box = b;*/ }
2197 virtual int NumFaces() const { return mat.NumFaces(); }
2198 virtual int NumPoints(int face) const { return mat.NumPoints(face); }
2199 virtual Point FacePoint(int face, int point) const { return mat.FacePoint(face,point); }
2200 virtual Vector PointNormal(int face, int point) const
2201 {
2202 return mat.PointNormal(face,point);
2203 }
2204 virtual unsigned int Color(int face, int point) const
2205 {
2206 return mat.Color(face,point);
2207 }
2208 virtual Point2d TexCoord(int face, int point) const
2209 {
2210 return mat.TexCoord(face,point);
2211 }
2212 virtual float Attrib(int face, int point, int id) const
2213 {
2214 return mat.Attrib(face,point,id);
2215 }
2216 virtual int AttribI(int face, int point, int id) const
2217 {
2218 return mat.AttribI(face,point,id);
2219 }
2220
2221private:
2222 RandomBitmap bit;
2223 RandomBitmap bitzero;
2224 HeightMapCubesFromBitmap height;
2225 BitmapCubeArray cubearray;
2226 CompressObject mat;
2227};
2228
2229#endif
2230class LayeredBitmap : public Bitmap<int>
2231{
2232public:
2234 Array<int, int> &arr2) : arr(arr), arr2(arr2) { }
2235 void Prepare() { }
2236
2237 int SizeX() const { return arr.Index(0)->SizeX(); }
2238 int SizeY() const { return arr.Index(0)->SizeY(); }
2239 int Map(int x, int y) const
2240 {
2241 int size = arr.Size();
2242 for(int i=0;i<size;i++)
2243 {
2244 Bitmap<bool> *b = arr.Index(i);
2245 if (b->Map(x,y)) return arr2.Index(i);
2246 }
2247 return 0;
2248 }
2249private:
2251 Array<int, int> &arr2;
2252};
2253
2254template<class K, class T>
2256{
2257public:
2258 virtual T Exp(const Array<int, K> &arr) const=0;
2259};
2260
2261template<class T>
2262class LayeredBitmap2 : public Bitmap<T>
2263{
2264public:
2266 void push_back(Bitmap<T> *t) { vec.push_back(t); }
2267 void Prepare() {
2268 int s = vec.Size();
2269 for(int i=0;i<s;i++)
2270 {
2271 vec[i]->Prepare();
2272 }
2273 }
2275 {
2276 pos.clear();
2277 int s = vec.Size();
2278 for(int i=0;i<s;i++)
2279 {
2280 Point2d p = { 0.0,0.0 };
2281 pos.push_back(p);
2282 }
2283 }
2284 void set_pos(int i, Point2d pos_p) { pos[i] = pos_p; }
2286 virtual int SizeX() const { return vec[0].SizeX(); }
2287 virtual int SizeY() const { return vec[0].SizeY(); }
2288 virtual T Map(int x, int y) const
2289 {
2290 VectorArray<T> vec;
2291 int s = vec.Size();
2292 for(int i=0;i<s;i++)
2293 {
2294 Bitmap<T> *bm = vec.Index(i);
2295 Point2d ps = pos.Index(i);
2296 int xx = x + ps.x;
2297 int yy = y + ps.y;
2298 vec.push_back(bm->Map(xx,yy));
2299 }
2300 return m_e->Exp(vec);
2301 }
2302private:
2303 VectorArray<Bitmap<T> *> vec;
2306};
2307
2308class BitmapCircle : public Bitmap<bool>
2309{
2310public:
2311 BitmapCircle(Point2d center, float radius, int sx, int sy) : center(center), radius(radius), sx(sx), sy(sy) { }
2313 void HeavyPrepare() { }
2314 void Prepare() { }
2315
2316 int SizeX() const { return sx; }
2317 int SizeY() const { return sy; }
2318 bool Map(int x, int y) const
2319 {
2320 float xx = x;
2321 float yy = y;
2322 xx -= center.x;
2323 yy -= center.y;
2324 return xx*xx+yy*yy < radius*radius;
2325 }
2326private:
2327 Point2d center;
2328 float radius;
2329 int sx, sy;
2330};
2331
2332
2333class PointGrid : public Bitmap<Point>
2334{
2335public:
2336 PointGrid(int x, int y, Point p, Vector u_x, Vector u_y, int sx, int sy) : x(x), y(y), p(p), u_x(u_x), u_y(u_y), sx(sx), sy(sy) { }
2337 void Prepare() { }
2338
2339 int SizeX() const { return sx; }
2340 int SizeY() const { return sy; }
2341 Point Map(int xx, int yy) const
2342 {
2343 int dx = xx-x;
2344 int dy = yy-y;
2345 return p + u_x*float(dx) + u_y*float(dy);
2346 }
2347private:
2348 int x;
2349 int y;
2350 Point p;
2351 Vector u_x;
2352 Vector u_y;
2353 int sx;
2354 int sy;
2355};
2356#if 0
2357class UnsignedIntFromBitmap : public Bitmap<unsigned int>
2358{
2359public:
2360 UnsignedIntFromBitmap(Bitmap<Color> &bm) : bm(bm) { }
2361 void Collect(CollectVisitor &vis) { bm.Collect(vis); }
2362 void HeavyPrepare() { }
2363
2364 void Prepare() { bm.Prepare(); }
2365
2366 int SizeX() const { return bm.SizeX(); }
2367 int SizeY() const { return bm.SizeY(); }
2368 unsigned int Map(int x, int y) const
2369 {
2370 return bm.Map(x,y).Pixel();
2371 }
2372private:
2373 Bitmap<Color> &bm;
2374};
2375#endif
2376
2377#if 0
2378class BitmapFromUnsignedInt : public Bitmap<Color>
2379{
2380public:
2381 BitmapFromUnsignedInt(Bitmap<unsigned int> &bm) : bm(bm) { }
2382 void Collect(CollectVisitor &vis) {
2383 bm.Collect(vis);
2384 }
2385 void HeavyPrepare() { }
2386 void Prepare() { bm.Prepare(); }
2387
2388 int SizeX() const { return bm.SizeX(); }
2389 int SizeY() const { return bm.SizeY(); }
2390 Color Map(int x, int y) const
2391 {
2392 return bm.Map(x,y);
2393 }
2394private:
2395 Bitmap<unsigned int> &bm;
2396};
2397#endif
2398
2399template<class T>
2400class BitmapFromFile : public Bitmap<T>
2401{
2402public:
2403 BitmapFromFile(std::string filename, Function<char, T> &func, int sizex, int sizey) : sizex(sizex), sizey(sizey), func(func)
2404 {
2405 std::cout << "Reading: " << filename << std::endl;
2406 std::ifstream file(filename.c_str());
2407 std::string s;
2408 while(std::getline(file, s))
2409 {
2410 vec.push_back(s);
2411 }
2412 }
2414 {
2415 }
2416 void HeavyPrepare() { }
2417
2418 void Prepare() { }
2419
2420 virtual int SizeX() const { return sizex; }
2421 virtual int SizeY() const { return sizey; }
2422 T Map(int x, int y) const
2423 {
2424 return func.Index(vec[y][x]);
2425 }
2426private:
2427 std::vector<std::string> vec;
2428 int sizex, sizey;
2430};
2431class MapFunction : public Function<char, bool>
2432{
2433public:
2434 bool Index(char c) const
2435 {
2436 if (c=='a'||c=='b'||c=='c'||c=='d') return true;
2437 return false;
2438 }
2439};
2440class ColorMapFunction : public Function<char, unsigned int>
2441{
2442public:
2443 unsigned int Index(char c) const
2444 {
2445 switch(c)
2446 {
2447 case 'a': return Color(255,255,255).Pixel();
2448 case 'b': return Color(255,0,0).Pixel();
2449 case 'c': return Color(0,255,0).Pixel();
2450 case 'd': return Color(0,0,255).Pixel();
2451 };
2452 return Color::White().Pixel();
2453 }
2454};
2455
2456
2457
2459{
2460public:
2463 {
2464 }
2465 void HeavyPrepare() { }
2466
2467 void Prepare() { }
2468 int SizeX() const { if (buf.buffer!=0) return buf.width; return 0; }
2469 int SizeY() const { if (buf.buffer!=0) return buf.height; return 0; }
2470 Color Map(int x, int y) const
2471 {
2472 if (x >= 0 && x <int(buf.width))
2473 if (y >= 0 && y < int(buf.height))
2474 return Color(buf.buffer[x+y*buf.ydelta]);
2475 return Color();
2476 }
2477 unsigned int &Map2(int x, int y) const
2478 {
2479 if (x >= 0 && x <int(buf.width))
2480 if (y >= 0 && y < int(buf.height))
2481 return buf.buffer[x+y*buf.ydelta];
2482 return buf.buffer[0];
2483 // throw "error";
2484 }
2485
2486
2487public:
2489};
2490
2492{
2493public:
2495 {
2496 buf = BufferRef::NewBuffer(1,1);
2497 t.Prepare();
2498 }
2499 ~BufferFromBitmapCollection() { delete [] buf.buffer; }
2500 void Gen() const
2501 {
2503 int sx = t.SizeX(i);
2504 int sy = t.SizeY(i);
2505 buf = BufferRef::NewBuffer(sx, sy);
2506 //std::cout << "BufferFromBitmapCollection::" << sx << "x" << sy << "=" << MB(sx*sy*sizeof(unsigned int)) << std::endl;
2507 for(int y=0;y<sy;y++)
2508 for(int x=0;x<sx;x++)
2509 {
2510 unsigned int color = t.Map(i,x,y).Pixel();
2511 buf.buffer[x+y*buf.ydelta] = color;
2512 }
2513 }
2514 BufferRef Buffer() const { return buf; }
2515private:
2517 int i;
2518 mutable BufferRef buf;
2519
2520};
2522{
2523public:
2525 {
2526 buf = BufferRef::NewBuffer(1,1);
2527 //Gen();
2528 t.Prepare();
2529 }
2530 ~BufferFromBitmap() { delete [] buf.buffer; }
2531 void Gen() const
2532 {
2534 int sx = t.SizeX();
2535 int sy = t.SizeY();
2536 buf = BufferRef::NewBuffer(sx, sy);
2537 //std::cout << "BufferFromBitmap:" << sx << "x" << sy << "=" << MB(sx*sy*sizeof(unsigned int)) << std::endl;
2538 for(int y=0;y<sy;y++) {
2539 int dd = y*buf.ydelta;
2540 for(int x=0;x<sx;x++)
2541 {
2542 unsigned int color = t.Map(x,y).Pixel();
2543 buf.buffer[dd+x] = color;
2544 }
2545 }
2546 }
2547 void GenPrepare() const
2548 {
2550 buf = BufferRef::NewBuffer(t.SizeX(), t.SizeY());
2551 //std::cout << "BufferFromBitmap:" << t.SizeX() << "x" << t.SizeY() << "=" << MB(t.SizeX()*t.SizeY()*sizeof(unsigned int)) << std::endl;
2552 }
2553 void Gen(int start_x, int end_x, int start_y, int end_y) const;
2554 /* MOVED TO GameApi_gltf.cc
2555 void Gen(int start_x, int end_x, int start_y, int end_y) const
2556 {
2557 if (t.IsDirectGltfImage())
2558 {
2559 FlipColours *bm1 = (FlipColours*)&t;
2560 BitmapPrepareCache *cache = (BitmapPrepareCache*)&bm1.c;
2561 GLTFImage *img=(GLTFImage*)cache->bm;
2562 const tinygltf::Image *img2 = img->img;
2563
2564 for(int y=start_y;y<end_y;y++) {
2565 int dd = y*buf.ydelta;
2566 int offset2 = y*img->width*img->component * (img->bits/8);
2567 for(int x=start_x;x<end_x;x++)
2568 {
2569 int offset = (x*img->component)*(img->bits/8);
2570
2571 unsigned int color = *(unsigned int*)&img2->image[x+offset+offset2];
2572 buf.buffer[dd+x] = color;
2573 }
2574 }
2575 return;
2576 }
2577
2578
2579 for(int y=start_y;y<end_y;y++) {
2580 int dd = y*buf.ydelta;
2581 for(int x=start_x;x<end_x;x++)
2582 {
2583 unsigned int color = t.Map(x,y).Pixel();
2584 buf.buffer[dd+x] = color;
2585 }
2586 }
2587 }
2588 */
2589 void FlipBytes() {
2591 buf = BufferRef::NewBuffer(t.SizeX(), t.SizeY());
2592 //std::cout << "BufferFromBitmap:" << t.SizeX() << "x" << t.SizeY() << "=" << MB(t.SizeX()*t.SizeY()*sizeof(unsigned int)) << std::endl;
2593 for(int y=0;y<t.SizeY();y++)
2594 for(int x=0;x<t.SizeX();x++)
2595 {
2596 unsigned int color = t.Map(x,y).Pixel();
2598 buf.buffer[x+y*buf.ydelta] = color;
2599 }
2600 }
2601 void flip_color(unsigned int &col)
2602 {
2603 unsigned int r = col & 0x00ff0000;
2604 unsigned int g = col & 0x0000ff00;
2605 unsigned int b = col & 0x000000ff;
2606 unsigned int a = col & 0xff000000;
2607 r>>=16;
2608 g>>=8;
2609 a>>=24;
2610 r<<=24;
2611 g<<=16;
2612 b<<=8;
2613 col = r+g+b+a;
2614 }
2615 BufferRef Buffer() const { return buf; }
2616 void clear_with_leak() { buf.buffer=0; }
2617private:
2618 Bitmap<Color> &t;
2619 mutable BufferRef buf;
2620};
2621
2622
2623class FlipColoursInv : public Bitmap<Color>
2624{
2625public:
2627
2628 void Collect(CollectVisitor &vis) { c.Collect(vis); }
2630 }
2631 void Prepare() { c.Prepare(); }
2632
2633 virtual int SizeX() const { return c.SizeX(); }
2634 virtual int SizeY() const { return c.SizeY(); }
2635 virtual Color Map(int x, int y) const
2636 {
2637 Color cc = c.Map(x,y);
2638 unsigned int val = cc.Pixel();
2639
2640 // This is gameapi format.
2641 unsigned int val_a = val&0xff000000;
2642 unsigned int val_r = val&0x00ff0000;
2643 unsigned int val_g = val&0x0000ff00;
2644 unsigned int val_b = val&0x000000ff;
2645 val_a >>= 24;
2646 val_b >>= 16;
2647 val_g >>= 8;
2648 val_r >>= 0;
2649
2650
2651 val_a <<= 24;
2652 val_r <<= 16;
2653 val_g <<= 8;
2654 val_b <<= 0;
2655
2656 // These are opengl RGBA format
2657 unsigned int v = val_r+val_g+val_b+val_a;
2658 return Color(v);
2659 }
2660 virtual bool IsDirectGltfImage() const { return c.IsDirectGltfImage(); }
2661
2662public:
2664};
2665
2666class FlipColours : public Bitmap<Color>
2667{
2668public:
2669 FlipColours(Bitmap<Color> &c) : c(c) /*, mutex(PTHREAD_MUTEX_INITIALIZER)*/ { }
2670 void Collect(CollectVisitor &vis) { c.Collect(vis); }
2672 }
2673 void Prepare() { c.Prepare(); }
2674
2675 virtual int SizeX() const { return c.SizeX(); }
2676 virtual int SizeY() const { return c.SizeY(); }
2677 virtual Color Map(int x, int y) const
2678 {
2679 Color cc = c.Map(x,y);
2680 unsigned int val = cc.Pixel();
2681 //#ifdef THREADS
2682 //if (firsttime)
2683 //{
2684 // pthread_mutex_init(&mutex,NULL);
2685 // firsttime=false;
2686 // }
2687
2688 // pthread_mutex_lock(&mutex);
2689 //#endif
2690
2691 //if (val==cache_key) {
2692 //unsigned int cc = cache_value;
2693 //#ifdef THREADS
2694 // pthread_mutex_unlock(&mutex);
2695 //#endif
2696 //return Color(cc);
2697 //}
2698
2699 // This is gameapi format.
2700 unsigned int val_a = val&0xff000000;
2701 unsigned int val_r = val&0x00ff0000;
2702 unsigned int val_g = val&0x0000ff00;
2703 unsigned int val_b = val&0x000000ff;
2704 val_a >>= 24;
2705 val_r >>= 16;
2706 val_g >>= 8;
2707 val_b >>= 0;
2708
2709 // These are opengl RGBA format
2710 val_a <<= 24;
2711 val_b <<= 16;
2712 val_g <<= 8;
2713 val_r <<= 0;
2714 unsigned int v = val_r+val_g+val_b+val_a;
2715 //std::cout << std::hex << v << std::dec << " " << std::endl;
2716 //cache_key = val;
2717 //cache_value = v;
2718 //#ifdef THREADS
2719 //pthread_mutex_unlock(&mutex);
2720 //#endif
2721 return Color(v);
2722 }
2723 virtual bool IsDirectGltfImage() const { return c.IsDirectGltfImage(); }
2724
2725public:
2727 //mutable bool firsttime=true;
2728 //mutable unsigned int cache_key=0;
2729 //mutable unsigned int cache_value=0;
2730 //mutable pthread_mutex_t mutex;
2731};
2732
2733
2734#if 0
2735class PolygonBitmap : public ContinuousBitmap<float>
2736{ // this is for piecewise definition of shapes
2737public:
2738 PolygonBitmap(int sx, int sy, Point2d p1, Point2d p2, Vector2d v1, Vector2d v2, float val_0, float val_1) : sx(sx),sy(sy), p1(p1), p2(p2), v1(v1), v2(v2), val_0(val_0), val_1(val_1) { }
2739 virtual float SizeX() const { return sx; }
2740 virtual float SizeY() const { return sy; }
2741 virtual float Map(float x, float y) const
2742 {
2743
2744 }
2745private:
2746 Point2d p1,p2;
2747 Vector2d v1,v2;
2748 float val_0, val_1;
2749};
2750
2751#endif
2752template<class C>
2754{
2755public:
2756 RotateContinuousBitmap(ContinuousBitmap<C> *orig, float center_x, float center_y, float angle) : orig(orig), center_x(center_x), center_y(center_y), angle(angle) { }
2758 orig->Collect(vis);
2759 }
2760 void HeavyPrepare() { }
2761
2762 void Prepare() { orig->Prepare(); }
2763 virtual float SizeX() const { return orig->SizeX(); }
2764 virtual float SizeY() const { return orig->SizeY(); }
2765 virtual C Map(float x, float y) const
2766 {
2767 x-=center_x;
2768 y-=center_y;
2769 float xx = cos(angle)*x + sin(angle)*y;
2770 float yy = -sin(angle)*x + cos(angle)*y;
2771 xx+=center_x;
2772 yy+=center_y;
2773 if (xx >= 0.0 && xx<orig->SizeX())
2774 if (yy >=0.0 && yy<orig->SizeY())
2775 return orig->Map(xx,yy);
2776 return C();
2777 }
2778private:
2779 ContinuousBitmap<C> *orig;
2780 float center_x, center_y;
2781 float angle;
2782};
2783
2785
2786template<class T>
2788{
2789public:
2790 InverseCreateContinuousBitmap(Bitmap<T> &bm, std::pair<int,int> (*fptr)(float,float), float sx, float sy) : bm(bm), fptr(fptr),sx(sx),sy(sy) {
2791
2792 }
2793 virtual void Prepare() {
2794 bm.Prepare();
2795 }
2796
2797 virtual float SizeX() const { return sx; }
2798 virtual float SizeY() const { return sy; }
2799 virtual T Map(float x, float y) const
2800 {
2801 std::pair<int,int> p = fptr(x,y);
2802 return bm.Map(p.first, p.second);
2803 }
2804
2805private:
2806 Bitmap<T> &bm;
2807 std::pair<int,int> (*fptr)(float,float);
2808 float sx,sy;
2809};
2810
2811class RandomSamplingBitmap : public Bitmap<Color>
2812{
2813public:
2814 RandomSamplingBitmap(ContinuousBitmap<Color> &c, int count) : c(c), count(count) { }
2815 void Prepare() { c.Prepare(); }
2816
2817 int SizeX() const { return c.SizeX()+1; }
2818 int SizeY() const { return c.SizeY()+1; }
2819 Color Map(int x, int y) const
2820 {
2821 Point2d tl = { float(x),float(y) };
2822 std::vector<Color> col;
2823 for(int i=0;i<count;i++)
2824 {
2825 float xval = const_cast<RandomSamplingBitmap*>(this)->Rand();
2826 float yval = const_cast<RandomSamplingBitmap*>(this)->Rand();
2827 Point2d p = { tl.x+xval, tl.y+yval };
2828 col.push_back(c.Map(p.x,p.y));
2829 }
2830 return Color::AverageArray(&col[0], count);
2831 }
2832 float Rand()
2833 {
2834 unsigned int val = rand.next();
2835 float fval = val;
2836 fval/= float(rand.maximum());
2837 return fval;
2838 }
2839private:
2841 int count;
2842 mutable Random rand;
2843};
2844
2845
2846
2847template<class T>
2849{
2850public:
2851 Function2Bitmap(float sx, float sy, Function2<float,float,T> &f) : sx(sx), sy(sy), f(f) { }
2852 void Prepare() { }
2853 virtual float SizeX() const { return sx; }
2854 virtual float SizeY() const { return sy; }
2855 virtual T Map(float x, float y) const { return f.Index(x,y); }
2856private:
2857 float sx,sy;
2859};
2860
2861
2862template<class T>
2864{ // requires == operation
2865public:
2866 BorderBitmap2(float width, ContinuousBitmap<T> &c) : width(width), c(c) { }
2867 void Prepare() { c.Prepare(); }
2868
2869 virtual float SizeX() const
2870 {
2871 return c.SizeX();
2872 }
2873 virtual float SizeY() const
2874 {
2875 return c.SizeY();
2876 }
2877 virtual bool Map(int x, int y) const
2878 {
2879 if (x<width || y<width ||x+width>=c.SizeX() ||y+width>=c.SizeY()) return false;
2880 T t0 = c.Map(x,y);
2881 T tx = c.Map(x+width,y);
2882 T ty = c.Map(x,y+width);
2883 T tmx = c.Map(x-width,y);
2884 T tmy = c.Map(x,y-width);
2885 return !(t0==tx && t0==ty && t0==tmx && t0==tmy);
2886 }
2887private:
2888 float width;
2890};
2891
2892
2893template<class C>
2895{
2896public:
2897 ConstantContinuousBitmap(float sx, float sy, C c) : sx(sx), sy(sy), c(c) { }
2899 void HeavyPrepare() { }
2900 void Prepare() { }
2901
2902 virtual float SizeX() const { return sx; }
2903 virtual float SizeY() const { return sy; }
2904 virtual C Map(float x, float y) const { return c; }
2905private:
2906 float sx,sy;
2907 C c;
2908};
2909
2910template<class T, class K>
2911class ContinuousStructBitmap : public ContinuousBitmap<std::pair<T,K> >
2912{
2913public:
2915 void Prepare() { }
2916
2917 float SizeX() const { return a1.Size(); }
2918 float SizeY() const { return a2.Size(); }
2919 std::pair<T,K> Map(float x, float y) const { return std::make_pair(a1.Index(x),a2.Index(y)); }
2920private:
2921 Array<float,T> &a1;
2922 Array<float,K> &a2;
2923};
2924
2925
2926template<class T1, class K, class T2 = T1>
2928{ // T1 => T2 conversion needs to exists
2929public:
2931 void Collect(CollectVisitor &vis) { bm.Collect(vis); }
2932 void HeavyPrepare() { }
2933 void Prepare() { bm.Prepare(); }
2934
2935 float SizeX() const { return bm.SizeX(); }
2936 float SizeY() const { return bm.SizeY(); }
2937 K Map(float x, float y) const { return f.Index(bm.Map(x,y)); }
2938private:
2941};
2942
2943
2945{
2946public:
2947 SpiralContinuousBitmap(float sx, float sy, Point2d center,
2948 Function<float, float> &mymap) : sx(sx), sy(sy), center(center), mymap(mymap) { }
2949 void Prepare() { }
2950
2951 float SizeX() const { return sx; }
2952 float SizeY() const { return sy; }
2953 Point2d Map(float x, float y) const
2954 {
2955 x-=center.x;
2956 y-=center.y;
2957 float dist = sqrt(x*x+y*y);
2958 float dist2 = mymap.Index(dist);
2959 Matrix m = Matrix::ZRotation(dist2);
2960 Point p(x,y,0.0);
2961 p = p * m;
2962 Point2d pp = { p.x, p.y };
2963 return pp;
2964 }
2965private:
2966 float sx,sy;
2967 Point2d center;
2968 Function<float,float> &mymap;
2969};
2970
2972{
2973public:
2975 ContinuousBitmap<bool> &cut_out) : bm(bm), cut_out(cut_out) { }
2977 {
2978 bm.Collect(vis); cut_out.Collect(vis);
2979 }
2980 void HeavyPrepare() { }
2981
2982 void Prepare() { bm.Prepare(); cut_out.Prepare(); }
2983
2984 float SizeX() const { return bm.SizeX(); }
2985 float SizeY() const { return bm.SizeY(); }
2986 Color Map(float x, float y) const
2987 {
2988 Color c1 = bm.Map(x,y);
2989 bool c2 = cut_out.Map(x,y);
2990 if (c2) { c1=Color(0,0,0,0); }
2991 return c1;
2992 }
2993
2994private:
2996 ContinuousBitmap<bool> &cut_out;
2997};
2998
2999#if 0
3000class AndNotContinuousBitmap : public ContinuousBitmap<bool>
3001{
3002public:
3003 AndNotContinuousBitmap(ContinuousBitmap<bool> &bm,
3004 ContinuousBitmap<bool> &cut_out) : bm(bm), cut_out(cut_out) { }
3005 void Collect(CollectVisitor &vis) { bm.Collect(vis); cut_out.Collect(vis); }
3006 void HeavyPrepare() { }
3007 void Prepare() { bm.Prepare(); cut_out.Prepare(); }
3008
3009 float SizeX() const { return bm.SizeX(); }
3010 float SizeY() const { return bm.SizeY(); }
3011 bool Map(float x, float y) const
3012 {
3013 bool c1 = bm.Map(x,y);
3014 bool c2 = cut_out.Map(x,y);
3015 if (c2) { c1=false; }
3016 return c1;
3017 }
3018
3019private:
3020 ContinuousBitmap<bool> &bm;
3021 ContinuousBitmap<bool> &cut_out;
3022};
3023#endif
3024
3025#if 0
3026class OrContinuousBitmap : public ContinuousBitmap<bool>
3027{
3028public:
3029 template<class It>
3030 OrContinuousBitmap(It beg, It end) : vec(beg, end) { }
3031 void Collect(CollectVisitor &vis) {
3032 int sz = vec.size();
3033 for(int i=0;i<sz;i++)
3034 {
3035 vec[i]->Collect(vis);
3036 }
3037 }
3038 void HeavyPrepare() { }
3039 void Prepare() {
3040 int sz = vec.size();
3041 for(int i=0;i<sz;i++)
3042 {
3043 vec[i]->Prepare();
3044 }
3045 }
3046
3047 float SizeX() const
3048 {
3049 float s = 0.0;
3050 int sz = vec.size();
3051 for(int i=0;i<sz;i++)
3052 {
3053 s = std::max(vec[i]->SizeX(), s);
3054 }
3055 return s;
3056 }
3057 float SizeY() const
3058 {
3059 float s = 0.0;
3060 int sz = vec.size();
3061 for(int i=0;i<sz;i++)
3062 {
3063 s = std::max(vec[i]->SizeY(), s);
3064 }
3065 return s;
3066 }
3067 bool Map(float x, float y) const
3068 {
3069 //std::cout << "OrContinuousBitmap" << x << " " << y << std::endl;
3070 bool b = false;
3071 int sz = vec.size();
3072 for(int i=0;i<sz;i++)
3073 {
3074 b |= vec[i]->Map(x,y);
3075 }
3076 return b;
3077 }
3078private:
3079 std::vector<ContinuousBitmap<bool> *> vec;
3080};
3081#endif
3082
3084{
3085public:
3086 TriangleCoordsContinuousBitmap(float sx, float sy, const Point2d &p1, const Point2d &p2, const Point2d &p3, float val1, float val2, float val3) : sx(sx), sy(sy), p1(p1), p2(p2), p3(p3), val1(val1), val2(val2), val3(val3) { }
3088 {
3089 }
3090 void HeavyPrepare() { }
3091
3092 void Prepare() { }
3093
3094 float SizeX() const { return sx; }
3095 float SizeY() const { return sy; }
3096 float Map(float x, float y) const
3097 {
3098 float p12 = ypos12(y);
3099 float p13 = ypos13(y);
3100 float p23 = ypos23(y);
3101 if (p12>=0.0 && p12<=1.0 && p13>=0.0 && p13<=1.0)
3102 { // p12 + p13
3103 float x12 = xpos12(p12);
3104 float x13 = xpos13(p13);
3105 float v12 = Line12(p12);
3106 float v13 = Line13(p13);
3107 x -= x12;
3108 x /= x13-x12;
3109 return v12*(1.0-x)+v13*x;
3110 }
3111 else if (p12>=0.0 && p12<=1.0 && p23>=0.0 && p23<=1.0)
3112 { // p12 + p23
3113 float x12 = xpos12(p12);
3114 float x23 = xpos23(p23);
3115 float v12 = Line12(p12);
3116 float v23 = Line23(p23);
3117 x -= x12;
3118 x /= x23-x12;
3119 return v12*(1.0-x)+v23*x;
3120 }
3121 else if (p13>=0.0 && p13<=1.0 && p23>=0.0 && p23<=1.0)
3122 { // p13 + p23
3123 float x13 = xpos13(p13);
3124 float x23 = xpos23(p23);
3125 float v13 = Line13(p13);
3126 float v23 = Line23(p23);
3127 x -= x13;
3128 x /= x23-x13;
3129 return v13*(1.0-x)+v23*x;
3130 }
3131 else
3132 { // outside triangle
3133 return 0.0;
3134 }
3135
3136 }
3137 // TODO
3138 float xpos12(float p) const
3139 {
3140 return p1.x*(1.0-p)+p2.x*p;
3141 }
3142 float xpos13(float p) const
3143 {
3144 return p1.x*(1.0-p)+p3.x*p;
3145 }
3146 float xpos23(float p) const
3147 {
3148 return p2.x*(1.0-p)+p3.x*p;
3149 }
3150
3151
3152 float ypos12(float y) const
3153 {
3154 y-=p1.y;
3155 y/=p2.y-p1.y;
3156 return y;
3157 }
3158 float ypos13(float y) const
3159 {
3160 y-=p1.y;
3161 y/=p3.y-p1.y;
3162 return y;
3163 }
3164 float ypos23(float y) const
3165 {
3166 y-=p2.y;
3167 y/=p3.y-p2.y;
3168 return y;
3169 }
3170
3171
3172 float Line12(float x) const
3173 {
3174 return val1*(1.0-x) + val2*x;
3175 }
3176 float Line13(float x) const
3177 {
3178 return val1*(1.0-x) + val3*x;
3179 }
3180 float Line23(float x) const
3181 {
3182 return val2*(1.0-x) + val3*x;
3183 }
3184private:
3185 float sx,sy;
3186 const Point2d &p1, &p2, &p3;
3187 float val1, val2, val3;
3188};
3189
3190
3192{
3193public:
3194 TriangleContinuousBitmap(float sx, float sy, const Point2d &p1, const Point2d &p2, const Point2d &p3) : sx(sx),sy(sy), p1(p1), p2(p2), p3(p3) { }
3196 {
3197 }
3198 void HeavyPrepare() { }
3199
3200 void Prepare() { }
3201 float SizeX() const
3202 {
3203 return sx;
3204 }
3205 float SizeY() const
3206 {
3207 return sy;
3208 }
3209
3210 bool Map(float x, float y) const
3211 {
3212 bool a1 = Line(p3.x,p3.y,p1,p2);
3213 bool a2 = Line(p2.x,p2.y,p1,p3);
3214 bool a3 = Line(p1.x,p1.y,p2,p3);
3215 bool b1 = Line(x,y,p1,p2);
3216 bool b2 = Line(x,y,p1,p3);
3217 bool b3 = Line(x,y,p2,p3);
3218 if (!a1) { b1 = !b1; }
3219 if (!a2) { b2 = !b2; }
3220 if (!a3) { b3 = !b3; }
3221
3222 return b1&&b2&&b3;
3223 }
3224
3225 bool Line(float x, float y, const Point2d &a, const Point2d &b) const
3226 {
3227 Point2d r = { x, y };
3228 float k = (r.x-a.x) / (b.x-a.x);
3229 return r.y < a.y + k*(b.y-a.y);
3230 }
3231
3232private:
3233 float sx,sy;
3234 const Point2d &p1;
3235 const Point2d &p2;
3236 const Point2d &p3;
3237};
3238
3240{
3241public:
3242 QuadContinuousBitmap(float sx, float sy, Point2d p1, Point2d p2, Point2d p3, Point2d p4) : tri1(sx,sy, p1,p2,p3), tri2(sx,sy,p1,p3,p4) { }
3243 void Prepare() { }
3244
3245 virtual float SizeX() const { return tri1.SizeX(); }
3246 virtual float SizeY() const { return tri1.SizeY(); }
3247 virtual bool Map(float x, float y) const
3248 {
3249 return tri1.Map(x,y) || tri2.Map(x,y);
3250 }
3251private:
3254};
3255
3256class ColorTriangle : public ContinuousBitmap<Color>
3257{
3258public:
3259 ColorTriangle(float sx, float sy, const Point2d &p1, const Point2d &p2, const Point2d &p3, const Color &c, const Color &c2) : tri(sx,sy,p1,p2,p3), c(c), c2(c2) { }
3261 void HeavyPrepare() { }
3262 void Prepare() { }
3263
3264 float SizeX() const { return tri.SizeX(); }
3265 float SizeY() const { return tri.SizeY(); }
3266 Color Map(float x, float y) const
3267 {
3268 if (tri.Map(x,y)) { return c; }
3269 return c2;
3270 }
3271private:
3273 const Color &c;
3274 const Color &c2;
3275};
3277{
3278public:
3279 ColorTriangle2(float sx, float sy,
3280 const Point2d &p1, const Point2d &p2, const Point2d &p3,
3281 const Color &c1, const Color &c2, const Color &c3, const Color &background)
3282 : sx(sx), sy(sy),
3283 tri(sx,sy,p1,p2,p3),
3284 r(sx,sy,p1,p2,p3,c1.r,c2.r,c3.r),
3285 g(sx,sy,p1,p2,p3,c1.g,c2.g,c3.g),
3286 b(sx,sy,p1,p2,p3,c1.b,c2.b,c3.b),
3287 a(sx,sy,p1,p2,p3,c1.alpha,c2.alpha,c3.alpha),
3288 background(background)
3289 { }
3290 void Prepare() { }
3291
3292 float SizeX() const { return sx; }
3293 float SizeY() const { return sy; }
3294 Color Map(float x, float y) const
3295 {
3296 if (!tri.Map(x,y)) return background;
3297 float rr = r.Map(x,y);
3298 float gg = g.Map(x,y);
3299 float bb = b.Map(x,y);
3300 float aa = a.Map(x,y);
3301 return Color(rr,gg,bb,aa);
3302 }
3303private:
3304 float sx,sy;
3307 const Color &background;
3308};
3309
3311{
3312public:
3313 GradientBitmap(float sx, float sy, Point2d p1, Point2d p2, Color c1, Color c2) : sx(sx), sy(sy), p1(p1), p2(p2), c1(c1), c2(c2) { }
3315 {
3316 }
3317 void HeavyPrepare() { }
3318
3319 void Prepare() { }
3320
3321 float SizeX() const { return sx; }
3322 float SizeY() const { return sy; }
3323 Color Map(float x, float y) const;
3324
3325private:
3326 float sx,sy;
3327 Point2d p1,p2;
3328 Color c1,c2;
3329};
3330
3332{
3333public:
3334 ContinuousBitmapArray(float sx, float sy, Array<int, ContinuousBitmap<Color>*> &arr) : sx(sx), sy(sy), arr(arr) { }
3335 void Prepare() {
3336 int size = arr.Size();
3337 for(int i=0;i<size;i++)
3338 {
3339 arr.Index(i)->Prepare();
3340 }
3341 }
3342 float SizeX() const
3343 {
3344 return sx;
3345 }
3346 float SizeY() const
3347 {
3348 return sy;
3349 }
3350 Color Map(float x, float y) const
3351 {
3352 int size = arr.Size();
3353 Color curr(255,255,255,255);
3354 for(int i=0;i<size;i++)
3355 {
3356 Color c = arr.Index(i)->Map(x,y);
3357 curr = Color::Interpolate(curr,c,c.alpha);
3358 }
3359 return curr;
3360 }
3361private:
3362 float sx,sy;
3364};
3365
3367{
3368public:
3369 TexturedTriangle(float sx, float sy, const Point2d &p1, const Point2d &p2, const Point2d &p3,
3370 ContinuousBitmap<Color> &texture,
3371 const Point2d &t1, const Point2d &t2, const Point2d &t3)
3372 : sx(sx), sy(sy), tri(sx,sy, p1,p2,p3), tx(sx,sy,p1,p2,p3,t1.x,t2.x,t3.x),
3373 ty(sx,sy,p1,p2,p3,t1.y,t2.y,t3.y), texture(texture)
3374 {
3375 }
3376 void Prepare() { texture.Prepare(); }
3377
3378 float SizeX() const { return sx; }
3379 float SizeY() const { return sy; }
3380 Color Map(float x, float y) const
3381 {
3382 if (!tri.Map(x,y)) { Color c(0,0,0,0); return c; }
3383 float ttx = tx.Map(x,y);
3384 float tty = ty.Map(x,y);
3385 return texture.Map(ttx,tty);
3386 }
3387
3388private:
3389 float sx,sy;
3392 ContinuousBitmap<Color> &texture;
3393};
3394
3396{
3397public:
3398 CircleContinuousBitmap(float size_x, float size_y, float center_x, float center_y, float radius) : size_x(size_x), size_y(size_y), center_x(center_x), center_y(center_y), radius(radius) { }
3399 void Prepare() { }
3400 float SizeX() const
3401 {
3402 return size_x;
3403 }
3404 float SizeY() const
3405 {
3406 return size_y;
3407 }
3408 bool Map(float x, float y) const
3409 {
3410 x-= center_x;
3411 y-= center_y;
3412 return x*x+y*y < radius*radius;
3413 }
3414private:
3415 float size_x, size_y;
3416 float center_x, center_y, radius;
3417};
3418
3419class SampleBitmap : public Bitmap<Color>
3420{
3421public:
3422 SampleBitmap(ContinuousBitmap<Color> &c, int sx, int sy) : c(c),sx(sx), sy(sy) { }
3424 {
3425 c.Collect(vis);
3426 }
3427 void HeavyPrepare() { }
3428
3429 void Prepare() { c.Prepare(); }
3430
3431 bool ReadyToPrepare() const { return c.ReadyToPrepare(); }
3432
3433 int SizeX() const { return sx; }
3434 int SizeY() const { return sy; }
3435 Color Map(int x, int y) const
3436 {
3437 float area_x = float(c.SizeX())/sx;
3438 float area_y = float(c.SizeY())/sy;
3439 float left = x*area_x;
3440 float top = y*area_y;
3441 left += 0.5*area_x;
3442 top += 0.5*area_y;
3443 Color c_c = c.Map(left,top);
3444 Color c_l = c.Map(left-0.25*area_x, top); // 0.25
3445 Color c_r = c.Map(left+0.25*area_x, top);
3446 Color c_t = c.Map(left, top-0.25*area_y);
3447 Color c_b = c.Map(left, top+0.25*area_y);
3448 c_c *= 0.5;
3449 c_l *= 0.25/2;
3450 c_r *= 0.25/2;
3451 c_t *= 0.25/2;
3452 c_b *= 0.25/2;
3453 Color cc = c_c + c_l + c_r + c_t + c_b;
3454 return cc;
3455 }
3456private:
3458 int sx,sy;
3459};
3460
3461template<class T>
3463{
3464public:
3465 ContinuousBitmapFromBitmap(Bitmap<T> &bitmap, float xsize, float ysize) : bitmap(bitmap), xsize(xsize), ysize(ysize) { }
3467 {
3468 bitmap.Collect(vis);
3469 vis.register_obj(this);
3470 }
3471 void HeavyPrepare() { Prepare(); }
3472
3473 void Prepare() { bitmap.Prepare(); }
3474
3475 bool ReadyToPrepare() const { return bitmap.ReadyToPrepare(); }
3476
3477 float SizeX() const { return xsize; }
3478 float SizeY() const { return ysize; }
3479 T Map(float x, float y) const
3480 {
3481 x/=xsize;
3482 y/=ysize;
3483 x*=bitmap.SizeX();
3484 y*=bitmap.SizeY();
3485 return bitmap.Map(x+0.5,y+0.5);
3486 }
3487private:
3488 Bitmap<T> &bitmap;
3489 float xsize;
3490 float ysize;
3491};
3492template<class T>
3494{
3495public:
3496 BitmapFromContinuousBitmap(ContinuousBitmap<T> &bitmap, int xsize, int ysize) : bitmap(bitmap), xsize(xsize), ysize(ysize) { }
3498 bitmap.Collect(vis);
3499 vis.register_obj(this);
3500 }
3501 void HeavyPrepare() { Prepare(); }
3502
3503 void Prepare() { bitmap.Prepare(); }
3504
3505 int SizeX() const { return xsize; }
3506 int SizeY() const { return ysize; }
3507 T Map(int x, int y) const
3508 {
3509 float xx = x;
3510 float yy = y;
3511 xx /= float(xsize);
3512 yy /= float(ysize);
3513 xx *= bitmap.SizeX();
3514 yy *= bitmap.SizeY();
3515 return bitmap.Map(xx,yy);
3516 }
3517private:
3518 ContinuousBitmap<T> &bitmap;
3519 int xsize;
3520 int ysize;
3521};
3522
3524
3525template<class C>
3526class VoxelNDim : public NDim<int, C>
3527{
3528public:
3529 VoxelNDim(Voxel<C> &bm) : bm(bm) { }
3530 virtual std::vector<int> Count() const { std::vector<int> vec; vec.push_back(bm.SizeX()); vec.push_back(bm.SizeY()); vec.push_back(bm.SizeZ()); return vec; }
3531 virtual C Map(int *array, int size) const
3532 {
3533 if (size != 3) std::cout << "VoxelNDim error dimensions" << std::endl;
3534 return bm.Map(array[0], array[1], array[2]);
3535 }
3536private:
3537 Voxel<C> &bm;
3538};
3539
3540
3541
3542
3543template<class T1, class K, class T2 = T1>
3544class MapVoxel : public Voxel<K>
3545{ // T1 => T2 conversion needs to exists
3546public:
3547 MapVoxel(Voxel<T1> &bm, Function<T2,K> &f) : bm(bm), f(f) { }
3548 int SizeX() const { return bm.SizeX(); }
3549 int SizeY() const { return bm.SizeY(); }
3550 int SizeZ() const { return bm.SizeZ(); }
3551 K Map(int x, int y, int z) const { return f.Index(bm.Map(x,y,z)); }
3552private:
3553 Voxel<T1> &bm;
3555};
3556
3557
3558class QuadVoxelFromObjects : public Voxel<Quad>
3559{ // FaceCollection must use quads
3560public:
3561 QuadVoxelFromObjects(FaceCollection &coll, Bitmap<Point> &pos) : coll(coll), pos(pos) { pos.Prepare(); }
3562 int SizeX() const { return pos.SizeX(); }
3563 int SizeY() const { return pos.SizeY(); }
3564 int SizeZ() const { return coll.NumFaces(); }
3565 Quad Map(int x, int y, int z) const
3566 {
3567 Quad q;
3568 Point p = pos.Map(x,y);
3569 q.p1 = p + coll.FacePoint(z, 0);
3570 q.p2 = p + coll.FacePoint(z, 1);
3571 q.p3 = p + coll.FacePoint(z, 2);
3572 q.p4 = p + coll.FacePoint(z, 3);
3573 return q;
3574 }
3575private:
3576 FaceCollection &coll;
3577 Bitmap<Point> &pos;
3578};
3580{
3581public:
3582 QuadArrayElem(Array<int, Quad> &array) : voxel(array) { }
3583 virtual std::string name() const { return "QuadArrayElem"; }
3584
3586 void HeavyPrepare() { }
3587 virtual int NumFaces() const { return voxel.Size(); }
3588 virtual int NumPoints(int face) const { return 4; }
3589 virtual Point FacePoint(int face, int point) const
3590 {
3591 Quad q = get(face);
3592 if (point == 0) return q.p1;
3593 if (point == 1) return q.p2;
3594 if (point == 2) return q.p3;
3595 return q.p4;
3596 }
3597 virtual Vector PointNormal(int face, int point) const
3598 {
3599 Quad q = get(face);
3600 Point p1 = q.p1;
3601 Point p2 = q.p2;
3602 Point p3 = q.p3;
3603 Vector u_x = p2-p1;
3604 Vector u_y = p3-p1;
3605 return Vector::CrossProduct(u_x, u_y);
3606 }
3607 virtual float Attrib(int face, int point, int id) const { return 0.0; }
3608 virtual int AttribI(int face, int point, int id) const { return 0; }
3609 virtual unsigned int Color(int face, int point) const { return Color::White().Pixel(); }
3610 virtual Point2d TexCoord(int face, int point) const
3611 {
3612 Point2d p;
3613 p.x = 0;
3614 p.y = 0;
3615 return p;
3616 }
3617
3618 Quad get(int face) const
3619 {
3620 return voxel.Index(face);
3621 }
3622private:
3623 Array<int,Quad> &voxel;
3624
3625};
3626
3628{
3629public:
3630 QuadBitmapElem(Bitmap<Quad> &voxel) : voxel(voxel) { voxel.Prepare(); }
3631
3632 virtual int NumFaces() const { return voxel.SizeX()*voxel.SizeY(); }
3633 virtual int NumPoints(int face) const { return 4; }
3634 virtual Point FacePoint(int face, int point) const
3635 {
3636 Quad q = get(face);
3637 if (point == 0) return q.p1;
3638 if (point == 1) return q.p2;
3639 if (point == 2) return q.p3;
3640 return q.p4;
3641 }
3642 virtual Vector PointNormal(int face, int point) const
3643 {
3644 Quad q = get(face);
3645 Point p1 = q.p1;
3646 Point p2 = q.p2;
3647 Point p3 = q.p3;
3648 Vector u_x = p2-p1;
3649 Vector u_y = p3-p1;
3650 return Vector::CrossProduct(u_x, u_y);
3651 }
3652 virtual float Attrib(int face, int point, int id) const { return 0.0; }
3653 virtual int AttribI(int face, int point, int id) const { return 0; }
3654 virtual unsigned int Color(int face, int point) const { return Color::White().Pixel(); }
3655 virtual Point2d TexCoord(int face, int point) const
3656 {
3657 Point2d p;
3658 p.x = 0;
3659 p.y = 0;
3660 return p;
3661 }
3662
3663 Quad get(int face) const
3664 {
3665 int x = face / (voxel.SizeX());
3666 int ddx = face - x*(voxel.SizeX());
3667 int y = ddx;
3668 Quad q = voxel.Map(x,y);
3669 return q;
3670 }
3671private:
3672 Bitmap<Quad> &voxel;
3673};
3674
3675
3677{
3678public:
3679 QuadVoxelElem(Voxel<Quad> &voxel) : voxel(voxel) { }
3680
3681 virtual int NumFaces() const { return voxel.SizeX()*voxel.SizeY()*voxel.SizeZ(); }
3682 virtual int NumPoints(int face) const { return 4; }
3683 virtual Point FacePoint(int face, int point) const
3684 {
3685 Quad q = get(face);
3686 if (point == 0) return q.p1;
3687 if (point == 1) return q.p2;
3688 if (point == 2) return q.p3;
3689 return q.p4;
3690 }
3691 virtual Vector PointNormal(int face, int point) const
3692 {
3693 Quad q = get(face);
3694 Point p1 = q.p1;
3695 Point p2 = q.p2;
3696 Point p3 = q.p3;
3697 Vector u_x = p2-p1;
3698 Vector u_y = p3-p1;
3699 return Vector::CrossProduct(u_x, u_y);
3700 }
3701 virtual float Attrib(int face, int point, int id) const { return 0.0; }
3702 virtual int AttribI(int face, int point, int id) const { return 0; }
3703 virtual unsigned int Color(int face, int point) const { return Color::White().Pixel(); }
3704 virtual Point2d TexCoord(int face, int point) const
3705 {
3706 Point2d p;
3707 p.x = 0;
3708 p.y = 0;
3709 return p;
3710 }
3711
3712 Quad get(int face) const
3713 {
3714 int z = face / (voxel.SizeX()*voxel.SizeY());
3715 int ddz = face - z*(voxel.SizeX()*voxel.SizeY());
3716 int y = ddz / voxel.SizeX();
3717 int ddy = ddz - y*voxel.SizeX();
3718 int x = ddy;
3719 Quad q = voxel.Map(x,y,z);
3720 return q;
3721 }
3722private:
3723 Voxel<Quad> &voxel;
3724};
3725
3726
3727template<class X, class Y>
3728class StructVoxel : public Voxel<std::pair<X,Y> >
3729{
3730public:
3731 StructVoxel(Bitmap<X> &bm, Array<int, Y> &a) : bm(bm), a(a) { bm.Prepare(); }
3732 virtual int SizeX() const { return bm.SizeX(); }
3733 virtual int SizeY() const { return bm.SizeY(); }
3734 virtual int SizeZ() const { return a.Size(); }
3735 virtual std::pair<X,Y> Map(int x, int y, int z) const
3736 {
3737 X xx = bm.Index(x,y);
3738 Y yy = a.Index(z);
3739 return std::make_pair(xx,yy);
3740 }
3741private:
3742 Bitmap<X> &bm;
3743 Array<int, Y> &a;
3744};
3745
3746class CubeVoxel : public Voxel<Cube3>
3747{
3748public:
3749 CubeVoxel(Cube3 p, int x, int y, int z) : p(p), x(x), y(y), z(z) { }
3750 int SizeX() const { return x; }
3751 int SizeY() const { return y; }
3752 int SizeZ() const { return z; }
3753 Cube3 Map(int xx, int yy, int zz) const
3754 {
3755 float sx = p.maxx-p.minx;
3756 float sy = p.maxy-p.miny;
3757 float sz = p.maxz-p.minz;
3758 sx/=x;
3759 sy/=y;
3760 sz/=z;
3761 float px = xx*sx + p.minx;
3762 float py = yy*sy + p.miny;
3763 float pz = zz*sz + p.minz;
3764 Cube3 c;
3765 c.minx = px;
3766 c.miny = py;
3767 c.minz = pz;
3768 c.maxx = px+sx;
3769 c.maxy = py+sy;
3770 c.maxz = pz+sz;
3771 return c;
3772 }
3773private:
3774 Cube3 p;
3775 int x,y,z;
3776};
3777
3779
3780
3781
3782class RayTracingFunction0 : public Function<float, Point>
3783{
3784public:
3785 RayTracingFunction0(Point p1, Vector v) : p1(p1), v(v) { }
3786 Point Index(float x) const
3787 {
3788 return p1+x*v;
3789 }
3790private:
3791 Point p1;
3792 Vector v;
3793};
3794
3795class RayTracingFunction1 : public Function<float,float>
3796{
3797public:
3799 float Index(float x) const
3800 {
3801 Point p = f.Index(x);
3802 return objs.Map(p.x,p.y,p.z);
3803 }
3804private:
3807};
3808
3809class RayTracingFunction : public Function<Point2d, Point>
3810{
3811public:
3813 Vector v, float z) : objs(objs), v(v),z(z) { }
3815 {
3816 Point p1(p.x,p.y,z);
3817 Vector v(0.0,0.0,-2.0*z);
3818 return RayTrace(p1,v);
3819 }
3820
3822 {
3823 RayTracingFunction0 func0(p,v);
3824 RayTracingFunction1 func1(func0, objs);
3825 float val = Solve(func1, 0.0, 1.0);
3826 Point pp = func0.Index(val);
3827 return pp;
3828 }
3829
3830private:
3832 Vector v;
3833 float z;
3834};
3835
3837{
3838public:
3839 RayTrace(ContinuousVoxel<float> &objs) : objs(objs) { }
3841 {
3842 RayTracingFunction0 func0(p,v);
3843 RayTracingFunction1 func1(func0, objs);
3844 float val = Solve(func1, 0.0, 1.0);
3845 Point pp = func0.Index(val);
3846 return pp;
3847 }
3848private:
3850};
3851
3852class RayTracingBitmap : public Bitmap<Color>
3853{
3854public:
3855 RayTracingBitmap(Function<Point2d,Point> &raytrace, // use RayTracingFunction
3857 int sx, int sy) : raytrace(raytrace), color(color), sx(sx), sy(sy) { }
3858 void Prepare() { }
3859
3860 virtual int SizeX() const { return sx; }
3861 virtual int SizeY() const { return sy; }
3862 virtual Color Map(int x, int y) const
3863 {
3864 Point2d p = { float(x), float(y) };
3865 Point pp = raytrace.Index(p);
3866 return color.Map(pp.x,pp.y,pp.z);
3867 }
3868private:
3869 Function<Point2d, Point> &raytrace;
3871 int sx,sy;
3872};
3873
3874
3875template<class T>
3877{
3878public:
3879 Maybe() : b(false), obj(NULL) { }
3880 Maybe(const T &t) : b(true) { obj = new T(t); }
3881 Maybe(const Maybe<T> &m) : b(m.b) { obj = new T(*m.obj); }
3882 void operator=(const Maybe<T> &m)
3883 {
3884 b = m.b;
3885 obj = new T(*m.obj);
3886 }
3887 ~Maybe() { delete obj; }
3888 bool b;
3890};
3891template<class C>
3892class MaybeVoxel : public ContinuousVoxel<Maybe<C> >
3893{
3894public:
3895 MaybeVoxel(VolumeObject &obj, ContinuousVoxel<C> &data) : obj(obj), data(data) { }
3896 virtual float SizeX() const { return data.SizeX(); }
3897 virtual float SizeY() const { return data.SizeY(); }
3898 virtual float SizeZ() const { return data.SizeZ(); }
3899 virtual Maybe<C> Map(float x, float y, float z) const
3900 {
3901 if (obj.Inside(Point(x,y,z))) return data.Map(x,y,z);
3902 return Maybe<C>();
3903 }
3904private:
3905 VolumeObject &obj;
3907};
3908template<class C>
3910{
3911public:
3912 JustVoxel(ContinuousVoxel<Maybe<C> > &vox, C def) : vox(vox), def(def) { }
3913 virtual float SizeX() const { return vox.SizeX(); }
3914 virtual float SizeY() const { return vox.SizeY(); }
3915 virtual float SizeZ() const { return vox.SizeZ(); }
3916 virtual C Map(float x, float y, float z) const
3917 {
3918 Maybe<C> val = vox.Map(x,y,z);
3919 if (val.b) return def;
3920 return *val.obj;
3921 }
3922
3923private:
3925 C def;
3926};
3927
3928
3929#if 0
3930class SphereNormalContinuousVoxel : public ContinuousVoxel<Vector>
3931{
3932public:
3933 SphereNormalContinuousVoxel(Point center) : center(center) { }
3934 void Collect(CollectVisitor &vis)
3935 {
3936 }
3937 void HeavyPrepare() { }
3938
3939 void Prepare() { }
3940 virtual float SizeX() const { return 1.0; }
3941 virtual float SizeY() const { return 1.0; }
3942 virtual float SizeZ() const { return 1.0; }
3943 virtual Vector Map(float x, float y, float z) const
3944 {
3945 Point v(x,y,z);
3946 v-=center;
3947 return Vector(v);
3948 }
3949private:
3950 Point center;
3951};
3952#endif
3953class ColorCube : public ContinuousVoxel<Color>
3954{
3955public:
3956 virtual float SizeX() const { return 1.0; }
3957 virtual float SizeY() const { return 1.0; }
3958 virtual float SizeZ() const { return 1.0; }
3959 Color Map(float x, float y, float z) const
3960 {
3961 Color c;
3962 c.r = x*255;
3963 c.g = y*255;
3964 c.b = z*255;
3965 return c;
3966 }
3967};
3968
3969
3971{
3972public:
3973 PosContinuousVoxel(float sx, float sy, float sz) : sx(sx), sy(sy), sz(sz) { }
3974
3975 virtual float SizeX() const { return sx; }
3976 virtual float SizeY() const { return sy; }
3977 virtual float SizeZ() const { return sz; }
3978 virtual Point Map(float x, float y, float z) const
3979 {
3980 Point p;
3981 p.x = x;
3982 p.y = y;
3983 p.z = z;
3984 return p;
3985 }
3986private:
3987 float sx,sy,sz;
3988};
3989
3990template<class T>
3992{
3993public:
3994 PlaneBitmap(ContinuousVoxel<T> &voxel, Plane pl, float sx, float sy) : voxel(voxel), pl(pl), sx(sx), sy(sy) { }
3996 void HeavyPrepare() { }
3997
3998 void Prepare() { }
3999 virtual float SizeX() const { return sx; }
4000 virtual float SizeY() const { return sy; }
4001 virtual T Map(float x, float y) const
4002 {
4003 Point2d p2d = { x,y };
4004 PlaneIn3d plane(p2d, pl);
4005 Point p3d = plane.Elem();
4006 return voxel.Map(p3d.x, p3d.y, p3d.z);
4007 }
4008private:
4009 ContinuousVoxel<T> &voxel;
4010 Plane pl;
4011 float sx,sy;
4012};
4013
4015{
4016public:
4018 virtual float SizeX() const { return p.SizeX(); }
4019 virtual float SizeY() const { return p.SizeY(); }
4020 virtual float SizeZ() const { return p.SizeZ(); }
4021 virtual Point Map(float x, float y, float z) const
4022 {
4023 Point pp = p.Map(x,y,z);
4024 return pp * m;
4025 }
4026private:
4027 Matrix m;
4029};
4030
4031template<class T>
4032class SampleVoxel : public Voxel<T>
4033{
4034public:
4035 SampleVoxel(ContinuousVoxel<T> &v, int x, int y, int z) : v(v), x(x), y(y), z(z) { }
4036 void Collect(CollectVisitor &vis) { v.Collect(vis); }
4037 void HeavyPrepare() { }
4038 void Prepare() { v.Prepare(); }
4039 int SizeX() const { return x; }
4040 int SizeY() const { return y; }
4041 int SizeZ() const { return z; }
4042 T Map(int xx, int yy, int zz) const
4043 {
4044 float xa = Sample(xx, x, v.SizeX());
4045 float ya = Sample(yy, y, v.SizeY());
4046 float za = Sample(zz, z, v.SizeZ());
4047 return v.Map(xa,ya,za);
4048 }
4049 float Sample(int xx, int xsize, float sizex) const
4050 {
4051 return xx*sizex/xsize;
4052 }
4053 void CleanPrepare() { }
4054private:
4056 int x,y,z;
4057};
4058
4059template<class T>
4061{
4062public:
4064 void Prepare() { vx.Prepare(); }
4065 int SizeX() const { return vx.SizeX(); }
4066 int SizeY() const { return vx.SizeY(); }
4067 int SizeZ() const { return vx.SizeZ(); }
4068 T Map(int xx, int yy, int zz) const
4069 {
4070 return vx.Map(xx,yy,zz);
4071 }
4072
4073private:
4074 Voxel<T> &vx;
4075};
4076
4077class VolumeVoxel : public ContinuousVoxel<bool>
4078{
4079public:
4080 VolumeVoxel(VolumeObject &vol, Range<float> x, Range<float> y, Range<float> z) : vol(vol), x(x), y(y), z(z) { }
4082 void HeavyPrepare() { }
4083 void Prepare() { }
4084 float SizeX() const { return x.end-x.start; }
4085 float SizeY() const { return y.end-y.start; }
4086 float SizeZ() const { return z.end-z.start; }
4087 bool Map(float xx, float yy, float zz) const
4088 {
4089 xx+=x.start;
4090 yy+=y.start;
4091 zz+=z.start;
4092 return vol.Inside(Point(xx,yy,zz));
4093 }
4094private:
4095 VolumeObject &vol;
4096 Range<float> x;
4097 Range<float> y;
4098 Range<float> z;
4099};
4100
4101template<class T>
4103{
4104public:
4105 // r = [0..radius]
4106 // alfa = [0..2*pi]
4107 // beta = [0..pi]
4108 virtual float radius() const=0;
4109 virtual T Map(float r, float alfa, float beta) const=0;
4110};
4111
4112template<class T>
4114{
4115public:
4116 VoxelToSphere(ContinuousVoxel<T> &sp, Point p, float radius) : sp(sp), p(p), m_r(radius) { }
4117 float radius() const
4118 {
4119 return m_r;
4120 }
4121 T Map(float r, float alfa, float beta) const
4122 {
4123 SphericalPoint spec(Point(0.0,0.0,0.0));
4124 spec.r = r;
4125 spec.alfa = alfa;
4126 spec.beta = beta;
4127 Point pp = spec.ToPoint();
4128 pp += p;
4129 return sp.Map(pp.x,pp.y,pp.z);
4130 }
4131private:
4133 Point p;
4134 float m_r;
4135};
4136
4137
4138template<class T, class K>
4140{
4141public:
4142 static bool Compare(T t, K k)
4143 {
4144 return t == k;
4145 }
4146};
4147
4148template<>
4149class GraphBool<float, float>
4150{
4151public:
4152 static bool Compare(float x, float y)
4153 {
4154 return x-y < 0.01;
4155 }
4156};
4157template<>
4158class GraphBool<std::pair<float, float>, std::pair<float,float> >
4159{
4160public:
4161 static bool Compare(std::pair<float, float> p1, std::pair<float,float> p2)
4162 {
4163 return p1.first - p2.first < 0.01 && p1.second - p2.second < 0.01;
4164 }
4165};
4166
4167
4168template<class T, class K>
4169class Graph2 : public Function<std::pair<T,K>, bool>
4170{
4171public:
4172 Graph2(const Function<T,K> &func) : func(func) { }
4173 bool Index(std::pair<T,K> i) const
4174 {
4175 return GraphBool<T,K>::Compare(func.Index(i.first), i.second);
4176 }
4177private:
4178 const Function<T,K> &func;
4179};
4180
4181template<class T, class K>
4182class TwoGraphs : public Array<T,Range<K> >
4183{
4184public:
4186 T Size() const { return pair.Size(); }
4188 {
4189 std::pair<K,K> p = pair.Index(t);
4190 Range<K> r;
4191 r.start = p.first;
4192 r.end = p.second;
4193 return r;
4194 }
4195private:
4196 ArrayPair<T,K,K> pair;
4197};
4198
4199
4200
4201template<class T>
4202class ColorizeBoolArray : public Array<T,Color>
4203{
4204public:
4205 ColorizeBoolArray(const Array<T,bool> &func) : func(func) { }
4206 T Size() const { return func.Size(); }
4207 Color Index(T t) const
4208 {
4209 bool b = func.Index(t);
4210 if (b) return Color(255,255,255,128);
4211 else return Color(0,0,0, 128);
4212 }
4213private:
4214 const Array<T,bool> &func;
4215};
4216
4217
4219{
4220public:
4221 BitmapizeArray(Array<std::pair<int,int>,Color> &func) : func(func) { }
4223 {
4224 }
4225 void HeavyPrepare() { }
4226
4227 void Prepare() { }
4228 int SizeX() const
4229 {
4230 return func.Size().first;
4231 }
4232 int SizeY() const
4233 {
4234 return func.Size().second;
4235 }
4236 Color Map(int x, int y) const
4237 {
4238 return func.Index(std::make_pair(x,y));
4239 }
4240private:
4242};
4243
4245{
4246public:
4247 BitmapCache(ColorBitmap &bitmap) : bitmap(bitmap)
4248 {
4249 ref = BufferRef::NewBuffer(1,1);
4250 }
4252 {
4254 int sizex = bitmap.SizeX();
4255 int sizey = bitmap.SizeY();
4256 ref = BufferRef::NewBuffer(sizex, sizey);
4257 //std::cout << "BitmapCache:" << sizex << "x" << sizey << "=" << MB(sizex*sizey*sizeof(unsigned int)) << std::endl;
4258 if (r.tl.x > r.br.x) std::swap(r.tl.x,r.br.x);
4259 if (r.tl.y > r.br.y) std::swap(r.tl.y,r.br.y);
4260 if (r.br.x > sizex) r.br.x = sizex;
4261 if (r.br.y > sizey) r.br.y = sizey;
4262 if (r.tl.x < 0.0) r.tl.x = 0.0;
4263 if (r.tl.y < 0.0) r.tl.y = 0.0;
4264 //std::cout << r.tl.x << " " << r.br.x << " " << r.tl.y << " " << r.br.y << std::endl;
4265 for(int y=r.tl.y;y<r.br.y;y++)
4266 for(int x=r.tl.x;x<r.br.x;x++)
4267 {
4268 Color c = bitmap.Map(x,y);
4269 ref.buffer[x+ref.ydelta*y] = c.Pixel();
4270 }
4271 }
4272 BufferRef Ref() const { return ref; }
4274private:
4275 BufferRef ref;
4276 ColorBitmap &bitmap;
4277};
4278
4280{
4281public:
4283 {
4284 vec.push_back(t);
4285 }
4286 void SetBox(Matrix m) { }
4287 int NumFaces() const { return vec.size(); }
4288 int NumPoints(int face) const { return 3; }
4289 Point FacePoint(int face, int point) const
4290 {
4291 return vec[face].Index(point);
4292 }
4293 unsigned int Color(int face, int point) const
4294 {
4295 return 0xffffffff;
4296 }
4297 virtual Point2d TexCoord(int face, int point) const
4298 {
4299 Point2d p;
4300 p.x = 0;
4301 p.y = 0;
4302 return p;
4303 }
4304
4305 Vector PointNormal(int face, int point) const
4306 {
4307 Point p = FacePoint(face, 0);
4308 Point px = FacePoint(face, 1);
4309 Point py = FacePoint(face, 2);
4310 return -Vector::CrossProduct(px-p, py-p);
4311 }
4312 float Attrib(int face, int point, int id) const
4313 {
4314 return 0.0;
4315 }
4316 int AttribI(int face, int point, int id) const
4317 {
4318 return 0.0;
4319 }
4320private:
4321 std::vector<Triangle> vec;
4322};
4323
4324#if 0
4325class Cube3HandleValue : public HandleValue<Cube3>, public Element<const BoxableFaceCollection*>
4326{
4327public:
4328 Cube3HandleValue() { }
4329 void Handle(Cube3 t)
4330 {
4331 CubeElem *cube = new CubeElem;
4332 cube->SetBox(Matrix::Identity());
4333 Matrix m = Matrix::Scale((t.maxx-t.minx)/2, (t.maxy-t.miny)/2, (t.maxz-t.minz)/2);
4334 Matrix m2 = m * Matrix::Translate(-t.minx, -t.miny, -t.minz);
4335 MatrixElem *matrix = new MatrixElem(*cube, m2);
4336 or_elem.push_back(matrix);
4337 }
4338 void update_faces_cache() { or_elem.update_faces_cache(); }
4339 const BoxableFaceCollection *Elem() const { return &or_elem; }
4340private:
4341 OrElem<BoxableFaceCollection> or_elem;
4342};
4343#endif
4344template<class T>
4346{
4347public:
4348 EnumerateBitmap(Bitmap<T> &bm, HandleValue<T> &hv) : bm(bm), hv(hv) { bm.Prepare(); }
4349
4350 void Gen()
4351 {
4352 int sizey = bm.SizeY();
4353 int sizex = bm.SizeX();
4354 for(int y=0;y<sizey;y++)
4355 {
4356 for(int x=0;x<sizex;x++)
4357 {
4358 hv.Handle(bm.Map(x,y));
4359 }
4360 }
4361 }
4362private:
4363 Bitmap<T> &bm;
4364 HandleValue<T> &hv;
4365};
4366
4368{
4369public:
4370 GenerateSequence(HandleValue<int> &gen, int size) : gen(gen), size(size) { }
4371 void Gen()
4372 {
4373 for(int i=0;i<size;i++)
4374 {
4375 gen.Handle(i);
4376 }
4377 }
4378private:
4379 HandleValue<int> &gen;
4380 int size;
4381};
4382
4383template<class T>
4384class GenerateArray : public HandleValue<T>, public VectorArray<T>
4385{
4386public:
4388 void Handle(T t)
4389 {
4390 this->push_back(t);
4391 }
4392};
4393
4395{
4396public:
4397 GenerateGrid(HandleValue<std::pair<int,int> > &gen, int sizex, int sizey) : gen(gen), sizex(sizex), sizey(sizey) { }
4398 void Gen()
4399 {
4400 for(int y=0;y<sizey;y++)
4401 for(int x=0;x<sizex;x++)
4402 gen.Handle(std::make_pair(x,y));
4403 }
4404private:
4406 int sizex, sizey;
4407};
4408
4409struct Cube2
4410{
4411 int x;
4412 int y;
4413 int z;
4414};
4415
4416class Cube2Cube3Function : public Function<Cube2, Cube3>
4417{
4418public:
4419 Cube2Cube3Function(float sx, float sy, float sz, float px, float py, float pz) : sx(sx), sy(sy), sz(sz), px(px), py(py), pz(pz) { }
4421 {
4422 float fx = c.x;
4423 float fy = c.y;
4424 float fz = c.z;
4425 fx *= sx;
4426 fy *= sy;
4427 fz *= sz;
4428 fx+=px;
4429 fy+=py;
4430 fz+=pz;
4431 Cube3 cc;
4432 cc.minx = fx - sx/2.0;
4433 cc.miny = fy - sy/2.0;
4434 cc.minz = fz - sz/2.0;
4435 cc.maxx = fx + sx/2.0;
4436 cc.maxy = fy + sy/2.0;
4437 cc.maxz = fz + sz/2.0;
4438 return cc;
4439 }
4440private:
4441 float sx,sy,sz;
4442 float px,py,pz;
4443};
4444
4445
4447{
4448public:
4449 GenerateCube(HandleValue<Cube2> &gen, int sizex, int sizey, int sizez) : gen(gen), sizex(sizex), sizey(sizey), sizez(sizez) { }
4450 void Gen()
4451 {
4452 for(int z=0;z<sizez;z++)
4453 for(int y=0;y<sizey;y++)
4454 for(int x=0;x<sizex;x++)
4455 {
4456 Cube2 c;
4457 c.x = x;
4458 c.y = y;
4459 c.z = z;
4460 gen.Handle(c);
4461 }
4462 }
4463private:
4464 HandleValue<Cube2> &gen;
4465 int sizex, sizey, sizez;
4466};
4467
4468template<class C>
4469class GenerateVoxel : private HandleValue<Cube2>
4470{
4471public:
4472 GenerateVoxel(Voxel<C> &voxel, HandleValue<std::pair<Cube2, C> > &hv) : voxel(voxel), gen(*this, voxel.SizeX(), voxel.SizeY(), voxel.SizeZ()), hv(hv) { }
4473 void Gen() { gen.Gen(); }
4474private:
4475 void Handle(Cube2 c)
4476 {
4477 C cc = voxel.Map(c.x, c.y, c.z);
4478 hv.Handle(std::make_pair(c,cc));
4479 }
4480private:
4481 Voxel<C> &voxel;
4482 GenerateCube gen;
4483 HandleValue<std::pair<Cube2,C> > &hv;
4484};
4485
4486template<class T>
4487class FilterHandleValue : public HandleValue<std::pair<T, bool> >
4488{
4489public:
4491 void Handle(std::pair<T,bool> p)
4492 {
4493 if (p.second)
4494 {
4495 hv.Handle(p.first);
4496 }
4497 }
4498private:
4499 HandleValue<T> &hv;
4500};
4501
4502template<class T>
4504{
4505public:
4506 HandleValueSource(Array<int, T> &arr, HandleValue<T> &hv) : arr(arr), hv(hv) { }
4507 void Gen()
4508 {
4509 int size = arr.Size();
4510 for(int i=0;i<size;i++)
4511 {
4512 hv.Handle(arr.Index(i));
4513 }
4514 }
4515private:
4516 Array<int, T> &arr;
4517 HandleValue<T> &hv;
4518};
4519
4520class CubeHandleValue : public HandleValue<Cube2>
4521{
4522public:
4524 Vector ax, Vector ay, Vector az,
4525 HandleValue<Vector> &hv) : pp(p), ax(ax),ay(ay),az(az), hv(hv) { }
4527 {
4528 Vector v = pp + float(p.x) * ax + float(p.y) * ay + float(p.z)*az;
4529 hv.Handle(v);
4530 }
4531private:
4532 Point pp;
4533 Vector ax, ay, az;
4535};
4536
4537template<class T>
4538class ScaleTranslateHandleValue : public HandleValue<std::pair<Vector, T> >
4539{
4540public:
4541 ScaleTranslateHandleValue(HandleValue<std::pair<Matrix, T> > &hv, float sx, float sy, float sz) : hv(hv), sx(sx), sy(sy), sz(sz) { }
4542 void Handle(std::pair<Vector,T> v)
4543 {
4544 hv.Handle(std::make_pair(Matrix::Scale(sx,sy,sz)*Matrix::Translate(v.first.dx, v.first.dy, v.first.dz), v.second));
4545 }
4546private:
4548 float sx,sy,sz;
4549};
4550
4551class ColorHandleValue : public HandleValue<Vector>
4552{
4553public:
4554 ColorHandleValue(HandleValue<std::pair<Vector,unsigned int> > &hv, float sizex, float sizey, float sizez) : hv(hv), sizex(sizex), sizey(sizey), sizez(sizez)
4555 { }
4557 {
4558 Vector v2 = v;
4559 v2.dx +=sizex/2;
4560 v2.dy +=sizey/2;
4561 v2.dz +=sizez/2;
4562 unsigned int color = Color::ColorCube(v2.dx,v2.dy,v2.dz, sizex, sizey, sizez);
4563 hv.Handle(std::make_pair(v, color));
4564 }
4565private:
4567 float sizex, sizey, sizez;
4568};
4569
4570class FaceCollectionHandleValueDynamic : public HandleValue<std::pair<Matrix, unsigned int > >
4571{
4572public:
4574 void DrawVBO(VBOState &vbostate, VBOUpdate u);
4575 void Handle(std::pair<Matrix, unsigned int> mm)
4576 {
4577 Matrix m = mm.first;
4578 Node n = {
4579 { m.matrix[0], m.matrix[4], m.matrix[8], m.matrix[12],
4580 m.matrix[1], m.matrix[5], m.matrix[9], m.matrix[13],
4581 m.matrix[2], m.matrix[6], m.matrix[10], m.matrix[14],
4582 m.matrix[3], m.matrix[7], m.matrix[11], m.matrix[15] },
4583 mm.second };
4584 vec.push_back(n);
4585 }
4586private:
4587 //BoxableFaceCollection &fc;
4588 struct Node
4589 {
4590 float mat[16];
4591 unsigned int color;
4592 };
4593 mutable VectorArray<Node> vec;
4594};
4595
4597{
4598public:
4600 float time;
4601};
4603{
4604 int id;
4605};
4606
4607class Dynamic : public HandleValue<std::pair<int, Matrix> >,
4608 public HandleValue<std::pair<int, AnimPoint> >,
4609 public HandleValue<std::pair<int, unsigned int> >,
4610 public HandleValue<std::pair<int, ObjectId > >
4611{
4612public:
4613 Dynamic(PieceShader &piece) : piece(piece) { }
4614 int count() const { return vec.size(); }
4615 int create_new() { vec.push_back(Node()); return vec.size()-1; }
4616 void unuse(int id) { vec[id].active=false; }
4617 void DrawVBO(VBOState &vbostate, VBOUpdate u, float time);
4618 void Handle(std::pair<int, Matrix> m); // original position
4619 void Handle(std::pair<int, AnimPoint> m); // movement
4620 void Handle(std::pair<int, unsigned int> m); // color
4621 void Handle(std::pair<int, ObjectId> m); // object id
4622private:
4623 struct Node
4624 {
4625 Matrix m;
4626 AnimPoint p;
4627 unsigned int color;
4628 int obj_id;
4629 bool active;
4630 };
4631private:
4632 std::vector<Node> vec;
4633 std::vector<std::pair<int, AnimPoint> > pending_changes;
4634 PieceShader &piece;
4635};
4636
4637
4638#if 0
4639class FaceCollectionHandleValue : public HandleValue<std::pair<Matrix, unsigned int > >
4640{
4641public:
4642 FaceCollectionHandleValue(BoxableFaceCollection &fc) : vec(), fc(fc) { }
4643 void Handle(std::pair<Matrix,unsigned int> m)
4644 {
4645 MatrixElem *me = new MatrixElem(fc, m.first);
4646 ColorElem *ce = new ColorElem(*me, m.second);
4647 MemoizeFaces *memo = new MemoizeFaces(*ce);
4648 vec.push_back(memo);
4649 vec2.push_back(me);
4650 vec2.push_back(ce);
4651 vec2.push_back(memo);
4652 //RenderOpenGl(me);
4653 }
4654 void UpdateVBO(VBOState &vbostate, VBOUpdate u)
4655 {
4656 MemoizeArray<const FaceCollection*> memovec(vec.Size(), vec);
4658 CompressObject compress(convert);
4659 ::UpdateVBO(compress, vbostate, u);
4660 }
4661 ~FaceCollectionHandleValue()
4662 {
4663 int size = vec2.Size();
4664 for(int i=0;i<size;i++)
4665 {
4666 delete vec2.Index(i);
4667 }
4668 }
4669private:
4670 VectorArray<const FaceCollection*> vec;
4671 VectorArray<const FaceCollection*> vec2;
4672 BoxableFaceCollection &fc;
4673};
4674#endif
4675
4676template<class T, class K>
4678{
4679public:
4680 HandleValueFunction(HandleValue<K> &hv, Function<T,K> &func) : hv(hv), func(func) { }
4681 void Handle(T t)
4682 {
4683 hv.Handle(func.Index(t));
4684 }
4685private:
4686 HandleValue<K> &hv;
4688};
4689
4690
4691template<class T, class K>
4692class SampledGraph : public Array<int, Point2d>
4693{
4694public:
4695 SampledGraph(Function<float,float> &func, float start, float end, int steps) : func(func), sample_func(start, (end-start)/steps), g(sample_hv, steps) {}
4696 Point2d Index(int i) const { return genarray.Index(i); }
4697 int Size() const { return genarray.Size(); }
4698private:
4700
4701 GenerateArray<Point2d> genarray;
4702
4703
4705 Sample sample_func;
4706 GenerateSequence g; // int
4707};
4708
4709
4710template<class A, class B, class C> // T = std::pair<A,B>
4712{
4713public:
4715 Array<int, B> &b_array,
4716 Function<A,C> &f,
4717 Function<B,C> &g) : a_array(a_array), b_array(b_array), f(f), g(g) { }
4718
4719 void Gen( HandleValue<std::pair<A,B> > &gen )
4720 {
4721 int asize = a_array.Size();
4722 int bsize = b_array.Size();
4723 for(int aa = 0;aa<asize;aa++)
4724 for(int bb = 0;bb<bsize;bb++)
4725 {
4726 A a = a_array.Index(aa);
4727 B b = b_array.Index(bb);
4728 if (Eval(a,b))
4729 gen.Handle(std::make_pair(a,b));
4730 }
4731 }
4732 bool Eval(A a, B b)
4733 {
4734 return GraphBool<C,C>::Compare(f.Index(a),g.Index(b));
4735 }
4736
4737private:
4738 Array<int, A> &a_array;
4739 Array<int, B> &b_array;
4741 Function<B,C> &g;
4742};
4743
4744
4746{
4747public:
4748 FunctionBitmap(Array<std::pair<int, int>, bool> &func) : colorize(func), bitmapize(colorize), cache(bitmapize)
4749 {
4750 }
4751 void Generate(Rect r) { cache.Generate(r); }
4752 BufferRef Ref() const { return cache.Ref(); }
4753private:
4755 BitmapizeArray bitmapize;
4756 BitmapCache cache;
4757};
4758
4759
4760
4761
4763{
4764public:
4765 VoxelEffect(Render *r);
4766 void Init();
4767 bool Frame(float time);
4768 ~VoxelEffect();
4769private:
4770 bool first;
4771 VBOState vbostate;
4775
4776 //int texture;
4777 GlobalTexturePiece globpiece;
4778 TexturePiece texturepiece;
4779 PieceShader shader;
4780 PhongPiece phongpiece;
4781 NormalPiece normalpiece;
4782};
4783
4785{
4786public:
4787 MarchingCubesVoxel(Voxel<bool> &vox, HandleValue<Cube2> &hv) : vox(vox), hv(hv) { }
4788 void Gen()
4789 {
4790 {
4791 std::set<Cube2, Compare> emptyset;
4792 visited_cubes.swap(emptyset);
4793 }
4794 Cube2 cc;
4795 Initial(cc);
4796 Id(cc);
4797 }
4798private:
4799 void Initial(Cube2 &c)
4800 {
4801 int sizex = vox.SizeX();
4802 int sizey = vox.SizeY();
4803 int sizez = vox.SizeZ();
4804 float x,y,z;
4805 do
4806 {
4807 x = float(random.next())/float(random.maximum());
4808 y = float(random.next())/float(random.maximum());
4809 z = float(random.next())/float(random.maximum());
4810 x*=sizex;
4811 y*=sizey;
4812 z*=sizez;
4813 }
4814 while(!vox.Map(int(x),int(y),int(z)));
4815 c.x = int(x);
4816 c.y = int(y);
4817 c.z = 0;
4818 bool b = Id2(c);
4819 while(b && c.z<sizez)
4820 {
4821 c.z++;
4822 b = Id2(c);
4823 }
4824 }
4825 bool Id2(const Cube2 &c)
4826 {
4827 bool a0 = vox.Map(c.x, c.y, c.z);
4828 bool x = vox.Map(c.x+1, c.y, c.z);
4829 bool y = vox.Map(c.x, c.y+1, c.z);
4830 bool z = vox.Map(c.x, c.y, c.z+1);
4831 bool yz = vox.Map(c.x, c.y+1, c.z+1);
4832 bool xz = vox.Map(c.x+1, c.y, c.z+1);
4833 bool xy = vox.Map(c.x+1, c.y+1, c.z);
4834 bool xyz = vox.Map(c.x+1, c.y+1, c.z+1);
4835 bool allsame = a0 == x && x == y && y==z && z == yz && yz == xz && xz == xy && xy == xyz;
4836 return allsame;
4837 }
4838 void Id(const Cube2 &cc2)
4839 {
4840 std::vector<Cube2> nodes;
4841 nodes.push_back(cc2);
4842 Cube2 c;
4843 while(!nodes.empty())
4844 {
4845 c = nodes.back();
4846 nodes.pop_back();
4847 if (visited_cubes.find(c) != visited_cubes.end())
4848 {
4849 continue;
4850 }
4851 visited_cubes.insert(c);
4852 hv.Handle(c);
4853
4854 bool a0 = vox.Map(c.x, c.y, c.z);
4855 bool x = vox.Map(c.x+1, c.y, c.z);
4856 bool y = vox.Map(c.x, c.y+1, c.z);
4857 bool z = vox.Map(c.x, c.y, c.z+1);
4858 bool yz = vox.Map(c.x, c.y+1, c.z+1);
4859 bool xz = vox.Map(c.x+1, c.y, c.z+1);
4860 bool xy = vox.Map(c.x+1, c.y+1, c.z);
4861 bool xyz = vox.Map(c.x+1, c.y+1, c.z+1);
4862
4863 bool my = (a0 == x) && (x == xz) && (z == a0); // -y
4864 bool px = (x == xy) && (xy == xyz) && (x == xz); // x
4865 bool mz = (a0 == x) && (x == xy) && (a0 == y); // -z
4866 bool pz = (z == xz) && (xz == xyz) && (z == yz); // z
4867 bool py = (y == xy) && (xy == xyz) && (y==yz); // y
4868 bool mx = (a0 == y) && (y == yz) && (a0 == z); // -x
4869
4870 if (!mx)
4871 {
4872 Cube2 cc = c;
4873 cc.x--;
4874 nodes.push_back(cc);
4875 }
4876 if (!px)
4877 {
4878 Cube2 cc = c;
4879 cc.x++;
4880 nodes.push_back(cc);
4881 }
4882
4883 if (!my)
4884 {
4885 Cube2 cc = c;
4886 cc.y --;
4887 nodes.push_back(cc);
4888 }
4889 if (!py)
4890 {
4891 Cube2 cc = c;
4892 cc.y ++;
4893 nodes.push_back(cc);
4894 }
4895 if (!mz)
4896 {
4897 Cube2 cc = c;
4898 cc.z --;
4899 nodes.push_back(cc);
4900 }
4901 if (!pz)
4902 {
4903 Cube2 cc = c;
4904 cc.z ++;
4905 nodes.push_back(cc);
4906 }
4907 }
4908 }
4909 class Compare
4910 {
4911 public:
4912 bool operator()(const Cube2 &c1, const Cube2 &c2) const
4913 {
4914 if (c1.x != c2.x) return c1.x < c2.x;
4915 if (c1.y != c2.y) return c1.y < c2.y;
4916 if (c1.z != c2.z) return c1.z < c2.z;
4917 return false;
4918 }
4919 };
4920private:
4921 Voxel<bool> &vox;
4922 HandleValue<Cube2> &hv;
4923 std::set<Cube2, Compare> visited_cubes;
4924 mutable Random random;
4925};
4926
4927class WaveFunction : public Function<Vector, Vector>
4928{
4929public:
4930 WaveFunction(float time, Waveform &F, Waveform &G, float c) : time(time), F(F), G(G), c(c) { }
4932 {
4933 float r = v.Dist();
4934 float oner = 1.0/r;
4935 float u = oner*(F.Index(r-c*time))+oner*(G.Index(r+c*time));
4936 return u*v;
4937 }
4938private:
4939 float time;
4940 Waveform &F;
4941 Waveform &G;
4942 float c;
4943};
4944
4945void RenderVoxel(VolumeObject &o, int size, float wholesize, HandleValue<std::pair<Vector, unsigned int> > &hv, VBOState &vbostate);
4946
4947void RenderVoxel(VolumeObject &orv, int size, float wholesize, HandleValue<std::pair<Vector, unsigned int> > &hv);
4948
4950{
4951public:
4952 WallsFromMap(Bitmap<bool> &mymap, Bitmap<unsigned int> &mycolor, HandleValue<std::pair<std::pair<int,int>, std::pair<int, unsigned int> > > &hv, int x, int y) : mymap(mymap), mycolor(mycolor), hv(hv), x(x), y(y) {
4953 mymap.Prepare();
4954 mycolor.Prepare();
4955 }
4956 void Gen()
4957 {
4958 Recurse(x,y);
4959 }
4960private:
4961 // 0 = +x
4962 // 1 = -x
4963 // 2 = +y
4964 // 3 = -y
4965 // 4 = roof
4966 // 5 = floor
4967 void Recurse(int x, int y)
4968 {
4969 if (visited_nodes.find(std::make_pair(x,y))!=visited_nodes.end())
4970 {
4971 return;
4972 }
4973 if (!mymap.Map(x,y)) return;
4974 unsigned int color = mycolor.Map(x,y);
4975 visited_nodes.insert(std::make_pair(x,y));
4976 hv.Handle(std::make_pair(std::make_pair(x,y), std::make_pair(4, color)));
4977 hv.Handle(std::make_pair(std::make_pair(x,y), std::make_pair(5, color)));
4978 bool nx = mymap.Map(x+1,y);
4979 bool px = mymap.Map(x-1,y);
4980 bool ny = mymap.Map(x,y+1);
4981 bool py = mymap.Map(x,y-1);
4982 if (nx)
4983 {
4984 Recurse(x+1,y);
4985 }
4986 else
4987 {
4988 hv.Handle(std::make_pair(std::make_pair(x,y), std::make_pair(0,color)));
4989 }
4990 if (px)
4991 {
4992 Recurse(x-1,y);
4993 }
4994 else
4995 {
4996 hv.Handle(std::make_pair(std::make_pair(x,y), std::make_pair(1,color)));
4997 }
4998 if (ny)
4999 {
5000 Recurse(x,y+1);
5001 }
5002 else
5003 {
5004 hv.Handle(std::make_pair(std::make_pair(x,y), std::make_pair(2,color)));
5005 }
5006 if (py)
5007 {
5008 Recurse(x,y-1);
5009 }
5010 else
5011 {
5012 hv.Handle(std::make_pair(std::make_pair(x,y), std::make_pair(3, color)));
5013 }
5014 }
5015private:
5016 Bitmap<bool> &mymap;
5017 Bitmap<unsigned int> &mycolor;
5018 HandleValue<std::pair<std::pair<int,int>, std::pair<int, unsigned int> > > &hv;
5019 int x, y;
5020 mutable std::set<std::pair<int,int> > visited_nodes;
5021};
5022class WallMatrix : public HandleValue<std::pair<std::pair<int,int> , std::pair<int, unsigned int > > >
5023{
5024public:
5025 WallMatrix(HandleValue<std::pair<Matrix, unsigned int> > &hv, float size) : hv(hv), size(size) { }
5026 void Handle(std::pair<std::pair<int,int>, std::pair<int, unsigned int > > h)
5027 {
5028 int val = h.second.first;
5029 int x = h.first.first;
5030 int y = h.first.second;
5031 unsigned int color = h.second.second;
5033 switch(val)
5034 {
5035 case 0: m = Matrix::YRotation(90*2.0*3.14159/360.0); break;
5036 case 1: m = Matrix::YRotation(-90*2.0*3.14459/360.0); break;
5037 case 3: m = Matrix::YRotation(180*2.0*3.14159/360.0); break;
5038 case 2: m = Matrix::Identity(); break;
5039 case 4: m = Matrix::XRotation(-90*2.0*3.14159/360.0); break;
5040 case 5: m = Matrix::XRotation(90*2.0*3.14159/360.0); break;
5041 }
5042 hv.Handle(std::make_pair(Matrix::Translate(0.0,0.0,size/2)*m*Matrix::Translate(x*size, 0.0, y*size), color));
5043 }
5044private:
5046 float size;
5047};
5048
5049template<class P, class S>
5051{
5052public:
5053 virtual bool CanDivide(P p) const=0;
5054 virtual std::vector<P> Divide(P p) const=0;
5055 virtual S Solve(P p) const=0;
5056 virtual S Combine(std::vector<S> s) const=0;
5057};
5058
5059template<class P, class S>
5061{
5062 if (d.CanDivide(p))
5063 {
5064 std::vector<P> pp = d.Divide(p);
5065 std::vector<S> ss;
5066 for(typename std::vector<P>::iterator i=pp.begin();i!=pp.end();i++)
5067 {
5068 S s1 = Conquer(d, *i);
5069 ss.push_back(s1);
5070 }
5071 S s = d.Combine(ss);
5072 return s;
5073 }
5074 else
5075 {
5076 S s = d.Solve(p);
5077 return s;
5078 }
5079}
5080
5082{
5083public:
5084 MapEffect(Render *r);
5085 ~MapEffect();
5086 void Init();
5087 bool Frame(float time);
5088 float XRot() const { return 0.0; }
5089 float YRot() const { return 1.0; }
5090 float ZRot() const { return 0.0; }
5091 float RotSpeed() const { return 0.0; }
5092public:
5097
5100 bool first;
5101
5102 unsigned int texture;
5105};
5106
5107//
5108// Supershape
5109//
5110class SuperShape2d : public Function<float, float>
5111{
5112public:
5113 SuperShape2d(float a, float b, float m, float n1, float n2, float n3) : a(a), b(b), m(m), n1(n1), n2(n2), n3(n3) { }
5114 float Index(float alfa) const
5115 {
5116 //std::cout << alfa << " " << m << " " << a << " " << b << std::endl;
5117 float d1 = fabs(1.0/a*cos(m*alfa/4.0));
5118 float d2 = fabs(1.0/b*sin(m*alfa/4.0));
5119 float a1 = pow(d1,n2);
5120 float a2 = pow(d2,n3);
5121 float r2 = a1 + a2;
5122 float r = pow(double(r2), double(-1.0/n1));
5123 //std::cout << d1 << " " << d2 << " " << a1 << " " << a2 << " " << r2 << " " << r << std::endl;
5124 return r;
5125 }
5126private:
5127 float a,b, m, n1, n2, n3;
5128};
5129
5131{
5132 float a,b,m,n1,n2,n3;
5133};
5134
5136{
5137public:
5138 SuperShape3d(SuperParameters &a1, SuperParameters &a2) : r1(a1.a, a1.b, a1.m, a1.n1, a1.n2, a1.n3),
5139 r2(a2.a, a2.b, a2.m, a2.n1, a2.n2, a2.n3) { }
5141 float b,
5142 float m,
5143 float n1,
5144 float n2,
5145 float n3,
5146 float aa,
5147 float bb,
5148 float mm,
5149 float nn1,
5150 float nn2,
5151 float nn3)
5152 : r1(a ,b ,m ,n1 ,n2 ,n3),
5153 r2(aa,bb,mm,nn1,nn2,nn3) { }
5155 void HeavyPrepare() { }
5156 Point Index(float alfa, float beta) const
5157 {
5158 alfa-=3.14159/2.0;
5159 beta-=3.14159;
5160
5161 float x = r1.Index(alfa)*cos(alfa)*r2.Index(beta)*cos(beta);
5162 float y = r1.Index(alfa)*sin(alfa)*r2.Index(beta)*cos(beta);
5163 float z = r2.Index(beta)*sin(beta);
5164 Point p;
5165 p.x = x;
5166 p.y = y;
5167 p.z = z;
5168 //std::cout << p << std::endl;
5169 return p;
5170 }
5171 Point2d Texture(float x, float y) const { Point2d p; p.x = x; p.y = y; return p; }
5172 float Attrib(float x, float y, int id) const { return 0.0; }
5173 int AttribI(float x, float y, int id) const
5174 {
5175 return 0;
5176 }
5177 Vector Normal(float x, float y) const
5178 {
5179 Point p1 = Index(x,y);
5180 Point p2 = Index(x+0.01,y);
5181 Point p3 = Index(x,y+0.01);
5182 Vector u_x = p2-p1;
5183 Vector u_y = p3-p1;
5184 return Vector::CrossProduct(u_x, u_y);
5185 }
5186 unsigned int Color(float x, float y) const
5187 {
5188 return Color::White().Pixel();
5189 }
5190 float XSize() const
5191 {
5192 return 3.14159;
5193 }
5194 float YSize() const
5195 {
5196 return 2.0*3.14159;
5197 }
5198
5199private:
5200 SuperShape2d r1;
5201 SuperShape2d r2;
5202};
5203
5204template<class T>
5206{
5207public:
5208 virtual int Size() const=0;
5209 virtual int ASize(int x) const=0;
5210 virtual T Map(int x, int y) const=0;
5211};
5212
5213template<class T>
5214class FunnyChoose : public Array<int, T>
5215{
5216public:
5217 FunnyChoose(FunnyArray<T> &arr, Array<int,int> &index) : arr(arr), index(index) { }
5218 int Size() const { return arr.Size(); }
5219 T Index(int i) const
5220 {
5221 int ii = index.Index(i);
5222 T t = arr.Map(i,ii);
5223 return t;
5224 }
5225private:
5226 FunnyArray<T> &arr;
5227 Array<int,int> &index;
5228};
5229
5230
5231
5232
5233
5235{
5237 float radius;
5238};
5247
5249{
5250public:
5252 int NumLines() const
5253 {
5254 return g.NumEdges();
5255 }
5256 Point LinePoint(int line, int point) const
5257 {
5258 std::pair<int,int> e = g.EdgeVertex(line);
5259 EdgeData3d ed = data.Edge(line, e.first, e.second);
5260 Point p;
5261 if (point == 0) p = ed.dom_center;
5262 else p = ed.cod_center;
5263 return p;
5264 }
5265private:
5266 Graph &g;
5268};
5269
5271{
5272public:
5273 FacesFromMap(Bitmap<bool> &mymap, Bitmap<Point> &pos) : mymap(mymap), pos(pos) { Refresh(); }
5274 virtual std::string name() const { return "FacesFromMap"; }
5275
5277 {
5278 mymap.Collect(vis);
5279 pos.Collect(vis);
5280 }
5281 void HeavyPrepare() { }
5282
5283
5284 void Prepare() { mymap.Prepare(); pos.Prepare(); }
5285 void SetBox(Matrix m) { }
5286 virtual int NumFaces() const { return vec.size(); }
5287 virtual int NumPoints(int face) const { return 4; }
5288 virtual Point FacePoint(int face, int point) const
5289 {
5290 const Face &face2 = vec[face];
5291 unsigned int p = point;
5292 if (p > face2.p.size()-1) p = face2.p.size()-1;
5293 if (face2.p.size()==0)
5294 return Point(0.0,0.0,0.0);
5295 return face2.p[p];
5296 }
5297 virtual Vector PointNormal(int face, int point) const
5298 {
5299 const Face &face2 = vec[face];
5300 Point p = face2.p[0]; //pos.Map(0,0);
5301 Point px = face2.p[1]; //pos.Map(1,0);
5302 Point py = face2.p[2]; //pos.Map(0,1);
5303 return -Vector::CrossProduct(px-p, py-p);
5304 }
5305 virtual float Attrib(int face, int point, int id) const
5306 {
5307 return 0.0;
5308 }
5309 virtual int AttribI(int face, int point, int id) const
5310 {
5311 return 0;
5312 }
5313 virtual unsigned int Color(int face, int point) const
5314 {
5315 return 0xffffffff;
5316 }
5317 virtual Point2d TexCoord(int face, int point) const
5318 {
5319 Point2d p;
5320 p.x = 0.0;
5321 p.y = 0.0;
5322 return p;
5323 }
5324
5325
5326 void Refresh()
5327 {
5328 vec = std::vector<Face>();
5329 int sizex = mymap.SizeX();
5330 int sizey = mymap.SizeY();
5331 for(int y=0;y<sizey-1;y++)
5332 for(int x=0;x<sizex-1;x++)
5333 {
5334 Face f;
5335 if (mymap.Map(x,y))
5336 {
5337 f.p.push_back(pos.Map(x,y));
5338 }
5339 if (mymap.Map(x+1,y))
5340 {
5341 f.p.push_back(pos.Map(x+1,y));
5342 }
5343 if (mymap.Map(x+1,y+1))
5344 {
5345 f.p.push_back(pos.Map(x+1,y+1));
5346 }
5347 if (mymap.Map(x,y+1))
5348 {
5349 f.p.push_back(pos.Map(x,y+1));
5350 }
5351 vec.push_back(f);
5352 }
5353 }
5354
5355 struct Face
5356 {
5357 std::vector<Point> p;
5358 };
5359private:
5360 Bitmap<bool> &mymap;
5361 Bitmap<Point> &pos;
5362 std::vector<Face> vec;
5363};
5364
5365class GraphFromMap : public Graph, public GraphData<VertexData3d, EdgeData3d>
5366{
5367public:
5368 GraphFromMap(Bitmap<bool> &mymap, Bitmap<Point> &pos, bool twoway, float radius) : mymap(mymap), twoway(twoway), pos(pos), radius(radius)
5369 {
5370 mymap.Prepare();
5371 pos.Prepare();
5372 Refresh();
5373 }
5374 VertexData3d Vertex(int v) const
5375 {
5376 std::pair<int,int> p = positions[v];
5377 int x = p.first;
5378 int y = p.second;
5379
5381 d.center = pos.Map(x,y);
5382 d.radius = radius;
5383 return d;
5384 }
5385 EdgeData3d Edge(int /*e*/, int v1, int v2) const
5386 {
5387 std::cout << v1 << " " << v2 << std::endl;
5388 VertexData3d d1 = Vertex(v1);
5389 VertexData3d d2 = Vertex(v2);
5390 EdgeData3d e;
5391 e.dom_center = d1.center;
5392 e.dom_radius = d1.radius;
5393 e.cod_center = d2.center;
5394 e.cod_radius = d2.radius;
5395 std::cout << e.dom_center << " " << e.cod_center << std::endl;
5396 return e;
5397 }
5398 int NumVertexes() const
5399 {
5400 return counter;
5401 }
5402 int NumEdges() const
5403 {
5404 return edgecount;
5405 }
5406 std::pair<int,int> EdgeVertex(int edge) const
5407 {
5408 return edges[edge];
5409 }
5410 void Refresh()
5411 {
5412 int xsize = mymap.SizeX();
5413 int ysize = mymap.SizeY();
5414 int count = 0;
5415 for(int y=0;y<ysize;y++)
5416 for(int x=0;x<xsize;x++)
5417 {
5418 if (mymap.Map(x,y))
5419 {
5420 positions[count] = std::make_pair(x,y);
5421 count ++;
5422 }
5423 }
5424
5425 counter = count;
5426 int count2 = 0;
5427 count = 0;
5428 for(int y=0;y<ysize;y++)
5429 for(int x=0;x<xsize;x++)
5430 {
5431 if (mymap.Map(x,y))
5432 {
5433 if (mymap.Map(x+1,y)) { edges[count2]=std::make_pair(count, find(x+1,y)); count2++; }
5434 if (mymap.Map(x,y+1)) { edges[count2]=std::make_pair(count, find(x,y+1)); count2++; }
5435 if (twoway)
5436 {
5437 if (mymap.Map(x-1,y)) { edges[count2]=std::make_pair(count, find(x-1,y)); count2++; }
5438 if (mymap.Map(x,y-1)) { edges[count2]=std::make_pair(count, find(x,y-1)); count2++; }
5439 }
5440 count ++;
5441 }
5442 }
5443 edgecount = count2;
5444 }
5445 int find(int x, int y)
5446 {
5447 for(int i=0;i<counter;i++)
5448 {
5449 std::pair<int,int> p = positions[i];
5450 if (p.first == x && p.second == y)
5451 {
5452 return i;
5453 }
5454 }
5455 return -1;
5456 }
5457private:
5458 mutable std::map<int, std::pair<int,int> > positions;
5459 mutable std::map<int, std::pair<int,int> > edges;
5460 int counter;
5461 int edgecount;
5462 Bitmap<bool> &mymap;
5463 bool twoway;
5464 Bitmap<Point> &pos;
5465 float radius;
5466};
5467
5468
5469template<class T>
5471{
5472public:
5473 virtual BoxableFaceCollection *Data(const T &t) const=0;
5474};
5475#if 0
5476class SphereDataRep : public DataRep<VertexData3d>
5477{
5478public:
5479 SphereDataRep(int x, int y) : x(x), y(y) { }
5480 virtual BoxableFaceCollection *Data(const VertexData3d &t) const
5481 {
5482 sphere = new SphereElem(x,y);
5483 sphere->SetBox(Matrix::Identity());
5484 mat = new MatrixElem(*sphere, Matrix::Scale(t.radius, t.radius, t.radius)*Matrix::Translate(t.center.x, t.center.y, t.center.z));
5485 return mat;
5486 }
5487private:
5488 mutable SphereElem *sphere;
5489 mutable MatrixElem *mat;
5490 int x, y;
5491};
5492#endif
5493class ConeDataRep : public DataRep<EdgeData3d>
5494{
5495public:
5496 ConeDataRep(int num) : num(num) { }
5497 virtual BoxableFaceCollection *Data(const EdgeData3d &t) const
5498 {
5499 elem = new ConeElem(num, t.dom_center, t.cod_center, t.dom_radius, t.cod_radius);
5500 return elem;
5501 }
5502private:
5503 mutable ConeElem *elem;
5504 int num;
5505};
5506
5507template<class V, class E>
5509{
5510public:
5512 GraphData<V,E> &data,
5513 DataRep<V> &vertex,
5514 DataRep<E> &edge)
5515 : g(g), data(data), vertex(vertex), edge(edge), or_elem(0)
5516 { Refresh(); }
5517 void Refresh()
5518 {
5519 int v = g.NumVertexes();
5520 for(int a = 0; a<v; a++)
5521 {
5522 V vv = data.Vertex(a);
5523 BoxableFaceCollection *coll = vertex.Data(vv);
5524 vec.push_back(coll);
5525 }
5526 int e = g.NumEdges();
5527 for(int b = 0; b<e; b++)
5528 {
5529 std::pair<int,int> p = g.EdgeVertex(b);
5530 E ee = data.Edge(b, p.first, p.second);
5531 BoxableFaceCollection *coll = edge.Data(ee);
5532 vec.push_back(coll);
5533 }
5534 delete or_elem;
5535 or_elem = new OrElem<BoxableFaceCollection>(vec.begin(), vec.end());
5536 or_elem->update_faces_cache();
5537 }
5538 virtual int NumFaces() const { return or_elem->NumFaces(); }
5539 virtual int NumPoints(int face) const { return or_elem->NumPoints(face); }
5540 virtual Point FacePoint(int face, int point) const { return or_elem->FacePoint(face,point); }
5541 virtual Vector PointNormal(int face, int point) const { return or_elem->PointNormal(face,point); }
5542 virtual float Attrib(int face, int point, int id) const { return or_elem->Attrib(face, point, id); }
5543 virtual int AttribI(int face, int point, int id) const { return or_elem->AttribI(face, point, id); }
5544 virtual unsigned int Color(int face, int point) const { return or_elem->Color(face,point); }
5545 virtual Point2d TexCoord(int face, int point) const { return or_elem->TexCoord(face,point); }
5546 virtual void SetBox(Matrix b) { return or_elem->SetBox(b); }
5547 virtual bool Inside(Point p) const { return or_elem->Inside(p); }
5548
5549private:
5550 Graph &g;
5552 DataRep<V> &vertex;
5553 DataRep<E> &edge;
5554 std::vector<BoxableFaceCollection*> vec;
5556};
5557
5558
5559
5560class NormalMapping1 : public Bitmap<Point>
5561{
5562public:
5563 NormalMapping1(SurfaceIn3d &surf, SurfaceIn3d &polys, int sizex, int sizey) : surf(surf), polys(polys), sizex(sizex), sizey(sizey) { }
5564 void Prepare() { }
5565
5566 virtual int SizeX() const { return sizex; }
5567 virtual int SizeY() const { return sizey; }
5568 virtual Point Map(int x, int y) const
5569 {
5570 Point p1 = surf.Index(surf.XSize()*x/sizex, surf.YSize()*y/sizey);
5571 Point p2 = polys.Index(polys.XSize()*x/sizex, polys.YSize()*y/sizey);
5572 Vector v = p2-p1;
5573 return Point(v);
5574 }
5575private:
5576 SurfaceIn3d &surf;
5577 SurfaceIn3d &polys;
5578 int sizex;
5579 int sizey;
5580};
5581
5582
5583template<class C>
5585{
5586public:
5587 virtual Bitmap<C>* Index(C c) const=0;
5588};
5589template<class C>
5590class ZoomArray : public Array<int, ZoomingStep<C>*>
5591{
5592};
5593
5594
5596{
5597public:
5599 int Choose(Point2d pp) const
5600 {
5601 int m = 100000.0;
5602 int index;
5603 for(int i=0;i<coll.Size();i++)
5604 {
5605 Point p = coll.Index(i);
5606 Point2d pp2 = { p.x-pp.x, pp.y-pp.y };
5607 float dist = sqrt(pp2.x*pp2.x+pp2.y*pp2.y);
5608 if (dist < m) { m=dist; index = i; }
5609 }
5610 return index;
5611 }
5612private:
5613 //Point2d pp;
5614 PointCollection &coll;
5615};
5616template<class T>
5618{
5619public:
5620 virtual T m(T t1, T t2) const=0;
5621 virtual T id() const=0;
5622};
5623template<class T>
5624class CompositionMonoid : public Monoid<Function<T,T> *>, private Function<T,T>
5625{
5626public:
5628 {
5629 m_t1 = t1;
5630 m_t2 = t2;
5631 return this;
5632 }
5633 T Index(T t) const
5634 {
5635 return m_t2->Index(m_t1->Index(t));
5636 }
5638 {
5639 return &idf;
5640 }
5641private:
5642 Function<T,T> *m_t1;
5643 Function<T,T> *m_t2;
5645};
5646
5647template<class T>
5649{
5650public:
5651 virtual T m(T t1, T t2) const=0;
5652 virtual T id() const=0;
5653 virtual T inv(T t) const=0;
5654};
5655template<class T>
5656class GroupMonoid : public Monoid<T>
5657{
5658public:
5660 T m(T t1, T t2) const { return g.m(t1,t2); }
5661 T id() const { return g.id(); }
5662private:
5663 GroupObject<T> &g;
5664};
5665class FloatGroup : public GroupObject<float>
5666{
5667public:
5668 float m(float t1, float t2) const { return t1*t2; }
5669 float id() const { return 1.0; }
5670 float inv(float a) const { return 1.0/a; }
5671};
5672
5673class MatrixGroup : public GroupObject<Matrix>
5674{
5675public:
5676 Matrix m(Matrix t1, Matrix t2) const
5677 {
5678 return t1*t2;
5679 }
5680 Matrix id() const
5681 {
5682 return Matrix::Identity();
5683 }
5685 {
5686 return Matrix::Inverse(t);
5687 }
5688
5689};
5690
5691#if 0
5692template<class T, class U, class B>
5693class Part
5694{
5695public:
5696 virtual U Index_p(T t) const=0;
5697 virtual B Index_ch(U u) const=0;
5698};
5699
5700template<class V, class X, class Y, class B>
5701class InverseImage : public Function<Part<V,Y,B>*, Part<std::pair<X,V>,X, B> *>, private Part<std::pair<X,V>,X, B>
5702{
5703public:
5704 InverseImage(Function<X,Y> &f) : f(f) { }
5705 Part<std::pair<X,V>,X, B> *Index(Part<V,Y, B> *p) const
5706 {
5707 pp = p;
5708 return this;
5709 }
5710 B Index_ch(X x) const
5711 {
5712 Y y = f.Index(x);
5713 return pp->Index_ch(y);
5714 }
5715 X Index_p(std::pair<X,V> u) const
5716 {
5717 return u.first;
5718 }
5719private:
5720 Function<X,Y> &f;
5721 Part<V,Y,B> *pp;
5722};
5723
5724template<class X, class V, class Y, class B>
5725class Intersection : private InverseImage<V,X,Y,B>, private Function<X,Y>, private Part<std::pair<X,V>,Y,B>
5726{
5727public:
5728 Intersection(Part<V,Y,B> &j, Part<X,Y,B> &f) : InverseImage<V,X,Y,B>(*this), j(j), f(f) { }
5729
5730 Part<std::pair<X,V>,X,B> *Part_i() const
5731 {
5732 return Index(&j);
5733 }
5734 Part<std::pair<X,V>,Y,B> *Part_m() const
5735 {
5736 return this;
5737 }
5738 Y Index_p(std::pair<X,V> p) const
5739 {
5740 Part<std::pair<X,V>,X,B> *i = Part_i();
5741 X x = i->Index_p(p);
5742 Y y = Index(x);
5743 return y;
5744 }
5745 B Index_ch(Y y) const
5746 {
5747 return j.Index_ch(y) && f.Index_ch(y);
5748 }
5749
5750 Y Index(X x) const
5751 {
5752 return f.Index_p(x);
5753 }
5754private:
5755 Part<V,Y,B> &j;
5756 Part<X,Y,B> &f;
5757};
5758
5759#endif
5760
5762{
5763public:
5765};
5766
5767
5769{
5770public:
5771 RegularPolygon(Point2d center, float radius, int count, float angle) : circle(center, radius), sample(circle, count, angle) { }
5772 int Size() const { return sample.Size(); }
5773 Point2d Index(int i) const { return sample.Index(i); }
5774private:
5775 Circle circle;
5776 SampleCurveIn2d sample;
5777};
5778
5780{
5782};
5783
5784Point2d IntersectLines(const Line2d &l1, const Line2d &l2);
5785float AngleLines(const Point2d &intersect, const Point2d &l1, const Point2d &l2);
5786
5787class Line2dCollection : public Array<int,Line2d>
5788{
5789public:
5790};
5791
5792
5793
5794#if 0
5795class ContinuousLines2d : public Line2dCollection
5796{
5797public:
5798 ContinuousLines2d(PointCollection2d &p, bool loops) : p(p), loops(loops) { }
5799 int Size() const { return loops?p.Size():p.Size()-1; }
5800 Line2d Index(int line) const
5801 {
5802 //std::cout << "ContinuousLines2d" << line << std::endl;
5803 Line2d res;
5804 int point = 0;
5805 int num = line+point;
5806 num %= p.Size();
5807 res.p1 = p.Index(num);
5808 point = 1;
5809 num = line+point;
5810 num %= p.Size();
5811 res.p2 = p.Index(num);
5812 return res;
5813 }
5814private:
5815 PointCollection2d &p;
5816 bool loops;
5817};
5818#endif
5819
5820class LineIn2d : public CurveIn2d
5821{
5822public:
5824 float Size() const { return 1.0; }
5825 Point2d Index(float x) const
5826 {
5828 }
5829public:
5831};
5832
5833#if 0
5834template<class T>
5835class ReorientedFunction : public Bitmap<T>
5836{
5837public:
5838 ReorientedFunction(Line2d &line, ContinuousBitmap<T> &func, T default_, int sz, int sy, float height) : line(line), func(func), sx(sx), sy(sy), height(height), default_(default_) { }
5839 int SizeX() const { return sx; }
5840 int SizeY() const { return sy; }
5841 T Map(int x, int y) const
5842 {
5843 Point2d p = { float(x), float(y) };
5844 std::pair<Vector,Vector> pp = Vector2d::SplitToComponents(p-line.p1, line.p2-line.p1);
5845 Vector vx = pp.first;
5846 Vector vy = pp.second;
5847 vx/=(line.p2-line.p1).Dist();
5848 vy/=height;
5849 float px = line.p1.x+vx*func.SizeX();
5850 float py = line.p1.y+vy*func.SizeY();
5851 if (px<0||px>=func.SizeX()) return default_;
5852 if (py<0||py>=func.SizeY()) return default_;
5853 T t = func.Map(px,py);
5854 return t;
5855 }
5856private:
5857 Line2d &line;
5858 ContinuousBitmap<T> &func;
5859 int sx,sy;
5860 float height;
5861 T default_;
5862};
5863#endif
5864
5865template<class T>
5866class ChooseBitmap2 : public Bitmap<Color>
5867{
5868public:
5870 : bm1(bm1), bm2(bm2), choose(choose) { }
5871 void Prepare() {
5872 bm1.Prepare();
5873 bm2.Prepare();
5874 choose.Prepare();
5875 }
5876
5877 virtual int SizeX() const { return bm1.SizeX(); }
5878 virtual int SizeY() const { return bm1.SizeY(); }
5879 virtual Color Map(int x, int y) const
5880 {
5881 Color t1 = bm1.Map(x,y);
5882 Color t2 = bm2.Map(x,y);
5883 Color t = Color::Interpolate(t1,t2, choose.Map(x,y));
5884 return t;
5885 }
5886
5887private:
5888 Bitmap<T> &bm1;
5889 Bitmap<T> &bm2;
5890 Bitmap<float> &choose;
5891};
5892
5893template<class T>
5894class ContainerBitmap : public Bitmap<T>
5895{
5896public:
5897 ContainerBitmap(int sx, int sy, T def) : sx(sx), sy(sy), def(def) { }
5898
5899 void Prepare() {
5900 int s = vec.size();
5901 for(int i=0;i<s;i++)
5902 {
5903 vec[i]->Prepare();
5904 }
5905 }
5906
5908 {
5909 rects.push_back(rect);
5910 vec.push_back(bm);
5911 return vec.size()-1;
5912 }
5913 void move(int index, TRect newpos) { rects[index]=newpos; }
5914 void change(int index, Bitmap<T> *bm) { vec[index]=bm; }
5915 void resize(int new_sx, int new_sy) { sx = new_sx; sy = new_sy; }
5916 virtual int SizeX() const { return sx; }
5917 virtual int SizeY() const { return sy; }
5918 virtual T Map(int x, int y) const
5919 {
5920 int sz = rects.size();
5921 for(int i=0;i<sz;i++)
5922 {
5923 TRect r = rects[i];
5924 if (x<r.x) continue;
5925 if (y<r.y) continue;
5926 if (x>=r.x+r.width) continue;
5927 if (y>=r.y+r.height) continue;
5928 return vec[i].Map(x-r.x,y-r.y);
5929 }
5930 return def;
5931 }
5932private:
5933 int sx,sy;
5934 std::vector<TRect> rects;
5935 std::vector<Bitmap<T>*> vec;
5936 T def;
5937};
5938template<class T>
5939class LayerBitmap : public Bitmap<T>
5940{
5941public:
5942 LayerBitmap(T (*fptr)(T *,int), int sx, int sy, T def) : fptr(fptr), sx(sx), sy(sy), def(def) { }
5943 void Prepare() {
5944 int s = vec.size();
5945 for(int i=0;i<s;i++)
5946 {
5947 vec[i]->Prepare();
5948 }
5949 }
5950
5952 {
5953 vec.push_back(bm);
5954 }
5955 virtual int SizeX() const { return sx; }
5956 virtual int SizeY() const { return sy; }
5957 virtual T Map(int x, int y) const
5958 {
5959 int sz = vec.size();
5960 if (sz==0) return def;
5961 std::vector<T> v;
5962 for(int i=0;i<sz;i++)
5963 {
5964 v.push_back(vec[i]->Map(x,y));
5965 }
5966 T val = fptr(&v[0], sz);
5967 return val;
5968 }
5969private:
5970 T (*fptr)(T*,int);
5971 int sx,sy;
5972 std::vector<Bitmap<T>*> vec;
5973 T def;
5974};
5975
5976class LineIn2d2 : public Function<float,float> // x->y
5977{
5978public:
5979 LineIn2d2(Point2d p1, Point2d p2) : p1(p1), p2(p2) { }
5980 float Index(float x) const
5981 {
5982 float y = p1.y + (p2.y-p1.y)*(x-p1.x)/(p2.x-p1.x);
5983 return y;
5984 }
5985private:
5986 Point2d p1,p2;
5987};
5988#if 0
5989class ConstantFloatFunction : public Function<float,float>
5990{
5991public:
5992 ConstantFloatFunction(float y) : y(y) { }
5993 float Index(float) const { return y; }
5994private:
5995 float y;
5996};
5997#endif
5998
6000{
6001public:
6002 SplitLines2d(Line2dCollection &lines, Line2d split) : lines(lines), split(split) { }
6003 int Size() const { return vec.size(); }
6004 Line2d Index(int i) const
6005 {
6006 return vec[i];
6007 }
6008
6009 void Execute()
6010 {
6011 int size = lines.Size();
6012 vec.clear();
6013 for(int i=0;i<size;i++)
6014 {
6015 Line2d line = lines.Index(i);
6016 LineIn2d2 l(line.p1, line.p2);
6017 LineIn2d2 sp(split.p1, split.p2);
6018 if ((l.Index(line.p1.x) > sp.Index(line.p1.x) &&
6019 l.Index(line.p2.x) < sp.Index(line.p2.x))
6020 ||
6021 (l.Index(line.p1.x) < sp.Index(line.p1.x) &&
6022 l.Index(line.p2.x) > sp.Index(line.p2.x))
6023 )
6024 { // here we have the points in different side of the line
6025 Point2d splitpoint = IntersectLines(line,split);
6026 Line2d l1 = { line.p1, splitpoint };
6027 Line2d l2 = { splitpoint, line.p2 };
6028 vec.push_back(l1);
6029 vec.push_back(l2);
6030 }
6031 else
6032 {
6033 vec.push_back(line);
6034 }
6035 }
6036 }
6037
6038private:
6039 Line2dCollection &lines;
6040 Line2d split;
6041 std::vector<Line2d> vec;
6042};
6043
6044
6046{ // sorts points by y-coordinate
6047public:
6049 int Size() const { return coll.Size(); }
6050 Line2d Index(int i) const
6051 {
6052 Line2d l = coll.Index(i);
6053 if (l.p1.y > l.p2.y)
6054 {
6055 std::swap(l.p1.x,l.p2.x);
6056 std::swap(l.p1.y,l.p2.y);
6057 }
6058 return l;
6059 }
6060private:
6061 Line2dCollection &coll;
6062};
6063
6064class FilterLines : public Array<int,bool>
6065{ // requires sorted lines
6066public:
6067 FilterLines(Line2dCollection &coll, float y) : coll(coll), y(y) { }
6068 int Size() const
6069 {
6070 return coll.Size();
6071 }
6072 bool Index(int i) const
6073 {
6074 Line2d l = coll.Index(i);
6075 if (l.p1.y <= y && y <= l.p2.y)
6076 {
6077 return true;
6078 }
6079 return false;
6080 }
6081private:
6082 Line2dCollection &coll;
6083 float y;
6084};
6085
6086class Field : public Function<Point,float>
6087{
6088};
6089
6090class FieldBitmap : public Bitmap<float>
6091{
6092public:
6093 FieldBitmap(Field &f, Bitmap<Point> &pos) : f(f), pos(pos) { }
6095 {
6096 pos.Collect(vis);
6097 }
6098 void HeavyPrepare() { }
6099
6100 void Prepare() { pos.Prepare(); }
6101
6102 int SizeX() const { return pos.SizeX(); }
6103 int SizeY() const { return pos.SizeY(); }
6104 float Map(int x, int y) const { return f.Index(pos.Map(x,y)); }
6105private:
6106 Field &f;
6107 Bitmap<Point> &pos;
6108};
6109
6110
6111class DistanceField : public Field
6112{
6113public:
6114 DistanceField(Point center, float dist) : center(center), dist(dist) { }
6115 float Index(Point p) const
6116 {
6117 p -= center;
6118 float d = p.Dist();
6119 return std::abs(d-dist);
6120 }
6121private:
6122 Point center;
6123 float dist;
6124};
6125
6126class FindPositionFromCurve : public Element<float>
6127{ // finds position from curve where field=0.
6128public:
6129 FindPositionFromCurve(Field &field, CurveIn3d &curve) : field(field), curve(curve) { }
6130 float Elem() const
6131 {
6132 SolvableCompose<Point> solved(curve,field);
6133 float val = Solve(solved, 0.0, curve.Size());
6134 return val;
6135 }
6136
6137private:
6138 Field &field;
6139 CurveIn3d &curve;
6140};
6141
6142class ChessBoard : public Bitmap<bool>
6143{
6144public:
6145 ChessBoard(int sx, int sy, bool b) : sx(sx), sy(sy), b(b) { }
6147 {
6148 }
6149 void HeavyPrepare() { }
6150
6151 void Prepare() { }
6152
6153 virtual int SizeX() const { return sx; }
6154 virtual int SizeY() const { return sy; }
6155 virtual bool Map(int x, int y) const
6156 {
6157 bool bb = false;
6158 if (x & 1)
6159 {
6160 bb = !bb;
6161 }
6162 if (y & 1)
6163 {
6164 bb = !bb;
6165 }
6166 if (b)
6167 {
6168 bb = !bb;
6169 }
6170 return bb;
6171 }
6172private:
6173 int sx,sy;
6174 bool b;
6175};
6176
6177template<class K, class T>
6178class CollectBitmapsBitmap : public Bitmap<Bitmap<T>*>
6179{
6180public:
6182 const Function<K,Bitmap<T>* > &func)
6183 : bm(bm), func(func) { }
6184 void Prepare() { bm.Prepare(); }
6185
6186 int SizeX() const
6187 {
6188 return bm.SizeX();
6189 }
6190 int SizeY() const
6191 {
6192 return bm.SizeY();
6193 }
6194 Bitmap<T> *Map(int x, int y) const
6195 {
6196 return func.Index(bm.Map(x,y));
6197 }
6198private:
6199 const Bitmap<K> &bm;
6200 const Function<K, Bitmap<T>* > &func;
6201};
6202
6203template<class T>
6204class FlattenBitmap : public Bitmap<T>
6205{
6206public:
6207 FlattenBitmap(Bitmap<Bitmap<T>* > &bm) : bm(bm) { }
6208 void Prepare() { }
6209 int SizeX() const
6210 {
6211 return StartX(bm.SizeX());
6212 }
6213 int SizeY() const
6214 {
6215 return StartY(bm.SizeY());
6216 }
6217 T Map(int x, int y) const
6218 {
6219 int sizex = bm.SizeX();
6220 int posx = 0;
6221 int dx = 0;
6222 int kx = 0;
6223 for (int i=0;i<sizex;i++)
6224 {
6225 int oldposx = posx;
6226 posx = StartX(i);
6227 if (x < posx)
6228 {
6229 kx = i;
6230 dx = x - oldposx;
6231 break;
6232 }
6233 }
6234
6235 int sizey = bm.SizeY();
6236 int posy = 0;
6237 int dy = 0;
6238 int ky = 0;
6239 for (int i=0;i<sizey;i++)
6240 {
6241 int oldposy = posy;
6242 posy = StartY(i);
6243 if (y < posy)
6244 {
6245 ky = i;
6246 dy = y - oldposy;
6247 break;
6248 }
6249 }
6250 return bm.Map(kx,ky)->Map(dx,dy);
6251 }
6252 int StartX(int x) const
6253 {
6254 int sx = bm.SizeX();
6255 int sizex = 0;
6256 for(int i=0;i<sx;i++)
6257 {
6258 sizex += bm.Map(i,0)->SizeX();
6259 if (i == x) break;
6260 }
6261 return sizex;
6262 }
6263 int StartY(int y) const
6264 {
6265 int sy = bm.SizeY();
6266 int sizey = 0;
6267 for(int i=0;i<sy;i++)
6268 {
6269 sizey += bm.Map(0,i)->SizeY();
6270 if (i == y) break;
6271 }
6272 return sizey;
6273 }
6274private:
6275 Bitmap<Bitmap<T> *> &bm;
6276};
6277template<class K, class T>
6278class CombineBitmaps2 : public Bitmap<T>
6279{ // ideal for chessboard
6280public:
6281 CombineBitmaps2(const Bitmap<K> &bm, const Function<K, Bitmap<T>* > &func) : collect(bm, func), flatten(collect) { }
6283 {
6284 }
6285 void HeavyPrepare() { }
6286
6287 void Prepare() { }
6288 int SizeX() const { return flatten.SizeX(); }
6289 int SizeY() const { return flatten.SizeY(); }
6290 T Map(int x, int y) const { return flatten.Map(x,y); }
6291private:
6293 FlattenBitmap<T> flatten;
6294};
6295
6296class ChessBoardBitmap : public Bitmap<Color>, private Function<bool, Bitmap<Color>* >
6297{
6298public:
6299 ChessBoardBitmap(Color c1, Color c2, int sx, int sy, int ssx, int ssy) : white_bm(c1, sx,sy), black_bm(c2,sx,sy), bitmap_bool(ssx,ssy, true), combine(bitmap_bool, *this) { }
6301 void HeavyPrepare() { }
6302 void Prepare() { }
6303 Bitmap<Color> *Index(bool b) const
6304 {
6305 if (b) return &white_bm;
6306 return &black_bm;
6307 }
6308 int SizeX() const { return combine.SizeX(); }
6309 int SizeY() const { return combine.SizeY(); }
6310 Color Map(int x, int y) const { return combine.Map(x,y).second; }
6311private:
6312 mutable ConstantBitmap<Color> white_bm;
6313 mutable ConstantBitmap<Color> black_bm;
6314 ChessBoard bitmap_bool;
6316};
6317
6318
6320{
6321public:
6323 bool Frame(float time);
6324};
6325
6327{
6328public:
6330 void Init();
6331 bool Frame(float time);
6332private:
6333 RectangleElem e;
6334 SimpleTexCoords tex;
6335 FaceRenderCmds render;
6336 TextureCommands tex2;
6337 TransparencyCmds trans;
6338 ColorCmds col;
6339 DisplayListCmds disp;
6340
6341};
6342
6344{
6345public:
6347
6348 void Init();
6349 bool Frame(float time);
6351private:
6354 VBOState vbostate;
6355
6356 PieceShader shader;
6357 LinearInterpolationShader linshader;
6358 GouraudPiece phong;
6359};
6360
6362{
6363public:
6364 GraphEffect(Render *render) : FrameAnim(render) { }
6365
6366 void Init();
6367 bool Frame(float time);
6368private:
6369 VBOState vbostate;
6370 //VBOState vbostate2;
6371};
6372
6374{
6375public:
6376 ShaderEffect(ShaderFile &file, Render *r) : FrameAnim(r), seq(file) { }
6377 void Init();
6378 bool Frame(float time);
6379private:
6380 ShaderSeq seq;
6381 int s;
6382 VBOState vbostate;
6383};
6384
6386{
6387public:
6388 Effect2dEffect(ShaderFile &file, Render *r) : FrameAnim(r), seq(file) { }
6389 void Init();
6390 bool Frame(float time);
6391private:
6392 ShaderSeq seq;
6393 int s;
6394 VBOState vbostate;
6395};
6397{
6398public:
6399 Effect3dEffect(ShaderFile &file, Render *r) : FrameAnim(r), seq(file) { }
6401 void Init();
6402 bool Frame(float time);
6403private:
6404 ShaderSeq seq;
6405 int s;
6406 VBOState vbostate;
6407};
6408
6409#if 0
6410class IntersectAnim : public Anim
6411{
6412public:
6413 int NumFrames() const { return 5; }
6414 FaceCollection *Frame(int framenum) const
6415 {
6416 SphereElem *sphere1 = new SphereElem(10,10);
6417 SphereElem *sphere2 = new SphereElem(10,10);
6418 MatrixElem *s1 = new MatrixElem(*sphere1, Matrix::Scale(100,100,100)*Matrix::Translate(framenum,100.0,0.0));
6419 MatrixElem *s2 = new MatrixElem(*sphere2, Matrix::Scale(100,100,100));
6420 AndNotElem *anot = new AndNotElem(*s1,*s2);
6421 return anot;
6422 }
6423};
6424#endif
6425
6426class SizeBitmapTo2 : public Bitmap<Color>
6427{
6428public:
6431 {
6432 bm.Collect(vis);
6433 }
6434 void HeavyPrepare() { }
6435
6436 void Prepare() { bm.Prepare(); }
6437
6438 int SizeX() const
6439 {
6440 int a=1;
6441 int b=2;
6442 while(bm.SizeX() > b)
6443 {
6444 a <<= 1;
6445 b <<= 1;
6446 }
6447 return b;
6448 }
6449 int SizeY() const
6450 {
6451 int aa=1;
6452 int bb=2;
6453 while(bm.SizeY() > bb)
6454 {
6455 aa <<= 1;
6456 bb <<= 1;
6457 }
6458 return bb;
6459 }
6460 Color Map(int x, int y) const
6461 {
6462 if (x>=bm.SizeX()) return Color(0.0,0.0,0.0);
6463 if (y>=bm.SizeY()) return Color(0.0,0.0,0.0);
6464 return bm.Map(x,y);
6465 }
6466private:
6467 Bitmap<Color> &bm;
6468};
6469
6470void *thread_func_bitmap(void* data);
6471class BufferFromBitmap;
6472
6473#ifndef ARM
6474#ifdef THREADS
6482
6483
6485{
6486public:
6487 int push_thread(BufferFromBitmap* bm, int start_x, int end_x, int start_y, int end_y);
6488 void join(int id);
6490
6491
6492private:
6493 std::vector<BufferFromBitmap*> buffers;
6494 std::vector<ThreadInfo_bitmap*> ti;
6495};
6496#endif
6497#endif
6498
6499
6501{
6502public:
6503 MeshTexturesImpl(Bitmap<Color> &bm) : /*bm(bm),*/ bm2(bm), next(empty), ref(0) { bm.Prepare();}
6504 MeshTexturesImpl(Bitmap<Color> &bm, MeshTextures &tex) : /*bm(bm),*/ bm2(bm), next(tex), ref(0) { bm.Prepare(); }
6505 ~MeshTexturesImpl() { delete ref; }
6506 virtual int NumTextures() const { return 1+next.NumTextures(); }
6507 virtual void GenTexture(int num)
6508 {
6509 if (num == 0)
6510 {
6511 delete ref;
6512 ref = new BufferFromBitmap(bm2);
6513 // ref->Gen();
6514
6515#ifndef THREADS
6516 ref->Gen();
6517#else
6518 ref->GenPrepare();
6519
6520 int numthreads = 8;
6521 ThreadedUpdateTexture threads;
6522 int sx = bm2.SizeX();
6523 int sy = bm2.SizeY();
6524 int dsy = sy/numthreads + 1;
6525 std::vector<int> ids;
6526 for(int i=0;i<numthreads;i++)
6527 {
6528 int start_x = 0;
6529 int end_x = sx;
6530 int start_y = i*dsy;
6531 int end_y = (i+1)*dsy;
6532 if (start_y>sy) { start_y = sy; }
6533 if (end_y>sy) end_y = sy;
6534
6535 if (end_y-start_y > 0)
6536 ids.push_back(threads.push_thread(ref, start_x, end_x, start_y, end_y));
6537 }
6538 int ss = ids.size();
6539 for(int i=0;i<ss;i++)
6540 {
6541 threads.join(ids[i]);
6542 }
6543#endif
6544
6545 }
6546 }
6547 virtual BufferRef TextureBuf(int num) const { return ref->Buffer(); }
6548
6549private:
6550 //Bitmap<Color> &bm;
6551 SizeBitmapTo2 bm2;
6552 MeshTextures &next;
6554 BufferFromBitmap *ref;
6555};
6556
6557
6559{ // speed = in frames
6560public:
6561 ScrollableView(int viewsizex, int viewsizey,
6562 int wholesizex, int wholesizey,
6563 float speed)
6564 : vsx(viewsizex), vsy(viewsizey),
6565 wsx(wholesizex), wsy(wholesizey),
6566 speed(speed), current_time(0.0), current_x(0.0), current_y(0.0), target_time(-1.0) { }
6567
6568 float TargetRangeX() const { return wsx-vsx; }
6569 float TargetRangeY() const { return wsy-vsy; }
6570 void SetTargetPos(float x, float y)
6571 {
6572 //if (x < 0.0 || x > TargetRangeX()) return;
6573 //if (y < 0.0 || y > TargetRangeY()) return;
6574 target_x=x; target_y=y;
6575 float tx = current_x - target_x;
6576 float ty = current_y - target_y;
6577 float dist = sqrt(tx*tx+ty*ty);
6578 float time = dist*speed;
6579 target_time = current_time + time;
6580 }
6581 void Frame()
6582 {
6583 if (current_time < target_time)
6584 {
6585 Vector2d v = { target_x-current_x, target_y-current_y };
6586 float dist = v.Dist();
6587 if (dist > speed)
6588 {
6589 v/= dist;
6590 v*= speed;
6591 }
6592 else
6593 {
6594 /* do nothing */
6595 }
6596 current_x += v.dx;
6597 current_y += v.dy;
6598 }
6599 current_time += 1.0;
6600 }
6601 float PosX() const { return current_x; }
6602 float PosY() const { return current_y; }
6603 void SetSpeed(float s)
6604 {
6605 speed = s;
6606 SetTargetPos(target_x, target_y);
6607 }
6608private:
6609 int vsx, vsy;
6610 int wsx, wsy;
6611 float speed;
6612
6613 float current_time;
6614 float current_x, current_y;
6615 float target_x, target_y, target_time;
6616};
6617
6618void PrepareGrid(Bitmap<Color> &bm, int cellsx, int cellsy, ArrayRender &rend);
6619void RenderGrid(Bitmap<Pos> &bm, float x, float y, int cellsx, int cellsy, ArrayRender &rend, int start_x, int start_y, int size_x, int size_y);
6620
6621
6622template<class T>
6624{
6625public:
6626 virtual T SpaceMap(Point p) const=0;
6627};
6628template<class T>
6630{
6631public:
6632 virtual T SpaceMap(Point2d p) const=0;
6633};
6634
6635class MoveMap : public Space<Point>
6636{
6637public:
6638 MoveMap(Vector v) : v(v) { }
6639 Point SpaceMap(Point p) const { return p+v; }
6640private:
6641 Vector v;
6642};
6643
6644class PhongSpace : public Space<float>
6645{ // vector from origo to normal
6646public:
6647 PhongSpace(Point viewer, Point light, int count) : viewer(viewer), light(light), count(count) { }
6648 float SpaceMap(Point normal) const
6649 {
6650 Point p = viewer + Vector(light);
6651 //p.Normalize();
6652 //normal.Normalize();
6653 float col = Vector::DotProduct(normal, p);
6654 for(int i=0;i<count;i++)
6655 col *= col;
6656 return col;
6657 }
6658private:
6659 Point viewer;
6660 Point light;
6661 int count;
6662};
6663
6664template<class T>
6666{
6667public:
6668 virtual T PairMap(Point p1, Point p2) const=0;
6669};
6670template<class T>
6672{
6673public:
6674 virtual T PairMap(Point2d p1, Point2d p2) const=0;
6675};
6676
6677
6678class PointSplitSpace : public Space<std::pair<Point,Point> >
6679{
6680public:
6681 PointSplitSpace(Vector v1, Vector v2) : v1(v1), v2(v2) { }
6682 std::pair<Point,Point> SpaceMap(Point p) const
6683 {
6684 return std::make_pair(p+v1, p+v2);
6685 }
6686private:
6687 Vector v1,v2;
6688};
6689
6690class PointPairSpace2d : public PairSpace2d<Point2d>
6691{
6692public:
6693 PointPairSpace2d(Vector2d v1_dir, Vector2d v2_dir) : v1(v1_dir), v2(v2_dir) { }
6695 {
6696 Point2d pp1 = { p1.x+v1.dx, p1.y+v1.dy };
6697 Line2d l1 = { p1, pp1 };
6698 Point2d pp2 = { p2.x+v2.dx, p2.y+v2.dy };
6699 Line2d l2 = { p1, pp2 };
6700 Point2d inter = IntersectLines(l1,l2);
6701 return inter;
6702 }
6703private:
6704 Vector2d v1,v2;
6705};
6706
6707
6708class TextureCoordBitmap : public Bitmap<Point2d>
6709{
6710};
6711class ZBitmap : public Bitmap<int>
6712{
6713};
6714
6715template<class T>
6717{
6718public:
6719 // alfa = [0..360]
6720 virtual T AMap(float alfa, float s) const=0;
6721};
6722
6723template<class T>
6725{
6726public:
6727 // alfa = [0..2pi]
6728 // beta = [0..pi]
6729 virtual T SMap(float alfa, float beta) const=0;
6730};
6731
6732class SphereDist : public Bitmap<float>
6733{ // distance from bitmap to sphere surface
6734public:
6735 SphereDist(Point center, float r, int sx, int sy, Point2d tl, Point2d br) : center(center), /*r(r),*/ sx(sx), sy(sy), tl(tl), br(br) { }
6736 void Prepare() { }
6737
6738 int SizeX() const { return sx; }
6739 int SizeY() const { return sy; }
6740 float Map(int x, int y) const
6741 {
6742 float xx = float(x)/sx;
6743 float yy = float(y)/sy;
6744 xx*= br.x - tl.x;
6745 yy*= br.y - tl.y;
6746 xx+=tl.x;
6747 yy+=tl.y;
6748 return xx*xx+yy*yy;
6749 }
6750private:
6751 Point center;
6752 //float r;
6753 int sx, sy;
6754 Point2d tl,br;
6755};
6756
6758{
6759public:
6760 GridEffect2(Render *rend2) : FrameAnimPlugins(rend2), rend(g_low), scr(1024, 768, 500*10, 500*11, 1.0) { }
6761 void Init();
6762 bool Frame(float time);
6763 virtual float RotSpeed() const { return 0.0; }
6764private:
6765 ArrayRender rend;
6766 ScrollableView scr;
6767};
6768
6769class BitmapSprite : public Sprite
6770{
6771public:
6772 BitmapSprite(Bitmap<Color> &c, Point2d pos) : c(c), pos(pos) { c.Prepare(); }
6773 virtual int NumFrames() const { return 1; }
6774 virtual int XSize(int frame) const { return c.SizeX(); }
6775 virtual int YSize(int frame) const { return c.SizeY(); }
6776 virtual Point2d Pos(int frame) const { return pos; }
6777 virtual Color Pixel(int frame, int x, int y) const { return c.Map(x,y); }
6778private:
6779 Bitmap<Color> &c;
6780 Point2d pos;
6781};
6782
6783class ArraySprite : public Sprite
6784{
6785public:
6786 ArraySprite(Sprite **array, int count) : array(array), count(count) { }
6788 {
6789 int count = 0;
6790 int sum = 0;
6791 int f = 0;
6792 int k = 0;
6793 int frames = count;
6794 for(int i=0;i<frames;i++,k++)
6795 {
6796 int oldsum = sum;
6797 int c = array[i]->NumFrames();
6798 sum += c;
6799 for(int s=0;s<c;s++)
6800 {
6801 if (f%10==0) {
6802 std::cout << "ArraySprite: " << f << "/" << frames << std::endl;
6803 }
6804 cache.push_back(f-oldsum);
6805 num.push_back(k);
6806 f++;
6807 }
6808 }
6809 }
6810 virtual int NumFrames() const
6811 {
6812 int counter = 0;
6813 for(int i=0;i<count;i++)
6814 {
6815 counter += array[i]->NumFrames();
6816 }
6817 return counter;
6818 }
6819 virtual int XSize(int frame) const
6820 {
6821#if 1
6822 return array[num[frame]]->XSize(cache[frame]);
6823#endif
6824#if 0
6825 int counter = 0;
6826 for(int i=0;i<count;i++)
6827 {
6828 int oldcount = counter;
6829 counter += array[i]->NumFrames();
6830 if (counter > frame) { return array[i]->XSize(frame-oldcount); }
6831 }
6832 return 0;
6833#endif
6834 }
6835 virtual int YSize(int frame) const
6836 {
6837#if 1
6838 return array[num[frame]]->YSize(cache[frame]);
6839#endif
6840#if 0
6841 int counter = 0;
6842 for(int i=0;i<count;i++)
6843 {
6844 int oldcount = counter;
6845 counter += array[i]->NumFrames();
6846 if (counter > frame) { return array[i]->YSize(frame-oldcount); }
6847 }
6848 return counter;
6849#endif
6850 }
6851 virtual Point2d Pos(int frame) const
6852 {
6853#if 1
6854 return array[num[frame]]->Pos(cache[frame]);
6855#endif
6856#if 0
6857 int counter = 0;
6858 for(int i=0;i<count;i++)
6859 {
6860 int oldcount = counter;
6861 counter += array[i]->NumFrames();
6862 if (counter > frame) { return array[i]->Pos(frame-oldcount); }
6863 }
6864 Point2d p = { 0.0, 0.0 };
6865 return p;
6866#endif
6867 }
6868 virtual Color Pixel(int frame, int x, int y) const
6869 {
6870#if 1
6871 return array[num[frame]]->Pixel(cache[frame],x,y);
6872#endif
6873
6874#if 0
6875 int counter = 0;
6876 for(int i=0;i<count;i++)
6877 {
6878 int oldcount = counter;
6879 counter += array[i]->NumFrames();
6880 if (counter > frame) { return array[i]->Pixel(frame-oldcount, x,y); }
6881 }
6882 return Color(0,0,0);
6883#endif
6884 }
6885private:
6886 Sprite **array;
6887 int count;
6888 std::vector<int> cache;
6889 std::vector<int> num;
6890};
6891
6892
6893class VertexArraySet;
6894void TexturePrepare(const Sprite &s, ArrayRender &rend, bool progress, bool textrender=false);
6895void TextureEnable(ArrayRender &rend, int frame, bool enable);
6896void PrepareSprite(const Sprite &s, ArrayRender &rend);
6897void PrepareSpriteToVA(const Sprite &s, VertexArraySet &vas);
6898
6899void RenderSprite(const Sprite &s, int frame, Point2d pos, float z, ArrayRender &rend, Program *prog);
6900void RenderSprite(const Sprite &s, int frame, Point2d pos, float z, ArrayRender &rend, float mult_x, float mult_y, Program *prog);
6901void RenderSprite(const Sprite &s, int frame, Point2d pos1, Point2d pos2, Point2d pos1_inside, Point2d pos2_inside, float z, ArrayRender &rend, Program *prog);
6902
6903extern int sprite_screen_width;
6904extern int sprite_screen_height;
6905extern int sprite_target_width;
6906extern int sprite_target_height;
6907
6908class SpriteMesh : public Mesh
6909{
6910public:
6911 SpriteMesh(const Sprite &s) : s(s) { }
6912 virtual int NumStates() const { return 0; }
6913 virtual int StateNum(int frame, int face) const { return 0; }
6914
6915
6916 virtual int NumFrames() const { return s.NumFrames(); }
6917 virtual int NumFaces(int framenum) const { return 1; }
6918 virtual int NumPoints() const { return 4; }
6919 virtual Point FacePoint(int framenum, int statenum, int face, int point) const
6920 {
6921 int sx = s.XSize(framenum);
6922 int sy = s.YSize(framenum);
6927 switch(point)
6928 {
6929 case 0: return Point(0.0,0.0, 0.0);
6930 case 1: return Point(sx, 0.0, 0.0);
6931 case 2: return Point(sx, sy, 0.0);
6932 case 3: return Point(0.0, sy, 0.0);
6933 };
6934 return Point(0.0,0.0,0.0);
6935 }
6936private:
6937 const Sprite &s;
6938};
6939
6941{
6942public:
6943 SpriteTexCoords(const Sprite &s) : s(s) { }
6944 virtual int NumFrames() const { return s.NumFrames(); }
6945 virtual Point2d TexCoord(int framenum, int statenum, int face, int point) const
6946 {
6947 int sx = 1.0; //s.XSize(framenum);
6948 int sy = 1.0; //s.YSize(framenum);
6949 //std::cout << "Tex: " << sx << " " << sy << std::endl;
6950 switch(point)
6951 {
6952 case 0: return Point2d::NewPoint(0.0,0.0);
6953 case 1: return Point2d::NewPoint(sx, 0.0);
6954 case 2: return Point2d::NewPoint(sx, sy);
6955 case 3: return Point2d::NewPoint(0.0, sy);
6956 };
6957 return Point2d::NewPoint(0.0,0.0);
6958 }
6959private:
6960 const Sprite &s;
6961};
6962
6963
6964class Data
6965{
6966public:
6967 void insert(int id, void *data) { m[id]=data; }
6968 void *fetch(int id) { return m[id]; }
6969private:
6970 std::map<int, void*> m;
6971};
6972
6973
6974void PrepareCube(const Bitmap<Range<float> > &bm_alternatives,
6975 Point pos, Vector u_x, Vector u_y, Vector u_z,
6976 ArrayRender &rend, Data &d, int id);
6978 const Matrix &pos,
6979 ArrayRender &rend, Data &d, int id);
6980
6981
6982class Mandelbrot : public Bitmap<int>
6983{
6984public: // good values are x=[-2..1], y=[-1,1]
6985 Mandelbrot(bool julia, float start_x, float end_x, float start_y, float end_y, int sx, int sy, int count, float xx, float yy) : julia(julia), start_x(start_x), end_x(end_x), start_y(start_y), end_y(end_y),sx(sx), sy(sy), count(count), xx(xx), yy(yy) { }
6987 {
6988 }
6989 void HeavyPrepare() { }
6990
6991 void Prepare() { }
6992 int SizeX() const { return sx; }
6993 int SizeY() const { return sy; }
6994 int Map(int x, int y) const
6995 {
6996 if (julia)
6997 {
6998 Point2d z;
6999 z.x = start_x + x*(end_x-start_x)/sx;
7000 z.y = start_y + y*(end_y-start_y)/sy;
7001 Point2d C;
7002 C.x = xx;
7003 C.y = yy;
7004 return RecRec(count, z,C);
7005 }
7006 else
7007 {
7008 Point2d z;
7009 z.x = xx;
7010 z.y = yy;
7011 Point2d C;
7012 C.x = start_x + x*(end_x-start_x)/sx;
7013 C.y = start_y + y*(end_y-start_y)/sy;
7014 return RecRec(count, z,C);
7015 }
7016 }
7017private:
7018 Point2d Rec(Point2d z, Point2d C) const
7019 {
7020 return Add(Mul(z,z), C);
7021 }
7022 int RecRec(int count, Point2d z, Point2d C) const
7023 {
7024 int i=0;
7025 for(;i<count;i++)
7026 {
7027 z = Rec(z,C);
7028 if (Dist2(z)>2.0*2.0)
7029 return i;
7030 }
7031 return i;
7032 }
7033 float Dist2(Point2d p1) const
7034 {
7035 return p1.x*p1.x+p1.y*p1.y;
7036 }
7037 Point2d Add(Point2d p1, Point2d p2) const
7038 {
7039 Point2d r;
7040 r.x = p1.x+p2.x;
7041 r.y = p1.y+p2.y;
7042 return r;
7043 }
7044 Point2d Mul(Point2d p1, Point2d p2) const
7045 {
7046 Point2d r;
7047 r.x = p1.x*p2.x-p1.y*p2.y;
7048 r.y = p1.x*p2.y+p1.y*p2.x;
7049 return r;
7050 }
7051
7052private:
7053 bool julia;
7054 float start_x, end_x;
7055 float start_y, end_y;
7056 int sx,sy;
7057 int count;
7058 float xx,yy;
7059};
7060
7062{
7063public:
7064 MandelbrotVolume(bool julia, int count, float yy) : julia(julia), count(count),yy(yy) { }
7065 virtual bool Inside(Point v) const {
7066 // xyz={-300.0 .. 300.0}
7067 Vector vv = v;
7068 vv/=300.0f;
7069 // -1.0 .. 1.0
7070 vv.dx *= 1.5f;
7071 // x = { -1.5 .. 1.5 }
7072 vv.dx -= 0.5f;
7073 // x = { -2.0 .. 1.0 }
7074 vv.dz *= 2.0f;
7075 // z={ -2.0 .. 2.0 }
7076 vv.dz -=2.0;
7077 vv.dz *=6.0/4.0;
7078 vv.dz +=4.0;
7079 // z={-4.0 .. 2.0 }
7080 Mandelbrot brot(julia, vv.dx, vv.dx, vv.dy,vv.dy, 1,1, count, vv.dz, yy);
7081 int count2 = brot.Map(0,0);
7082 return count2>count-1;
7083 }
7084private:
7085 bool julia;
7086 int count;
7087 float yy;
7088};
7089
7090
7091class MapBitmapToColor : public Bitmap<Color>
7092{
7093public:
7094 MapBitmapToColor(int value1, int value2,
7095 Color c1, Color c2,
7096 Bitmap<int> &bm)
7097 : value1(value1), value2(value2),
7098 c1(c1), c2(c2), bm(bm)
7099 {
7100 }
7102 {
7103 bm.Collect(vis);
7104 }
7105 void HeavyPrepare() { }
7106 void Prepare() { bm.Prepare(); }
7107
7108 int SizeX() const { return bm.SizeX(); }
7109 int SizeY() const { return bm.SizeY(); }
7110 Color Map(int x, int y) const
7111 {
7112 float val = (float)bm.Map(x,y);
7113 if (val<value1) val=value1;
7114 if (val>value2) val=value2;
7115 val -= float(value1);
7116 val /= float(value2-value1);
7117 //float f = float(val-value1)/(value2-value1);
7118 return Color::Interpolate(c1,c2, 1.0-val);
7119 }
7120
7121private:
7122 int value1, value2;
7123 Color c1,c2;
7124 Bitmap<int> &bm;
7125};
7126
7127class Heightmap2 : public Array<Pos, Quad>
7128{
7129public:
7130 Heightmap2(Point center, Vector u_x, Vector u_y, int sx, int sy) : center(center), u_x(u_x), u_y(u_y), sx(sx), sy(sy) { }
7131 Pos Size() const
7132 {
7133 Pos p;
7134 p.x = sx-1;
7135 p.y = sy-1;
7136 return p;
7137 }
7138 Quad Index(Pos p) const
7139 {
7140 int x1 = p.x;
7141 int y1 = p.y;
7142 int x2 = p.x + 1;
7143 int y2 = p.y + 1;
7144 Point p11 = center + x1*u_x + y1*u_y;
7145 Point p21 = center + x2*u_x + y1*u_y;
7146 Point p12 = center + x1*u_x + y2*u_y;
7147 Point p22 = center + x2*u_x + y2*u_y;
7148 Quad q;
7149 q.p1 = p11;
7150 q.p2 = p21;
7151 q.p3 = p22;
7152 q.p4 = p12;
7153 return q;
7154 }
7155private:
7156 Point center;
7157 Vector u_x, u_y, v;
7158 int sx,sy;
7159 //int maxval;
7160};
7161
7162#if 0
7163class RectSplitter
7164{
7165public:
7166 virtual int Count() const=0;
7167 virtual void SetParent(TRect parent)=0;
7168 virtual TRect GetRect() const=0;
7169 virtual Color GetPixel(Point2d p) const=0;
7170 virtual RectSplitter *Splitter(int val) const=0;
7171protected:
7172 bool InsideRect(TRect r, Point2d p)
7173 {
7174 if (p.x < r.x) return false;
7175 if (p.y < r.y) return false;
7176 if (p.x > r.x+r.width) return false;
7177 if (p.y > t.y+r.height) return false;
7178 return true;
7179 }
7180};
7181class BitmapRectSplitter : public RectSplitter
7182{
7183public:
7184 BitmapRectSplitter(ContinuousBitmap<Color> &vals) : vals(vals) { vals.Prepare(); }
7185 virtual int Count() const { return 1; }
7186 virtual Rect Rects(int val, Rect parent) const
7187 {
7188 return parent;
7189 }
7190 Color Pixel(int val, Rect pos, Point2d p) const
7191 {
7192 if (InsideRect(pos,p))
7193 {
7194 p.x -= pos.x;
7195 p.y -= pos.y;
7196 p.x/=pos.width;
7197 p.y/=pos.height;
7198 p.x*=vals.SizeX();
7199 p.y*=vals.SizeY();
7200 return vals.Map(p.x,p.y);
7201 }
7202 return Color(0,0,0,0);
7203 }
7204private:
7205 ContinuousBitmap<Color> &vals;
7206};
7207class PosRectSplitter : public RectSplitter
7208{
7209public:
7210 PosRectSplitter(RectDelta *array, int size) : array(array), size(size) { }
7211
7212private:
7213 RectDelta *array;
7214 int size;
7215};
7216#endif
7217
7218
7220{
7221public:
7226 tex.Collect(vis);
7227 }
7228 void HeavyPrepare() { }
7229
7230 virtual void Prepare() { SurfaceIn3dImpl::Prepare(); tex.Prepare(); }
7231 virtual unsigned int Color(float x, float y) const
7232 {
7233 if (x<0.0 || y<0.0) { return 0x00000000; }
7234 float sx = XSize();
7235 float sy = YSize();
7236 x/=sx;
7237 y/=sy;
7238 x*=tex.SizeX();
7239 y*=tex.SizeY();
7240 //std::cout << "Color:" << x << " " << y << std::endl;
7241 unsigned int cl = tex.Map(x,y).Pixel();
7242 //std::cout << "Color: " << cl << std::endl;
7243 return cl;
7244 }
7245
7246private:
7248};
7249
7250#if 0
7251class BitmapSphere : public SurfaceIn3d
7252{
7253public:
7254 BitmapSphere(ContinuousBitmap<float> &bm, Point center, float radius0, float radius1) : bm(bm), center(center), radius0(radius0), radius1(radius1) { bm.Prepare(); }
7255 void Collect(CollectVisitor &vis) { }
7256 void HeavyPrepare() { }
7257
7258 Point Index(float x, float y) const
7259 {
7260 Matrix m = Matrix::XRotation(x)*Matrix::YRotation(y);
7261 float xx = x*bm.SizeX()/(2.0*3.14159);
7262 float yy = y*bm.SizeY()/3.14159;
7263 float value = bm.Map(xx,yy);
7264 Vector v = Vector(0.0,0.0,radius0*(1.0-value)+radius1*value);
7265 Vector pp = v*m;
7266 return center+pp;
7267 }
7268 virtual float XSize() const { return 2.0*3.14159; }
7269 virtual float YSize() const { return 3.14159; }
7270 virtual Vector Normal(float x, float y) const
7271 {
7272 Vector vx = Index(x+0.01,y)-Index(x,y);
7273 Vector vy = Index(x,y+0.01)-Index(x,y);
7274 return -Vector::CrossProduct(vx,vy);
7275 }
7276 virtual Point2d Texture(float x, float y) const { Point2d p = { 0,0 }; return p; }
7277 virtual float Attrib(float x, float y, int id) const
7278 {
7279 return 0.0;
7280 }
7281 virtual int AttribI(float x, float y, int id) const { return 0; }
7282 virtual unsigned int Color(float x, float y) const { return 0; }
7283
7284private:
7285 ContinuousBitmap<float> &bm;
7286 Point center;
7287 float radius0, radius1;
7288};
7289#endif
7290
7291#if 0
7292class ContinuousColorBitmapToFloatBitmap : public ContinuousBitmap<float>
7293{
7294public:
7295 ContinuousColorBitmapToFloatBitmap(ContinuousBitmap<Color> &bm) : bm(bm) { }
7296 void Collect(CollectVisitor &vis) { bm.Collect(vis); }
7297 void HeavyPrepare() { }
7298
7299 void Prepare() { bm.Prepare(); }
7300
7301 virtual float SizeX() const { return bm.SizeX(); }
7302 virtual float SizeY() const { return bm.SizeY(); }
7303 virtual float Map(float x, float y) const
7304 {
7305 Color c = bm.Map(x,y);
7306 float val = (c.r+c.b+c.g)/3/255.0;
7307 return val;
7308 }
7309private:
7310 ContinuousBitmap<Color> &bm;
7311};
7312#endif
7313
7314#if 0
7315class HeightMap3Data : public Bitmap<float>
7316{
7317public:
7318 void Collect(CollectVisitor &vis) { }
7319 void HeavyPrepare() { }
7320};
7321class HeightMap3DataImpl : public HeightMap3Data
7322{
7323public:
7324 HeightMap3DataImpl(Bitmap<Color> &c) : c(c) { }
7325 void Prepare() { c.Prepare(); }
7326
7327 int SizeX() const { return c.SizeX(); }
7328 int SizeY() const { return c.SizeY(); }
7329 float Map(int x, int y) const
7330 {
7331 Color cc = c.Map(x,y);
7332 int val = (cc.r + cc.g + cc.b)/3;
7333 float vv = float(val)/255.0;
7334 return vv;
7335 }
7336private:
7337 Bitmap<Color> &c;
7338};
7339
7340class HeightMap3 : public Mesh
7341{
7342public:
7343 HeightMap3(Bitmap<float> &bm,
7344 float min_val, float max_val,
7345 Point p,
7346 Vector u_x,
7347 Vector u_y, // u_y is the function's value
7348 Vector u_z) : bm(bm), /*min_val(min_val), max_val(max_val),*/
7349 p(p), u_x(u_x), u_y(u_y), u_z(u_z), cached_face(-1)
7350 {
7351 bm.Prepare();
7352 float start_x = 0.0;
7353 float start_y = 0.0;
7354 float start_z = 0.0;
7355 float end_x = 0.0;
7356 float end_y = 0.0;
7357 float end_z = 0.0;
7358 Point p111(start_x, start_y, start_z);
7359 Point p112(start_x, start_y, end_z);
7360 Point p121(start_x, end_y, start_z);
7361 Point p122(start_x, end_y, end_z);
7362 Point p211(end_x, start_y, start_z);
7363 Point p212(end_x, start_y, end_z);
7364 Point p221(end_x, end_y, start_z);
7365 Point p222(end_x, end_y, end_z);
7366
7367 elem = new CubeElem(p111,p112,p121,p122,
7368 p211,p212,p221,p222);
7369 }
7370 int NumStates() const { return 1; }
7371 int StateNum(int,int) const { return 0; }
7372 virtual int NumFrames() const { return 1; }
7373 virtual int NumFaces(int framenum) const { return bm.SizeX()*bm.SizeY()*elem->NumFaces(); }
7374 virtual int NumPoints() const
7375 {
7376 return elem->NumPoints(0);
7377 }
7378 virtual Point FacePoint(int framenum, int statenum, int face, int point) const
7379 {
7380 int z = face / (bm.SizeX()*bm.SizeY());
7381 if (cached_face != face)
7382 {
7383 int ddz = face - z*(bm.SizeX()*bm.SizeY());
7384 int y = ddz / bm.SizeX();
7385 int ddy = ddz - y*bm.SizeX();
7386 int x = ddy;
7387 float val = bm.Map(x,y);
7388
7389 Point tl = Pos(x,val,y);
7390 //Point br = Pos(x+1,val,y+1);
7391 //Point tla = Pos(x,0,y);
7392 Point bra = Pos(x+1,0,y+1);
7393 float start_x = tl.x;
7394 float start_y = tl.y;
7395 float start_z = tl.z;
7396 float end_x = bra.x;
7397 float end_y = bra.y;
7398 float end_z = bra.z;
7399
7400 Point p111(start_x, start_y, start_z);
7401 Point p112(start_x, start_y, end_z);
7402 Point p121(start_x, end_y, start_z);
7403 Point p122(start_x, end_y, end_z);
7404 Point p211(end_x, start_y, start_z);
7405 Point p212(end_x, start_y, end_z);
7406 Point p221(end_x, end_y, start_z);
7407 Point p222(end_x, end_y, end_z);
7408
7409 delete elem;
7410 elem = new CubeElem(p111,p112,p121,p122,
7411 p211,p212,p221,p222);
7412 cached_face = face;
7413
7414 }
7415 return elem->FacePoint(z,point);
7416 }
7417
7418 Point Pos(int x, float y, int z) const
7419 {
7420 Point pos = p + float(x)*u_x/bm.SizeX() + y*u_y + float(z)*u_z/bm.SizeY();
7421 return pos;
7422 }
7423
7424private:
7425 Bitmap<float> &bm;
7426 mutable CubeElem *elem;
7427 //float min_val, max_val;
7428 Point p;
7429 Vector u_x, u_y, u_z;
7430 mutable int cached_face;
7431};
7432#endif
7433class Visitor;
7434struct Loop
7435{
7438 void visit(Visitor &v);
7440};
7441
7442
7444{
7445public:
7446 virtual void visit(bool &b)=0;
7447 virtual void visit(int &a)=0; // 0
7448 virtual void visit(float &b)=0; // 1
7449 virtual void visit(Point2d &p)=0; // 2
7450 virtual void visit(Point &p)=0; //3
7451 virtual void visit(VectorArray<Loop> *array)=0; // 4
7452 virtual void visit(VectorArray<Point2d> *array)=0; // 5
7453};
7454
7455
7457{
7458public:
7459 SizePosVisitor() : off(0) { }
7460 virtual void visit(bool &b)
7461 {
7462 offset.push_back(off); size.push_back(sizeof(bool));
7463 off += sizeof(bool);
7464 type.push_back(6);
7465 }
7466 virtual void visit(int &a)
7467 { offset.push_back(off); size.push_back(sizeof(int)); off += sizeof(int); type.push_back(0); }
7468 virtual void visit(float &b)
7469 { offset.push_back(off); size.push_back(sizeof(float)); off+= sizeof(float); type.push_back(1); }
7470 virtual void visit(Point2d &p)
7471 { offset.push_back(off); size.push_back(sizeof(Point2d)); off+=sizeof(Point2d);type.push_back(2); }
7472 virtual void visit(Point &p)
7473 { offset.push_back(off); size.push_back(sizeof(Point)); off+=sizeof(Point); type.push_back(3); }
7474 virtual void visit(VectorArray<Loop> *array)
7475 {
7476 offset.push_back(off); size.push_back(sizeof(VectorArray<Loop>*));
7477 off+=sizeof(VectorArray<Loop>*);
7478 type.push_back(4);
7479 }
7480 virtual void visit(VectorArray<Point2d> *array)
7481 {
7482 std::cout << array << std::endl;
7483 std::cout << this << std::endl;
7484 offset.push_back(off); size.push_back(sizeof(VectorArray<Point2d>*));
7485 off+=sizeof(VectorArray<Point2d>*);
7486 type.push_back(5);
7487 }
7488
7489public:
7490 int Offset(int i) const { return offset[i]; }
7491 int Size(int i) const { return size[i]; }
7492 int Type(int i) const { return type[i]; }
7493private:
7494 std::vector<int> offset;
7495 std::vector<int> size;
7496 std::vector<int> type;
7497 int off;
7498};
7499
7500class WriteVisitor : public Visitor
7501{
7502public:
7503 WriteVisitor(char *currentptr, int size) : currentptr(currentptr) /*, size(size) */{ }
7504 virtual void visit(int &a)
7505 { int *ptr = (int*)currentptr; a = *ptr; currentptr+=sizeof(int); }
7506 virtual void visit(float &b)
7507 { float *ptr = (float*)currentptr; b = *ptr; currentptr+=sizeof(float); }
7508 virtual void visit(Point2d &p)
7509 { Point2d *ptr = (Point2d*)currentptr; p = *ptr; currentptr+=sizeof(Point2d); }
7510 virtual void visit(Point &p)
7511 { Point *ptr = (Point*)currentptr; p = *ptr; currentptr+=sizeof(Point); }
7512 //virtual void visit(Array<int,int> &array) { }
7513 //{ int *ptr = (int*)currentptr; a = *ptr; currentptr+=sizeof(int); }
7514 //virtual void visit(Array<int,float> &array) { }
7515 //{ int *ptr = (int*)currentptr; a = *ptr; currentptr+=sizeof(int); }
7516private:
7517 char *currentptr;
7518 //int size;
7519};
7520
7522{
7523 std::vector<Point> vec;
7524};
7526{
7527 std::vector<Point2d> vec;
7528};
7529
7530
7531#if 0
7532class Parser2 {
7533public:
7534 Parser2() : currentptr(0), size(0) { }
7535 int ParseInt(std::string s, bool &success);
7536 int ParseEnum(std::string *strings, int size, std::string s, bool &success);
7537 bool ParseBool(std::string s, bool &success);
7538 float ParseFloat(std::string s, bool &success);
7539 Point2d ParsePoint2d(std::string s, bool &success);
7540 Point ParsePoint(std::string s, bool &success);
7541 template<class T>
7542 VectorArray<T> *ParseArray(std::string s, bool &success);
7543 template<class T>
7544 T ParseStruct(std::string s, bool &success);
7545
7546 Loop ParseLoop(std::string s, bool &success)
7547 {
7548 Loop l = ParseStruct<Loop>(s,success);
7549 return l;
7550 }
7551 Path3d ParsePath3d(std::string s, bool &success);
7552 Path2d ParsePath2d(std::string s, bool &success);
7553public: // these parse without {}'s.
7554 template<class T>
7555 T ParseStruct2(std::string s, bool &success);
7556 template<class T>
7557 VectorArray<T> *ParseArray2(std::string s, bool &success);
7558private:
7559 template<class T>
7560 T *Alloc()
7561 {
7562 //delete[] currentptr;
7563 T *obj = new T;
7564 currentptr = (char*)obj;
7565 //currentptr = new char[sizeof(T)];
7566 //new(currentptr)T;
7567 size = sizeof(T);
7568 return obj;
7569 }
7570private:
7571 char *currentptr;
7572 int size;
7573};
7574#endif
7575
7576#if 0
7577template<class T>
7578class TypeTraits
7579{
7580};
7581template<>
7582class TypeTraits<int>
7583{
7584public:
7585 typedef int (Parser2::*fptrtype)(std::string, bool &);
7586 static fptrtype fptr;
7587};
7588
7589
7590template<>
7591class TypeTraits<bool>
7592{
7593public:
7594 typedef bool (Parser2::*fptrtype)(std::string, bool &);
7595 static fptrtype fptr;
7596};
7597
7598#endif
7599
7600
7601#if 0
7602template<>
7603class TypeTraits<float>
7604{
7605public:
7606 typedef float (Parser2::*fptrtype)(std::string, bool &);
7607 static fptrtype fptr;
7608 //float (Parser2::*fptr)(std::string, bool &) = &Parser2::ParseFloat;
7609};
7610
7611template<>
7612class TypeTraits<Point2d>
7613{
7614public:
7615 typedef Point2d (Parser2::*fptrtype)(std::string, bool &);
7616 static fptrtype fptr;
7617
7618 //Point2d (Parser2::*fptr)(std::string, bool &) = &Parser2::ParsePoint2d;
7619};
7620
7621template<>
7622class TypeTraits<Loop>
7623{
7624public:
7625 typedef Loop (Parser2::*fptrtype)(std::string, bool &);
7626 static fptrtype fptr;
7627
7628 //Point2d (Parser2::*fptr)(std::string, bool &) = &Parser2::ParsePoint2d;
7629};
7630
7631#endif
7632
7633#if 0
7634template<>
7635class TypeTraits<Point>
7636{
7637public:
7638 Point (Parser2::*fptr)(std::string, bool &) = &Parser2::ParsePoint;
7639};
7640template<>
7641class TypeTraits<Array<int,int> >
7642{
7643};
7644template<>
7645class TypeTraits<Array<int,float> >
7646{
7647};
7648#endif
7649
7650
7651#if 0
7652class ParseInterface
7653{
7654public:
7655 virtual void* Parse(std::string s, bool &success)=0;
7656};
7657template<class T>
7658class ParseInterfaceImpl : public ParseInterface
7659{
7660public:
7661 ParseInterfaceImpl(T (Parser2::*fptr)(std::string, bool &)) : fptr(fptr) { }
7662 void *Parse(std::string s, bool &success)
7663 {
7664 t = fptr(s, success);
7665 return &t;
7666 }
7667private:
7668 T (Parser2::*fptr)(std::string, bool &);
7669 void *res;
7670 T t;
7671};
7672#endif
7673
7674
7676{
7677 float x,y,z,k;
7678 int a,b,c,d;
7680 {
7681 v.visit(x);
7682 v.visit(y);
7683 v.visit(z);
7684 v.visit(k);
7685 v.visit(a);
7686 v.visit(b);
7687 v.visit(c);
7688 v.visit(d);
7689 }
7690};
7691class Parser2;
7692void Write(Parser2 *p, char *c, int size, int type, std::string s, bool &success)
7693;
7694std::string WhiteSpace(std::string s);
7695
7696int Find(std::string s, char c);
7697
7698void DumpMem(const char *c, int size);
7699
7700
7701#if 0
7702template<class T>
7703T Parser2::ParseStruct2(std::string s_, bool &success)
7704{
7705 std::cout << "ParseStruct2: '" << s_ << "'" << std::endl;
7706
7707 std::string s = WhiteSpace(s_);
7708
7709 SizePosVisitor sizepos;
7710
7711 T *ptr = Alloc<T>();
7712 ptr->init();
7713 ptr->visit(sizepos);
7714
7715 int pos = Find(s,',');
7716 if (pos==-1)
7717 {
7718 std::cout << "ParseStruct2 find fail" << std::endl;
7719 success = false;
7720 return T();
7721 }
7722 int i = 0;
7723 char *cp = currentptr;
7724 std::string snd;
7725 while(pos != -1)
7726 {
7727 std::string fst = s.substr(0,pos);
7728 snd = s.substr(pos+1, s.length()-pos-1);
7729 pos = Find(snd, ',');
7730 int type = sizepos.Type(i);
7731 std::cout << "Write type: " << type << std::endl;
7732 Write(this, cp, sizepos.Size(i), type, fst, success);
7733 if (!success) { std::cout << "ParseStruct2 Write fail" << std::endl; return T(); }
7734 cp+=sizepos.Size(i);
7735 std::cout << "Advance by:" << sizepos.Size(i) << std::endl;
7736 //TypeTraits<Type>::fptr
7737 i++;
7738 s = snd;
7739 }
7740 int type = sizepos.Type(i);
7741 std::cout << "Write type2: " << type << std::endl;
7742 Write(this, cp, sizepos.Size(i), type, snd, success);
7743 cp+=sizepos.Size(i);
7744 std::cout << "Advance by2:" << sizepos.Size(i) << std::endl;
7745 std::cout << "Type: " << typeid(T).name() << std::endl;
7746 if (cp != currentptr+sizeof(T))
7747 {
7748 //std::cout << std::hex << (void*)cp << " " << std::dec << sizeof(T) << std::hex << " " << (void*)currentptr << std::dec << std::endl;
7749 std::cout << "Struct Alignment problem" << std::endl;
7750 }
7751 DumpMem(currentptr, sizeof(T));
7752 return *(T*)currentptr;
7753}
7754#endif
7755
7756#if 0
7757template<class T>
7758T Parser2::ParseStruct(std::string s_, bool &success)
7759{
7760 std::cout << "ParseStruct: '" << s_ << "'" << std::endl;
7761
7762 std::string s = WhiteSpace(s_);
7763
7764 if (s.length()<3) { std::cout << "ParseStruct length<3 fail: '" << s << "'" << std::endl; success = false; return T(); }
7765 if (s[0]=='{' && s[s.length()-1]=='}')
7766 {
7767 std::string ss = s.substr(1, s.length()-2);
7768 T t = ParseStruct2<T>(ss, success);
7769 return t;
7770 }
7771 else
7772 {
7773 std::cout << "ParseStruct {} fail" << std::endl;
7774 success = false;
7775 return T();
7776 }
7777}
7778template<class T>
7779VectorArray<T> *Parser2::ParseArray(std::string s_, bool &success)
7780{
7781 std::cout << "ParseArray: '" << s_ << "'" << std::endl;
7782 std::string s = WhiteSpace(s_);
7783
7784 if (s.length()<3) { success = false; return 0; }
7785 if (s[0]=='{' && s[s.length()-1]=='}')
7786 {
7787 std::string ss = s.substr(1, s.length()-2);
7788 VectorArray<T> *t = ParseArray2<T>(ss, success);
7789 return t;
7790 }
7791 else
7792 {
7793 std::cout << "ParseArray {} fail" << std::endl;
7794 success = false;
7795 return 0;
7796 }
7797}
7798
7799template<class T>
7800VectorArray<T> *Parser2::ParseArray2(std::string s_, bool &success)
7801{
7802 std::cout << "ParseArray2: '" << s_ << "'" << std::endl;
7803 std::string s = WhiteSpace(s_);
7804
7805 T (Parser2::*fptr)(std::string, bool &) = TypeTraits<T>::fptr;
7806 int pos = Find(s,',');
7807 if (pos == -1)
7808 {
7809 T t = (this->*fptr)(s, success);
7810 if (!success) { std::cout << "ParseArray2 fail" << std::endl; return 0; }
7811 VectorArray<T> *vec = Alloc<VectorArray<T> >();
7812 vec->push_back(t);
7813 return vec;
7814 }
7815 std::string sbegin = s.substr(0,pos);
7816 std::string send = s.substr(pos+1, s.length()-1-pos);
7817 T t = (this->*fptr)(sbegin, success);
7818 if (!success) { std::cout << "ParseArray2 fail2" << std::endl; success = false; return 0; }
7819 VectorArray<T> *lst = ParseArray2<T>(send, success);
7820 if (!success) { std::cout << "ParseArray2 fail3" << std::endl; success = false; return 0; }
7821
7822 lst->push_back(t);
7823 success = true;
7824 return lst;
7825}
7826#endif
7827
7829
7830//
7831// New interpolation for timing stuff
7832//
7833
7834class IWaveform : public Function<float,float>
7835{
7836public:
7837 virtual float Start() const=0;
7838 virtual float End() const=0;
7839 virtual float Min() const=0;
7840 virtual float Max() const=0;
7841 virtual float Index(float val) const=0;
7842};
7843
7844class IWaveFormArray : public Array<int, IWaveform*>
7845{
7846public:
7847 virtual float Map(float x) const=0;
7848};
7850{
7851public:
7852 IDynWaveArray(float (*fptr)(float,float)) : fptr(fptr) { }
7853 void push_back(IWaveform *wave) { vec.push_back(wave); }
7854
7855 IWaveform* Index(int val) const
7856 {
7857 return vec[val];
7858 }
7859 float Map(float x) const
7860 {
7861 int s=vec.size();
7862 std::vector<IWaveform*> waves;
7863 for(int i=0;i<s;i++)
7864 {
7865 IWaveform *w = vec[i];
7866 if (x < w->Start()) continue;
7867 if (x > w->End()) continue;
7868 waves.push_back(w);
7869 }
7870 int s2 = waves.size();
7871 float val = vec[0]->Index(x);
7872 for(int i=1;i<s2;i++)
7873 {
7874 IWaveform *w1 = vec[i];
7875 float f1 = w1->Index(x);
7876 val = fptr(val, f1);
7877 }
7878 return val;
7879 }
7880private:
7881 //float start, end, min,max;
7882 std::vector<IWaveform*> vec;
7883 float (*fptr)(float,float);
7884};
7885
7886class IWaveArrayArray : public Array<int, IWaveFormArray*>
7887{
7888public:
7889};
7890
7892{
7893public:
7894 void push_back(IWaveFormArray* wave) { vec.push_back(wave); }
7895
7896 IWaveFormArray* Index(int val) const
7897 {
7898 return vec[val];
7899 }
7900 float Map(int y, float x) const
7901 {
7902 return vec[y]->Map(x);
7903 }
7904private:
7905 std::vector<IWaveFormArray*> vec;
7906};
7907
7908// 2 -> ZxZ -> AxB -> Ax(Z)B
7909template<class A, class B, class Z>
7910class BitmapPullback : public Function<std::pair<A,B>, bool>
7911{
7912public:
7914 Function<A,Z> &f,
7915 Function<B,Z> &g) : Zz(Zz),f(f),g(g) { }
7916 bool Index(std::pair<A,B> p) const
7917 {
7918 A a = p.first;
7919 B b = p.second;
7920 Z aa = f.Index(a);
7921 Z bb = g.Index(b);
7922 return Zz.Map(aa,bb);
7923 }
7924private:
7927 Function<B, Z> &g;
7928};
7929
7930
7931class IntDiagonalBitmap : public ContinuousBitmap2<int, bool>
7932{
7933public:
7934 IntDiagonalBitmap(int sx, int sy) : sx(sx), sy(sy) { }
7935 virtual int SizeX() const { return sx; }
7936 virtual int SizeY() const { return sy; }
7937 virtual bool Map(int x, int y) const
7938 {
7939 return x==y;
7940 }
7941private:
7942 int sx, sy;
7943};
7944
7945class DiagonalBitmap : public ContinuousBitmap2<float, bool>
7946{
7947public:
7948 DiagonalBitmap(float sx, float sy, float acc=0.001) : sx(sx), sy(sy), acc(acc) { }
7949 virtual float SizeX() const { return sx; }
7950 virtual float SizeY() const { return sy; }
7951 virtual bool Map(float x, float y) const
7952 {
7953 return fabs(x-y)<acc;
7954 }
7955private:
7956 float sx,sy,acc;
7957};
7958
7959template<class A, class B>
7961{
7962public:
7963 Subset(Array<int, A> &enumeration,
7964 Function<A,B> &subsetfunc,
7965 Function<B,bool> &characteristic) : enumeration(enumeration), subsetfunc(subsetfunc), characteristic(characteristic) { }
7966 void HeavyLoop() {
7967 int s = enumeration.Size();
7968 for(int i=0;i<s;i++)
7969 {
7970 A a = enumeration.Index(i);
7971 B b = subsetfunc.Index(a);
7972 bool bb = characteristic(b);
7973 if (bb) vec_true.push_back(a);
7974 else vec_false.push_back(a);
7975 }
7976 }
7977public:
7978 std::vector<A> vec_true;
7979 std::vector<A> vec_false;
7980
7981private:
7982 Array<int,A> &enumeration;
7983 Function<A,B> &subsetfunc;
7984 Function<B,bool> &characteristic;
7985};
7986
7987template<class A, class B, class AA, class BB>
7988class BitmapIntersection : public Bitmap<bool>
7989{
7990public:
7992 Array<int,B> &enum2,
7993 Function<A,AA> &subset1,
7994 Function<B,BB> &subset2,
7995 Function<AA,bool> &char1,
7996 Function<BB,bool> &char2) : enum1(enum1),
7997 enum2(enum2),
7998 subset1(subset1),
7999 subset2(subset2),
8000 char1(char1),
8001 char2(char2) { }
8002public:
8003 int SizeX() const { return enum1.Size(); }
8004 int SizeY() const { return enum2.Size(); }
8005 bool Map(int x, int y) const
8006 {
8007 A a = enum1.Index(x);
8008 B b = enum2.Index(y);
8009 AA aa = subset1.Index(a);
8010 BB bb = subset2.Index(b);
8011 bool ba = char1.Index(aa);
8012 bool bm = char1.Index(bb);
8013 return ba&&bm;
8014 }
8015private:
8016 Array<int,A> &enum1;
8017 Array<int,B> &enum2;
8018 Function<A,AA> &subset1;
8019 Function<B,BB> &subset2;
8020 Function<AA,bool> &char1;
8021 Function<BB,bool> &char2;
8022};
8023
8024template<class T>
8025class BitmapEnumeration : public Array<int,std::pair<int,int> >
8026{
8027public:
8028 BitmapEnumeration(Bitmap<T> &bm) : bm(bm) {bm.Prepare(); }
8029 int Size() const
8030 {
8031 return bm.SizeX()*bm.SizeY();
8032 }
8033 std::pair<int,int> Index(int i) const
8034 {
8035 int sx = bm.SizeX();
8036 int iy = i/sx;
8037 int ix = i-(sx*iy);
8038 return std::make_pair(ix,iy);
8039 }
8040private:
8041 Bitmap<T> &bm;
8042};
8043
8044template<class A>
8045class BitmapSubset : public Function<std::pair<int,int>, A>
8046{
8047public:
8048 BitmapSubset(Bitmap<A> &bm) : bm(bm) {bm.Prepare(); }
8049 A Index(std::pair<int,int> p) const
8050 {
8051 return bm.Map(p.first,p.second);
8052 }
8053private:
8054 Bitmap<A> &bm;
8055};
8056
8057class Sphere : public Function<Point,bool>
8058{
8059public:
8060 Sphere(Point center, float radius) : center(center), radius(radius) { }
8061 bool Index(Point p) const
8062 {
8063 p-=center;
8064 return p.x*p.x+p.y*p.y+p.z*p.z<radius*radius;
8065 }
8066 float Radius() const { return radius; }
8067 Point Center() const { return center; }
8068private:
8069 Point center;
8070 float radius;
8071};
8072#if 0
8073template<class T, class A, class B, class AB>
8074class Intersection
8075{
8076public:
8077
8078};
8079
8080#endif
8081
8082
8083class RenderPolyToBitmap : public Bitmap<Color>
8084{
8085public:
8086 RenderPolyToBitmap(Point2d center_in_bm, Point center, int sx, int sy, FaceCollection *coll, Bitmap<Color> &bg) : center(center), sx(sx), sy(sy), coll(coll),bg(bg) { }
8087 void Prepare() { bg.Prepare(); coll->Prepare(); }
8088
8089 virtual int SizeX() const { return sx; }
8090 virtual int SizeY() const { return sy; }
8091 virtual Color Map(int x, int y) const
8092 {
8093 x -= center_in_bm.x;
8094 y -= center_in_bm.y;
8095 int faces = coll->NumFaces();
8096 for(int f=0;f<faces;f++)
8097 {
8098 int points = coll->NumPoints(f);
8099 DynPointCollection2d pointcol;
8100 for(int p=0;p<points;p++)
8101 {
8102 Point pos = coll->FacePoint(f,p);
8103 pos+=Vector(center);
8104 Point2d p2 = Perspective(pos);
8105 pointcol.push_back(p2);
8106 }
8107 while(points<4) { pointcol.push_back(pointcol.Index(points-1)); points++; }
8108 TriangleContinuousBitmap bm(sx,sy, pointcol.Index(0), pointcol.Index(1), pointcol.Index(2));
8109 TriangleContinuousBitmap bm2(sx,sy,pointcol.Index(0), pointcol.Index(2), pointcol.Index(3));
8110 bool b = bm.Map(x,y);
8111 bool b2 = bm2.Map(x,y);
8112 if (!b && !b2) return bg.Map(x,y);
8113 int i1,i2,i3;
8114 if (b) {
8115 i1=0;i2=1;i3=2;
8116 } else {
8117 i1=0;i2=2;i3=3;
8118 }
8119 TriangleCoordsContinuousBitmap color_val_r(sx,sy, pointcol.Index(i1),pointcol.Index(i2),pointcol.Index(i3), Color(coll->Color(f,i1)).r, Color(coll->Color(f,i2)).r, Color(coll->Color(f,i3)).r);
8120 TriangleCoordsContinuousBitmap color_val_g(sx,sy, pointcol.Index(i1),pointcol.Index(i2),pointcol.Index(i3), Color(coll->Color(f,i1)).g, Color(coll->Color(f,i2)).g, Color(coll->Color(f,i3)).g);
8121 TriangleCoordsContinuousBitmap color_val_b(sx,sy, pointcol.Index(i1),pointcol.Index(i2),pointcol.Index(i3), Color(coll->Color(f,i1)).b, Color(coll->Color(f,i2)).b, Color(coll->Color(f,i3)).b);
8122 TriangleCoordsContinuousBitmap color_val_a(sx,sy, pointcol.Index(i1),pointcol.Index(i2),pointcol.Index(i3), Color(coll->Color(f,i1)).alpha, Color(coll->Color(f,i2)).alpha, Color(coll->Color(f,i3)).alpha);
8123
8124 TriangleCoordsContinuousBitmap tex_val_tx(sx,sy, pointcol.Index(i1), pointcol.Index(i2), pointcol.Index(i3), coll->TexCoord(f,i1).x, coll->TexCoord(f,i2).x, coll->TexCoord(f,i3).x);
8125 TriangleCoordsContinuousBitmap tex_val_ty(sx,sy, pointcol.Index(i1), pointcol.Index(i2), pointcol.Index(i3), coll->TexCoord(f,i1).y, coll->TexCoord(f,i2).y, coll->TexCoord(f,i3).y);
8126
8127 return TexMap(f, color_val_r.Map(x,y), color_val_g.Map(x,y),
8128 color_val_b.Map(x,y), color_val_a.Map(x,y),
8129 tex_val_tx.Map(x,y), tex_val_ty.Map(x,y));
8130 }
8131 Color c;
8132 return c;
8133 }
8134 virtual Color TexMap(int face, float r, float g, float b, float a, float tx, float ty) const
8135 {
8136 int tex = coll->FaceTexture(face);
8137 if (tex==-1)
8138 return Color(r,g,b,a);
8139 else
8140 {
8141 BufferRef texture = coll->TextureBuf(tex);
8142 return Color::Interpolate(Color(r,g,b,a), Color(texture.buffer[(int)tx+((int)ty)*texture.ydelta]), 0.5);
8143 }
8144 }
8145 virtual Point2d Perspective(Point p) const
8146 {
8147 Point2d pp = { p.x, p.y };
8148 return pp;
8149 }
8150private:
8151 Point2d center_in_bm;
8152 Point center;
8153 int sx,sy;
8154 FaceCollection *coll;
8155 Bitmap<Color> &bg;
8156};
8157
8158//
8159// Texture support
8160//
8162{
8163public:
8164 virtual int SizeX() const { return 0; }
8165 virtual int SizeY() const { return 0; }
8166 virtual Color Map(int x, int y) const { return Color::Transparent(); }
8167 virtual int AreaCount() const { return 0; }
8168 virtual int Id(int i) const { return 0; }
8169 virtual Point2d AreaS(int i) const { Point2d p; p.x = 0.0; return p; }
8170 virtual Point2d AreaE(int i) const { Point2d p; p.x = 0.0; return p; }
8171 virtual ~TextureI() { }
8172};
8173
8174class TextureIBitmap : public Bitmap<Color>
8175{
8176public:
8177 TextureIBitmap(TextureI &ti) : ti(ti) { }
8179 void HeavyPrepare() { }
8180 void Prepare() { }
8181
8182 virtual int SizeX() const { return ti.SizeX(); }
8183 virtual int SizeY() const { return ti.SizeY(); }
8184 virtual Color Map(int x, int y) const { return ti.Map(x,y); }
8185private:
8186 TextureI &ti;
8187};
8188
8189class TexPlane : public TextureI
8190{
8191public:
8192 TexPlane(int sx, int sy) : sx(sx), sy(sy) { }
8193 virtual int SizeX() const { return sx; }
8194 virtual int SizeY() const { return sy; }
8195 virtual Color Map(int x, int y) const { return Color::Transparent(); }
8196private:
8197 int sx,sy;
8198};
8199
8200class TexBitmap : public TextureI
8201{
8202public:
8203 TexBitmap(Bitmap<Color> &bm) : bm(bm) { bm.Prepare(); }
8204 virtual int SizeX() const { return bm.SizeX(); }
8205 virtual int SizeY() const { return bm.SizeY(); }
8206 virtual Color Map(int x, int y) const { return bm.Map(x,y); }
8207private:
8208 Bitmap<Color> &bm;
8209};
8210
8211class TexAssign : public TextureI
8212{
8213public:
8214 TexAssign(TextureI &next, int id, int x, int y, Bitmap<Color> &bm)
8215 : next(next), id(id), x(x), y(y), bm(bm) { bm.Prepare(); }
8216
8217 virtual int SizeX() const { return next.SizeX(); }
8218 virtual int SizeY() const { return next.SizeY(); }
8219 virtual Color Map(int x, int y) const
8220 {
8221 int s = AreaCount();
8222 for(int i=0;i<s;i++)
8223 {
8224 Point2d p1 = AreaS(i);
8225 Point2d p2 = AreaE(i);
8226 if (x<p1.x) continue;
8227 if (y<p1.y) continue;
8228 if (x>=p2.x) continue;
8229 if (y>=p2.y) continue;
8230 return bm.Map(x-p1.x,y-p1.y);
8231 }
8232 return next.Map(x,y);
8233 }
8234 virtual int AreaCount() const { return next.AreaCount()+1; }
8235 virtual int Id(int i) const
8236 {
8237 if (i==0) { return id; }
8238 return next.Id(i-1);
8239 }
8240 virtual Point2d AreaS(int i) const
8241 {
8242 if (i==0) {
8243 Point2d p;
8244 p.x = (float)x;
8245 p.y = (float)y;
8246 return p;
8247 }
8248 return next.AreaS(i-1);
8249 }
8250 virtual Point2d AreaE(int i) const {
8251 if (i==0) {
8252 Point2d p;
8253 p.x = (float)(x+bm.SizeX());
8254 p.y = (float)(y+bm.SizeY());
8255 return p;
8256 }
8257 return next.AreaS(i-1);
8258 }
8259
8260private:
8261 TextureI &next;
8262 int id;
8263 int x,y;
8264 Bitmap<Color> &bm;
8265};
8266
8268{
8269public:
8270 TextureITexCoord(TextureI &next, int id, int x, int y, int width, int height)
8271 : next(next), id(id), x(x), y(y), width(width), height(height) { }
8272 virtual int SizeX() const { return next.SizeX(); }
8273 virtual int SizeY() const { return next.SizeY(); }
8274 virtual Color Map(int x, int y) const { return next.Map(x,y); }
8275
8276 virtual int AreaCount() const { return next.AreaCount()+1; }
8277 virtual int Id(int i) const
8278 {
8279 if (i==0) { return id; }
8280 return next.Id(i-1);
8281 }
8282 virtual Point2d AreaS(int i) const
8283 {
8284 if (i==0) {
8285 Point2d p;
8286 p.x = (float)x;
8287 p.y = (float)y;
8288 return p;
8289 }
8290 return next.AreaS(i-1);
8291 }
8292 virtual Point2d AreaE(int i) const {
8293 if (i==0) {
8294 Point2d p;
8295 p.x = (float)(x+width);
8296 p.y = (float)(y+height);
8297 return p;
8298 }
8299 return next.AreaS(i-1);
8300 }
8301private:
8302 TextureI &next;
8303 int id;
8304 int x; int y;
8305 int width; int height;
8306};
8307
8308
8309//
8310// PLANE
8311//
8313{
8314public:
8315 virtual ~PlanePoints2d() { }
8316 virtual float SizeX() const=0;
8317 virtual float SizeY() const=0;
8318 virtual int Size() const=0;
8319 virtual Point2d Map(int i) const=0;
8320 //virtual Point2d Map2(int i) const=0;
8322 virtual PlanePointsType Type(int i) const { if (i==0) return EMove; else return ELineTo; }
8323};
8324
8325#if 0
8326class FloodFillBorder : public PlanePoints2d
8327{
8328public:
8329 FloodFillBorder(Bitmap<bool> &bm, int x, int y) :bm(bm), x(x),y(y) { }
8330 void run() {
8331 }
8332 virtual float SizeX() const { return bm.SizeX(); }
8333 virtual float SizeY() const { return bm.SizeY(); }
8334 virtual int Size() const { return vec.size(); }
8335 virtual Point2d Map(int i) const { return vec[i]; }
8336
8337private:
8338 Bitmap<bool> &bm;
8339 int x,y;
8340 std::vector<Point2d> vec;
8341};
8342
8343#endif
8344
8345//
8346// FBO
8347//
8348
8349//
8350// FRAMEBUFFER OBJECTS
8351//
8352class FBO : public Bitmap<Color>
8353{
8354public:
8355 void Prepare() { }
8356
8357 virtual int SizeX() const { return sx; }
8358 virtual int SizeY() const { return sy; }
8359 virtual Color Map(int x, int y) const
8360 {
8361 if (x>=0&&x<sx)
8362 if (y>=0&&y<sy)
8363 return ref.buffer[x+y*ref.ydelta];
8364 return Color::Transparent();
8365 }
8366 FBO(int sx, int sy);
8368 void bind();
8369 void unbind();
8370 void update(); // swapbuffers
8371private:
8372 unsigned int ids[1];
8373 unsigned int rbo[1];
8374 BufferRef ref;
8375 int sx,sy;
8376};
8377
8379{
8380public:
8381 BitmapVolume(Bitmap<bool> *b, float dist) : b(b), dist(dist) { b->Prepare(); }
8382 virtual bool Inside(Point v) const {
8383 if (b->Map(v.x,v.y) && v.z>0.0 && v.z<dist)
8384 {
8385 return true;
8386 }
8387 return false;
8388 }
8389private:
8390 Bitmap<bool> *b;
8391 float dist;
8392};
8393
8395{
8396public:
8397 virtual ~Layout() { }
8398 virtual int count() const=0;
8399 virtual TRect get(int i) const=0;
8400};
8401#if 0
8402class SplitXYLayout : public Layout
8403{
8404public:
8405 SplitXYLayout(Layout &l, int id, int num_x, int num_y) : l(l), id(id), num_x(num_x), num_y(num_y) { }
8406 virtual int count() const { return num_x*num_y; }
8407 virtual TRect get(int i) const
8408 {
8409 int xx = i/num_y;
8410 int yy = i-xx*num_y;
8411 TRect r = l.get(id);
8412 r.width /= num_x;
8413 r.height /= num_y;
8414 r.x += r.width*xx;
8415 r.y += r.height*yy;
8416 return r;
8417 }
8418private:
8419 Layout &l;
8420 int id;
8421 int num_x, num_y;
8422};
8423
8424class CenterLayout : public Layout
8425{
8426public:
8427 CenterLayout(Layout &l, int id, int cx, int cy) : l(l), id(id), cx(cx), cy(cy) { }
8428 virtual int count() const { return 1; }
8429 virtual TRect get(int i) const
8430 {
8431 TRect r = l.get(id);
8432 int ccx = r.x+r.width/2;
8433 int ccy = r.y+r.height/2;
8434 r.x = ccx-cx;
8435 r.y = ccy-cy;
8436 r.width = cx;
8437 r.height = cy;
8438 return r;
8439 }
8440
8441private:
8442 Layout &l;
8443 int id;
8444 int cx,cy;
8445};
8446
8447class ArrayLayout : public Layout
8448{
8449public:
8450 ArrayLayout(Layout **layout, int *id, int size) : layout(layout), id(id), size(size) { }
8451 virtual int count() const { return size; }
8452 virtual TRect get(int i) const
8453 {
8454 TRect r = layout[i]->get(id[i]);
8455 return r;
8456 }
8457private:
8458 Layout **layout;
8459 int *id;
8460 int size;
8461};
8462
8463class MarginLayout : public Layout
8464{
8465public:
8466 MarginLayout(Layout &l, int id, int lx, int rx, int ty, int by) : l(l), id(id), lx(lx), rx(rx), ty(ty), by(by) { }
8467 virtual int count() const { return 1; }
8468 virtual TRect get(int i) const
8469 {
8470 TRect r = l.get(id);
8471 r.x+=lx;
8472 r.y+=ty;
8473 r.width-=rx+lx;
8474 r.height-=by+ty;
8475 return r;
8476 }
8477private:
8478 Layout &l;
8479 int id;
8480 int lx;
8481 int rx;
8482 int ty;
8483 int by;
8484};
8485
8486class SplitLayoutY : public Layout
8487{
8488public:
8489 SplitLayoutY(Layout &l, int id, int num) : l(l), id(id), num(num) { }
8490 virtual int count() const { return num; }
8491 virtual TRect get(int i) const
8492 {
8493 TRect p = l.get(id);
8494 float k = p.height/num;
8495 p.y+=k*i;
8496 p.height = k;
8497 return p;
8498 }
8499private:
8500 Layout &l;
8501 int id;
8502 int num;
8503};
8504
8505class SplitLayoutX : public Layout
8506{
8507public:
8508 SplitLayoutX(Layout &l, int id, int num) : l(l), id(id), num(num) { }
8509 virtual int count() const { return num; }
8510 virtual TRect get(int i) const
8511 {
8512 TRect p = l.get(id);
8513 float k = p.width/num;
8514 p.x+=k*i;
8515 p.width = k;
8516 return p;
8517 }
8518private:
8519 Layout &l;
8520 int id;
8521 int num;
8522};
8523
8524
8525
8526class RootLayout : public Layout
8527{
8528public:
8529 RootLayout(int sx, int sy) : sx(sx),sy(sy) { }
8530 virtual int count() const { return 1; }
8531 virtual TRect get(int i) const
8532 {
8533 TRect r;
8534 r.x = 0;
8535 r.y = 0;
8536 r.width = sx;
8537 r.height= sy;
8538 return r;
8539 }
8540private:
8541 int sx,sy;
8542};
8543#endif
8544
8545class Draw
8546{
8547public:
8548 virtual int type() const=0;
8549 virtual Point2d topleft() const=0;
8550 virtual Point2d bottomright() const=0;
8551 virtual int propcount() const=0;
8552 virtual std::string propname(int i) const=0;
8553 virtual std::string proptype(int i) const=0;
8554 virtual void* probvalue(int i) const=0;
8555
8556 virtual int ArrayCount() const=0;
8557 virtual Draw* ArrayIndex(int i) const=0;
8558
8559 virtual int AlArrayCount() const=0;
8560 virtual Draw* AlArrayIndex(int i) const=0;
8561};
8562#if 0
8563
8564class DrawScroll : public Draw
8565{
8566public:
8567 DrawScroll(Draw &next, int delta_x, int delta_y) : next(next), delta_x(delta_xx), delta_y(delta_y) { }
8568 virtual int type() const { return next.type(); }
8569 virtual Point2d topleft() const { return next.topleft(); }
8570 virtual Point2d bottomright() const { return next.bottomright(); }
8571 virtual int propcount() const { return next.propcount(); }
8572 virtual std::string propname(int i) const { return next.propname(i); }
8573 virtual std::string proptype(int i) const { return next.proptype(i); }
8574 virtual void* propvalue(int i) const { return next.propvalue(i); }
8575
8576 virtual int ArrayCount() const { return next.ArrayCount(); }
8577 virtual Draw* ArrayIndex(int i) const
8578 {
8579 return next.ArrayIndex(i);
8580 }
8581
8582 virtual int AlArrayCount() const { return next.AlArrayCount(); }
8583 virtual Draw* AlArrayIndex(int i) const
8584 {
8585 reutrn next.AlArrayIndex(i);
8586 }
8587private:
8588 Draw &next;
8589 int delta_x, delta_y;
8590};
8591#if 0
8592class DrawEmpty : public Draw
8593{
8594public:
8595 DrawEmpty(int type, Point2d tl, Point2d br) : type(type), tl(tl), br(br) { }
8596 virtual int type() const { return type; }
8597 virtual Point2d topleft() const { return tl; }
8598 virtual Point2d bottomright() const { return br; }
8599 virtual int propcount() const { return 0; }
8600 virtual std::string propname(int i) const { return ""; }
8601 virtual std::string proptype(int i) const { return ""; }
8602 virtual void* probvalue(int i) const { return 0; }
8603
8604 virtual int ArrayCount() const { return 0; }
8605 virtual Draw* ArrayIndex(int i) const { return 0; }
8606
8607 virtual int AlArrayCount() const { return 0; }
8608 virtual Draw* AlArrayIndex(int i) const { return 0; }
8609private:
8610 int type;
8611 Point2d tl,br;
8612};
8613#endif
8614
8615#if 0
8616template<class T>
8617class DrawPropTrait { };
8618template<>
8619class DrawPropTrait<float> { static const std::string s = "float"; };
8620template<>
8621class DrawPropTrait<int> { static const std::string s = "int"; };
8622
8623template<class T>
8624class DrawProp : public Draw
8625{
8626public:
8627 DrawProp(Draw &next, std::string name, T t) : next(next), name(name), type(DrawPropTrait<T>::s), t(t) { }
8628 virtual int type() const { return next.type(); }
8629 virtual Point2d topleft() const { return next.topleft(); }
8630 virtual Point2d bottomright() const { return next.bottomright(); }
8631
8632 virtual int propcount() const { return next.propcount()+1; }
8633 virtual std::string propname(int i) const
8634 {
8635 if (i==0) return name; else return next.propname(i-1);
8636 }
8637 virtual std::string proptype(int i) const
8638 {
8639 if (i==0) return type; else return next.proptype(i-1);
8640 }
8641 virtual void* probvalue(int i) const
8642 {
8643 if (i==0) return &t; else return next.propvalue(i-1);
8644 }
8645 virtual int ArrayCount() const { return next.ArrayCount(); }
8646 virtual Draw* ArrayIndex(int i) const { return next.ArrayIndex(i); }
8647
8648 virtual int AlArrayCount() const { return next.AlArrayCount(); }
8649 virtual Draw* AlArrayIndex(int i) const { return next.AlArrayIndex(i); }
8650
8651private:
8652 Draw &next;
8653 std::string name;
8654 std::string type;
8655 T t;
8656};
8657#endif
8658
8659class DrawArray : public Draw
8660{
8661public:
8662 DrawArray(Draw &next, Draw *array, int size) : next(next) { }
8663 virtual int type() const { return next.type(); }
8664 virtual Point2d topleft() const { return next.topleft(); }
8665 virtual Point2d bottomright() const { return next.bottomright(); }
8666 virtual int propcount() const { return next.propcount(); }
8667 virtual std::string propname(int i) const { return next.propname(i); }
8668 virtual std::string proptype(int i) const { return next.proptype(i); }
8669 virtual void* probvalue(int i) const { return next.propvalue(i); }
8670
8671 virtual int ArrayCount() const { return size; }
8672 virtual Draw* ArrayIndex(int i) const { return &array[i]; }
8673
8674 virtual int AlArrayCount() const { return next.AlArrayCount(); }
8675 virtual Draw* AlArrayIndex(int i) const { return next.AlArrayIndex(i); }
8676private:
8677 Draw &next;
8678 Draw *array;
8679 int size;
8680};
8681
8682class DrawAlArray : public Draw
8683{
8684public:
8685 DrawAlArray(Draw &next, Draw *array, int size) : next(next) { }
8686 virtual int type() const { return next.type(); }
8687 virtual Point2d topleft() const { return next.topleft(); }
8688 virtual Point2d bottomright() const { return next.bottomright(); }
8689 virtual int propcount() const { return next.propcount(); }
8690 virtual std::string propname(int i) const { return next.propname(i); }
8691 virtual std::string proptype(int i) const { return next.proptype(i); }
8692 virtual void* probvalue(int i) const { return next.propvalue(i); }
8693
8694 virtual int ArrayCount() const { return next.ArrayCount(); }
8695 virtual Draw* ArrayIndex(int i) const { return next.ArrayIndex(i); }
8696
8697 virtual int AlArrayCount() const { return size; }
8698 virtual Draw* AlArrayIndex(int i) const { return &array[i]; }
8699private:
8700 Draw &next;
8701 Draw *array;
8702 int size;
8703};
8704#endif
8705
8706
8708{
8709public:
8711 virtual float distance(Point p) const=0;
8712 virtual unsigned int color(Point p) const=0;
8713 virtual Vector normal(Point p) const=0;
8714 //virtual std::string shader() const { return ""; }
8715 //virtual int varnum() const {return 0; }
8716};
8717
8718
8719
8720#if 0
8721class SpacePoints : public PointsApiPoints
8722{
8723public:
8724 SpacePoints(VolumeObject &v, Point p, Vector u_x, Vector u_y, Vector u_z,
8725 int sx, int sy, int sz) : v(v), p(p), u_x(u_x), u_y(u_y), u_z(u_z), sx(sx), sy(sy), sz(sz) { Create(); }
8726 void Collect(CollectVisitor &vis) {
8727 }
8728 void HeavyPrepare() { }
8729
8730 void Create() {
8731 for(int i=0;i<sx;i++)
8732 {
8733 Point pp = p + u_x*i/sx;
8734 for(int j=0;j<sy;j++)
8735 {
8736 Vector pp2 = u_y*j/sy;
8737 for(int k=0;k<sz;k++)
8738 {
8739 Vector pp3 = u_z*k/sz;
8740 Point p = pp + pp2 + pp3;
8741 bool b = v.Inside(p);
8742 if (b) { vec.push_back(p); }
8743 }
8744 }
8745 }
8746 }
8747 virtual int NumPoints() const { return vec.size(); }
8748 virtual Point Pos(int i) const { return vec[i]; }
8749 virtual unsigned int Color(int i) const { return 0xffffffff; }
8750private:
8751 VolumeObject &v;
8752 Point p;
8753 Vector u_x, u_y, u_z;
8754 int sx, sy, sz;
8755 std::vector<Point> vec;
8756};
8757#endif
8758
8759
8760
8761#endif
P func(int c, EveryApi &ev)
Definition test.cpp:59
Env e
Definition Common.cc:2
float Solve(const Function< float, float > &func, float t_0, float t_1)
Definition Effect.cc:1836
void UpdateVBO(const FaceCollection &faces, VBOState &state, VBOUpdate u, const std::vector< Attrib > &attribs)
Definition Effect.cc:2058
LowApi * g_low
Definition GameApi_low.cc:1684
VBOUpdate
Definition Effect.hh:10676
ArrayConvert< FaceCollectionArray, int, const FaceCollection * > FaceCollectionArrayConvert
Definition Effect.hh:3563
void split(std::vector< FontInterfaceImpl::Bezier2d > &vec, FontInterfaceImpl::Bezier2d orig, float t, bool emit_left, bool emit_right)
Definition FreeType2.cc:134
void matrix(BoxableFaceCollection &coll, Matrix m, FaceStore &s)
Definition Functions.cc:56
void cube(Matrix m, FaceStore &s)
Definition Functions.cc:10
void sphere(Matrix m, int numfaces, int numfaces2, FaceStore &s)
Definition Functions.cc:16
P Cube2(float start_x, float end_x, float start_y, float end_y, float start_z, float end_z, unsigned int color, void *data, EveryApi &api)
Definition GameApiTest7.cc:35
PT Map(PT p, int face, int point, void *data)
Definition GameApiTest.cc:19
CollectData collect(CollectInterface *i)
Definition GameApi.cc:18297
IMPORT int sprite_target_width
Definition Graph.cc:1267
IMPORT int sprite_target_height
Definition Graph.cc:1268
bool done
Definition GameApi_gui.cc:1629
size dy
Definition GameApi_gui.cc:1727
EditorGuiWidgetAtlas GuiWidgetForward render()
Definition GameApi_gui.cc:1412
Bitmap< Color > ColorBitmap
Definition GraphI.hh:901
void FontParseTestCases()
void PrepareGrid(Bitmap< Color > &bm, int cellsx, int cellsy, ArrayRender &rend)
Definition Graph.cc:919
Point2d IntersectLines(const Line2d &l1, const Line2d &l2)
Definition Graph.cc:725
int sprite_target_height
Definition Graph.cc:1268
void TextureEnable(ArrayRender &rend, int frame, bool enable)
Definition Graph.cc:1216
Line PlanePlaneIntersection(const Plane &p1, const Plane &p2)
Definition VectorTools.cc:1866
ContinuousBitmap< Color > ContinuousColorBitmap
Definition Graph.hh:2784
std::string WhiteSpace(std::string s)
Definition Graph.cc:1449
int sprite_target_width
Definition Graph.cc:1267
void Write(Parser2 *p, char *c, int size, int type, std::string s, bool &success)
Definition Graph.cc:1523
void PrepareSprite(const Sprite &s, ArrayRender &rend)
Definition Graph.cc:1225
void RenderSprite(const Sprite &s, int frame, Point2d pos, float z, ArrayRender &rend, Program *prog)
Definition Graph.cc:1270
int sprite_screen_height
Definition Graph.cc:1266
void RenderCube(const Bitmap< Range< int > > &bm, const Matrix &pos, ArrayRender &rend, Data &d, int id)
void DumpMem(const char *c, int size)
Definition Graph.cc:1469
float AngleLines(const Point2d &intersect, const Point2d &l1, const Point2d &l2)
Definition Graph.cc:730
Voxel< Quad > QuadVoxel
Definition Graph.hh:3523
int sprite_screen_width
Definition Graph.cc:1265
void BlitBitmap(BufferRef ref, int x, int y, Bitmap< Color > &color)
Definition Graph.cc:750
void RenderVoxel(VolumeObject &o, int size, float wholesize, HandleValue< std::pair< Vector, unsigned int > > &hv, VBOState &vbostate)
int Find(std::string s, char c)
Definition Graph.cc:1583
void TexturePrepare(const Sprite &s, ArrayRender &rend, bool progress, bool textrender=false)
Definition Graph.cc:1202
Quad QuadInterpolation(const Quad &q1, const Quad &q2, float val)
Bitmap< Size > SizeBitmap
Definition Graph.hh:1531
void * thread_func_bitmap(void *data)
Definition Main.cc:480
S Conquer(DivideAndConquer< P, S > &d, P p)
Definition Graph.hh:5060
ArrayConvert< Region, int, Rect > RegionConvert
Definition Graph.hh:100
void PrepareCube(const Bitmap< Range< float > > &bm_alternatives, Point pos, Vector u_x, Vector u_y, Vector u_z, ArrayRender &rend, Data &d, int id)
Cube3 CubeVoxelArea(Voxel< Cube3 > &cubes, PointI p1, PointI p2)
Definition Graph.cc:675
std::string MB(long i)
Definition GameApi.cc:43586
void PrepareSpriteToVA(const Sprite &s, VertexArraySet &vas)
Definition Graph.cc:1251
void RenderGrid(Bitmap< Pos > &bm, float x, float y, int cellsx, int cellsy, ArrayRender &rend, int start_x, int start_y, int size_x, int size_y)
Definition Graph.cc:935
float Dist(const Point &a, const Point &b)
Definition VectorTools.cc:78
AK empty(int sx, int sy, int sz, float start_x, float end_x, float start_y, float end_y, float start_z, float end_z)
Definition accel.cc:723
PML or_elem(PML p1, PML p2)
Definition accel.cc:820
int add(void *w)
Definition ui.cc:341
unsigned int color_1(int pointnum, PT pos)
Definition test.cpp:7
Definition compiled_tests.cpp:1189
virtual int SizeY() const
Definition Graph.hh:655
bool Map(int x, int y) const
Definition Graph.hh:656
void HeavyPrepare()
Definition Graph.hh:647
void Prepare()
Definition Graph.hh:649
AndNotBitmap(Bitmap< bool > &bm1, Bitmap< bool > &bm2)
Definition Graph.hh:642
virtual int SizeX() const
Definition Graph.hh:654
void Collect(CollectVisitor &vis)
Definition Graph.hh:643
float SizeY() const
Definition Graph.hh:2985
Color Map(float x, float y) const
Definition Graph.hh:2986
float SizeX() const
Definition Graph.hh:2984
AndNotColorContinuousBitmap(ContinuousBitmap< Color > &bm, ContinuousBitmap< bool > &cut_out)
Definition Graph.hh:2974
void Prepare()
Definition Graph.hh:2982
void Collect(CollectVisitor &vis)
Definition Graph.hh:2976
void HeavyPrepare()
Definition Graph.hh:2980
Definition Effect.hh:3441
virtual int NumFrames() const =0
virtual FaceCollection * Frame(int framenum) const =0
Definition Effect.hh:919
Definition Effect.hh:1238
Definition Effect.hh:11461
virtual Point2d Pos(int frame) const
Definition Graph.hh:6851
ArraySprite(Sprite **array, int count)
Definition Graph.hh:6786
virtual int YSize(int frame) const
Definition Graph.hh:6835
virtual Color Pixel(int frame, int x, int y) const
Definition Graph.hh:6868
virtual int XSize(int frame) const
Definition Graph.hh:6819
void update_cache()
Definition Graph.hh:6787
virtual int NumFrames() const
Definition Graph.hh:6810
Definition EffectI.hh:22
Definition compiled_tests.cpp:1200
BitmapArray(Bitmap< C > &bm)
Definition Graph.hh:865
int Size() const
Definition Graph.hh:870
C Index(int i) const
Definition Graph.hh:871
void Prepare()
Definition Graph.hh:866
Definition Graph.hh:4245
BufferRef Ref() const
Definition Graph.hh:4272
void Generate(Rect r)
Definition Graph.hh:4251
BitmapCache(ColorBitmap &bitmap)
Definition Graph.hh:4247
~BitmapCache()
Definition Graph.hh:4273
void HeavyPrepare()
Definition Graph.hh:2313
void Prepare()
Definition Graph.hh:2314
int SizeY() const
Definition Graph.hh:2317
int SizeX() const
Definition Graph.hh:2316
bool Map(int x, int y) const
Definition Graph.hh:2318
BitmapCircle(Point2d center, float radius, int sx, int sy)
Definition Graph.hh:2311
void Collect(CollectVisitor &vis)
Definition Graph.hh:2312
Definition GraphI.hh:2598
std::pair< int, int > Index(int i) const
Definition Graph.hh:8033
BitmapEnumeration(Bitmap< T > &bm)
Definition Graph.hh:8028
int Size() const
Definition Graph.hh:8029
Color Map(int x, int y) const
Definition Graph.hh:2470
unsigned int & Map2(int x, int y) const
Definition Graph.hh:2477
BitmapFromBuffer(BufferRef buf)
Definition Graph.hh:2461
void Prepare()
Definition Graph.hh:2467
int SizeY() const
Definition Graph.hh:2469
void HeavyPrepare()
Definition Graph.hh:2465
int SizeX() const
Definition Graph.hh:2468
BufferRef buf
Definition Graph.hh:2488
void Collect(CollectVisitor &vis)
Definition Graph.hh:2462
T Map(int x, int y) const
Definition Graph.hh:3507
int SizeY() const
Definition Graph.hh:3506
void Collect(CollectVisitor &vis)
Definition Graph.hh:3497
BitmapFromContinuousBitmap(ContinuousBitmap< T > &bitmap, int xsize, int ysize)
Definition Graph.hh:3496
void Prepare()
Definition Graph.hh:3503
int SizeX() const
Definition Graph.hh:3505
void HeavyPrepare()
Definition Graph.hh:3501
Definition Graph.hh:2401
void Prepare()
Definition Graph.hh:2418
void Collect(CollectVisitor &vis)
Definition Graph.hh:2413
virtual int SizeX() const
Definition Graph.hh:2420
virtual int SizeY() const
Definition Graph.hh:2421
void HeavyPrepare()
Definition Graph.hh:2416
T Map(int x, int y) const
Definition Graph.hh:2422
BitmapFromFile(std::string filename, Function< char, T > &func, int sizex, int sizey)
Definition Graph.hh:2403
BitmapFunction(Bitmap< T > &bm)
Definition Graph.hh:1590
T Index(Pos p) const
Definition Graph.hh:1591
int SizeX() const
Definition Graph.hh:8003
BitmapIntersection(Array< int, A > &enum1, Array< int, B > &enum2, Function< A, AA > &subset1, Function< B, BB > &subset2, Function< AA, bool > &char1, Function< BB, bool > &char2)
Definition Graph.hh:7991
int SizeY() const
Definition Graph.hh:8004
bool Map(int x, int y) const
Definition Graph.hh:8005
BitmapPullback(ContinuousBitmap2< Z, bool > &Zz, Function< A, Z > &f, Function< B, Z > &g)
Definition Graph.hh:7913
bool Index(std::pair< A, B > p) const
Definition Graph.hh:7916
int SizeY() const
Definition Graph.hh:1801
C Map(int x, int y) const
Definition Graph.hh:1802
BitmapRelation(Bitmap< C > &bm, C unknown_value, C value)
Definition Graph.hh:1797
void Prepare()
Definition Graph.hh:1798
BitmapRelation(Bitmap< C > &bm, C unknown_value, int xx, int yy)
Definition Graph.hh:1796
int SizeX() const
Definition Graph.hh:1800
virtual int XSize(int frame) const
Definition Graph.hh:6774
virtual Point2d Pos(int frame) const
Definition Graph.hh:6776
virtual int NumFrames() const
Definition Graph.hh:6773
BitmapSprite(Bitmap< Color > &c, Point2d pos)
Definition Graph.hh:6772
virtual int YSize(int frame) const
Definition Graph.hh:6775
virtual Color Pixel(int frame, int x, int y) const
Definition Graph.hh:6777
Definition Graph.hh:1500
virtual int SizeX() const
Definition Graph.hh:1504
virtual int SizeY() const
Definition Graph.hh:1505
void Set(Bitmap< T > &t)
Definition Graph.hh:1508
virtual T Map(int x, int y) const
Definition Graph.hh:1506
void Prepare()
Definition Graph.hh:1502
~BitmapStore()
Definition Graph.hh:1522
BitmapSubset(Bitmap< A > &bm)
Definition Graph.hh:8048
A Index(std::pair< int, int > p) const
Definition Graph.hh:8049
BitmapTextureSurfaceIn3d(SurfaceIn3d &surf, Bitmap< class Color > &tex)
Definition Graph.hh:7222
void HeavyPrepare()
Definition Graph.hh:7228
void Collect(CollectVisitor &vis)
Definition Graph.hh:7224
virtual void Prepare()
Definition Graph.hh:7230
virtual unsigned int Color(float x, float y) const
Definition Graph.hh:7231
virtual bool Inside(Point v) const
Definition Graph.hh:8382
BitmapVolume(Bitmap< bool > *b, float dist)
Definition Graph.hh:8381
Definition GraphI.hh:826
virtual int SizeY() const =0
virtual void Prepare()=0
virtual int SizeX() const =0
virtual C Map(int x, int y) const =0
Definition Graph.hh:4219
void HeavyPrepare()
Definition Graph.hh:4225
Color Map(int x, int y) const
Definition Graph.hh:4236
void Collect(CollectVisitor &vis)
Definition Graph.hh:4222
int SizeY() const
Definition Graph.hh:4232
BitmapizeArray(Array< std::pair< int, int >, Color > &func)
Definition Graph.hh:4221
void Prepare()
Definition Graph.hh:4227
int SizeX() const
Definition Graph.hh:4228
virtual int SizeY() const
Definition Graph.hh:1325
virtual int SizeX() const
Definition Graph.hh:1324
void Prepare()
Definition Graph.hh:1318
void Collect(CollectVisitor &vis)
Definition Graph.hh:1311
BlitBitmapClassMasked2(Bitmap< Color > &bm, Bitmap< Color > &bm2, int x, int y, Bitmap< bool > &mask)
Definition Graph.hh:1310
void HeavyPrepare()
Definition Graph.hh:1317
virtual Color Map(int xx, int yy) const
Definition Graph.hh:1326
void Collect(CollectVisitor &vis)
Definition Graph.hh:1272
virtual int SizeX() const
Definition Graph.hh:1285
BlitBitmapClassMasked(Bitmap< Color > &bm, Bitmap< Color > &bm2, int x, int y, Bitmap< float > &mask)
Definition Graph.hh:1271
void Prepare()
Definition Graph.hh:1279
virtual int SizeY() const
Definition Graph.hh:1286
virtual Color Map(int xx, int yy) const
Definition Graph.hh:1287
void HeavyPrepare()
Definition Graph.hh:1278
void HeavyPrepare()
Definition Graph.hh:1253
virtual Color Map(int xx, int yy) const
Definition Graph.cc:85
virtual int SizeX() const
Definition Graph.hh:1259
virtual int SizeY() const
Definition Graph.hh:1260
void Collect(CollectVisitor &vis)
Definition Graph.hh:1247
BlitBitmapClass(Bitmap< Color > &bm, Bitmap< Color > &bm2, int x, int y)
Definition Graph.hh:1246
void Prepare()
Definition Graph.hh:1254
virtual bool Map(int x, int y) const
Definition Graph.hh:386
void Prepare()
Definition Graph.hh:382
virtual int SizeX() const
Definition Graph.hh:384
BoolBitmapFromFloatBitmap2(Bitmap< float > &bm2, float range_start, float range_end)
Definition Graph.hh:370
void Collect(CollectVisitor &vis)
Definition Graph.hh:378
void HeavyPrepare()
Definition Graph.hh:381
virtual int SizeY() const
Definition Graph.hh:385
void Prepare()
Definition Graph.hh:2867
virtual float SizeY() const
Definition Graph.hh:2873
virtual float SizeX() const
Definition Graph.hh:2869
virtual bool Map(int x, int y) const
Definition Graph.hh:2877
BorderBitmap2(float width, ContinuousBitmap< T > &c)
Definition Graph.hh:2866
void Prepare()
Definition Graph.hh:1195
virtual int SizeY() const
Definition Graph.hh:1198
void HeavyPrepare()
Definition Graph.hh:1193
virtual Color Map(int x, int y) const
Definition Graph.hh:1199
BorderBitmap(Bitmap< Color > &next, Color left, Color right, Color top, Color bottom, int left_border, int right_border, int top_border, int bottom_border)
Definition Graph.hh:1185
void Collect(CollectVisitor &vis)
Definition Graph.hh:1190
virtual int SizeX() const
Definition Graph.hh:1197
Definition Effect.hh:67
~BufferFromBitmapCollection()
Definition Graph.hh:2499
BufferFromBitmapCollection(BitmapCollection< Color > &t, int i)
Definition Graph.hh:2494
void Gen() const
Definition Graph.hh:2500
BufferRef Buffer() const
Definition Graph.hh:2514
Definition Graph.hh:2522
void GenPrepare() const
Definition Graph.hh:2547
BufferFromBitmap(Bitmap< Color > &t)
Definition Graph.hh:2524
void clear_with_leak()
Definition Graph.hh:2616
~BufferFromBitmap()
Definition Graph.hh:2530
void flip_color(unsigned int &col)
Definition Graph.hh:2601
void Gen() const
Definition Graph.hh:2531
void FlipBytes()
Definition Graph.hh:2589
BufferRef Buffer() const
Definition Graph.hh:2615
Definition Buffer.hh:73
Bitmap< Color > * Index(bool b) const
Definition Graph.hh:6303
void HeavyPrepare()
Definition Graph.hh:6301
void Collect(CollectVisitor &vis)
Definition Graph.hh:6300
int SizeX() const
Definition Graph.hh:6308
void Prepare()
Definition Graph.hh:6302
Color Map(int x, int y) const
Definition Graph.hh:6310
int SizeY() const
Definition Graph.hh:6309
ChessBoardBitmap(Color c1, Color c2, int sx, int sy, int ssx, int ssy)
Definition Graph.hh:6299
Definition Graph.hh:6143
virtual int SizeX() const
Definition Graph.hh:6153
virtual int SizeY() const
Definition Graph.hh:6154
void Prepare()
Definition Graph.hh:6151
void HeavyPrepare()
Definition Graph.hh:6149
void Collect(CollectVisitor &vis)
Definition Graph.hh:6146
virtual bool Map(int x, int y) const
Definition Graph.hh:6155
ChessBoard(int sx, int sy, bool b)
Definition Graph.hh:6145
void Prepare()
Definition Graph.hh:5871
virtual int SizeY() const
Definition Graph.hh:5878
virtual Color Map(int x, int y) const
Definition Graph.hh:5879
ChooseBitmap2(Bitmap< Color > &bm1, Bitmap< Color > &bm2, Bitmap< float > &choose)
Definition Graph.hh:5869
virtual int SizeX() const
Definition Graph.hh:5877
virtual int SizeX() const
Definition Graph.hh:752
void Prepare()
Definition Graph.hh:746
ChooseBitmap(Bitmap< T > &bm1, Bitmap< T > &bm2, Bitmap< bool > &which)
Definition Graph.hh:745
virtual int SizeY() const
Definition Graph.hh:753
virtual T Map(int x, int y) const
Definition Graph.hh:754
int Choose(Point2d pp) const
Definition Graph.hh:5599
ChoosePointByMouseCursor(PointCollection &coll)
Definition Graph.hh:5598
ChooseTBitmap(Bitmap< bool > &bm, T false_t, T true_t)
Definition Graph.hh:458
void HeavyPrepare()
Definition Graph.hh:462
void Collect(CollectVisitor &vis)
Definition Graph.hh:459
virtual T Map(int x, int y) const
Definition Graph.hh:468
virtual int SizeY() const
Definition Graph.hh:467
void Prepare()
Definition Graph.hh:464
virtual int SizeX() const
Definition Graph.hh:466
bool Map(float x, float y) const
Definition Graph.hh:3408
void Prepare()
Definition Graph.hh:3399
float SizeY() const
Definition Graph.hh:3404
CircleContinuousBitmap(float size_x, float size_y, float center_x, float center_y, float radius)
Definition Graph.hh:3398
float SizeX() const
Definition Graph.hh:3400
Definition Effect.hh:2060
Definition Graph.hh:6179
Bitmap< T > * Map(int x, int y) const
Definition Graph.hh:6194
CollectBitmapsBitmap(const Bitmap< K > &bm, const Function< K, Bitmap< T > * > &func)
Definition Graph.hh:6181
int SizeY() const
Definition Graph.hh:6190
void Prepare()
Definition Graph.hh:6184
int SizeX() const
Definition Graph.hh:6186
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
Definition Effect.hh:10804
Definition Graph.hh:3954
Color Map(float x, float y, float z) const
Definition Graph.hh:3959
virtual float SizeX() const
Definition Graph.hh:3956
virtual float SizeY() const
Definition Graph.hh:3957
virtual float SizeZ() const
Definition Graph.hh:3958
void Handle(Vector v)
Definition Graph.hh:4556
ColorHandleValue(HandleValue< std::pair< Vector, unsigned int > > &hv, float sizex, float sizey, float sizez)
Definition Graph.hh:4554
Definition Graph.hh:2441
unsigned int Index(char c) const
Definition Graph.hh:2443
void Prepare()
Definition Graph.hh:3290
float SizeX() const
Definition Graph.hh:3292
Color Map(float x, float y) const
Definition Graph.hh:3294
float SizeY() const
Definition Graph.hh:3293
ColorTriangle2(float sx, float sy, const Point2d &p1, const Point2d &p2, const Point2d &p3, const Color &c1, const Color &c2, const Color &c3, const Color &background)
Definition Graph.hh:3279
void Collect(CollectVisitor &vis)
Definition Graph.hh:3260
float SizeY() const
Definition Graph.hh:3265
void Prepare()
Definition Graph.hh:3262
void HeavyPrepare()
Definition Graph.hh:3261
float SizeX() const
Definition Graph.hh:3264
Color Map(float x, float y) const
Definition Graph.hh:3266
ColorTriangle(float sx, float sy, const Point2d &p1, const Point2d &p2, const Point2d &p3, const Color &c, const Color &c2)
Definition Graph.hh:3259
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
static Color AverageArray(Color *array, int size)
Definition VectorTools.hh:712
static Color Darker(const Color &aVec, float aVal)
Definition VectorTools.hh:708
static Color Transparent()
Definition VectorTools.hh:474
static unsigned int ColorCube(float x, float y, float z, float sizex, float sizey, float sizez)
Definition VectorTools.hh:478
int alpha
Definition VectorTools.hh:745
int g
Definition VectorTools.hh:744
static Color White()
Definition VectorTools.hh:476
static Color Lighter(const Color &aVec, float aVal)
Definition VectorTools.hh:704
int b
Definition VectorTools.hh:744
Definition Graph.hh:4203
T Size() const
Definition Graph.hh:4206
Color Index(T t) const
Definition Graph.hh:4207
ColorizeBoolArray(const Array< T, bool > &func)
Definition Graph.hh:4205
ColumnRowBitmap(Array< int, int > &column_x, Array< int, int > &row_y)
Definition Graph.hh:1617
Size Map(int xx, int yy) const
Definition Graph.hh:1622
void Prepare()
Definition Graph.hh:1618
int SizeX() const
Definition Graph.hh:1620
int SizeY() const
Definition Graph.hh:1621
CombineBitmapX(Bitmap< C > &bm, Bitmap< C > &bm2)
Definition Graph.hh:1942
void Prepare()
Definition Graph.hh:1948
int SizeY() const
Definition Graph.hh:1951
int SizeX() const
Definition Graph.hh:1950
void HeavyPrepare()
Definition Graph.hh:1947
void Collect(CollectVisitor &vis)
Definition Graph.hh:1943
C Map(int x, int y) const
Definition Graph.hh:1952
int SizeY() const
Definition Graph.hh:6289
CombineBitmaps2(const Bitmap< K > &bm, const Function< K, Bitmap< T > * > &func)
Definition Graph.hh:6281
void HeavyPrepare()
Definition Graph.hh:6285
T Map(int x, int y) const
Definition Graph.hh:6290
void Collect(CollectVisitor &vis)
Definition Graph.hh:6282
void Prepare()
Definition Graph.hh:6287
int SizeX() const
Definition Graph.hh:6288
Definition Graph.hh:714
CombineBitmaps(Bitmap< T > &bm1, Bitmap< K > &bm2)
Definition Graph.hh:716
virtual std::pair< T, K > Map(int x, int y) const
Definition Graph.hh:731
void Collect(CollectVisitor &vis)
Definition Graph.hh:717
virtual int SizeY() const
Definition Graph.hh:730
void HeavyPrepare()
Definition Graph.hh:722
virtual int SizeX() const
Definition Graph.hh:729
void Prepare()
Definition Graph.hh:724
Definition Graph.hh:2256
virtual T Exp(const Array< int, K > &arr) const =0
Definition Graph.hh:5625
Function< T, T > * id() const
Definition Graph.hh:5637
T Index(T t) const
Definition Graph.hh:5633
virtual Function< T, T > * m(Function< T, T > *t1, Function< T, T > *t2) const
Definition Graph.hh:5627
virtual BoxableFaceCollection * Data(const EdgeData3d &t) const
Definition Graph.hh:5497
ConeDataRep(int num)
Definition Graph.hh:5496
Definition Effect.hh:9376
Color Map(int, int) const
Definition Graph.hh:1743
void Collect(CollectVisitor &vis)
Definition Graph.hh:1737
void HeavyPrepare()
Definition Graph.hh:1738
void Prepare()
Definition Graph.hh:1739
ConstantBitmap_Color(Color c, int x, int y)
Definition Graph.hh:1736
int SizeX() const
Definition Graph.hh:1741
int SizeY() const
Definition Graph.hh:1742
ConstantBitmap_bool(bool c, int x, int y)
Definition Graph.hh:1755
bool Map(int, int) const
Definition Graph.hh:1762
void Collect(CollectVisitor &vis)
Definition Graph.hh:1756
int SizeY() const
Definition Graph.hh:1761
void HeavyPrepare()
Definition Graph.hh:1757
void Prepare()
Definition Graph.hh:1758
int SizeX() const
Definition Graph.hh:1760
int SizeY() const
Definition Graph.hh:1780
void HeavyPrepare()
Definition Graph.hh:1776
ConstantBitmap_float(float c, int x, int y)
Definition Graph.hh:1774
int SizeX() const
Definition Graph.hh:1779
float Map(int, int) const
Definition Graph.hh:1781
void Collect(CollectVisitor &vis)
Definition Graph.hh:1775
void Prepare()
Definition Graph.hh:1777
Definition Graph.hh:1712
int SizeX() const
Definition Graph.hh:1722
ConstantBitmap(C c, int x, int y)
Definition Graph.hh:1714
void Collect(CollectVisitor &vis)
Definition Graph.hh:1715
int SizeY() const
Definition Graph.hh:1723
C Map(int, int) const
Definition Graph.hh:1724
void Prepare()
Definition Graph.hh:1720
void HeavyPrepare()
Definition Graph.hh:1718
void Collect(CollectVisitor &vis)
Definition Graph.hh:2898
virtual C Map(float x, float y) const
Definition Graph.hh:2904
void HeavyPrepare()
Definition Graph.hh:2899
virtual float SizeY() const
Definition Graph.hh:2903
void Prepare()
Definition Graph.hh:2900
ConstantContinuousBitmap(float sx, float sy, C c)
Definition Graph.hh:2897
virtual float SizeX() const
Definition Graph.hh:2902
virtual int SizeY() const
Definition Graph.hh:5917
void change(int index, Bitmap< T > *bm)
Definition Graph.hh:5914
void Prepare()
Definition Graph.hh:5899
virtual T Map(int x, int y) const
Definition Graph.hh:5918
void move(int index, TRect newpos)
Definition Graph.hh:5913
virtual int SizeX() const
Definition Graph.hh:5916
void resize(int new_sx, int new_sy)
Definition Graph.hh:5915
int push_back(TRect rect, Bitmap< T > *bm)
Definition Graph.hh:5907
ContainerBitmap(int sx, int sy, T def)
Definition Graph.hh:5897
Definition GraphI.hh:1178
void Prepare()
Definition Graph.hh:3335
float SizeY() const
Definition Graph.hh:3346
ContinuousBitmapArray(float sx, float sy, Array< int, ContinuousBitmap< Color > * > &arr)
Definition Graph.hh:3334
Color Map(float x, float y) const
Definition Graph.hh:3350
float SizeX() const
Definition Graph.hh:3342
void HeavyPrepare()
Definition Graph.hh:3471
float SizeY() const
Definition Graph.hh:3478
bool ReadyToPrepare() const
Definition Graph.hh:3475
float SizeX() const
Definition Graph.hh:3477
void Collect(CollectVisitor &vis)
Definition Graph.hh:3466
ContinuousBitmapFromBitmap(Bitmap< T > &bitmap, float xsize, float ysize)
Definition Graph.hh:3465
void Prepare()
Definition Graph.hh:3473
T Map(float x, float y) const
Definition Graph.hh:3479
Definition GraphI.hh:1164
virtual float SizeY() const =0
virtual void Prepare()=0
virtual C Map(float x, float y) const =0
virtual float SizeX() const =0
void Prepare()
Definition Graph.hh:2915
float SizeX() const
Definition Graph.hh:2917
ContinuousStructBitmap(Array< float, T > &a1, Array< float, K > &a2)
Definition Graph.hh:2914
std::pair< T, K > Map(float x, float y) const
Definition Graph.hh:2919
float SizeY() const
Definition Graph.hh:2918
Definition GraphI.hh:1188
virtual C Map(float x, float y, float z) const =0
virtual float SizeY() const =0
virtual float SizeZ() const =0
virtual void Prepare()=0
virtual float SizeX() const =0
virtual K Map(int x, int y) const
Definition Graph.hh:1543
void Prepare()
Definition Graph.hh:1540
void HeavyPrepare()
Definition Graph.hh:1539
virtual int SizeX() const
Definition Graph.hh:1541
ConvertBitmap(Bitmap< T > &bm)
Definition Graph.hh:1537
void Collect(CollectVisitor &vis)
Definition Graph.hh:1538
virtual int SizeY() const
Definition Graph.hh:1542
Cube2Cube3Function(float sx, float sy, float sz, float px, float py, float pz)
Definition Graph.hh:4419
Cube3 Index(Cube2 c) const
Definition Graph.hh:4420
void Handle(Cube2 p)
Definition Graph.hh:4526
CubeHandleValue(Point p, Vector ax, Vector ay, Vector az, HandleValue< Vector > &hv)
Definition Graph.hh:4523
CubeVoxel(Cube3 p, int x, int y, int z)
Definition Graph.hh:3749
int SizeY() const
Definition Graph.hh:3751
int SizeZ() const
Definition Graph.hh:3752
Cube3 Map(int xx, int yy, int zz) const
Definition Graph.hh:3753
int SizeX() const
Definition Graph.hh:3750
float Index(float x) const
Definition Graph.hh:107
float DIndex(float x) const
Definition Graph.hh:115
CubicInterpolate(float f_0, float f_1, float df_0, float df_1)
Definition Graph.hh:106
Definition EffectI.hh:41
Definition EffectI.hh:49
Definition Graph.hh:6717
virtual T AMap(float alfa, float s) const =0
Definition GraphI.hh:792
virtual Color Map(int x, int y) const
Definition Graph.hh:976
virtual int SizeX() const
Definition Graph.hh:974
void Prepare()
Definition Graph.hh:969
virtual int SizeY() const
Definition Graph.hh:975
DarkerBitmap(Bitmap< Color > &orig, Bitmap< float > &dark, Point2d pos)
Definition Graph.hh:968
Definition Graph.hh:5471
virtual BoxableFaceCollection * Data(const T &t) const =0
Definition Graph.hh:6965
void * fetch(int id)
Definition Graph.hh:6968
void insert(int id, void *data)
Definition Graph.hh:6967
DiagonalBitmap(float sx, float sy, float acc=0.001)
Definition Graph.hh:7948
virtual float SizeX() const
Definition Graph.hh:7949
virtual bool Map(float x, float y) const
Definition Graph.hh:7951
virtual float SizeY() const
Definition Graph.hh:7950
Definition Effect.hh:10860
DistanceField(Point center, float dist)
Definition Graph.hh:6114
float Index(Point p) const
Definition Graph.hh:6115
Definition Graph.hh:8708
virtual unsigned int color(Point p) const =0
virtual float distance(Point p) const =0
virtual Vector normal(Point p) const =0
virtual ~DistanceRenderable()
Definition Graph.hh:8710
Definition Graph.hh:5051
virtual S Solve(P p) const =0
virtual std::vector< P > Divide(P p) const =0
virtual bool CanDivide(P p) const =0
virtual S Combine(std::vector< S > s) const =0
Definition Draw.hh:3
virtual void * probvalue(int i) const =0
virtual Draw * ArrayIndex(int i) const =0
virtual int ArrayCount() const =0
virtual Point2d topleft() const =0
virtual Draw * AlArrayIndex(int i) const =0
virtual int propcount() const =0
virtual Point2d bottomright() const =0
virtual int AlArrayCount() const =0
virtual int type() const =0
virtual std::string propname(int i) const =0
virtual std::string proptype(int i) const =0
virtual int SizeX() const
Definition Graph.hh:998
T & At(int x, int y)
Definition Graph.hh:1008
DynBitmap(int sx, int sy)
Definition Graph.hh:995
void Prepare()
Definition Graph.hh:996
virtual T Map(int x, int y) const
Definition Graph.hh:1000
virtual int SizeY() const
Definition Graph.hh:999
const T & At(int x, int y) const
Definition Graph.hh:1004
Definition Effect.hh:2852
Point2d Index(int i) const
Definition Effect.hh:2855
void push_back(Point2d p)
Definition Effect.hh:2859
void DrawVBO(VBOState &vbostate, VBOUpdate u, float time)
void Handle(std::pair< int, ObjectId > m)
void unuse(int id)
Definition Graph.hh:4616
int create_new()
Definition Graph.hh:4615
void Handle(std::pair< int, Matrix > m)
Dynamic(PieceShader &piece)
Definition Graph.hh:4613
int count() const
Definition Graph.hh:4614
void Handle(std::pair< int, unsigned int > m)
void Handle(std::pair< int, AnimPoint > m)
void Init()
Definition Graph.cc:601
bool Frame(float time)
Definition Graph.cc:614
Effect2dEffect(ShaderFile &file, Render *r)
Definition Graph.hh:6388
Effect3dEffect(ShaderFile &file, Render *r)
Definition Graph.hh:6399
bool Frame(float time)
Definition Graph.cc:659
~Effect3dEffect()
Definition Graph.cc:666
void Init()
Definition Graph.cc:637
Definition Effect.hh:571
virtual T Elem() const =0
void Gen()
Definition Graph.hh:4350
EnumerateBitmap(Bitmap< T > &bm, HandleValue< T > &hv)
Definition Graph.hh:4348
EquivalenceClassColorBitmap(Bitmap< Color > &bm, Color val)
Definition Graph.hh:688
virtual int SizeX() const
Definition Graph.hh:698
void HeavyPrepare()
Definition Graph.hh:692
void Prepare()
Definition Graph.hh:694
void Collect(CollectVisitor &vis)
Definition Graph.hh:689
virtual int SizeY() const
Definition Graph.hh:699
virtual bool Map(int x, int y) const
Definition Graph.hh:700
void HeavyPrepare()
Definition Graph.hh:669
virtual int SizeY() const
Definition Graph.hh:675
void Collect(CollectVisitor &vis)
Definition Graph.hh:666
EquivalenceClassIntBitmap(Bitmap< int > &bm, int val)
Definition Graph.hh:665
void Prepare()
Definition Graph.hh:670
virtual bool Map(int x, int y) const
Definition Graph.hh:676
virtual int SizeX() const
Definition Graph.hh:674
virtual int SizeY() const
Definition Graph.hh:8358
void update()
FBO(int sx, int sy)
void bind()
virtual Color Map(int x, int y) const
Definition Graph.hh:8359
void unbind()
~FBO()
virtual int SizeX() const
Definition Graph.hh:8357
void Prepare()
Definition Graph.hh:8355
Definition Effect.hh:3547
Definition Graph.hh:4571
void Handle(std::pair< Matrix, unsigned int > mm)
Definition Graph.hh:4575
void DrawVBO(VBOState &vbostate, VBOUpdate u)
Definition Graph.cc:243
FaceCollectionHandleValueDynamic()
Definition Graph.hh:4573
Definition EffectI.hh:212
virtual Vector PointNormal(int face, int point) const =0
virtual Point FacePoint(int face, int point) const =0
virtual void Prepare()=0
virtual float Attrib(int face, int point, int id) const =0
virtual unsigned int Color(int face, int point) const =0
virtual int NumPoints(int face) const =0
virtual Point2d TexCoord(int face, int point) const =0
virtual int NumFaces() const =0
virtual int AttribI(int face, int point, int id) const =0
Definition Effect.hh:10823
virtual int AttribI(int face, int point, int id) const
Definition Graph.hh:5309
virtual Point FacePoint(int face, int point) const
Definition Graph.hh:5288
void SetBox(Matrix m)
Definition Graph.hh:5285
virtual float Attrib(int face, int point, int id) const
Definition Graph.hh:5305
virtual int NumPoints(int face) const
Definition Graph.hh:5287
virtual std::string name() const
Definition Graph.hh:5274
FacesFromMap(Bitmap< bool > &mymap, Bitmap< Point > &pos)
Definition Graph.hh:5273
virtual int NumFaces() const
Definition Graph.hh:5286
void Prepare()
Definition Graph.hh:5284
virtual unsigned int Color(int face, int point) const
Definition Graph.hh:5313
void Collect(CollectVisitor &vis)
Definition Graph.hh:5276
virtual Vector PointNormal(int face, int point) const
Definition Graph.hh:5297
void HeavyPrepare()
Definition Graph.hh:5281
virtual Point2d TexCoord(int face, int point) const
Definition Graph.hh:5317
void Refresh()
Definition Graph.hh:5326
void Collect(CollectVisitor &vis)
Definition Graph.hh:6094
float Map(int x, int y) const
Definition Graph.hh:6104
FieldBitmap(Field &f, Bitmap< Point > &pos)
Definition Graph.hh:6093
void HeavyPrepare()
Definition Graph.hh:6098
void Prepare()
Definition Graph.hh:6100
int SizeY() const
Definition Graph.hh:6103
int SizeX() const
Definition Graph.hh:6102
Definition Graph.hh:6087
void Handle(std::pair< T, bool > p)
Definition Graph.hh:4491
FilterHandleValue(HandleValue< T > &hv)
Definition Graph.hh:4490
bool Index(int i) const
Definition Graph.hh:6072
FilterLines(Line2dCollection &coll, float y)
Definition Graph.hh:6067
int Size() const
Definition Graph.hh:6068
FindPositionFromCurve(Field &field, CurveIn3d &curve)
Definition Graph.hh:6129
float Elem() const
Definition Graph.hh:6130
Definition Graph.hh:6205
int SizeY() const
Definition Graph.hh:6213
int StartY(int y) const
Definition Graph.hh:6263
void Prepare()
Definition Graph.hh:6208
int SizeX() const
Definition Graph.hh:6209
T Map(int x, int y) const
Definition Graph.hh:6217
int StartX(int x) const
Definition Graph.hh:6252
FlattenBitmap(Bitmap< Bitmap< T > * > &bm)
Definition Graph.hh:6207
virtual int SizeY() const
Definition Graph.hh:2634
void Collect(CollectVisitor &vis)
Definition Graph.hh:2628
FlipColoursInv(Bitmap< Color > &c)
Definition Graph.hh:2626
void HeavyPrepare()
Definition Graph.hh:2629
virtual int SizeX() const
Definition Graph.hh:2633
void Prepare()
Definition Graph.hh:2631
virtual Color Map(int x, int y) const
Definition Graph.hh:2635
virtual bool IsDirectGltfImage() const
Definition Graph.hh:2660
Bitmap< Color > & c
Definition Graph.hh:2663
void HeavyPrepare()
Definition Graph.hh:2671
Bitmap< Color > & c
Definition Graph.hh:2726
FlipColours(Bitmap< Color > &c)
Definition Graph.hh:2669
virtual bool IsDirectGltfImage() const
Definition Graph.hh:2723
virtual int SizeY() const
Definition Graph.hh:2676
virtual int SizeX() const
Definition Graph.hh:2675
virtual Color Map(int x, int y) const
Definition Graph.hh:2677
void Collect(CollectVisitor &vis)
Definition Graph.hh:2670
void Prepare()
Definition Graph.hh:2673
void HeavyPrepare()
Definition Graph.hh:428
void Prepare()
Definition Graph.hh:430
virtual int SizeX() const
Definition Graph.hh:432
virtual float Map(int x, int y) const
Definition Graph.hh:434
void Collect(CollectVisitor &vis)
Definition Graph.hh:425
virtual int SizeY() const
Definition Graph.hh:433
FloatBitmapFromBoolBitmap(Bitmap< bool > &bm, int csx, int csy)
Definition Graph.hh:424
Definition Graph.hh:5666
float m(float t1, float t2) const
Definition Graph.hh:5668
float id() const
Definition Graph.hh:5669
float inv(float a) const
Definition Graph.hh:5670
FloatPointBitmap(Point p)
Definition Graph.hh:1971
int SizeX() const
Definition Graph.hh:1979
FloatPointBitmap(Vector v)
Definition Graph.hh:1972
int SizeY() const
Definition Graph.hh:1980
void Prepare()
Definition Graph.hh:1977
void Collect(CollectVisitor &vis)
Definition Graph.hh:1973
float Map(int x, int y) const
Definition Graph.hh:1981
void HeavyPrepare()
Definition Graph.hh:1976
virtual bool Map(int x, int y) const
Definition Graph.hh:255
virtual int SizeX() const
Definition Graph.hh:253
void Collect(CollectVisitor &vis)
Definition Graph.hh:247
virtual int SizeY() const
Definition Graph.hh:254
void HeavyPrepare()
Definition Graph.hh:250
FloatRangeBitmap(Bitmap< float > &fb, float rs, float re)
Definition Graph.hh:246
void Prepare()
Definition Graph.hh:252
void Prepare()
Definition Graph.hh:492
FontCharacterString(T def, int x_gap)
Definition Graph.hh:483
void Collect(CollectVisitor &vis)
Definition Graph.hh:484
virtual T Map(int x, int y) const
Definition Graph.hh:521
virtual int SizeX() const
Definition Graph.hh:510
void HeavyPrepare()
Definition Graph.hh:491
void push_back(Bitmap< T > *bm, int top, int ascender, int height, int advance_x, int descender, int left)
Definition Graph.hh:500
int PositiveDelta() const
Definition Graph.hh:542
virtual int SizeY() const
Definition Graph.hh:517
int Height() const
Definition Graph.hh:555
FrameAnimPlugins(Render *render)
Definition Effect.hh:2390
FrameAnim(Render *render)
Definition Effect.hh:110
virtual float SizeY() const
Definition Graph.hh:2854
virtual float SizeX() const
Definition Graph.hh:2853
Function2Bitmap(float sx, float sy, Function2< float, float, T > &f)
Definition Graph.hh:2851
virtual T Map(float x, float y) const
Definition Graph.hh:2855
void Prepare()
Definition Graph.hh:2852
Definition Effect.hh:518
void Generate(Rect r)
Definition Graph.hh:4751
FunctionBitmap(Array< std::pair< int, int >, bool > &func)
Definition Graph.hh:4748
BufferRef Ref() const
Definition Graph.hh:4752
Definition EffectI.hh:11
virtual const FaceCollection * Index(int a) const=0
Definition Graph.hh:5206
virtual int ASize(int x) const =0
virtual int Size() const =0
virtual T Map(int x, int y) const =0
T Index(int i) const
Definition Graph.hh:5219
FunnyChoose(FunnyArray< T > &arr, Array< int, int > &index)
Definition Graph.hh:5217
int Size() const
Definition Graph.hh:5218
Definition Graph.hh:4385
void Init()
Definition Graph.hh:4387
void Handle(T t)
Definition Graph.hh:4388
GenerateCube(HandleValue< Cube2 > &gen, int sizex, int sizey, int sizez)
Definition Graph.hh:4449
void Gen()
Definition Graph.hh:4450
void Gen()
Definition Graph.hh:4398
GenerateGrid(HandleValue< std::pair< int, int > > &gen, int sizex, int sizey)
Definition Graph.hh:4397
Definition Graph.hh:4368
GenerateSequence(HandleValue< int > &gen, int size)
Definition Graph.hh:4370
void Gen()
Definition Graph.hh:4371
void Gen()
Definition Graph.hh:4473
GenerateVoxel(Voxel< C > &voxel, HandleValue< std::pair< Cube2, C > > &hv)
Definition Graph.hh:4472
Definition Shader.hh:847
Definition Shader.hh:340
GradientBitmap(float sx, float sy, Point2d p1, Point2d p2, Color c1, Color c2)
Definition Graph.hh:3313
void HeavyPrepare()
Definition Graph.hh:3317
float SizeX() const
Definition Graph.hh:3321
Color Map(float x, float y) const
Definition Graph.cc:688
float SizeY() const
Definition Graph.hh:3322
void Collect(CollectVisitor &vis)
Definition Graph.hh:3314
void Prepare()
Definition Graph.hh:3319
bool Index(std::pair< T, K > i) const
Definition Graph.hh:4173
Graph2(const Function< T, K > &func)
Definition Graph.hh:4172
void Prepare()
Definition Graph.hh:1152
virtual int SizeX() const
Definition Graph.hh:1154
virtual int SizeY() const
Definition Graph.hh:1155
Color Map(int x, int y) const
Definition Graph.hh:1157
GraphBitmap(Function< float, float > &f, Color top, Color middle, Color bottom, float up_delta, float down_delta, float start_x, float end_x, float start_y, float end_y, int size_x, int size_y)
Definition Graph.hh:1151
static bool Compare(float x, float y)
Definition Graph.hh:4152
static bool Compare(std::pair< float, float > p1, std::pair< float, float > p2)
Definition Graph.hh:4161
Definition Graph.hh:4140
static bool Compare(T t, K k)
Definition Graph.hh:4142
Definition GraphI.hh:1215
void Init()
Definition Graph.cc:527
GraphEffect(Render *render)
Definition Graph.hh:6364
bool Frame(float time)
Definition Graph.cc:543
VertexData3d Vertex(int v) const
Definition Graph.hh:5374
GraphFromMap(Bitmap< bool > &mymap, Bitmap< Point > &pos, bool twoway, float radius)
Definition Graph.hh:5368
std::pair< int, int > EdgeVertex(int edge) const
Definition Graph.hh:5406
void Refresh()
Definition Graph.hh:5410
int find(int x, int y)
Definition Graph.hh:5445
int NumVertexes() const
Definition Graph.hh:5398
int NumEdges() const
Definition Graph.hh:5402
EdgeData3d Edge(int, int v1, int v2) const
Definition Graph.hh:5385
int NumLines() const
Definition Graph.hh:5252
GraphToLines(Graph &g, GraphData< VertexData3d, EdgeData3d > &data)
Definition Graph.hh:5251
Point LinePoint(int line, int point) const
Definition Graph.hh:5256
Definition GraphI.hh:1206
void Prepare()
Definition Graph.hh:406
void Collect(CollectVisitor &vis)
Definition Graph.hh:401
void HeavyPrepare()
Definition Graph.hh:404
virtual Color Map(int x, int y) const
Definition Graph.hh:410
virtual int SizeX() const
Definition Graph.hh:408
virtual int SizeY() const
Definition Graph.hh:409
GrayScaleBitmapFromFloatBitmap(Bitmap< float > &bm, Color c1, Color c2)
Definition Graph.hh:400
bool Frame(float time)
Definition Graph.cc:1007
GridEffect2(Render *rend2)
Definition Graph.hh:6760
void Init()
Definition Graph.cc:1000
virtual float RotSpeed() const
Definition Graph.hh:6763
GroupMonoid(GroupObject< T > &g)
Definition Graph.hh:5659
T m(T t1, T t2) const
Definition Graph.hh:5660
T id() const
Definition Graph.hh:5661
Definition Graph.hh:5649
virtual T m(T t1, T t2) const =0
virtual T id() const =0
virtual T inv(T t) const =0
GrowBitmap(Bitmap< T > &bm, int l, int t, int r, int b, T bg_color)
Definition Graph.hh:1383
void Prepare()
Definition Graph.hh:1393
virtual T Map(int x, int y) const
Definition Graph.hh:1397
void Collect(CollectVisitor &vis)
Definition Graph.hh:1387
virtual int SizeX() const
Definition Graph.hh:1395
virtual int SizeY() const
Definition Graph.hh:1396
void HeavyPrepare()
Definition Graph.hh:1391
Definition Graph.hh:4678
HandleValueFunction(HandleValue< K > &hv, Function< T, K > &func)
Definition Graph.hh:4680
void Handle(T t)
Definition Graph.hh:4681
void Gen()
Definition Graph.hh:4507
HandleValueSource(Array< int, T > &arr, HandleValue< T > &hv)
Definition Graph.hh:4506
Definition GraphI.hh:1200
virtual void Handle(T t)=0
HeightMapCubesFromBitmap(Bitmap< float > &bm_min, Bitmap< float > &bm_max, float sx, float sy, float sz)
Definition Graph.hh:2109
void Prepare()
Definition Graph.hh:2112
int SizeY() const
Definition Graph.hh:2111
int SizeX() const
Definition Graph.hh:2110
Cube3 Map(int x, int y) const
Definition Graph.hh:2113
Quad Index(Pos p) const
Definition Graph.hh:7138
Heightmap2(Point center, Vector u_x, Vector u_y, int sx, int sy)
Definition Graph.hh:7130
Pos Size() const
Definition Graph.hh:7131
Definition Graph.hh:7892
IWaveFormArray * Index(int val) const
Definition Graph.hh:7896
void push_back(IWaveFormArray *wave)
Definition Graph.hh:7894
float Map(int y, float x) const
Definition Graph.hh:7900
IWaveform * Index(int val) const
Definition Graph.hh:7855
float Map(float x) const
Definition Graph.hh:7859
IDynWaveArray(float(*fptr)(float, float))
Definition Graph.hh:7852
void push_back(IWaveform *wave)
Definition Graph.hh:7853
Definition Graph.hh:7887
Definition Graph.hh:7845
virtual float Map(float x) const =0
Definition Graph.hh:7835
virtual float Start() const =0
virtual float Max() const =0
virtual float End() const =0
virtual float Min() const =0
virtual float Index(float val) const =0
Definition Effect.hh:7706
IntDiagonalBitmap(int sx, int sy)
Definition Graph.hh:7934
virtual bool Map(int x, int y) const
Definition Graph.hh:7937
virtual int SizeY() const
Definition Graph.hh:7936
virtual int SizeX() const
Definition Graph.hh:7935
virtual Color Map(int x, int y) const
Definition Graph.hh:1108
virtual int SizeX() const
Definition Graph.hh:1106
void Prepare()
Definition Graph.hh:1101
virtual int SizeY() const
Definition Graph.hh:1107
void HeavyPrepare()
Definition Graph.hh:1099
InterpolateBitmap(Bitmap< Color > &c1, Bitmap< Color > &c2, float xx)
Definition Graph.hh:1093
void Collect(CollectVisitor &vis)
Definition Graph.hh:1094
InterpolateMovementEffect(Render *render)
Definition Graph.hh:6346
bool Frame(float time)
Definition Graph.cc:497
~InterpolateMovementEffect()
Definition Graph.cc:493
void Init()
Definition Graph.cc:435
Definition Equalizer.hh:478
bool Index(A a) const
Definition Equalizer.hh:481
Intersection(PowerSet< A > &m, PowerSet< A > &m2)
Definition Equalizer.hh:480
virtual float SizeX() const
Definition Graph.hh:2797
virtual T Map(float x, float y) const
Definition Graph.hh:2799
virtual float SizeY() const
Definition Graph.hh:2798
InverseCreateContinuousBitmap(Bitmap< T > &bm, std::pair< int, int >(*fptr)(float, float), float sx, float sy)
Definition Graph.hh:2790
virtual void Prepare()
Definition Graph.hh:2793
Definition Equalizer.hh:303
PowerSet< A > * Index(PowerSet< B > *b) const
Definition Equalizer.hh:306
InverseImage(Function< A, B > &f)
Definition Equalizer.hh:305
virtual int SizeX() const
Definition Graph.hh:782
InverseMapBitmap(Bitmap< T > &bm, std::pair< int, int >(*fptr)(std::pair< int, int >), int sx, int sy)
Definition Graph.hh:777
virtual int SizeY() const
Definition Graph.hh:783
virtual T Map(int x, int y) const
Definition Graph.hh:784
void Prepare()
Definition Graph.hh:778
virtual C Map(float x, float y, float z) const
Definition Graph.hh:3916
virtual float SizeZ() const
Definition Graph.hh:3915
JustVoxel(ContinuousVoxel< Maybe< C > > &vox, C def)
Definition Graph.hh:3912
virtual float SizeX() const
Definition Graph.hh:3913
virtual float SizeY() const
Definition Graph.hh:3914
void push_back(Bitmap< T > *bm)
Definition Graph.hh:5951
virtual T Map(int x, int y) const
Definition Graph.hh:5957
LayerBitmap(T(*fptr)(T *, int), int sx, int sy, T def)
Definition Graph.hh:5942
virtual int SizeX() const
Definition Graph.hh:5955
void Prepare()
Definition Graph.hh:5943
virtual int SizeY() const
Definition Graph.hh:5956
void set_pos(int i, Point2d pos_p)
Definition Graph.hh:2284
void finish_push_backs()
Definition Graph.hh:2274
void push_back(Bitmap< T > *t)
Definition Graph.hh:2266
virtual int SizeX() const
Definition Graph.hh:2286
void set_combiner(CombineElems< bool, T > *e)
Definition Graph.hh:2285
virtual T Map(int x, int y) const
Definition Graph.hh:2288
void Prepare()
Definition Graph.hh:2267
virtual int SizeY() const
Definition Graph.hh:2287
LayeredBitmap2()
Definition Graph.hh:2265
void Prepare()
Definition Graph.hh:2235
int SizeY() const
Definition Graph.hh:2238
int SizeX() const
Definition Graph.hh:2237
int Map(int x, int y) const
Definition Graph.hh:2239
LayeredBitmap(Array< int, Bitmap< bool > * > &arr, Array< int, int > &arr2)
Definition Graph.hh:2233
Definition Graph.hh:8395
virtual int count() const =0
virtual ~Layout()
Definition Graph.hh:8397
virtual TRect get(int i) const =0
virtual int SizeY() const
Definition Graph.hh:950
LighterBitmap(Bitmap< Color > &orig, Bitmap< float > &light, Point2d pos)
Definition Graph.hh:943
void Prepare()
Definition Graph.hh:944
virtual int SizeX() const
Definition Graph.hh:949
virtual Color Map(int x, int y) const
Definition Graph.hh:951
Definition Graph.hh:5788
Definition EffectI.hh:305
Definition Graph.hh:5977
LineIn2d2(Point2d p1, Point2d p2)
Definition Graph.hh:5979
float Index(float x) const
Definition Graph.hh:5980
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
LinearInterpolation2(C c1, C c2)
Definition Graph.hh:132
C Interpolate(float pos) const
Definition Graph.hh:133
Definition Shader.hh:1346
Definition Graph.hh:1630
int SizeX() const
Definition Graph.hh:1635
int SizeY() const
Definition Graph.hh:1636
MBitmap(int x, int y)
Definition Graph.hh:1632
void Prepare()
Definition Graph.hh:1633
T Map(int xx, int yy) const
Definition Graph.hh:1637
T & Mod(int xx, int yy)
Definition Graph.hh:1641
MBitmap< T > & operator=(const MBitmap< T > &t)
Definition Graph.hh:1642
MBitmap(const MBitmap< T > &t)
Definition Graph.hh:1650
Definition Graph.hh:1661
MBitmap< T > Index(Size s) const
Definition Graph.hh:1663
MandelbrotVolume(bool julia, int count, float yy)
Definition Graph.hh:7064
virtual bool Inside(Point v) const
Definition Graph.hh:7065
Definition Graph.hh:6983
Mandelbrot(bool julia, float start_x, float end_x, float start_y, float end_y, int sx, int sy, int count, float xx, float yy)
Definition Graph.hh:6985
int SizeY() const
Definition Graph.hh:6993
int SizeX() const
Definition Graph.hh:6992
void Prepare()
Definition Graph.hh:6991
int Map(int x, int y) const
Definition Graph.hh:6994
void Collect(CollectVisitor &vis)
Definition Graph.hh:6986
void HeavyPrepare()
Definition Graph.hh:6989
MapArray(Array< int, TRect > &arr, Function< TRect, CubeCoords > &func)
Definition Effect.hh:803
int SizeX() const
Definition Graph.hh:7108
MapBitmapToColor(int value1, int value2, Color c1, Color c2, Bitmap< int > &bm)
Definition Graph.hh:7094
void HeavyPrepare()
Definition Graph.hh:7105
void Prepare()
Definition Graph.hh:7106
void Collect(CollectVisitor &vis)
Definition Graph.hh:7101
int SizeY() const
Definition Graph.hh:7109
Color Map(int x, int y) const
Definition Graph.hh:7110
int SizeX() const
Definition Graph.hh:1684
K Map(int x, int y) const
Definition Graph.hh:1686
int SizeY() const
Definition Graph.hh:1685
MapBitmap(Bitmap< T1 > &bm, Function< T2, K > &f)
Definition Graph.hh:1675
void Collect(CollectVisitor &vis)
Definition Graph.hh:1676
void HeavyPrepare()
Definition Graph.hh:1680
void Prepare()
Definition Graph.hh:1682
float SizeY() const
Definition Graph.hh:2936
float SizeX() const
Definition Graph.hh:2935
MapContinuousBitmap(ContinuousBitmap< T1 > &bm, Function< T2, K > &f)
Definition Graph.hh:2930
void Collect(CollectVisitor &vis)
Definition Graph.hh:2931
void Prepare()
Definition Graph.hh:2933
void HeavyPrepare()
Definition Graph.hh:2932
K Map(float x, float y) const
Definition Graph.hh:2937
FaceCollectionHandleValueDynamic hv
Definition Graph.hh:5098
PieceShader shader
Definition Graph.hh:5104
float YRot() const
Definition Graph.hh:5089
void Init()
Definition Graph.cc:291
float ZRot() const
Definition Graph.hh:5090
unsigned int texture
Definition Graph.hh:5102
float RotSpeed() const
Definition Graph.hh:5091
BitmapFromFile< bool > mapfunc
Definition Graph.hh:5095
TexturePiece texturepiece
Definition Graph.hh:5103
MapFunction mapfunc1
Definition Graph.hh:5093
bool first
Definition Graph.hh:5100
BitmapFromFile< unsigned int > colorfunc
Definition Graph.hh:5096
MapEffect(Render *r)
Definition Graph.cc:266
~MapEffect()
Definition Graph.cc:287
ColorMapFunction colorfunc1
Definition Graph.hh:5094
float XRot() const
Definition Graph.hh:5088
bool Frame(float time)
Definition Graph.cc:306
VBOState vbostate
Definition Graph.hh:5099
Definition Graph.hh:2432
bool Index(char c) const
Definition Graph.hh:2434
MapRectArray(Array< int, TRect > &arr, Point p, Vector u_x, Vector u_y, Vector u_z, float z)
Definition Graph.hh:1702
MapRectBitmap(Bitmap< TRect > &bm, Point p, Vector u_x, Vector u_y, Vector u_z, float z)
Definition Graph.hh:1695
int SizeY() const
Definition Graph.hh:3549
K Map(int x, int y, int z) const
Definition Graph.hh:3551
int SizeX() const
Definition Graph.hh:3548
int SizeZ() const
Definition Graph.hh:3550
MapVoxel(Voxel< T1 > &bm, Function< T2, K > &f)
Definition Graph.hh:3547
MarchingCubesVoxel(Voxel< bool > &vox, HandleValue< Cube2 > &hv)
Definition Graph.hh:4787
void Gen()
Definition Graph.hh:4788
virtual float SizeX() const
Definition Graph.hh:4018
virtual Point Map(float x, float y, float z) const
Definition Graph.hh:4021
virtual float SizeY() const
Definition Graph.hh:4019
virtual float SizeZ() const
Definition Graph.hh:4020
MatrixContinuousVoxel(ContinuousVoxel< Point > &p, Matrix m)
Definition Graph.hh:4017
Definition Effect.hh:8076
Definition Graph.hh:5674
Matrix id() const
Definition Graph.hh:5680
Matrix m(Matrix t1, Matrix t2) const
Definition Graph.hh:5676
Matrix inv(Matrix t) const
Definition Graph.hh:5684
Definition VectorTools.hh:279
float matrix[16]
Definition VectorTools.hh:343
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 ZRotation(float rot)
Definition VectorTools.cc:537
static Matrix Identity()
Definition VectorTools.cc:487
static Matrix Scale(float x, float y, float z)
Definition VectorTools.cc:556
virtual Maybe< C > Map(float x, float y, float z) const
Definition Graph.hh:3899
MaybeVoxel(VolumeObject &obj, ContinuousVoxel< C > &data)
Definition Graph.hh:3895
virtual float SizeZ() const
Definition Graph.hh:3898
virtual float SizeY() const
Definition Graph.hh:3897
virtual float SizeX() const
Definition Graph.hh:3896
Definition Graph.hh:3877
bool b
Definition Graph.hh:3888
Maybe(const T &t)
Definition Graph.hh:3880
~Maybe()
Definition Graph.hh:3887
void operator=(const Maybe< T > &m)
Definition Graph.hh:3882
T * obj
Definition Graph.hh:3889
Maybe()
Definition Graph.hh:3879
Maybe(const Maybe< T > &m)
Definition Graph.hh:3881
void Collect(CollectVisitor &vis)
Definition Graph.hh:1026
MemoizeBitmap(Bitmap< Color > &bm)
Definition Graph.hh:1022
void Prepare()
Definition Graph.hh:1043
virtual Color Map(int x, int y) const
Definition Graph.hh:1071
void MemoizeAll()
Definition Graph.hh:1059
virtual int SizeX() const
Definition Graph.hh:1069
void HeavyPrepare()
Definition Graph.hh:1030
virtual int SizeY() const
Definition Graph.hh:1070
~MemoizeBitmap()
Definition Graph.hh:1058
Definition Effect.hh:11366
~MeshTexturesImpl()
Definition Graph.hh:6505
MeshTexturesImpl(Bitmap< Color > &bm)
Definition Graph.hh:6503
virtual BufferRef TextureBuf(int num) const
Definition Graph.hh:6547
MeshTexturesImpl(Bitmap< Color > &bm, MeshTextures &tex)
Definition Graph.hh:6504
virtual int NumTextures() const
Definition Graph.hh:6506
virtual void GenTexture(int num)
Definition Graph.hh:6507
Definition Effect.hh:11409
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
void Prepare()
Definition Graph.hh:1224
virtual T Map(int xx, int yy) const
Definition Graph.hh:1228
ModifyBitmap(Bitmap< T > &bm, Bitmap< T > &bm2, int x, int y)
Definition Graph.hh:1218
virtual int SizeY() const
Definition Graph.hh:1227
void Collect(CollectVisitor &vis)
Definition Graph.hh:1219
void HeavyPrepare()
Definition Graph.hh:1223
virtual int SizeX() const
Definition Graph.hh:1226
Definition Graph.hh:5618
virtual T m(T t1, T t2) const =0
virtual T id() const =0
MoveMap(Vector v)
Definition Graph.hh:6638
Point SpaceMap(Point p) const
Definition Graph.hh:6639
Definition Effect.hh:733
Definition GraphI.hh:1154
virtual NDim< I, B > * Interpolate(const NDim< I, B > &b1, const NDim< I, B > &b2, I val) const =0
virtual B Map(I *array, int size) const =0
virtual std::vector< I > Count() const =0
virtual int SizeX() const
Definition Graph.hh:2070
virtual float Map(int x, int y) const
Definition Graph.hh:2072
NodeToOne(Bitmap< float > &bm, int x_and_y)
Definition Graph.hh:2062
virtual int SizeY() const
Definition Graph.hh:2071
void Prepare()
Definition Graph.hh:2068
void Collect(CollectVisitor &vis)
Definition Graph.hh:2063
void HeavyPrepare()
Definition Graph.hh:2067
int SizeY() const
Definition Graph.hh:2091
void Collect(CollectVisitor &vis)
Definition Graph.hh:2083
int SizeX() const
Definition Graph.hh:2090
NodeToZero(Bitmap< float > &bm, int x, int y)
Definition Graph.hh:2082
void HeavyPrepare()
Definition Graph.hh:2087
void Prepare()
Definition Graph.hh:2088
float Map(int x, int y) const
Definition Graph.hh:2092
virtual int SizeY() const
Definition Graph.hh:5567
virtual Point Map(int x, int y) const
Definition Graph.hh:5568
void Prepare()
Definition Graph.hh:5564
NormalMapping1(SurfaceIn3d &surf, SurfaceIn3d &polys, int sizex, int sizey)
Definition Graph.hh:5563
virtual int SizeX() const
Definition Graph.hh:5566
Definition Shader.hh:412
virtual int SizeY() const
Definition Graph.hh:897
NormalRectBitmap(Point2d p1, Vector2d u_x, Vector2d u_y, float width, float height, float x_gap, float y_gap, int sx, int sy)
Definition Graph.hh:889
virtual TRect Map(int x, int y) const
Definition Graph.hh:898
virtual int SizeX() const
Definition Graph.hh:896
void Prepare()
Definition Graph.hh:587
void Collect(CollectVisitor &vis)
Definition Graph.hh:582
NotBitmap(Bitmap< bool > &bm)
Definition Graph.hh:581
bool Map(int x, int y) const
Definition Graph.hh:591
virtual int SizeY() const
Definition Graph.hh:590
void HeavyPrepare()
Definition Graph.hh:585
virtual int SizeX() const
Definition Graph.hh:589
void render(Point p, float startz)
Definition Graph.hh:215
int SizeX() const
Definition Graph.hh:203
Object3dRender(VolumeObject &o, int sx, int sy, Point p, float min_z, float max_z)
Definition Graph.hh:197
bool Map(int x, int y) const
Definition Graph.hh:205
Point2d projection(Point p) const
Definition Graph.hh:209
int SizeY() const
Definition Graph.hh:204
void Prepare()
Definition Graph.hh:202
OrBitmap(Bitmap< bool > &bm1, Bitmap< bool > &bm2)
Definition Graph.hh:599
virtual int SizeX() const
Definition Graph.hh:610
bool Map(int x, int y) const
Definition Graph.hh:612
void Prepare()
Definition Graph.hh:605
virtual int SizeY() const
Definition Graph.hh:611
void Collect(CollectVisitor &vis)
Definition Graph.hh:600
void HeavyPrepare()
Definition Graph.hh:604
Definition Effect.hh:7021
Definition Graph.hh:6672
virtual T PairMap(Point2d p1, Point2d p2) const =0
Definition Graph.hh:6666
virtual T PairMap(Point p1, Point p2) const =0
PartCircleBoolBitmap(int sx, int sy, float x, float y, float start_angle, float end_angle, float start_rad, float end_rad)
Definition Graph.hh:341
void Prepare()
Definition Graph.hh:345
void Collect(CollectVisitor &vis)
Definition Graph.hh:342
void HeavyPrepare()
Definition Graph.hh:344
virtual int SizeX() const
Definition Graph.hh:347
virtual int SizeY() const
Definition Graph.hh:348
bool Map(int ax, int ay) const
Definition Graph.hh:350
Definition Shader.hh:444
float SpaceMap(Point normal) const
Definition Graph.hh:6648
PhongSpace(Point viewer, Point light, int count)
Definition Graph.hh:6647
Definition Shader.hh:1251
virtual T Map(float x, float y) const
Definition Graph.hh:4001
virtual float SizeX() const
Definition Graph.hh:3999
void Collect(CollectVisitor &vis)
Definition Graph.hh:3995
void Prepare()
Definition Graph.hh:3998
void HeavyPrepare()
Definition Graph.hh:3996
virtual float SizeY() const
Definition Graph.hh:4000
PlaneBitmap(ContinuousVoxel< T > &voxel, Plane pl, float sx, float sy)
Definition Graph.hh:3994
Definition Effect.hh:2218
Point Elem() const
Definition Effect.hh:2221
Definition Graph.hh:8313
virtual ~PlanePoints2d()
Definition Graph.hh:8315
virtual Point2d Map(int i) const =0
virtual float SizeX() const =0
virtual float SizeY() const =0
virtual PlanePointsType Type(int i) const
Definition Graph.hh:8322
virtual int Size() const =0
PlanePointsType
Definition Graph.hh:8321
@ EConic
Definition Graph.hh:8321
@ EMove
Definition Graph.hh:8321
@ ELineTo
Definition Graph.hh:8321
@ ECubic
Definition Graph.hh:8321
Definition VectorTools.hh:350
Definition Effect.hh:2663
Definition Effect.hh:2456
void Prepare()
Definition Graph.hh:2337
Point Map(int xx, int yy) const
Definition Graph.hh:2341
PointGrid(int x, int y, Point p, Vector u_x, Vector u_y, int sx, int sy)
Definition Graph.hh:2336
int SizeX() const
Definition Graph.hh:2339
int SizeY() const
Definition Graph.hh:2340
PointPairSpace2d(Vector2d v1_dir, Vector2d v2_dir)
Definition Graph.hh:6693
Point2d PairMap(Point2d p1, Point2d p2) const
Definition Graph.hh:6694
PointSplitSpace(Vector v1, Vector v2)
Definition Graph.hh:6681
std::pair< Point, Point > SpaceMap(Point p) const
Definition Graph.hh:6682
Definition GraphI.hh:2349
virtual int NumPoints() const =0
virtual unsigned int Color(int i) const =0
virtual Point Pos(int i) const =0
void HeavyPrepare()
Definition Graph.hh:1557
virtual Pos Map(int x, int y) const
Definition Graph.hh:1561
PosBitmap(int sx, int sy)
Definition Graph.hh:1555
virtual int SizeX() const
Definition Graph.hh:1559
void Prepare()
Definition Graph.hh:1558
void Collect(CollectVisitor &vis)
Definition Graph.hh:1556
virtual int SizeY() const
Definition Graph.hh:1560
virtual float SizeZ() const
Definition Graph.hh:3977
PosContinuousVoxel(float sx, float sy, float sz)
Definition Graph.hh:3973
virtual float SizeY() const
Definition Graph.hh:3976
virtual Point Map(float x, float y, float z) const
Definition Graph.hh:3978
virtual float SizeX() const
Definition Graph.hh:3975
Definition Shader.hh:75
bool Eval(A a, B b)
Definition Graph.hh:4732
PullBack(Array< int, A > &a_array, Array< int, B > &b_array, Function< A, C > &f, Function< B, C > &g)
Definition Graph.hh:4714
void Gen(HandleValue< std::pair< A, B > > &gen)
Definition Graph.hh:4719
Quad get(int face) const
Definition Graph.hh:3618
virtual int AttribI(int face, int point, int id) const
Definition Graph.hh:3608
virtual std::string name() const
Definition Graph.hh:3583
QuadArrayElem(Array< int, Quad > &array)
Definition Graph.hh:3582
virtual int NumFaces() const
Definition Graph.hh:3587
virtual unsigned int Color(int face, int point) const
Definition Graph.hh:3609
void HeavyPrepare()
Definition Graph.hh:3586
virtual Vector PointNormal(int face, int point) const
Definition Graph.hh:3597
virtual Point FacePoint(int face, int point) const
Definition Graph.hh:3589
virtual int NumPoints(int face) const
Definition Graph.hh:3588
virtual float Attrib(int face, int point, int id) const
Definition Graph.hh:3607
virtual Point2d TexCoord(int face, int point) const
Definition Graph.hh:3610
void Collect(CollectVisitor &vis)
Definition Graph.hh:3585
virtual Point FacePoint(int face, int point) const
Definition Graph.hh:3634
virtual int NumPoints(int face) const
Definition Graph.hh:3633
virtual Point2d TexCoord(int face, int point) const
Definition Graph.hh:3655
virtual unsigned int Color(int face, int point) const
Definition Graph.hh:3654
virtual int NumFaces() const
Definition Graph.hh:3632
virtual float Attrib(int face, int point, int id) const
Definition Graph.hh:3652
QuadBitmapElem(Bitmap< Quad > &voxel)
Definition Graph.hh:3630
Quad get(int face) const
Definition Graph.hh:3663
virtual int AttribI(int face, int point, int id) const
Definition Graph.hh:3653
virtual Vector PointNormal(int face, int point) const
Definition Graph.hh:3642
void Prepare()
Definition Graph.hh:1480
int SizeY() const
Definition Graph.hh:1483
int SizeX() const
Definition Graph.hh:1482
Quad Map(int x, int y) const
Definition Graph.hh:1484
QuadBitmapFromObjects(FaceCollection &coll, Array< int, Point > &pos)
Definition Graph.hh:1479
int SizeX() const
Definition Graph.hh:1457
Quad Map(int x, int y) const
Definition Graph.hh:1459
int SizeY() const
Definition Graph.hh:1458
void Prepare()
Definition Graph.hh:1455
QuadBitmapFromSphere(Point center, float radius, int sx, int sy)
Definition Graph.hh:1453
virtual bool Map(float x, float y) const
Definition Graph.hh:3247
QuadContinuousBitmap(float sx, float sy, Point2d p1, Point2d p2, Point2d p3, Point2d p4)
Definition Graph.hh:3242
virtual float SizeY() const
Definition Graph.hh:3246
virtual float SizeX() const
Definition Graph.hh:3245
void Prepare()
Definition Graph.hh:3243
Quad Index(std::pair< Quad, Quad > p) const
Definition Graph.hh:49
QuadInterpolationFunction(float val)
Definition Graph.hh:48
virtual float Attrib(int face, int point, int id) const
Definition Graph.hh:3701
virtual Point FacePoint(int face, int point) const
Definition Graph.hh:3683
virtual Vector PointNormal(int face, int point) const
Definition Graph.hh:3691
virtual int NumPoints(int face) const
Definition Graph.hh:3682
virtual Point2d TexCoord(int face, int point) const
Definition Graph.hh:3704
virtual int NumFaces() const
Definition Graph.hh:3681
Quad get(int face) const
Definition Graph.hh:3712
virtual int AttribI(int face, int point, int id) const
Definition Graph.hh:3702
QuadVoxelElem(Voxel< Quad > &voxel)
Definition Graph.hh:3679
virtual unsigned int Color(int face, int point) const
Definition Graph.hh:3703
int SizeY() const
Definition Graph.hh:3563
int SizeX() const
Definition Graph.hh:3562
int SizeZ() const
Definition Graph.hh:3564
Quad Map(int x, int y, int z) const
Definition Graph.hh:3565
QuadVoxelFromObjects(FaceCollection &coll, Bitmap< Point > &pos)
Definition Graph.hh:3561
int SizeX() const
Definition Graph.hh:1826
RandomBitmap(int x, int y, float min, float max)
Definition Graph.hh:1829
int SizeY() const
Definition Graph.hh:1827
void Prepare()
Definition Graph.hh:1824
float Map(int xx, int yy) const
Definition Graph.hh:1828
float Rand()
Definition Graph.hh:1841
~RandomBitmap()
Definition Graph.hh:1840
int SizeX() const
Definition Graph.hh:2817
RandomSamplingBitmap(ContinuousBitmap< Color > &c, int count)
Definition Graph.hh:2814
void Prepare()
Definition Graph.hh:2815
Color Map(int x, int y) const
Definition Graph.hh:2819
int SizeY() const
Definition Graph.hh:2818
float Rand()
Definition Graph.hh:2832
Definition VolumeObjects.hh:1005
Definition Effect.hh:1305
T end
Definition Effect.hh:1310
T start
Definition Effect.hh:1309
RayTrace(ContinuousVoxel< float > &objs)
Definition Graph.hh:3839
Point RayTraceFunc(Point p, Vector v)
Definition Graph.hh:3840
virtual Color Map(int x, int y) const
Definition Graph.hh:3862
virtual int SizeX() const
Definition Graph.hh:3860
virtual int SizeY() const
Definition Graph.hh:3861
RayTracingBitmap(Function< Point2d, Point > &raytrace, ContinuousVoxel< Color > &color, int sx, int sy)
Definition Graph.hh:3855
void Prepare()
Definition Graph.hh:3858
Definition Graph.hh:3783
RayTracingFunction0(Point p1, Vector v)
Definition Graph.hh:3785
Point Index(float x) const
Definition Graph.hh:3786
Definition Graph.hh:3796
float Index(float x) const
Definition Graph.hh:3799
RayTracingFunction1(Function< float, Point > &f, ContinuousVoxel< float > &objs)
Definition Graph.hh:3798
Point Index(Point2d p) const
Definition Graph.hh:3814
Point RayTrace(Point p, Vector v) const
Definition Graph.hh:3821
RayTracingFunction(ContinuousVoxel< float > &objs, Vector v, float z)
Definition Graph.hh:3812
Definition Graph.hh:883
Definition Graph.hh:916
CubeCoords Index(TRect r) const
Definition Graph.hh:919
RectCubeFunction(Point p, Vector u_x, Vector u_y, Vector u_z, float z)
Definition Graph.hh:918
Definition Graph.hh:63
Point2d br
Definition Graph.hh:95
float x
Definition Layout.hh:43
float height
Definition Layout.hh:43
float y
Definition Layout.hh:43
Point2d RectInternalCoordinates(Point2d p)
Definition Graph.hh:87
bool InsideRect(Point2d p)
Definition Graph.hh:79
float width
Definition Layout.hh:43
Point2d tl
Definition Graph.hh:94
std::pair< Rect, Rect > SplitX()
Definition Graph.hh:65
Definition Effect.hh:9104
Definition Graph.hh:98
RegularPolygon(Point2d center, float radius, int count, float angle)
Definition Graph.hh:5771
Point2d Index(int i) const
Definition Graph.hh:5773
int Size() const
Definition Graph.hh:5772
virtual bool Inside(Point p) const
Definition Graph.hh:5547
virtual unsigned int Color(int face, int point) const
Definition Graph.hh:5544
virtual int NumPoints(int face) const
Definition Graph.hh:5539
virtual float Attrib(int face, int point, int id) const
Definition Graph.hh:5542
virtual int NumFaces() const
Definition Graph.hh:5538
virtual int AttribI(int face, int point, int id) const
Definition Graph.hh:5543
virtual Vector PointNormal(int face, int point) const
Definition Graph.hh:5541
virtual Point2d TexCoord(int face, int point) const
Definition Graph.hh:5545
RenderGraph(Graph &g, GraphData< V, E > &data, DataRep< V > &vertex, DataRep< E > &edge)
Definition Graph.hh:5511
virtual Point FacePoint(int face, int point) const
Definition Graph.hh:5540
virtual void SetBox(Matrix b)
Definition Graph.hh:5546
void Refresh()
Definition Graph.hh:5517
RenderPolyToBitmap(Point2d center_in_bm, Point center, int sx, int sy, FaceCollection *coll, Bitmap< Color > &bg)
Definition Graph.hh:8086
virtual int SizeY() const
Definition Graph.hh:8090
void Prepare()
Definition Graph.hh:8087
virtual Point2d Perspective(Point p) const
Definition Graph.hh:8145
virtual Color TexMap(int face, float r, float g, float b, float a, float tx, float ty) const
Definition Graph.hh:8134
virtual Color Map(int x, int y) const
Definition Graph.hh:8091
virtual int SizeX() const
Definition Graph.hh:8089
RenderToTextureEffect(Render *r)
Definition Graph.cc:396
bool Frame(float time)
Definition Graph.cc:430
void Init()
Definition Graph.cc:419
Definition Effect.hh:9514
RepeatBitmap(Bitmap< C > &bm, int times_x, int times_y)
Definition Graph.hh:1862
C Map(int x, int y) const
Definition Graph.hh:1871
int SizeX() const
Definition Graph.hh:1869
void Prepare()
Definition Graph.hh:1867
int SizeY() const
Definition Graph.hh:1870
void HeavyPrepare()
Definition Graph.hh:1866
void Collect(CollectVisitor &vis)
Definition Graph.hh:1863
virtual float SizeY() const
Definition Graph.hh:2764
RotateContinuousBitmap(ContinuousBitmap< C > *orig, float center_x, float center_y, float angle)
Definition Graph.hh:2756
void Prepare()
Definition Graph.hh:2762
void HeavyPrepare()
Definition Graph.hh:2760
virtual float SizeX() const
Definition Graph.hh:2763
virtual C Map(float x, float y) const
Definition Graph.hh:2765
void Collect(CollectVisitor &vis)
Definition Graph.hh:2757
RotateZoomer(Bitmap< C > &bm, int sx, int sy, Point2d p1, Vector2d vx, Vector2d vy, C outside)
Definition Graph.hh:1915
virtual C Map(int x, int y) const
Definition Graph.hh:1920
virtual int SizeY() const
Definition Graph.hh:1919
void Prepare()
Definition Graph.hh:1916
virtual int SizeX() const
Definition Graph.hh:1918
Definition Graph.hh:2028
virtual int SizeY() const
Definition Graph.hh:2040
virtual int SizeX() const
Definition Graph.hh:2039
void Prepare()
Definition Graph.hh:2037
RowAddition(Bitmap< float > &bm, int row1, int row2, float val_for_row2)
Definition Graph.hh:2030
void Collect(CollectVisitor &vis)
Definition Graph.hh:2031
void HeavyPrepare()
Definition Graph.hh:2035
virtual float Map(int x, int y) const
Definition Graph.hh:2041
Definition Graph.hh:1996
void Collect(CollectVisitor &vis)
Definition Graph.hh:1999
virtual int SizeY() const
Definition Graph.hh:2008
virtual float Map(int x, int y) const
Definition Graph.hh:2009
void Prepare()
Definition Graph.hh:2005
void HeavyPrepare()
Definition Graph.hh:2003
RowMultiply(Bitmap< float > &bm, int row, float val)
Definition Graph.hh:1998
virtual int SizeX() const
Definition Graph.hh:2007
SampleBitmap(ContinuousBitmap< Color > &c, int sx, int sy)
Definition Graph.hh:3422
Color Map(int x, int y) const
Definition Graph.hh:3435
int SizeX() const
Definition Graph.hh:3433
int SizeY() const
Definition Graph.hh:3434
void Collect(CollectVisitor &vis)
Definition Graph.hh:3423
void Prepare()
Definition Graph.hh:3429
bool ReadyToPrepare() const
Definition Graph.hh:3431
void HeavyPrepare()
Definition Graph.hh:3427
Definition Effect.hh:2866
void Collect(CollectVisitor &vis)
Definition Graph.hh:4036
void CleanPrepare()
Definition Graph.hh:4053
int SizeY() const
Definition Graph.hh:4040
void Prepare()
Definition Graph.hh:4038
int SizeZ() const
Definition Graph.hh:4041
void HeavyPrepare()
Definition Graph.hh:4037
int SizeX() const
Definition Graph.hh:4039
SampleVoxel(ContinuousVoxel< T > &v, int x, int y, int z)
Definition Graph.hh:4035
T Map(int xx, int yy, int zz) const
Definition Graph.hh:4042
float Sample(int xx, int xsize, float sizex) const
Definition Graph.hh:4049
Definition Effect.hh:8424
int Size() const
Definition Graph.hh:4697
Point2d Index(int i) const
Definition Graph.hh:4696
SampledGraph(Function< float, float > &func, float start, float end, int steps)
Definition Graph.hh:4695
void Handle(std::pair< Vector, T > v)
Definition Graph.hh:4542
ScaleTranslateHandleValue(HandleValue< std::pair< Matrix, T > > &hv, float sx, float sy, float sz)
Definition Graph.hh:4541
Definition Graph.hh:6559
float TargetRangeX() const
Definition Graph.hh:6568
void SetTargetPos(float x, float y)
Definition Graph.hh:6570
ScrollableView(int viewsizex, int viewsizey, int wholesizex, int wholesizey, float speed)
Definition Graph.hh:6561
void Frame()
Definition Graph.hh:6581
float PosX() const
Definition Graph.hh:6601
void SetSpeed(float s)
Definition Graph.hh:6603
float PosY() const
Definition Graph.hh:6602
float TargetRangeY() const
Definition Graph.hh:6569
ShaderEffect(ShaderFile &file, Render *r)
Definition Graph.hh:6376
void Init()
Definition Graph.cc:550
bool Frame(float time)
Definition Graph.cc:572
Definition Shader.hh:1466
Definition Shader.hh:1480
Definition Effect.hh:4983
Definition Effect.hh:3163
Definition Graph.hh:6427
int SizeY() const
Definition Graph.hh:6449
int SizeX() const
Definition Graph.hh:6438
void Collect(CollectVisitor &vis)
Definition Graph.hh:6430
SizeBitmapTo2(Bitmap< Color > &bm)
Definition Graph.hh:6429
void HeavyPrepare()
Definition Graph.hh:6434
Color Map(int x, int y) const
Definition Graph.hh:6460
void Prepare()
Definition Graph.hh:6436
Definition Graph.hh:7457
virtual void visit(Point2d &p)
Definition Graph.hh:7470
virtual void visit(VectorArray< Loop > *array)
Definition Graph.hh:7474
SizePosVisitor()
Definition Graph.hh:7459
int Type(int i) const
Definition Graph.hh:7492
virtual void visit(int &a)
Definition Graph.hh:7466
int Offset(int i) const
Definition Graph.hh:7490
virtual void visit(Point &p)
Definition Graph.hh:7472
virtual void visit(bool &b)
Definition Graph.hh:7460
int Size(int i) const
Definition Graph.hh:7491
virtual void visit(float &b)
Definition Graph.hh:7468
virtual void visit(VectorArray< Point2d > *array)
Definition Graph.hh:7480
Definition Effect.hh:10172
Definition Graph.hh:6630
virtual T SpaceMap(Point2d p) const =0
Definition Graph.hh:6624
virtual T SpaceMap(Point p) const =0
Definition Graph.hh:4103
virtual T Map(float r, float alfa, float beta) const =0
virtual float radius() const =0
int SizeY() const
Definition Graph.hh:6739
int SizeX() const
Definition Graph.hh:6738
void Prepare()
Definition Graph.hh:6736
float Map(int x, int y) const
Definition Graph.hh:6740
SphereDist(Point center, float r, int sx, int sy, Point2d tl, Point2d br)
Definition Graph.hh:6735
Definition Effect.hh:9304
Definition Graph.hh:6725
virtual T SMap(float alfa, float beta) const =0
Sphere(Point center, float radius)
Definition Graph.hh:8060
float Radius() const
Definition Graph.hh:8066
bool Index(Point p) const
Definition Graph.hh:8061
Point Center() const
Definition Graph.hh:8067
Definition VectorTools.hh:106
float r
Definition VectorTools.hh:113
float alfa
Definition VectorTools.hh:114
float beta
Definition VectorTools.hh:115
Point ToPoint()
Definition VectorTools.cc:87
float SizeY() const
Definition Graph.hh:2952
void Prepare()
Definition Graph.hh:2949
Point2d Map(float x, float y) const
Definition Graph.hh:2953
float SizeX() const
Definition Graph.hh:2951
SpiralContinuousBitmap(float sx, float sy, Point2d center, Function< float, float > &mymap)
Definition Graph.hh:2947
int Size() const
Definition Graph.hh:6003
SplitLines2d(Line2dCollection &lines, Line2d split)
Definition Graph.hh:6002
void Execute()
Definition Graph.hh:6009
Line2d Index(int i) const
Definition Graph.hh:6004
virtual int NumPoints() const
Definition Graph.hh:6918
virtual int StateNum(int frame, int face) const
Definition Graph.hh:6913
virtual int NumFaces(int framenum) const
Definition Graph.hh:6917
virtual Point FacePoint(int framenum, int statenum, int face, int point) const
Definition Graph.hh:6919
virtual int NumFrames() const
Definition Graph.hh:6916
SpriteMesh(const Sprite &s)
Definition Graph.hh:6911
virtual int NumStates() const
Definition Graph.hh:6912
virtual Point2d TexCoord(int framenum, int statenum, int face, int point) const
Definition Graph.hh:6945
SpriteTexCoords(const Sprite &s)
Definition Graph.hh:6943
virtual int NumFrames() const
Definition Graph.hh:6944
Definition GraphI.hh:1223
StructBitmap(Array< int, T > &a1, Array< int, K > &a2)
Definition Graph.hh:1603
int SizeX() const
Definition Graph.hh:1606
int SizeY() const
Definition Graph.hh:1607
void Prepare()
Definition Graph.hh:1604
std::pair< T, K > Map(int x, int y) const
Definition Graph.hh:1608
StructVoxel(Bitmap< X > &bm, Array< int, Y > &a)
Definition Graph.hh:3731
virtual int SizeZ() const
Definition Graph.hh:3734
virtual int SizeX() const
Definition Graph.hh:3732
virtual std::pair< X, Y > Map(int x, int y, int z) const
Definition Graph.hh:3735
virtual int SizeY() const
Definition Graph.hh:3733
int SizeY() const
Definition Graph.hh:1369
void Collect(CollectVisitor &vis)
Definition Graph.hh:1360
T Map(int mx, int my) const
Definition Graph.hh:1370
void Prepare()
Definition Graph.hh:1366
int SizeX() const
Definition Graph.hh:1368
void HeavyPrepare()
Definition Graph.hh:1364
SubBitmap(Bitmap< T > &bm, int x, int y, int width, int height)
Definition Graph.hh:1359
Pos Index(Pos p) const
Definition Graph.hh:1576
SubPos(int x, int y)
Definition Graph.hh:1575
void HeavyLoop()
Definition Graph.hh:7966
std::vector< A > vec_false
Definition Graph.hh:7979
Subset(Array< int, A > &enumeration, Function< A, B > &subsetfunc, Function< B, bool > &characteristic)
Definition Graph.hh:7963
std::vector< A > vec_true
Definition Graph.hh:7978
SubstituteBitmapPixels(Bitmap< T > &bm, Function< T, Bitmap< C > * > &func, int sx, int sy)
Definition Graph.hh:1889
virtual int SizeY() const
Definition Graph.hh:1893
virtual int SizeX() const
Definition Graph.hh:1892
void Prepare()
Definition Graph.hh:1890
virtual C Map(int x, int y) const
Definition Graph.hh:1894
Definition Graph.hh:5111
float Index(float alfa) const
Definition Graph.hh:5114
SuperShape2d(float a, float b, float m, float n1, float n2, float n3)
Definition Graph.hh:5113
float YSize() const
Definition Graph.hh:5194
void Collect(CollectVisitor &vis)
Definition Graph.hh:5154
unsigned int Color(float x, float y) const
Definition Graph.hh:5186
Vector Normal(float x, float y) const
Definition Graph.hh:5177
SuperShape3d(float a, float b, float m, float n1, float n2, float n3, float aa, float bb, float mm, float nn1, float nn2, float nn3)
Definition Graph.hh:5140
SuperShape3d(SuperParameters &a1, SuperParameters &a2)
Definition Graph.hh:5138
Point Index(float alfa, float beta) const
Definition Graph.hh:5156
Point2d Texture(float x, float y) const
Definition Graph.hh:5171
float Attrib(float x, float y, int id) const
Definition Graph.hh:5172
float XSize() const
Definition Graph.hh:5190
int AttribI(float x, float y, int id) const
Definition Graph.hh:5173
void HeavyPrepare()
Definition Graph.hh:5155
bool Frame(float time)
Definition Graph.cc:384
SuperShapeEffect(Render *r)
Definition Graph.hh:6322
virtual void Prepare()
Definition Effect.hh:1900
SurfaceIn3dImpl(SurfaceIn3d &next)
Definition Effect.hh:1899
virtual float YSize() const
Definition Effect.hh:1908
virtual float XSize() const
Definition Effect.hh:1907
Definition Effect.hh:1880
virtual float YSize() const =0
virtual Point Index(float x, float y) const =0
virtual int AttribI(float x, float y, int id) const =0
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
SwapLine2dCollection(Line2dCollection &coll)
Definition Graph.hh:6048
Line2d Index(int i) const
Definition Graph.hh:6050
int Size() const
Definition Graph.hh:6049
virtual int SizeX() const
Definition Graph.hh:8217
virtual Point2d AreaS(int i) const
Definition Graph.hh:8240
virtual Color Map(int x, int y) const
Definition Graph.hh:8219
TexAssign(TextureI &next, int id, int x, int y, Bitmap< Color > &bm)
Definition Graph.hh:8214
virtual int Id(int i) const
Definition Graph.hh:8235
virtual int SizeY() const
Definition Graph.hh:8218
virtual int AreaCount() const
Definition Graph.hh:8234
virtual Point2d AreaE(int i) const
Definition Graph.hh:8250
virtual int SizeX() const
Definition Graph.hh:8204
virtual Color Map(int x, int y) const
Definition Graph.hh:8206
virtual int SizeY() const
Definition Graph.hh:8205
TexBitmap(Bitmap< Color > &bm)
Definition Graph.hh:8203
virtual int SizeX() const
Definition Graph.hh:8193
virtual Color Map(int x, int y) const
Definition Graph.hh:8195
virtual int SizeY() const
Definition Graph.hh:8194
TexPlane(int sx, int sy)
Definition Graph.hh:8192
Definition Effect.hh:10851
Definition Graph.hh:6709
TextureIBitmap(TextureI &ti)
Definition Graph.hh:8177
void Prepare()
Definition Graph.hh:8180
void HeavyPrepare()
Definition Graph.hh:8179
void Collect(CollectVisitor &vis)
Definition Graph.hh:8178
virtual Color Map(int x, int y) const
Definition Graph.hh:8184
virtual int SizeY() const
Definition Graph.hh:8183
virtual int SizeX() const
Definition Graph.hh:8182
virtual Point2d AreaE(int i) const
Definition Graph.hh:8292
virtual Color Map(int x, int y) const
Definition Graph.hh:8274
virtual Point2d AreaS(int i) const
Definition Graph.hh:8282
virtual int AreaCount() const
Definition Graph.hh:8276
TextureITexCoord(TextureI &next, int id, int x, int y, int width, int height)
Definition Graph.hh:8270
virtual int SizeY() const
Definition Graph.hh:8273
virtual int SizeX() const
Definition Graph.hh:8272
virtual int Id(int i) const
Definition Graph.hh:8277
Definition Graph.hh:8162
virtual int SizeX() const
Definition Graph.hh:8164
virtual int AreaCount() const
Definition Graph.hh:8167
virtual Point2d AreaS(int i) const
Definition Graph.hh:8169
virtual ~TextureI()
Definition Graph.hh:8171
virtual int Id(int i) const
Definition Graph.hh:8168
virtual int SizeY() const
Definition Graph.hh:8165
virtual Point2d AreaE(int i) const
Definition Graph.hh:8170
virtual Color Map(int x, int y) const
Definition Graph.hh:8166
Definition Shader.hh:945
float SizeX() const
Definition Graph.hh:3378
float SizeY() const
Definition Graph.hh:3379
void Prepare()
Definition Graph.hh:3376
TexturedTriangle(float sx, float sy, const Point2d &p1, const Point2d &p2, const Point2d &p3, ContinuousBitmap< Color > &texture, const Point2d &t1, const Point2d &t2, const Point2d &t3)
Definition Graph.hh:3369
Color Map(float x, float y) const
Definition Graph.hh:3380
Definition Graph.hh:6485
int push_thread(BufferFromBitmap *bm, int start_x, int end_x, int start_y, int end_y)
Definition GameApi_dep_arr_render.cc:190
void join(int id)
Definition GameApi_dep_arr_render.cc:211
~ThreadedUpdateTexture()
Definition GameApi_dep_arr_render.cc:217
void DeleteAll()
Definition Graph.hh:1435
TileBitmap2(Bitmap< T > &bm, int tile_sx, int tile_sy)
Definition Graph.hh:1424
~TileBitmap2()
Definition Graph.hh:1431
Bitmap< T > * Index(Pos p) const
Definition Graph.hh:1425
Definition Graph.hh:1415
TileBitmap(Bitmap< T > &bm, int tile_sx, int tile_sy, int x, int y)
Definition Graph.hh:1417
Definition Effect.hh:10814
Definition Graph.hh:3192
void Collect(CollectVisitor &vis)
Definition Graph.hh:3195
void HeavyPrepare()
Definition Graph.hh:3198
float SizeX() const
Definition Graph.hh:3201
float SizeY() const
Definition Graph.hh:3205
bool Map(float x, float y) const
Definition Graph.hh:3210
TriangleContinuousBitmap(float sx, float sy, const Point2d &p1, const Point2d &p2, const Point2d &p3)
Definition Graph.hh:3194
bool Line(float x, float y, const Point2d &a, const Point2d &b) const
Definition Graph.hh:3225
void Prepare()
Definition Graph.hh:3200
Definition Graph.hh:3084
float Line13(float x) const
Definition Graph.hh:3176
TriangleCoordsContinuousBitmap(float sx, float sy, const Point2d &p1, const Point2d &p2, const Point2d &p3, float val1, float val2, float val3)
Definition Graph.hh:3086
float SizeY() const
Definition Graph.hh:3095
float xpos23(float p) const
Definition Graph.hh:3146
float Line23(float x) const
Definition Graph.hh:3180
float Map(float x, float y) const
Definition Graph.hh:3096
float SizeX() const
Definition Graph.hh:3094
float ypos23(float y) const
Definition Graph.hh:3164
float ypos13(float y) const
Definition Graph.hh:3158
void Collect(CollectVisitor &vis)
Definition Graph.hh:3087
void HeavyPrepare()
Definition Graph.hh:3090
float ypos12(float y) const
Definition Graph.hh:3152
float Line12(float x) const
Definition Graph.hh:3172
float xpos12(float p) const
Definition Graph.hh:3138
void Prepare()
Definition Graph.hh:3092
float xpos13(float p) const
Definition Graph.hh:3142
Definition Graph.hh:4280
int NumPoints(int face) const
Definition Graph.hh:4288
virtual Point2d TexCoord(int face, int point) const
Definition Graph.hh:4297
Point FacePoint(int face, int point) const
Definition Graph.hh:4289
int NumFaces() const
Definition Graph.hh:4287
int AttribI(int face, int point, int id) const
Definition Graph.hh:4316
void Handle(Triangle t)
Definition Graph.hh:4282
void SetBox(Matrix m)
Definition Graph.hh:4286
unsigned int Color(int face, int point) const
Definition Graph.hh:4293
float Attrib(int face, int point, int id) const
Definition Graph.hh:4312
Vector PointNormal(int face, int point) const
Definition Graph.hh:4305
Definition Effect.hh:2498
TwoGraphs(Array< T, K > &f, Array< T, K > &f2)
Definition Graph.hh:4185
Range< K > Index(T t) const
Definition Graph.hh:4187
T Size() const
Definition Graph.hh:4186
Definition Effect.hh:10694
Definition Effect.hh:1122
void clear()
Definition Effect.hh:1138
void push_back(T t)
Definition Effect.hh:1131
virtual int Size() const
Definition Effect.hh:1127
VectorArray()
Definition Effect.hh:1124
Definition VectorTools.hh:125
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
Definition VertexArray.hh:49
Definition Graph.hh:7444
virtual void visit(float &b)=0
virtual void visit(Point2d &p)=0
virtual void visit(VectorArray< Point2d > *array)=0
virtual void visit(VectorArray< Loop > *array)=0
virtual void visit(bool &b)=0
virtual void visit(int &a)=0
virtual void visit(Point &p)=0
Definition VolumeObjects.hh:130
virtual bool Inside(Point v) const
Definition VolumeObjects.hh:132
float SizeX() const
Definition Graph.hh:4084
float SizeY() const
Definition Graph.hh:4085
void HeavyPrepare()
Definition Graph.hh:4082
void Prepare()
Definition Graph.hh:4083
void Collect(CollectVisitor &vis)
Definition Graph.hh:4081
bool Map(float xx, float yy, float zz) const
Definition Graph.hh:4087
VolumeVoxel(VolumeObject &vol, Range< float > x, Range< float > y, Range< float > z)
Definition Graph.hh:4080
float SizeZ() const
Definition Graph.hh:4086
~VoxelEffect()
Definition Graph.cc:128
VoxelEffect(Render *r)
Definition Graph.cc:69
void Init()
Definition Graph.cc:115
bool Frame(float time)
Definition Graph.cc:132
virtual C Map(int *array, int size) const
Definition Graph.hh:3531
VoxelNDim(Voxel< C > &bm)
Definition Graph.hh:3529
virtual std::vector< int > Count() const
Definition Graph.hh:3530
int SizeZ() const
Definition Graph.hh:4067
VoxelToContinuousVoxel(Voxel< T > &vx)
Definition Graph.hh:4063
int SizeY() const
Definition Graph.hh:4066
T Map(int xx, int yy, int zz) const
Definition Graph.hh:4068
void Prepare()
Definition Graph.hh:4064
int SizeX() const
Definition Graph.hh:4065
float radius() const
Definition Graph.hh:4117
VoxelToSphere(ContinuousVoxel< T > &sp, Point p, float radius)
Definition Graph.hh:4116
T Map(float r, float alfa, float beta) const
Definition Graph.hh:4121
Definition GraphI.hh:1131
virtual int SizeX() const =0
virtual int SizeY() const =0
virtual int SizeZ() const =0
void Handle(std::pair< std::pair< int, int >, std::pair< int, unsigned int > > h)
Definition Graph.hh:5026
WallMatrix(HandleValue< std::pair< Matrix, unsigned int > > &hv, float size)
Definition Graph.hh:5025
WallsFromMap(Bitmap< bool > &mymap, Bitmap< unsigned int > &mycolor, HandleValue< std::pair< std::pair< int, int >, std::pair< int, unsigned int > > > &hv, int x, int y)
Definition Graph.hh:4952
void Gen()
Definition Graph.hh:4956
Vector Index(Vector v) const
Definition Graph.hh:4931
WaveFunction(float time, Waveform &F, Waveform &G, float c)
Definition Graph.hh:4930
WaveformBitmap(Waveform &wv, float start_x, float end_x, float start_y, float end_y, int sx, int sy, Color true_color, Color false_color)
Definition Graph.hh:160
void Collect(CollectVisitor &vis)
Definition Graph.hh:161
virtual int SizeY() const
Definition Graph.hh:165
virtual Color Map(int x, int y) const
Definition Graph.hh:166
virtual int SizeX() const
Definition Graph.hh:164
void Prepare()
Definition Graph.hh:163
void HeavyPrepare()
Definition Graph.hh:162
WaveformInterpolate(Waveform &w)
Definition Graph.hh:144
float Interpolate(float pos)
Definition Graph.hh:145
Definition Effect.hh:5073
WriteVisitor(char *currentptr, int size)
Definition Graph.hh:7503
virtual void visit(float &b)
Definition Graph.hh:7506
virtual void visit(int &a)
Definition Graph.hh:7504
virtual void visit(Point2d &p)
Definition Graph.hh:7508
virtual void visit(Point &p)
Definition Graph.hh:7510
Definition Equalizer.hh:1800
void HeavyPrepare()
Definition Graph.hh:625
XorBitmap(Bitmap< bool > &bm1, Bitmap< bool > &bm2)
Definition Graph.hh:620
bool Map(int x, int y) const
Definition Graph.hh:633
virtual int SizeX() const
Definition Graph.hh:631
virtual int SizeY() const
Definition Graph.hh:632
void Prepare()
Definition Graph.hh:626
void Collect(CollectVisitor &vis)
Definition Graph.hh:621
Definition Equalizer.hh:1807
Definition Graph.hh:6712
Definition Graph.hh:5591
Definition Graph.hh:5585
virtual Bitmap< C > * Index(C c) const =0
IMPORT int sprite_screen_height
Definition Graph.cc:1266
IMPORT int sprite_screen_width
Definition Graph.cc:1265
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
let delta_x
Definition gameapi_example.php:62
background color
Definition gameapi_example.php:46
SFO background(EveryApi &ev)
Definition test.cpp:409
convert($d)
Definition mesh_api.php:35
d
Definition meshpage.php:3895
iVBORw0KGgoAAAANSUhEUgAAANcAAAB5CAMAAACdtUQZAAAA51BMVEX</div ></div >< div style="padding: 0px 0px; width: 1324px;">< div style="height: 400px; width: 1324px;"></div >< div itemscope itemtype="https: </div><div itemscope itemtype="https:</div >< div itemscope itemtype="https: </div></div><p><div style="padding:0px 0px;width:1324px;"><div></div><div itemscope itemtype="https:< ul >< li >< b > Application name
8AkrcAgqgAs9wqQ0ey2tkAo8gAuuQfeI4hPUH09fXHy8z4+fng4uNKXF/Lz9BzfoAcgpkQMTUAKjAbOT4Qr9AXhJ8Rl7ktMCwTosA...
Definition meshpage.php:1610
lazy data
Definition meshpage.php:1583
line height
Definition meshpage.php:3536
n< br > font size
Definition meshpage.php:3536
not_this_one end(...)
void array(const std::string &type, Module &m)
Definition bootstrap.hpp:23
STL namespace.
double f(const std::string &, double, bool) noexcept
Definition profile_cpp_calls_2.cpp:4
int f2(char c)
Definition test.cpp:51
Definition GameApiTest5.cc:17
Definition Graph.hh:4597
Point pos
Definition Graph.hh:4599
float time
Definition Graph.hh:4600
Definition GameApi.h:11
Definition Buffer.hh:62
static BufferRefMask NewBuffer(int width, int height)
Definition Buffer.cc:97
Definition Buffer.hh:32
unsigned int * buffer
Definition Buffer.hh:33
unsigned int ydelta
Definition Buffer.hh:36
static BufferRef NewBuffer(int width, int height)
Definition Buffer.cc:36
static void FreeBuffer(BufferRef &ref)
Definition Buffer.cc:92
Definition GameApi.h:30
Definition Graph.hh:4410
int y
Definition Graph.hh:4412
int x
Definition Graph.hh:4411
int z
Definition Graph.hh:4413
Definition Graph.hh:2101
float miny
Definition Graph.hh:2102
float maxy
Definition Graph.hh:2103
float maxz
Definition Graph.hh:2103
float maxx
Definition Graph.hh:2103
float minz
Definition Graph.hh:2102
float minx
Definition Graph.hh:2102
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:43
Definition Graph.hh:5240
Point cod_center
Definition Graph.hh:5244
float cod_radius
Definition Graph.hh:5245
Point dom_center
Definition Graph.hh:5241
float dom_radius
Definition Graph.hh:5242
Definition GameApi.h:32
Definition Graph.hh:5356
std::vector< Point > p
Definition Graph.hh:5357
Definition FreeType2.cc:432
Definition Graph.hh:5780
Point2d p1
Definition Graph.hh:5781
Point2d p2
Definition Graph.hh:5781
Definition test.cpp:88
Definition Graph.hh:7435
void init()
Definition Graph.hh:7439
void visit(Visitor &v)
Definition Graph.cc:1506
VectorArray< Point2d > * points
Definition Graph.hh:7437
int inverse
Definition Graph.hh:7436
Definition Graph.hh:768
Bitmap< Color > * colors
Definition Graph.hh:769
Bitmap< unsigned char > * mask
Definition Graph.hh:770
Definition Graph.hh:4603
int id
Definition Graph.hh:4604
Definition GameApi.h:23
Definition Graph.hh:7526
std::vector< Point2d > vec
Definition Graph.hh:7527
Definition Graph.hh:7522
std::vector< Point > vec
Definition Graph.hh:7523
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
static Point2d NewPoint(float x, float y)
Definition VectorTools.hh:912
Definition Graph.hh:58
int y
Definition Graph.hh:59
int z
Definition Graph.hh:59
int x
Definition Graph.hh:59
Definition Parser.cc:60
float x
Definition Parser.cc:60
float Dist() const
Definition VectorTools.cc:150
float y
Definition Parser.cc:60
float z
Definition Parser.cc:60
static Point Interpolate(const Point &aVec, const Point &aVec2, float aVal)
Definition VectorTools.hh:85
Definition test.cpp:10
int x
Definition test.cpp:10
int y
Definition test.cpp:10
Definition GraphI.hh:702
Point p3
Definition GraphI.hh:703
Point p1
Definition GraphI.hh:703
Point p2
Definition GraphI.hh:703
Point p4
Definition GraphI.hh:703
Definition GameApi_pl.cc:25194
Definition GameApi.h:39
Definition GraphI.hh:1234
int sx
Definition GraphI.hh:1235
Definition Graph.hh:5762
VolumeObject * obj
Definition Graph.hh:5764
Definition Graph.hh:5131
float n2
Definition Graph.hh:5132
float b
Definition Graph.hh:5132
float n1
Definition Graph.hh:5132
float n3
Definition Graph.hh:5132
float a
Definition Graph.hh:5132
float m
Definition Graph.hh:5132
Definition GraphI.hh:1242
float width
Definition GraphI.hh:1244
float y
Definition GraphI.hh:1243
float x
Definition GraphI.hh:1243
float height
Definition GraphI.hh:1244
Definition GameApi.h:42
int id
Definition GameApi.h:42
Definition Graph.hh:7676
int b
Definition Graph.hh:7678
int d
Definition Graph.hh:7678
float z
Definition Graph.hh:7677
float x
Definition Graph.hh:7677
float k
Definition Graph.hh:7677
int c
Definition Graph.hh:7678
int a
Definition Graph.hh:7678
float y
Definition Graph.hh:7677
void visit(Visitor &v)
Definition Graph.hh:7679
Definition Graph.hh:6476
int end_x
Definition Graph.hh:6478
BufferFromBitmap * buffer
Definition Graph.hh:6480
int end_y
Definition Graph.hh:6479
int start_y
Definition Graph.hh:6479
pthread_t thread_id
Definition Graph.hh:6477
int start_x
Definition Graph.hh:6478
Definition GameApi.h:17
Definition VectorTools.hh:972
float Dist() const
Definition VectorTools.hh:986
float dy
Definition VectorTools.hh:973
float dx
Definition VectorTools.hh:973
static Vector2d FromPoint(const Point2d &p)
Definition VectorTools.hh:991
Definition Graph.hh:5235
float radius
Definition Graph.hh:5237
Point center
Definition Graph.hh:5236
W center_y(W item, int sy)
Definition ui.cc:947
num
Definition view.php:2821
#define compress
Definition zip_file.hpp:485