OSDN Git Service

4c7faf3c7da68af1f2374e60d711388610f745a8
[csp-qt/common_source_project-fm7.git] / source / src / qt / common / qt_gldraw.cpp
1 /*
2  * agar_gldraw2.cpp
3  * Using Indexed palette @8Colors.
4  * (c) 2011 K.Ohta <whatisthis.sowhat@gmail.com>
5  */
6
7
8 #include "emu.h"
9
10 #include <QtGui>
11 #include <QtOpenGL/QGLWidget>
12 #include <SDL/SDL.h>
13 #ifdef _WINDOWS
14 #include <GL/gl.h>
15 #include <GL/glext.h>
16 #else
17 #include <GL/glx.h>
18 #include <GL/glxext.h>
19 #endif
20
21 #undef _USE_OPENCL
22 #ifdef _USE_OPENCL
23 //# include "agar_glcl.h"
24 #endif
25
26
27 #ifdef USE_OPENMP
28 #include <omp.h>
29 #endif //_OPENMP
30 #include "qt_gldraw.h"
31 //#include "agar_main.h"
32
33 void GLDrawClass::SetBrightRGB(float r, float g, float b)
34 {
35    fBrightR = r;
36    fBrightG = g;
37    fBrightB = b;
38 //   SDLDrawFlag.Drawn = TRUE; // Force draw.
39 }
40
41
42 #ifdef _USE_OPENCL
43 extern class GLCLDraw *cldraw;
44 extern void InitContextCL(void);
45 #endif
46
47
48 // Grids
49
50 // Brights
51
52
53
54
55 /*
56  * Event Functins
57  */
58 #if 0
59 void AGEventOverlayGL(AG_Event *event)
60 {
61         AG_GLView *glv = (AG_GLView *)AG_SELF();
62 }
63
64
65 void AGEventScaleGL(AG_Event *event)
66 {
67    AG_GLView *glv = (AG_GLView *)AG_SELF();
68
69    glViewport(glv->wid.rView.x1, glv->wid.rView.y1, glv->wid.rView.w, glv->wid.rView.h);
70     //glLoadIdentity();
71     //glOrtho(-1.0, 1.0,        1.0, -1.0, -1.0,  1.0);
72
73 }
74 #endif
75
76 void GLDrawClass::drawGrids(void *pg,int w, int h)
77 {
78
79    
80 }
81
82
83 void GLDrawClass::drawUpdateTexture(Uint32 *p, int w, int h, bool crtflag)
84 {
85     if(uVramTextureID != 0){
86        Uint32 *pu;
87        Uint32 *pq;
88        int xx;
89        int yy;
90        int ww;
91        int hh;
92        int ofset;
93        BOOL flag;
94        int i;
95        //       glPushAttrib(GL_TEXTURE_BIT);
96        ww = w >> 3;
97        hh = h >> 3;
98
99 #ifdef _USE_OPENCL
100        if((cldraw != NULL) && (bCLEnabled)) {
101           cl_int ret = CL_SUCCESS;
102 //        LockVram();
103           flag = FALSE;
104           for(i = 0; i < h; i++) {
105             if(bDrawLine[i]) {
106               flag = TRUE;
107             }
108           }
109           //if(SDLDrawFlag.Drawn) flag = TRUE;
110           if(flag) {
111                 ret = cldraw->GetVram(bModeOld);
112                 for(i = 0; i < h; i++)  bDrawLine[i] = FALSE;
113
114                 if(ret != CL_SUCCESS) {
115                   //SDLDrawFlag.Drawn = FALSE;
116                   bPaletFlag = FALSE;
117                   glBindTexture(GL_TEXTURE_2D, 0);
118                   //UnlockVram();
119                   return;
120                 }
121             }
122             if(bCLGLInterop){
123                 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, cldraw->GetPbo());
124                 glBindTexture(GL_TEXTURE_2D, uVramTextureID);
125                 // Copy pbo to texture 
126                 glTexSubImage2D(GL_TEXTURE_2D, 
127                                 0,
128                                 0,
129                                 0,
130                                 w,
131                                 h,
132                                 GL_RGBA,
133                                 GL_UNSIGNED_BYTE,
134                                 NULL);
135                 glFinish();
136                 glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
137                 glBindTexture(GL_TEXTURE_2D, 0);
138                 glFinish();
139             } else { // Not interoperability with GL
140                 Uint32 *pp;
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);
145                 glFinish();
146                 cldraw->ReleasePixelBuffer(pp);
147                 glBindTexture(GL_TEXTURE_2D, 0);
148                 glFinish();
149             }
150             //SDLDrawFlag.Drawn = FALSE;
151             bPaletFlag = FALSE;
152           //UnlockVram();
153        } else {
154 #endif
155           //LockVram();
156           flag = TRUE;
157           //flag |= SDLDrawFlag.Drawn;
158           if((p != NULL) && (flag)) {
159              if(crtflag != false) {
160                 glBindTexture(GL_TEXTURE_2D, uVramTextureID);
161                 glTexSubImage2D(GL_TEXTURE_2D, 
162                           0,
163                           0,
164                           0,
165                           640,
166                           h,
167                           GL_RGBA,
168                           GL_UNSIGNED_BYTE,
169                           p);
170                glFinish();
171                glBindTexture(GL_TEXTURE_2D, 0); // 20111023 チラつきなど抑止
172              }
173              //bPaletFlag = FALSE;
174              //SDLDrawFlag.Drawn = FALSE;
175           }
176           //UnlockVram();
177 #ifdef _USE_OPENCL
178        }
179 #endif       
180     }
181 }
182
183    
184
185
186
187
188 /*
189  * "Draw"イベントハンドラ
190  */
191
192 void GLDrawClass::DrawHandler(void)
193 {
194    int w;
195    int h;
196    int i;
197    float width;
198    float yf;
199    Uint32 *p;
200    Uint32 *pp;
201    int x;
202    int y;
203    GLfloat TexCoords[4][2];
204    GLfloat Vertexs[4][3];
205    GLfloat TexCoords2[4][2];
206    GLfloat *gridtid;
207    bool crtflag = true;
208    
209    p = emu->screen_buffer(0);
210    w = SCREEN_WIDTH;
211    h = SCREEN_HEIGHT;
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
215    
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;
219
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
225
226
227     if(uVramTextureID == 0) uVramTextureID = CreateNullTexture(640, 400); //  ドットゴーストを防ぐ
228     if(uNullTextureID == 0) uNullTextureID = CreateNullTexture(640, 400); //  ドットゴーストを防ぐ
229      /*
230      * 20110904 OOPS! Updating-Texture must be in Draw-Event-Handler(--;
231      */
232
233     glPushAttrib(GL_TEXTURE_BIT);
234     glPushAttrib(GL_TRANSFORM_BIT);
235     glPushAttrib(GL_ENABLE_BIT);
236 #ifdef _USE_OPENCL
237     InitContextCL();   
238 #endif
239     glMatrixMode(GL_PROJECTION);
240     glLoadIdentity();
241     
242    
243     glEnable(GL_DEPTH_TEST);
244     glDisable(GL_BLEND);
245    
246     /*
247      * VRAMの表示:テクスチャ貼った四角形
248      */
249      //if(uVramTextureID != 0) {
250
251        if(crtflag){
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);
256      //} else {
257 //      glDisable(GL_TEXTURE_2D);
258 //      glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
259 //     }
260      } else {
261            glEnable(GL_TEXTURE_2D);
262           glBindTexture(GL_TEXTURE_2D, uNullTextureID);
263            glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
264      }       
265        //if(!bSmoosing) {
266          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
267          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
268        //} else {
269         // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
270         // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
271       // }
272        if(bGL_EXT_VERTEX_ARRAY) {
273          glEnable(GL_TEXTURE_COORD_ARRAY_EXT);
274          glEnable(GL_VERTEX_ARRAY_EXT);
275               
276          glTexCoordPointerEXT(2, GL_FLOAT, 0, 4, TexCoords);
277          glVertexPointerEXT(3, GL_FLOAT, 0, 4, Vertexs);
278          glDrawArraysEXT(GL_POLYGON, 0, 4);
279          
280          glDisable(GL_VERTEX_ARRAY_EXT);
281          glDisable(GL_TEXTURE_COORD_ARRAY_EXT);
282        } else {
283          glBegin(GL_POLYGON);
284          glTexCoord2f(TexCoords[0][0], TexCoords[0][1]);
285          glVertex3f(Vertexs[0][0], Vertexs[0][1], Vertexs[0][2]);
286          
287          glTexCoord2f(TexCoords[1][0], TexCoords[1][1]);
288          glVertex3f(Vertexs[1][0], Vertexs[1][1], Vertexs[1][2]);
289          
290          glTexCoord2f(TexCoords[2][0], TexCoords[2][1]);
291          glVertex3f(Vertexs[2][0], Vertexs[2][1], Vertexs[2][2]);
292               
293          glTexCoord2f(TexCoords[3][0], TexCoords[3][1]);
294          glVertex3f(Vertexs[3][0], Vertexs[3][1], Vertexs[3][2]);
295          glEnd();
296        }
297     // }
298    
299      // 20120502 輝度調整
300     glBindTexture(GL_TEXTURE_2D, 0); // 20111023
301     glDisable(GL_TEXTURE_2D);
302     glDisable(GL_DEPTH_TEST);
303
304     if(bCLEnabled == FALSE){
305        glEnable(GL_BLEND);
306    
307        glColor3f(fBrightR , fBrightG, fBrightB);
308        glBlendFunc(GL_ZERO, GL_SRC_COLOR);
309     
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);
316        } else {
317           glBegin(GL_POLYGON);
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]);
322           glEnd();
323        }
324        
325        glBlendFunc(GL_ONE, GL_ZERO);
326    
327        glDisable(GL_BLEND);
328     }
329        glDisable(GL_TEXTURE_2D);
330        glDisable(GL_DEPTH_TEST);
331 #if 0
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);
340           } else {
341              glBegin(GL_LINES);
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);  
346              }
347              glEnd();
348           }
349        
350         }
351 #endif   
352    //}
353    glDisable(GL_BLEND);
354    glDisable(GL_TEXTURE_2D);
355    glDisable(GL_DEPTH_TEST);
356 #ifdef USE_OPENGL
357     //DrawOSDGL(glv);
358 #endif
359     glPopAttrib();
360     glPopAttrib();
361     glPopAttrib();
362     glFlush();
363 }