bplayer stub update + remove some tabs
[blender-staging.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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 /** \file gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
30  *  \ingroup blroutines
31  */
32
33
34 #include "KX_BlenderCanvas.h"
35 #include "DNA_screen_types.h"
36 #include <stdio.h>
37
38
39 KX_BlenderCanvas::KX_BlenderCanvas(struct wmWindow *win, RAS_Rect &rect, struct ARegion *ar) :
40 m_win(win),
41 m_frame_rect(rect)
42 {
43         // area boundaries needed for mouse coordinates in Letterbox framing mode
44         m_area_left = ar->winrct.xmin;
45         m_area_top = ar->winrct.ymax;
46 }
47
48 KX_BlenderCanvas::~KX_BlenderCanvas()
49 {
50 }
51
52 void KX_BlenderCanvas::Init()
53 {
54         glDepthFunc(GL_LEQUAL);
55 }       
56
57
58 void KX_BlenderCanvas::SwapBuffers()
59 {
60         BL_SwapBuffers(m_win);
61 }
62
63 void KX_BlenderCanvas::BeginFrame()
64 {
65         glEnable(GL_DEPTH_TEST);
66         glDepthFunc(GL_LEQUAL);
67
68 }
69
70
71 void KX_BlenderCanvas::EndFrame()
72 {
73                 // this is needed, else blender distorts a lot
74         glPopAttrib();
75         glPushAttrib(GL_ALL_ATTRIB_BITS);
76                 
77         glDisable(GL_FOG);
78 }
79
80
81
82 void KX_BlenderCanvas::ClearColor(float r,float g,float b,float a)
83 {
84         glClearColor(r,g,b,a);
85 }
86
87
88
89 void KX_BlenderCanvas::ClearBuffer(int type)
90 {
91         int ogltype = 0;
92
93         if (type & RAS_ICanvas::COLOR_BUFFER )
94                 ogltype |= GL_COLOR_BUFFER_BIT;
95
96         if (type & RAS_ICanvas::DEPTH_BUFFER )
97                 ogltype |= GL_DEPTH_BUFFER_BIT;
98         glClear(ogltype);
99 }
100
101 int KX_BlenderCanvas::GetWidth(
102 ) const {
103         return m_frame_rect.GetWidth();
104 }
105
106 int KX_BlenderCanvas::GetHeight(
107 ) const {
108         return m_frame_rect.GetHeight();
109 }
110
111 int KX_BlenderCanvas::GetMouseX(int x)
112 {
113         float left = GetWindowArea().GetLeft();
114         return float(x - (left - m_area_left));
115 }
116
117 int KX_BlenderCanvas::GetMouseY(int y)
118 {
119         float top = GetWindowArea().GetTop();
120         return float(y - (m_area_top - top));
121 }
122
123 float KX_BlenderCanvas::GetMouseNormalizedX(int x)
124 {
125         int can_x = GetMouseX(x);
126         return float(can_x)/this->GetWidth();
127 }
128
129 float KX_BlenderCanvas::GetMouseNormalizedY(int y)
130 {
131         int can_y = GetMouseY(y);
132         return float(can_y)/this->GetHeight();
133 }
134
135 RAS_Rect &
136 KX_BlenderCanvas::
137 GetWindowArea(
138 ){
139         return m_area_rect;
140 }       
141
142         void
143 KX_BlenderCanvas::
144 SetViewPort(
145         int x1, int y1,
146         int x2, int y2
147 ){
148         /*      x1 and y1 are the min pixel coordinate (e.g. 0)
149                 x2 and y2 are the max pixel coordinate
150                 the width,height is calculated including both pixels
151                 therefore: max - min + 1
152         */
153         int vp_width = (x2 - x1) + 1;
154         int vp_height = (y2 - y1) + 1;
155         int minx = m_frame_rect.GetLeft();
156         int miny = m_frame_rect.GetBottom();
157
158         m_area_rect.SetLeft(minx + x1);
159         m_area_rect.SetBottom(miny + y1);
160         m_area_rect.SetRight(minx + x2);
161         m_area_rect.SetTop(miny + y2);
162
163         glViewport(minx + x1, miny + y1, vp_width, vp_height);
164         glScissor(minx + x1, miny + y1, vp_width, vp_height);
165 }
166
167
168 void KX_BlenderCanvas::SetMouseState(RAS_MouseState mousestate)
169 {
170         m_mousestate = mousestate;
171
172         switch (mousestate)
173         {
174         case MOUSE_INVISIBLE:
175                 {
176                         BL_HideMouse(m_win);
177                         break;
178                 }
179         case MOUSE_WAIT:
180                 {
181                         BL_WaitMouse(m_win);
182                         break;
183                 }
184         case MOUSE_NORMAL:
185                 {
186                         BL_NormalMouse(m_win);
187                         break;
188                 }
189         default:
190                 {
191                 }
192         }
193 }
194
195
196
197 //      (0,0) is top left, (width,height) is bottom right
198 void KX_BlenderCanvas::SetMousePosition(int x,int y)
199 {
200         int winX = m_frame_rect.GetLeft();
201         int winY = m_frame_rect.GetBottom();
202         int winH = m_frame_rect.GetHeight();
203         
204         BL_warp_pointer(m_win, winX + x, winY + (winH-y));
205 }
206
207
208
209 void KX_BlenderCanvas::MakeScreenShot(const char* filename)
210 {
211         ScrArea area_dummy= {0};
212         area_dummy.totrct.xmin = m_frame_rect.GetLeft();
213         area_dummy.totrct.xmax = m_frame_rect.GetRight();
214         area_dummy.totrct.ymin = m_frame_rect.GetBottom();
215         area_dummy.totrct.ymax = m_frame_rect.GetTop();
216
217         BL_MakeScreenShot(&area_dummy, filename);
218 }