1 module amper
is aliced
;
6 import arsd
.simpledisplay
;
18 // ////////////////////////////////////////////////////////////////////////// //
19 __gshared
ubyte vbNewScale
= 1;
22 // ////////////////////////////////////////////////////////////////////////// //
23 public __gshared
void delegate () gxRebuildScreenCB
;
25 public void gxRebuildScreen () {
26 if (gxRebuildScreenCB
!is null) {
30 } catch (Exception e
) {
31 conwriteln("SCREEN REBUILD ERROR: ", e
.msg
);
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
);
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));
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
;
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; }
82 sdwin
.addEventListener((GLConScreenRebuildEvent evt
) {
83 if (sdwin
.closed
) return;
84 if (isQuitRequested
) { sdwin
.close(); return; }
86 sdwin
.redrawOpenGlSceneNow();
89 sdwin
.addEventListener((GLConScreenRepaintEvent evt
) {
90 if (sdwin
.closed
) return;
91 if (isQuitRequested
) { sdwin
.close(); return; }
92 sdwin
.redrawOpenGlSceneNow();
95 sdwin
.addEventListener((GLConDoConsoleCommandsEvent evt
) {
96 bool sendAnother
= false;
97 bool prevVisible
= isConsoleVisible
;
100 scope(exit
) consoleUnlock();
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
);
122 sdwin
.redrawOpenGlScene
= delegate () {
123 if (sdwin
.closed
) return;
127 scope(exit
) consoleUnlock();
128 if (!conQueueEmpty()) glconPostDoConCommands();
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);
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
);
154 sdwin
.redrawOpenGlSceneNow();
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; }
190 conProcessQueue(int.max
/4);