1 /**
2 * ae.demo.render.main
3 *
4 * License:
5 * This Source Code Form is subject to the terms of
6 * the Mozilla Public License, v. 2.0. If a copy of
7 * the MPL was not distributed with this file, You
8 * can obtain one at http://mozilla.org/MPL/2.0/.
9 *
10 * Authors:
11 * Vladimir Panteleev <vladimir@thecybershadow.net>
12 */
13
14 module ae.demo.render.main;
15
16 import std.random;
17
18 import ae.ui.app.application;
19 import ae.ui.app.posix.main;
20 import ae.ui.shell.shell;
21 import ae.ui.shell.sdl2.shell;
22 import ae.ui.video.renderer;
23 import ae.ui.video.sdl2.video;
24 import ae.ui.timer.sdl2.timer;
25 import ae.ui.timer.thread.timer;
26 import ae.utils.fps;
27 import ae.utils.graphics.image;
28
29 final class MyApplication : Application
30 {
31 override string getName() { return "Demo/Render"; }
32 override string getCompanyName() { return "CyberShadow"; }
33
34 Shell shell;
35 Timer timer;
36 FPSCounter fps;
37 Renderer.Pixel[] pixels;
38 bool useOpenGL, switching;
39 float x=0f, y=0f, dx=0f, dy=0f;
40 enum DELTA = 1f / 256;
41 ImageTextureSource[5] imgs;
42 ImageTextureSource imgT;
43
44 this()
45 {
46 foreach (x; 0..256)
47 foreach (y; 0..256)
48 pixels ~= Renderer.Pixel(x, y, BGRX(cast(ubyte)x, cast(ubyte)y, 0));
49
50 foreach (ubyte r; 0..2)
51 foreach (ubyte g; 0..2)
52 foreach (ubyte b; 0..2)
53 pixels ~= Renderer.Pixel(300 + r*3 + b*12, 100 + g*3, BGRX(cast(ubyte)(r*255), cast(ubyte)(g*255), cast(ubyte)(b*255)));
54 }
55
56 void updateFPS(string fps)
57 {
58 shell.setCaption((useOpenGL ? "SDL/OpenGL" : "SDL/Software") ~ " - " ~ fps);
59 }
60
61 override void render(Renderer s)
62 {
63 fps.tick(&updateFPS);
64
65 //pixels ~= Renderer.Pixel(uniform(0, s.width), uniform(0, s.height), BGRX(uniform!ubyte(), uniform!ubyte(), uniform!ubyte()));
66 s.clear();
67 s.putPixels(pixels);
68
69 s.vline(300, 25, 75, BGRX(255, 0, 0));
70 s. line(300, 25, 350, 75, BGRX(0, 255, 0));
71 s.hline(300, 350, 25, BGRX(0, 0, 255));
72
73 foreach (uint i, img; imgs)
74 {
75 s.draw(i*128, 300, img, 0, 0, img.image.w, img.image.h);
76 s.draw(
77 i*128 + x+img.image.w/4 , 428 + img.image.h/4 ,
78 i*128 + x+img.image.w/4*3, 428 + img.image.h/4*3,
79 img, 0, 0, img.image.w, img.image.h);
80 }
81
82 static int offset;
83 offset++;
84 auto w = imgT.image.crop(0, 0, imgT.image.w, imgT.image.h).toRef;
85 for (int l=5; l>=0; l--)
86 {
87 checker(w, l, l%2 ? 0 : (offset%60==0?offset+0:offset) >> (3-l/2));
88 w = w.crop(w.w/4, w.h/4, w.w/4*3, w.h/4*3).toRef;
89 }
90 imgT.textureVersion++;
91 s.draw(400, 50, imgT, 0, 0, imgT.image.w, imgT.image.h);
92 }
93
94 void checker(CANVAS)(CANVAS img, int level, int offset)
95 {
96 foreach (y; 0..img.h)
97 foreach (x; 0..img.w)
98 if (x==0 || y==0 || x==img.w-1 || y==img.h-1)
99 img[x, y] = BGRX(255, 0, 0);
100 else
101 if (level && ((x+offset)/(1<<(level-1))+y/(1<<(level-1)))%2)
102 img[x, y] = BGRX(255, 255, 255);
103 else
104 img[x, y] = BGRX(0, 0, 0);
105 }
106
107 override int run(string[] args)
108 {
109 {
110 enum W = 96, H = 96;
111
112 foreach (int i, ref img; imgs)
113 {
114 img = new ImageTextureSource;
115 img.image.size(W, H);
116 checker(img.image, i, 0);
117 }
118
119 imgT = new ImageTextureSource;
120 imgT.image.size(W*2, H*2);
121 }
122
123 shell = new SDL2Shell(this);
124 auto sdl2 = new SDL2Video();
125 // auto opengl = new SDLOpenGLVideo();
126 // opengl.aa = false;
127
128 timer = new SDLTimer();
129 //timer = new ThreadTimer();
130 timer.setInterval(AppCallback({ x += dx; y += dy; }), 10);
131
132 do
133 {
134 switching = false;
135 // useOpenGL = !useOpenGL;
136 // shell.video = useOpenGL ? opengl : sdl;
137 shell.video = sdl2;
138 updateFPS("?");
139 shell.run();
140 } while (switching);
141 sdl2.shutdown();
142 // opengl.shutdown();
143 return 0;
144 }
145
146 override void handleKeyDown(Key key, dchar character)
147 {
148 switch (key)
149 {
150 case Key.space:
151 switching = true;
152 goto case;
153 case Key.esc:
154 shell.quit();
155 break;
156 case Key.left : dx = -DELTA; break;
157 case Key.right: dx = +DELTA; break;
158 case Key.up : dy = -DELTA; break;
159 case Key.down : dy = +DELTA; break;
160 default:
161 break;
162 }
163 }
164
165 override void handleKeyUp(Key key)
166 {
167 switch (key)
168 {
169 case Key.left : dx = 0f; break;
170 case Key.right: dx = 0f; break;
171 case Key.up : dy = 0f; break;
172 case Key.down : dy = 0f; break;
173 default:
174 break;
175 }
176 }
177
178 override void handleQuit()
179 {
180 shell.quit();
181 }
182 }
183
184 shared static this()
185 {
186 createApplication!MyApplication();
187 }