3 * Using Indexed palette @8Colors.
4 * (c) 2011 K.Ohta <whatisthis.sowhat@gmail.com>
11 #include <QtOpenGL/QGLWidget>
18 #include <GL/glxext.h>
23 //# include "agar_glcl.h"
30 #include "qt_gldraw.h"
31 //#include "agar_main.h"
33 void GLDrawClass::SetBrightRGB(float r, float g, float b)
38 // SDLDrawFlag.Drawn = TRUE; // Force draw.
43 extern class GLCLDraw *cldraw;
44 extern void InitContextCL(void);
59 void AGEventOverlayGL(AG_Event *event)
61 AG_GLView *glv = (AG_GLView *)AG_SELF();
65 void AGEventScaleGL(AG_Event *event)
67 AG_GLView *glv = (AG_GLView *)AG_SELF();
69 glViewport(glv->wid.rView.x1, glv->wid.rView.y1, glv->wid.rView.w, glv->wid.rView.h);
71 //glOrtho(-1.0, 1.0, 1.0, -1.0, -1.0, 1.0);
76 void GLDrawClass::drawGrids(void *pg,int w, int h)
83 void GLDrawClass::drawUpdateTexture(Uint32 *p, int w, int h, bool crtflag)
85 if(uVramTextureID != 0){
95 // glPushAttrib(GL_TEXTURE_BIT);
100 if((cldraw != NULL) && (bCLEnabled)) {
101 cl_int ret = CL_SUCCESS;
104 for(i = 0; i < h; i++) {
109 //if(SDLDrawFlag.Drawn) flag = TRUE;
111 ret = cldraw->GetVram(bModeOld);
112 for(i = 0; i < h; i++) bDrawLine[i] = FALSE;
114 if(ret != CL_SUCCESS) {
115 //SDLDrawFlag.Drawn = FALSE;
117 glBindTexture(GL_TEXTURE_2D, 0);
123 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, cldraw->GetPbo());
124 glBindTexture(GL_TEXTURE_2D, uVramTextureID);
125 // Copy pbo to texture
126 glTexSubImage2D(GL_TEXTURE_2D,
136 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
137 glBindTexture(GL_TEXTURE_2D, 0);
139 } else { // Not interoperability with GL
141 pp = cldraw->GetPixelBuffer();
142 glBindTexture(GL_TEXTURE_2D, uVramTextureID);
143 if(pp != NULL) glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,
144 w, h, GL_RGBA, GL_UNSIGNED_BYTE, pp);
146 cldraw->ReleasePixelBuffer(pp);
147 glBindTexture(GL_TEXTURE_2D, 0);
150 //SDLDrawFlag.Drawn = FALSE;
157 //flag |= SDLDrawFlag.Drawn;
158 if((p != NULL) && (flag)) {
159 if(crtflag != false) {
160 glBindTexture(GL_TEXTURE_2D, uVramTextureID);
161 glTexSubImage2D(GL_TEXTURE_2D,
171 glBindTexture(GL_TEXTURE_2D, 0); // 20111023 チラつきなど抑止
173 //bPaletFlag = FALSE;
174 //SDLDrawFlag.Drawn = FALSE;
192 void GLDrawClass::DrawHandler(void)
203 GLfloat TexCoords[4][2];
204 GLfloat Vertexs[4][3];
205 GLfloat TexCoords2[4][2];
209 p = emu->screen_buffer(0);
212 if((p == NULL) && (bCLEnabled == FALSE)) return;
213 TexCoords[0][0] = TexCoords[3][0] = 0.0f; // Xbegin
214 TexCoords[0][1] = TexCoords[1][1] = 0.0f; // Ybegin
216 TexCoords[2][0] = TexCoords[1][0] = (float)w / (float)w; // Xend
217 TexCoords[2][1] = TexCoords[3][1] = (float)(h - 1) / (float)h; // Yend
218 gridtid = GridVertexs400l;
220 Vertexs[0][2] = Vertexs[1][2] = Vertexs[2][2] = Vertexs[3][2] = -0.98f;
221 Vertexs[0][0] = Vertexs[3][0] = -1.0f; // Xbegin
222 Vertexs[0][1] = Vertexs[1][1] = 1.0f; // Yend
223 Vertexs[2][0] = Vertexs[1][0] = 1.0f; // Xend
224 Vertexs[2][1] = Vertexs[3][1] = -1.0f; // Ybegin
227 if(uVramTextureID == 0) uVramTextureID = CreateNullTexture(640, 400); // ドットゴーストを防ぐ
228 if(uNullTextureID == 0) uNullTextureID = CreateNullTexture(640, 400); // ドットゴーストを防ぐ
230 * 20110904 OOPS! Updating-Texture must be in Draw-Event-Handler(--;
233 glPushAttrib(GL_TEXTURE_BIT);
234 glPushAttrib(GL_TRANSFORM_BIT);
235 glPushAttrib(GL_ENABLE_BIT);
239 glMatrixMode(GL_PROJECTION);
243 glEnable(GL_DEPTH_TEST);
247 * VRAMの表示:テクスチャ貼った四角形
249 //if(uVramTextureID != 0) {
252 drawUpdateTexture(p, w, h, crtflag);
253 glEnable(GL_TEXTURE_2D);
254 glBindTexture(GL_TEXTURE_2D, uVramTextureID);
255 glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
257 // glDisable(GL_TEXTURE_2D);
258 // glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
261 glEnable(GL_TEXTURE_2D);
262 glBindTexture(GL_TEXTURE_2D, uNullTextureID);
263 glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
266 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
267 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
269 // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
270 // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
272 if(bGL_EXT_VERTEX_ARRAY) {
273 glEnable(GL_TEXTURE_COORD_ARRAY_EXT);
274 glEnable(GL_VERTEX_ARRAY_EXT);
276 glTexCoordPointerEXT(2, GL_FLOAT, 0, 4, TexCoords);
277 glVertexPointerEXT(3, GL_FLOAT, 0, 4, Vertexs);
278 glDrawArraysEXT(GL_POLYGON, 0, 4);
280 glDisable(GL_VERTEX_ARRAY_EXT);
281 glDisable(GL_TEXTURE_COORD_ARRAY_EXT);
284 glTexCoord2f(TexCoords[0][0], TexCoords[0][1]);
285 glVertex3f(Vertexs[0][0], Vertexs[0][1], Vertexs[0][2]);
287 glTexCoord2f(TexCoords[1][0], TexCoords[1][1]);
288 glVertex3f(Vertexs[1][0], Vertexs[1][1], Vertexs[1][2]);
290 glTexCoord2f(TexCoords[2][0], TexCoords[2][1]);
291 glVertex3f(Vertexs[2][0], Vertexs[2][1], Vertexs[2][2]);
293 glTexCoord2f(TexCoords[3][0], TexCoords[3][1]);
294 glVertex3f(Vertexs[3][0], Vertexs[3][1], Vertexs[3][2]);
300 glBindTexture(GL_TEXTURE_2D, 0); // 20111023
301 glDisable(GL_TEXTURE_2D);
302 glDisable(GL_DEPTH_TEST);
304 if(bCLEnabled == FALSE){
307 glColor3f(fBrightR , fBrightG, fBrightB);
308 glBlendFunc(GL_ZERO, GL_SRC_COLOR);
310 // glBlendFunc(GL_ZERO, GL_SRC_ALPHA);
311 if(bGL_EXT_VERTEX_ARRAY) {
312 glEnable(GL_VERTEX_ARRAY_EXT);
313 glVertexPointerEXT(3, GL_FLOAT, 0, 4, Vertexs);
314 glDrawArraysEXT(GL_POLYGON, 0, 4);
315 glDisable(GL_VERTEX_ARRAY_EXT);
318 glVertex3f(Vertexs[0][0], Vertexs[0][1], Vertexs[0][2]);
319 glVertex3f(Vertexs[1][0], Vertexs[1][1], Vertexs[1][2]);
320 glVertex3f(Vertexs[2][0], Vertexs[2][1], Vertexs[2][2]);
321 glVertex3f(Vertexs[3][0], Vertexs[3][1], Vertexs[3][2]);
325 glBlendFunc(GL_ONE, GL_ZERO);
329 glDisable(GL_TEXTURE_2D);
330 glDisable(GL_DEPTH_TEST);
332 if(glv->wid.rView.h >= h) {
333 glLineWidth((float)(glv->wid.rView.h) / (float)(h * 2));
334 glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
335 if(bGL_EXT_VERTEX_ARRAY) {
336 glEnable(GL_VERTEX_ARRAY_EXT);
337 glVertexPointerEXT(3, GL_FLOAT, 0, h + 1, gridtid);
338 glDrawArraysEXT(GL_LINE, 0, h + 1);
339 glDisable(GL_VERTEX_ARRAY_EXT);
342 for(y = 0; y < h; y++) {
343 yf = -1.0f + (float) (y + 1) * 2.0f / (float)h;
344 glVertex3f(-1.0f, yf, 0.96f);
345 glVertex3f(+1.0f, yf, 0.96f);
354 glDisable(GL_TEXTURE_2D);
355 glDisable(GL_DEPTH_TEST);