doxygen: prevent GPL license block from being parsed as doxygen comment.
[blender.git] / source / gameengine / BlenderRoutines / KX_BlenderGL.cpp
index da52be56d1b415525c83ad1cee11377a45abbb45..08280cdbb4e12bf2c59e41d0de3ef7974c5c6a01 100644 (file)
@@ -1,4 +1,4 @@
-/**
+/*
  * $Id$
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
  * $Id$
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
@@ -14,7 +14,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software Foundation,
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
  * All rights reserved.
  *
  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
  * All rights reserved.
  * ***** END GPL LICENSE BLOCK *****
  */
 
  * ***** END GPL LICENSE BLOCK *****
  */
 
-#include "GL/glew.h"
 #include "KX_BlenderGL.h"
 
 #include "KX_BlenderGL.h"
 
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
 /* 
  * This little block needed for linking to Blender... 
  */
 #ifdef WIN32
 /* 
  * This little block needed for linking to Blender... 
  */
 #ifdef WIN32
+#include <vector>
 #include "BLI_winstuff.h"
 #endif
 
 #include <stdlib.h>
 #include <string.h>
 
 #include "BLI_winstuff.h"
 #endif
 
 #include <stdlib.h>
 #include <string.h>
 
-#include "BMF_Api.h"
+#include "GL/glew.h"
 
 
-#include "BIF_gl.h"
+#include "MEM_guardedalloc.h"
 
 #include "BL_Material.h" // MAXTEX
 
 
 #include "BL_Material.h" // MAXTEX
 
 #include "DNA_image_types.h"
 #include "DNA_view3d_types.h"
 #include "DNA_material_types.h"
 #include "DNA_image_types.h"
 #include "DNA_view3d_types.h"
 #include "DNA_material_types.h"
+#include "DNA_windowmanager_types.h"
 
 #include "BKE_global.h"
 
 #include "BKE_global.h"
+#include "BKE_main.h"
 #include "BKE_bmfont.h"
 #include "BKE_image.h"
 
 #include "BKE_bmfont.h"
 #include "BKE_image.h"
 
-extern "C" {
-#include "BDR_drawmesh.h"
-#include "BIF_mywindow.h"
-#include "BIF_toolbox.h"
-#include "BIF_graphics.h" /* For CURSOR_NONE CURSOR_WAIT CURSOR_STD */
+#include "BLI_path_util.h"
 
 
+extern "C" {
+#include "IMB_imbuf_types.h"
+#include "IMB_imbuf.h"
+#include "WM_api.h"
+#include "WM_types.h"
+#include "wm_event_system.h"
+#include "wm_cursors.h"
+#include "wm_window.h"
+#include "BLF_api.h"
 }
 
 /* end of blender block */
 }
 
 /* end of blender block */
-
-/* was in drawmesh.c */
-void spack(unsigned int ucol)
-{
-       char *cp= (char *)&ucol;
-        
-       glColor3ub(cp[3], cp[2], cp[1]);
-}
-
-void BL_warp_pointer(int x,int y)
-{
-       warp_pointer(x,y);
-}
-
-void BL_SwapBuffers()
+void BL_warp_pointer(wmWindow *win, int x,int y)
 {
 {
-       myswapbuffers();
+       WM_cursor_warp(win, x, y);
 }
 
 }
 
