initial commit; PoC
[amper.git] / amper.d
blobba46403aa1313c6d3a5f6529a5bf221c66baa12b
1 module amper is aliced;
3 import arsd.bmp;
4 import arsd.color;
5 import arsd.image;
6 import arsd.simpledisplay;
8 import iv.cmdcon;
9 import iv.cmdcongl;
10 import iv.strex;
11 import iv.vfs;
13 import egfx;
15 import amperskin;
18 // ////////////////////////////////////////////////////////////////////////// //
19 __gshared ubyte vbNewScale = 1;
22 // ////////////////////////////////////////////////////////////////////////// //
23 public __gshared void delegate () gxRebuildScreenCB;
25 public void gxRebuildScreen () {
26 if (gxRebuildScreenCB !is null) {
27 gxClipReset();
28 try {
29 gxRebuildScreenCB();
30 } catch (Exception e) {
31 conwriteln("SCREEN REBUILD ERROR: ", e.msg);
33 vglUpdateTexture();
38 // ////////////////////////////////////////////////////////////////////////// //
39 void main (string[] args) {
40 sdpyWindowClass = "AMPER_PLAYER";
41 glconShowKey = "M-Grave";
43 conRegVar!vbNewScale(1, 8, "v_scale", "window scale");
45 conProcessQueue(); // load config
46 conProcessArgs!true(args);
48 loadSkin();
50 gxRebuildScreenCB = delegate () {
52 gxClearScreen(gxRGB!(0, 0, 0));
53 gxDrawRect(10, 10, VBufWidth-20, VBufHeight-20, gxRGB!(255, 127, 0));
54 string text = "Hi there!";
55 gxDrawTextUtf((VBufWidth-gxTextWidthUtf(text))/2, (VBufHeight-gxTextHeightUtf)/2, text, gxRGB!(0, 255, 255));
57 gxClearScreen(gxRGB!(255, 127, 0));
59 skinMainImg.blitAt(0, 0);
60 //skinMainCButtons.blitRect(16, 88, GxRect(0, 0, 23, 18));
61 skinMainCButtons.blitRect(16, 88, GxRect(0, 18, 23, 18));
62 foreach (immutable int dx; 0..10) skinMainCButtons.blitRect(dx*20-10, dx*20-10, GxRect(0, 18, 23, 18));
64 ampMain.onPaint();
65 //skinMainCButtons.blitRect(16, 88, GxRect(0, 18, 23, 18));
68 auto sdwin = new SimpleWindow(skinMainImg.width*vbufEffScale, skinMainImg.height*vbufEffScale, "Amper", OpenGlOptions.yes, Resizablity.allowResizing, WindowTypes.undecorated);
69 glconMainWindow = sdwin;
70 //sdwin.hideCursor();
72 static if (is(typeof(&sdwin.closeQuery))) {
73 sdwin.closeQuery = delegate () { concmd("quit"); glconPostDoConCommands(); };
76 sdwin.addEventListener((QuitEvent evt) {
77 if (sdwin.closed) return;
78 if (isQuitRequested) { sdwin.close(); return; }
79 concmd("quit");
80 });
82 sdwin.addEventListener((GLConScreenRebuildEvent evt) {
83 if (sdwin.closed) return;
84 if (isQuitRequested) { sdwin.close(); return; }
85 gxRebuildScreen();
86 sdwin.redrawOpenGlSceneNow();
87 });
89 sdwin.addEventListener((GLConScreenRepaintEvent evt) {
90 if (sdwin.closed) return;
91 if (isQuitRequested) { sdwin.close(); return; }
92 sdwin.redrawOpenGlSceneNow();
93 });
95 sdwin.addEventListener((GLConDoConsoleCommandsEvent evt) {
96 bool sendAnother = false;
97 bool prevVisible = isConsoleVisible;
99 consoleLock();
100 scope(exit) consoleUnlock();
101 conProcessQueue();
102 sendAnother = !conQueueEmpty();
104 if (sdwin.closed) return;
105 if (isQuitRequested) { sdwin.close(); return; }
106 if (sendAnother) glconPostDoConCommands();
108 if (prevVisible || isConsoleVisible) glconPostScreenRepaintDelayed();
109 if (vbNewScale != vbufEffScale) glconPostScreenRepaint();
111 glconPostScreenRebuild();
115 sdwin.windowResized = delegate (int wdt, int hgt) {
116 if (sdwin.closed) return;
117 glconResize(wdt, hgt);
118 vglResizeBuffer(wdt/vbufEffScale, hgt/vbufEffScale, vbufEffScale);
119 gxRebuildScreen();
122 sdwin.redrawOpenGlScene = delegate () {
123 if (sdwin.closed) return;
126 consoleLock();
127 scope(exit) consoleUnlock();
128 if (!conQueueEmpty()) glconPostDoConCommands();
131 // draw main screen
133 glClearColor(0, 0, 0, 0);
134 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_ACCUM_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
135 glViewport(0, 0, sdwin.width, sdwin.height);
137 vglBlitTexture();
138 glconDraw();
140 if (vbNewScale != vbufEffScale) {
141 vglResizeBuffer(VBufWidth, VBufHeight, vbNewScale);
142 vbNewScale = vbufEffScale;
143 sdwin.resize(winWidthScaled, winHeightScaled);
146 //if (isQuitRequested()) sdwin.glconPostEvent(new QuitEvent());
149 sdwin.visibleForTheFirstTime = delegate () {
150 sdwin.setAsCurrentOpenGlContext();
151 glconInit(sdwin.width, sdwin.height);
152 vglResizeBuffer(sdwin.width, sdwin.height);
153 gxRebuildScreen();
154 sdwin.redrawOpenGlSceneNow();
157 sdwin.eventLoop(0,
158 delegate () {
159 scope(exit) if (!conQueueEmpty()) glconPostDoConCommands();
160 if (sdwin.closed) return;
161 if (isQuitRequested) { sdwin.close(); return; }
163 delegate (KeyEvent event) {
164 scope(exit) if (!conQueueEmpty()) glconPostDoConCommands();
165 if (sdwin.closed) return;
166 if (isQuitRequested) { sdwin.close(); return; }
167 if (glconKeyEvent(event)) { glconPostScreenRepaint(); return; }
168 if (event.pressed && event == "Escape") { concmd("quit"); return; }
169 if (event.pressed && event == "Plus") { concmd("v_scale 2"); return; }
170 if (event.pressed && event == "Minus") { concmd("v_scale 1"); return; }
171 //conwriteln(event.toStr);
172 if (ampMain.onKey(event)) { glconPostScreenRebuild(); return; }
173 glconPostScreenRebuild();
175 delegate (MouseEvent event) {
176 scope(exit) if (!conQueueEmpty()) glconPostDoConCommands();
177 if (sdwin.closed) return;
178 event.x /= vbufEffScale;
179 event.y /= vbufEffScale;
180 if (ampMain.onMouse(event)) { glconPostScreenRebuild(); return; }
181 glconPostScreenRebuild();
183 delegate (dchar ch) {
184 if (sdwin.closed) return;
185 scope(exit) if (!conQueueEmpty()) glconPostDoConCommands();
186 if (glconCharEvent(ch)) { glconPostScreenRepaint(); return; }
189 flushGui();
190 conProcessQueue(int.max/4);