svn merge -r 21041:21301 https://svn.blender.org/svnroot/bf-blender/branches/blender2...
[blender.git] / source / gameengine / BlenderRoutines / KX_BlenderCanvas.cpp
1 /**
2  * $Id$
3  * ***** BEGIN GPL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software Foundation,
17  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18  *
19  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
20  * All rights reserved.
21  *
22  * The Original Code is: all of this file.
23  *
24  * Contributor(s): none yet.
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 #include "KX_BlenderCanvas.h"
30 #include "DNA_screen_types.h"
31 #include "stdio.h"
32
33 #ifdef HAVE_CONFIG_H
34 #include <config.h>
35 #endif
36
37
38 KX_BlenderCanvas::KX_BlenderCanvas(struct wmWindow *win, ARegion *ar) :
39 m_win(win),
40 m_ar(ar)
41 {
42 }
43
44 KX_BlenderCanvas::~KX_BlenderCanvas()
45 {
46 }
47
48 void KX_BlenderCanvas::Init()
49 {
50         glDepthFunc(GL_LEQUAL);
51 }       
52
53
54 void KX_BlenderCanvas::SwapBuffers()
55 {
56         BL_SwapBuffers(m_win);
57 }
58
59 void KX_BlenderCanvas::BeginFrame()
60 {
61         glEnable(GL_DEPTH_TEST);
62         glDepthFunc(GL_LEQUAL);
63
64 }
65
66
67 void KX_BlenderCanvas::EndFrame()
68 {
69                 // this is needed, else blender distorts a lot
70         glPopAttrib();
71         glPushAttrib(GL_ALL_ATTRIB_BITS);
72                 
73         glDisable(GL_FOG);
74 }
75
76
77
78 void KX_BlenderCanvas::ClearColor(float r,float g,float b,float a)
79 {
80         glClearColor(r,g,b,a);
81 }
82
83
84
85 void KX_BlenderCanvas::ClearBuffer(int type)
86 {
87         int ogltype = 0;
88
89         if (type & RAS_ICanvas::COLOR_BUFFER )
90                 ogltype |= GL_COLOR_BUFFER_BIT;
91
92         if (type & RAS_ICanvas::DEPTH_BUFFER )
93                 ogltype |= GL_DEPTH_BUFFER_BIT;
94         glClear(ogltype);
95 }
96
97 int KX_BlenderCanvas::GetWidth(
98 ) const {
99         return m_ar->winx;
100 }
101
102 int KX_BlenderCanvas::GetHeight(
103 ) const {
104         return m_ar->winy;
105 }
106
107 RAS_Rect &
108 KX_BlenderCanvas::
109 GetWindowArea(
110 ){
111         return m_area_rect;
112 }       
113
114         void
115 KX_BlenderCanvas::
116 SetViewPort(
117         int x1, int y1,
118         int x2, int y2
119 ){
120         int vp_width = (x2 - x1) + 1;
121         int vp_height = (y2 - y1) + 1;
122         int minx = m_ar->winrct.xmin;
123         int miny = m_ar->winrct.ymin;
124
125         m_area_rect.SetLeft(minx + x1);
126         m_area_rect.SetBottom(miny + y1);
127         m_area_rect.SetRight(minx + x2);
128         m_area_rect.SetTop(miny + y2);
129
130         glViewport(minx + x1, miny + y1, vp_width, vp_height);
131         glScissor(minx + x1, miny + y1, vp_width, vp_height);
132 }
133
134
135 void KX_BlenderCanvas::SetMouseState(RAS_MouseState mousestate)
136 {
137         switch (mousestate)
138         {
139         case MOUSE_INVISIBLE:
140                 {
141                         BL_HideMouse();
142                         break;
143                 }
144         case MOUSE_WAIT:
145                 {
146                         BL_WaitMouse();
147                         break;
148                 }
149         case MOUSE_NORMAL:
150                 {
151                         BL_NormalMouse();
152                         break;
153                 }
154         default:
155                 {
156                 }
157         }
158 }
159
160
161
162 //      (0,0) is top left, (width,height) is bottom right
163 void KX_BlenderCanvas::SetMousePosition(int x,int y)
164 {
165         int winX = m_ar->winrct.xmin;
166         int winY = m_ar->winrct.ymin;
167         int winH = m_ar->winy;
168         
169         BL_warp_pointer(winX + x, winY + (winH-y-1));
170 }
171
172
173
174 void KX_BlenderCanvas::MakeScreenShot(const char* filename)
175 {
176         BL_MakeScreenShot(m_ar, filename);
177 }