Bugfix [#32410] Create New Group (CTRL+G) tried to activate even when nothing is
[blender.git] / source / gameengine / BlenderRoutines / KX_BlenderCanvas.cpp
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
29  *  \ingroup blroutines
30  */
31
32
33 #include "KX_BlenderCanvas.h"
34 #include "DNA_screen_types.h"
35 #include <stdio.h>
36
37
38 KX_BlenderCanvas::KX_BlenderCanvas(struct wmWindow *win, RAS_Rect &rect, struct ARegion *ar) :
39 m_win(win),
40 m_frame_rect(rect)
41 {
42         // initialize area so that it's available for game logic on frame 1 (ImageViewport)
43         m_area_rect = rect;
44         // area boundaries needed for mouse coordinates in Letterbox framing mode
45         m_area_left = ar->winrct.xmin;
46         m_area_top = ar->winrct.ymax;
47 }
48
49 KX_BlenderCanvas::~KX_BlenderCanvas()
50 {
51 }
52
53 void KX_BlenderCanvas::Init()
54 {
55         glDepthFunc(GL_LEQUAL);
56 }       
57
58
59 void KX_BlenderCanvas::SwapBuffers()
60 {
61         BL_SwapBuffers(m_win);
62 }
63
64 void KX_BlenderCanvas::ResizeWindow(int width, int height)
65 {
66         // Not implemented for the embedded player
67 }
68
69 void KX_BlenderCanvas::BeginFrame()
70 {
71         glEnable(GL_DEPTH_TEST);
72         glDepthFunc(GL_LEQUAL);
73
74 }
75
76
77 void KX_BlenderCanvas::EndFrame()
78 {
79                 // this is needed, else blender distorts a lot
80         glPopAttrib();
81         glPushAttrib(GL_ALL_ATTRIB_BITS);
82                 
83         glDisable(GL_FOG);
84 }
85
86
87
88 void KX_BlenderCanvas::ClearColor(float r,float g,float b,float a)
89 {
90         glClearColor(r,g,b,a);
91 }
92
93
94
95 void KX_BlenderCanvas::ClearBuffer(int type)
96 {
97         int ogltype = 0;
98
99         if (type & RAS_ICanvas::COLOR_BUFFER )
100                 ogltype |= GL_COLOR_BUFFER_BIT;
101
102         if (type & RAS_ICanvas::DEPTH_BUFFER )
103                 ogltype |= GL_DEPTH_BUFFER_BIT;
104         glClear(ogltype);
105 }
106
107 int KX_BlenderCanvas::GetWidth(
108 ) const {
109         return m_frame_rect.GetWidth();
110 }
111
112 int KX_BlenderCanvas::GetHeight(
113 ) const {
114         return m_frame_rect.GetHeight();
115 }
116
117 int KX_BlenderCanvas::GetMouseX(int x)
118 {
119         float left = GetWindowArea().GetLeft();
120         return float(x - (left - m_area_left));
121 }
122
123 int KX_BlenderCanvas::GetMouseY(int y)
124 {
125         float top = GetWindowArea().GetTop();
126         return float(y - (m_area_top - top));
127 }
128
129 float KX_BlenderCanvas::GetMouseNormalizedX(int x)
130 {
131         int can_x = GetMouseX(x);
132         return float(can_x)/this->GetWidth();
133 }
134
135 float KX_BlenderCanvas::GetMouseNormalizedY(int y)
136 {
137         int can_y = GetMouseY(y);
138         return float(can_y)/this->GetHeight();
139 }
140
141 RAS_Rect &
142 KX_BlenderCanvas::
143 GetWindowArea(
144 ) {
145         return m_area_rect;
146 }       
147
148         void
149 KX_BlenderCanvas::
150 SetViewPort(
151         int x1, int y1,
152         int x2, int y2
153 ) {
154         /*      x1 and y1 are the min pixel coordinate (e.g. 0)
155                 x2 and y2 are the max pixel coordinate
156                 the width,height is calculated including both pixels
157                 therefore: max - min + 1
158         */
159         int vp_width = (x2 - x1) + 1;
160         int vp_height = (y2 - y1) + 1;
161         int minx = m_frame_rect.GetLeft();
162         int miny = m_frame_rect.GetBottom();
163
164         m_area_rect.SetLeft(minx + x1);
165         m_area_rect.SetBottom(miny + y1);
166         m_area_rect.SetRight(minx + x2);
167         m_area_rect.SetTop(miny + y2);
168
169         glViewport(minx + x1, miny + y1, vp_width, vp_height);
170         glScissor(minx + x1, miny + y1, vp_width, vp_height);
171 }
172
173
174 void KX_BlenderCanvas::SetMouseState(RAS_MouseState mousestate)
175 {
176         m_mousestate = mousestate;
177
178         switch (mousestate)
179         {
180         case MOUSE_INVISIBLE:
181                 {
182                         BL_HideMouse(m_win);
183                         break;
184                 }
185         case MOUSE_WAIT:
186                 {
187                         BL_WaitMouse(m_win);
188                         break;
189                 }
190         case MOUSE_NORMAL:
191                 {
192                         BL_NormalMouse(m_win);
193                         break;
194                 }
195         default:
196                 {
197                 }
198         }
199 }
200
201
202
203 //      (0,0) is top left, (width,height) is bottom right
204 void KX_BlenderCanvas::SetMousePosition(int x,int y)
205 {
206         int winX = m_frame_rect.GetLeft();
207         int winY = m_frame_rect.GetBottom();
208         int winH = m_frame_rect.GetHeight();
209         
210         BL_warp_pointer(m_win, winX + x, winY + (winH-y));
211 }
212
213
214
215 void KX_BlenderCanvas::MakeScreenShot(const char* filename)
216 {
217         ScrArea area_dummy= {0};
218         area_dummy.totrct.xmin = m_frame_rect.GetLeft();
219         area_dummy.totrct.xmax = m_frame_rect.GetRight();
220         area_dummy.totrct.ymin = m_frame_rect.GetBottom();
221         area_dummy.totrct.ymax = m_frame_rect.GetTop();
222
223         BL_MakeScreenShot(&area_dummy, filename);
224 }