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