-void BL_RenderText(int mode,const char* textstr,int textlen,struct MTFace* tface,
-                   unsigned int *col,float v1[3],float v2[3],float v3[3],float v4[3])
+void BL_SwapBuffers(wmWindow *win)
 {
 {
-       Image* ima;
-
-       if(mode & TF_BMFONT) {
-                       //char string[MAX_PROPSTRING];
-                       int characters, index, character;
-                       float centerx, centery, sizex, sizey, transx, transy, movex, movey, advance;
-                       
-//                     bProperty *prop;
-
-                       // string = "Frank van Beek";
-
-                       characters = textlen;
-
-                       ima = (struct Image*) tface->tpage;
-                       if (ima == NULL) {
-                               characters = 0;
-                       }
-
-                       /* When OBCOL flag is on the color is set in IndexPrimitives_3DText */                  
-                       if (tface->mode & TF_OBCOL) { /* Color has been set */
-                               col= NULL;
-                       } else {
-                               if(!col) glColor3f(1.0f, 1.0f, 1.0f);                   
-                       }
-
-                       glPushMatrix();
-                       for (index = 0; index < characters; index++) {
-                               // lets calculate offset stuff
-                               character = textstr[index];
-                               
-                               // space starts at offset 1
-                               // character = character - ' ' + 1;
-                               
-                               matrixGlyph((ImBuf *)ima->ibufs.first, character, & centerx, &centery, &sizex, &sizey, &transx, &transy, &movex, &movey, &advance);
-
-                               glBegin(GL_POLYGON);
-                               // printf(" %c %f %f %f %f\n", character, tface->uv[0][0], tface->uv[0][1], );
-                               // glTexCoord2f((tface->uv[0][0] - centerx) * sizex + transx, (tface->uv[0][1] - centery) * sizey + transy);
-                               glTexCoord2f((tface->uv[0][0] - centerx) * sizex + transx, (tface->uv[0][1] - centery) * sizey + transy);
-
-                               if(col) spack(col[0]);
-                               // glVertex3fv(v1);
-                               glVertex3f(sizex * v1[0] + movex, sizey * v1[1] + movey, v1[2]);
-                               
-                               glTexCoord2f((tface->uv[1][0] - centerx) * sizex + transx, (tface->uv[1][1] - centery) * sizey + transy);
-                               if(col) spack(col[1]);
-                               // glVertex3fv(v2);
-                               glVertex3f(sizex * v2[0] + movex, sizey * v2[1] + movey, v2[2]);
-       
-                               glTexCoord2f((tface->uv[2][0] - centerx) * sizex + transx, (tface->uv[2][1] - centery) * sizey + transy);
-                               if(col) spack(col[2]);
-                               // glVertex3fv(v3);
-                               glVertex3f(sizex * v3[0] + movex, sizey * v3[1] + movey, v3[2]);
-       
-                               if(v4) {
-                                       // glTexCoord2f((tface->uv[3][0] - centerx) * sizex + transx, 1.0 - (1.0 - tface->uv[3][1]) * sizey - transy);
-                                       glTexCoord2f((tface->uv[3][0] - centerx) * sizex + transx, (tface->uv[3][1] - centery) * sizey + transy);
-                                       if(col) spack(col[3]);
-                                       // glVertex3fv(v4);
-                                       glVertex3f(sizex * v4[0] + movex, sizey * v4[1] + movey, v4[2]);
-                               }
-                               glEnd();
-
-                               glTranslatef(advance, 0.0, 0.0);
-                       }
-                       glPopMatrix();
-
-               }
+       wm_window_swap_buffers(win);
 }
 
 }
 
-
 void DisableForText()
 {
 void DisableForText()
 {
+       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); /* needed for texture fonts otherwise they render as wireframe */
+
        if(glIsEnabled(GL_BLEND)) glDisable(GL_BLEND);
        if(glIsEnabled(GL_ALPHA_TEST)) glDisable(GL_ALPHA_TEST);
 
        if(glIsEnabled(GL_BLEND)) glDisable(GL_BLEND);
        if(glIsEnabled(GL_ALPHA_TEST)) glDisable(GL_ALPHA_TEST);
 
@@ -177,45 +99,75 @@ void DisableForText()
                glDisable(GL_COLOR_MATERIAL);
        }
 
                glDisable(GL_COLOR_MATERIAL);
        }
 
-       if(GLEW_ARB_multitexture)
-               for(int i=0; i<MAXTEX; i++)
+       if(GLEW_ARB_multitexture) {
+               for(int i=0; i<MAXTEX; i++) {
                        glActiveTextureARB(GL_TEXTURE0_ARB+i);
 
                        glActiveTextureARB(GL_TEXTURE0_ARB+i);
 
-       if(GLEW_ARB_texture_cube_map)
-               if(glIsEnabled(GL_TEXTURE_CUBE_MAP_ARB))
-                       glDisable(GL_TEXTURE_CUBE_MAP_ARB);
+                       if(GLEW_ARB_texture_cube_map)
+                               if(glIsEnabled(GL_TEXTURE_CUBE_MAP_ARB))
+                                       glDisable(GL_TEXTURE_CUBE_MAP_ARB);
+
+                       if(glIsEnabled(GL_TEXTURE_2D))
+                               glDisable(GL_TEXTURE_2D);
+               }
+
+               glActiveTextureARB(GL_TEXTURE0_ARB);
+       }
+       else {
+               if(GLEW_ARB_texture_cube_map)
+                       if(glIsEnabled(GL_TEXTURE_CUBE_MAP_ARB))
+                               glDisable(GL_TEXTURE_CUBE_MAP_ARB);
+
+               if(glIsEnabled(GL_TEXTURE_2D))
+                       glDisable(GL_TEXTURE_2D);
+       }
+}
+
+/* Print 3D text */
+void BL_print_game_line(int fontid, const char* text, int size, int dpi, float* color, double* mat, float aspect)
+{
+       /* gl prepping */
+       DisableForText();
+
+       /* the actual drawing */
+       glColor4fv(color);
+
+       /* multiply the text matrix by the object matrix */
+       BLF_enable(fontid, BLF_MATRIX|BLF_ASPECT);
+       BLF_matrix(fontid, mat);
 
 
-       if(glIsEnabled(GL_TEXTURE_2D))
-               glDisable(GL_TEXTURE_2D);
+       /* aspect is the inverse scale that allows you to increase */
+       /* your resolution without sizing the final text size      */
+       /* the bigger the size, the smaller the aspect             */
+       BLF_aspect(fontid, aspect, aspect, aspect);
+
+       BLF_size(fontid, size, dpi);
+       BLF_position(fontid, 0, 0, 0);
+       BLF_draw(fontid, (char *)text, strlen(text));
+
+       BLF_disable(fontid, BLF_MATRIX|BLF_ASPECT);
 }
 
 }
 
