BGE fix #20456 - 2.5: mouse position problem (offseted by 1 vertically)
[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., 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 #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, RAS_Rect &rect) :
39 m_win(win),
40 m_frame_rect(rect)
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_frame_rect.GetWidth();
100 }
101
102 int KX_BlenderCanvas::GetHeight(
103 ) const {
104         return m_frame_rect.GetHeight();
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         /*      x1 and y1 are the min pixel coordinate (e.g. 0)
121                 x2 and y2 are the max pixel coordinate
122                 the width,height is calculated including both pixels
123                 therefore: max - min + 1
124         */
125         int vp_width = (x2 - x1) + 1;
126         int vp_height = (y2 - y1) + 1;
127         int minx = m_frame_rect.GetLeft();
128         int miny = m_frame_rect.GetBottom();
129
130         m_area_rect.SetLeft(minx + x1);
131         m_area_rect.SetBottom(miny + y1);
132         m_area_rect.SetRight(minx + x2);
133         m_area_rect.SetTop(miny + y2);
134
135         glViewport(minx + x1, miny + y1, vp_width, vp_height);
136         glScissor(minx + x1, miny + y1, vp_width, vp_height);
137 }
138
139
140 void KX_BlenderCanvas::SetMouseState(RAS_MouseState mousestate)
141 {
142         switch (mousestate)
143         {
144         case MOUSE_INVISIBLE:
145                 {
146                         BL_HideMouse(m_win);
147                         break;
148                 }
149         case MOUSE_WAIT:
150                 {
151                         BL_WaitMouse(m_win);
152                         break;
153                 }
154         case MOUSE_NORMAL:
155                 {
156                         BL_NormalMouse(m_win);
157                         break;
158                 }
159         default:
160                 {
161                 }
162         }
163 }
164
165
166
167 //      (0,0) is top left, (width,height) is bottom right
168 void KX_BlenderCanvas::SetMousePosition(int x,int y)
169 {
170         int winX = m_frame_rect.GetLeft();
171         int winY = m_frame_rect.GetBottom();
172         int winH = m_frame_rect.GetHeight();
173         
174         BL_warp_pointer(m_win, winX + x, winY + (winH-y));
175 }
176
177
178
179 void KX_BlenderCanvas::MakeScreenShot(const char* filename)
180 {
181 //      BL_MakeScreenShot(m_ar, filename);
182 }