-void BL_print_gamedebug_line(char* text, int xco, int yco, int width, int height)
+void BL_print_gamedebug_line(const char* text, int xco, int yco, int width, int height)
 {      
        /* gl prepping */
        DisableForText();
 {      
        /* gl prepping */
        DisableForText();
-       //glDisable(GL_TEXTURE_2D);
+       glDisable(GL_DEPTH_TEST);
 
        glMatrixMode(GL_PROJECTION);
        glPushMatrix();
        glLoadIdentity();
 
        glMatrixMode(GL_PROJECTION);
        glPushMatrix();
        glLoadIdentity();
-       
-       glOrtho(0, width,
-                       0, height, 0, 1);
-       
+
+       glOrtho(0, width, 0, height, -100, 100);
+
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();
        glLoadIdentity();
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();
        glLoadIdentity();
-       glMatrixMode(GL_TEXTURE);
-       glPushMatrix();
-       glLoadIdentity();
 
        /* the actual drawing */
        glColor3ub(255, 255, 255);
 
        /* the actual drawing */
        glColor3ub(255, 255, 255);
-       glRasterPos2s(xco, height-yco);
-       BMF_DrawString(G.fonts, text);
+       BLF_draw_default(xco, height-yco, 0.0f, (char *)text, 65535); /* XXX, use real len */
 
 
-       glMatrixMode(GL_TEXTURE);
-       glPopMatrix();
        glMatrixMode(GL_PROJECTION);
        glPopMatrix();
        glMatrixMode(GL_MODELVIEW);
        glMatrixMode(GL_PROJECTION);
        glPopMatrix();
        glMatrixMode(GL_MODELVIEW);
@@ -223,38 +175,30 @@ void BL_print_gamedebug_line(char* text, int xco, int yco, int width, int height
        glEnable(GL_DEPTH_TEST);
 }
 
        glEnable(GL_DEPTH_TEST);
 }
 
-void BL_print_gamedebug_line_padded(char* text, int xco, int yco, int width, int height)
+void BL_print_gamedebug_line_padded(const char* text, int xco, int yco, int width, int height)
 {
        /* This is a rather important line :( The gl-mode hasn't been left
         * behind quite as neatly as we'd have wanted to. I don't know
         * what cause it, though :/ .*/
        DisableForText();
 {
        /* This is a rather important line :( The gl-mode hasn't been left
         * behind quite as neatly as we'd have wanted to. I don't know
         * what cause it, though :/ .*/
        DisableForText();
-       //glDisable(GL_TEXTURE_2D);
+       glDisable(GL_DEPTH_TEST);
 
        glMatrixMode(GL_PROJECTION);
        glPushMatrix();
        glLoadIdentity();
        
 
        glMatrixMode(GL_PROJECTION);
        glPushMatrix();
        glLoadIdentity();
        
-       glOrtho(0, width,
-                       0, height, 0, 1);
+       glOrtho(0, width, 0, height, -100, 100);
        
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();
        glLoadIdentity();
        
        glMatrixMode(GL_MODELVIEW);
        glPushMatrix();
        glLoadIdentity();
-       glMatrixMode(GL_TEXTURE);
-       glPushMatrix();
-       glLoadIdentity();
 
        /* draw in black first*/
        glColor3ub(0, 0, 0);
 
        /* draw in black first*/
        glColor3ub(0, 0, 0);
-       glRasterPos2s(xco+1, height-yco-1);
-       BMF_DrawString(G.fonts, text);
+       BLF_draw_default(xco+2, height-yco-2, 0.0f, text, 65535); /* XXX, use real len */
        glColor3ub(255, 255, 255);
        glColor3ub(255, 255, 255);
-       glRasterPos2s(xco, height-yco);
-       BMF_DrawString(G.fonts, text);
+       BLF_draw_default(xco, height-yco, 0.0f, text, 65535); /* XXX, use real len */
 
 
-       glMatrixMode(GL_TEXTURE);
-       glPopMatrix();
        glMatrixMode(GL_PROJECTION);
        glPopMatrix();
        glMatrixMode(GL_MODELVIEW);
        glMatrixMode(GL_PROJECTION);
        glPopMatrix();
        glMatrixMode(GL_MODELVIEW);
@@ -262,36 +206,71 @@ void BL_print_gamedebug_line_padded(char* text, int xco, int yco, int width, int
        glEnable(GL_DEPTH_TEST);
 }
 
        glEnable(GL_DEPTH_TEST);
 }
 
-void BL_HideMouse()
+void BL_HideMouse(wmWindow *win)
 {
 {
-       set_cursor(CURSOR_NONE);
+       WM_cursor_set(win, CURSOR_NONE);
 }
 
 
 }
 
 
-void BL_WaitMouse()
+void BL_WaitMouse(wmWindow *win)
 {
 {
-       set_cursor(CURSOR_WAIT);
+       WM_cursor_set(win, CURSOR_WAIT);
 }
 
 
 }
 
 
-void BL_NormalMouse()
+void BL_NormalMouse(wmWindow *win)
 {
 {
-       set_cursor(CURSOR_STD);
+       WM_cursor_set(win, CURSOR_STD);
 }
 #define MAX_FILE_LENGTH 512
 
 }
 #define MAX_FILE_LENGTH 512
 
+/* get shot from frontbuffer sort of a copy from screendump.c */
+static unsigned int *screenshot(ScrArea *curarea, int *dumpsx, int *dumpsy)
+{
+       int x=0, y=0;
+       unsigned int *dumprect= NULL;
+       
+       x= curarea->totrct.xmin;
+       y= curarea->totrct.ymin;
+       *dumpsx= curarea->totrct.xmax-x;
+       *dumpsy= curarea->totrct.ymax-y;
+
+       if (*dumpsx && *dumpsy) {
+               
+               dumprect= (unsigned int *)MEM_mallocN(sizeof(int) * (*dumpsx) * (*dumpsy), "dumprect");
+               glReadBuffer(GL_FRONT);
+               glReadPixels(x, y, *dumpsx, *dumpsy, GL_RGBA, GL_UNSIGNED_BYTE, dumprect);
+               glFinish();
+               glReadBuffer(GL_BACK);
+       }
+
+       return dumprect;
+}
 
 
-void BL_MakeScreenShot(struct ScrArea *area, const char* filename)
+/* based on screendump.c::screenshot_exec */
+void BL_MakeScreenShot(ScrArea *curarea, const char* filename)
 {
 {
-       char copyfilename[MAX_FILE_LENGTH];
-       strcpy(copyfilename,filename);
+       char path[MAX_FILE_LENGTH];
+       strcpy(path,filename);
 
 
-       // filename read - only
+       unsigned int *dumprect;
+       int dumpsx, dumpsy;
        
        
-         /* XXX will need to change at some point */
-       BIF_screendump(0);
-
-       // write+read filename
-       write_screendump((char*) copyfilename);
+       dumprect= screenshot(curarea, &dumpsx, &dumpsy);
+       if(dumprect) {
+               ImBuf *ibuf;
+               BLI_path_abs(path, G.main->name);
+               /* BKE_add_image_extension() checks for if extension was already set */
+               BKE_add_image_extension(path, R_PNG); /* scene->r.imtype */
+               ibuf= IMB_allocImBuf(dumpsx, dumpsy, 24, 0);
+               ibuf->rect= dumprect;
+               ibuf->ftype= PNG;
+
+               IMB_saveiff(ibuf, path, IB_rect);
+
+               ibuf->rect= NULL;
+               IMB_freeImBuf(ibuf);
+               MEM_freeN(dumprect);
+       }
 }
 
 }