]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - contrib/camera/renderer.cpp
transfer from internal tree r5311 branches/1.4-gpl
[xonotic/netradiant.git] / contrib / camera / renderer.cpp
1 /*\r
2 Copyright (C) 1999-2007 id Software, Inc. and contributors.\r
3 For a list of contributors, see the accompanying CONTRIBUTORS file.\r
4 \r
5 This file is part of GtkRadiant.\r
6 \r
7 GtkRadiant is free software; you can redistribute it and/or modify\r
8 it under the terms of the GNU General Public License as published by\r
9 the Free Software Foundation; either version 2 of the License, or\r
10 (at your option) any later version.\r
11 \r
12 GtkRadiant is distributed in the hope that it will be useful,\r
13 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
15 GNU General Public License for more details.\r
16 \r
17 You should have received a copy of the GNU General Public License\r
18 along with GtkRadiant; if not, write to the Free Software\r
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\r
20 */\r
21 \r
22 /*\r
23 Camera plugin for GtkRadiant\r
24 Copyright (C) 2002 Splash Damage Ltd.\r
25 */\r
26 \r
27 #include "camera.h"\r
28 \r
29 CRenderer::CRenderer() {\r
30 \r
31   refCount = 1;\r
32 \r
33   m_bHooked = FALSE;\r
34   \r
35   Register();\r
36   Initialize();\r
37 }\r
38 \r
39 CRenderer::~CRenderer() {\r
40   if( m_bHooked )\r
41     UnRegister();\r
42 }\r
43 \r
44 void CRenderer::Register() {\r
45         g_QglTable.m_pfnHookGL2DWindow( this );\r
46         g_QglTable.m_pfnHookGL3DWindow( this );\r
47         m_bHooked = TRUE;\r
48 }\r
49 \r
50 void CRenderer::UnRegister() {\r
51         if( g_QglTable.m_nSize ) {\r
52                 g_QglTable.m_pfnUnHookGL2DWindow( this );\r
53                 g_QglTable.m_pfnUnHookGL3DWindow( this );\r
54         }\r
55         m_bHooked = FALSE;\r
56 }\r
57 \r
58 void CRenderer::Initialize() {\r
59 \r
60 }\r
61 \r
62 void CRenderer::Draw2D( VIEWTYPE vt ) {\r
63 \r
64   g_QglTable.m_pfn_qglPushAttrib(GL_ALL_ATTRIB_BITS);\r
65         g_QglTable.m_pfn_qglPushMatrix();\r
66 \r
67   switch(vt)\r
68   {\r
69   case XY:\r
70     break;\r
71   case XZ:\r
72     g_QglTable.m_pfn_qglRotatef(270.0f, 1.0f, 0.0f, 0.0f);\r
73     break;\r
74   case YZ:\r
75     g_QglTable.m_pfn_qglRotatef(270.0f, 1.0f, 0.0f, 0.0f);\r
76     g_QglTable.m_pfn_qglRotatef(270.0f, 0.0f, 0.0f, 1.0f);\r
77     break;\r
78   }\r
79 \r
80   CCamera *cam = firstCam;\r
81   while( cam ) {\r
82     cam->GetCam()->draw( ((Listener && cam == g_pCurrentEditCam) ? true : false) );\r
83     cam = cam->GetNext();\r
84   }\r
85 \r
86         g_QglTable.m_pfn_qglPopMatrix();\r
87         g_QglTable.m_pfn_qglPopAttrib();\r
88 }\r
89 \r
90 void CRenderer::Draw3D() {\r
91         // FIXME: really need a mainloop callback from the editor core\r
92         static long start;\r
93         static float cycle;\r
94         static long msecs;\r
95         static long current;\r
96 \r
97         if( g_iPreviewRunning ) {\r
98                 if( g_iPreviewRunning == 1 ) {\r
99                         start = g_FuncTable.m_pfnQGetTickCount();\r
100                         GetCurrentCam()->GetCam()->startCamera( start );\r
101                         cycle = GetCurrentCam()->GetCam()->getTotalTime();\r
102                         msecs = (long)(cycle * 1000);\r
103                         current = start;\r
104                         g_iPreviewRunning = 2;\r
105                 }\r
106 \r
107                 if( current < start + msecs ) {\r
108                         float fov;\r
109       vec3_t origin = {0.0f, 0.0f, 0.0f}, dir = {0.0f, 0.0f, 0.0f}, angles;\r
110 \r
111                         GetCurrentCam()->GetCam()->getCameraInfo( current, &origin[0], &dir[0], &fov );\r
112                         VectorSet( angles, asin (dir[2])*180/3.14159, atan2 (dir[1], dir[0])*180/3.14159, 0 );\r
113                         g_CameraTable.m_pfnSetCamera( origin, angles );\r
114                         current = g_FuncTable.m_pfnQGetTickCount();\r
115                 } else {\r
116                         g_iPreviewRunning = 0;\r
117                         GetCurrentCam()->GetCam()->setRunning( false );\r
118                         g_FuncTable.m_pfnSysUpdateWindows( W_XY_OVERLAY | W_CAMERA );\r
119                 }\r
120         }\r
121 \r
122   g_QglTable.m_pfn_qglPushAttrib(GL_ALL_ATTRIB_BITS);\r
123 \r
124   CCamera *cam = firstCam;\r
125   while( cam ) {\r
126     cam->GetCam()->draw( ((Listener && cam == g_pCurrentEditCam) ? true : false) );\r
127     cam = cam->GetNext();\r
128   }\r
129 \r
130         if( g_iPreviewRunning ) {\r
131                 int x, y, width, height, i;\r
132                 float degInRad;\r
133 \r
134                 g_CameraTable.m_pfnGetCamWindowExtents( &x, &y, &width, &height );\r
135 \r
136                 // setup orthographic projection mode\r
137                 g_QglTable.m_pfn_qglMatrixMode(GL_PROJECTION);\r
138                 g_QglTable.m_pfn_qglLoadIdentity();\r
139                 g_QglTable.m_pfn_qglDisable( GL_DEPTH_TEST );\r
140                 g_QglTable.m_pfn_qglOrtho( 0, (float)width, 0, (float)height, -100, 100 );\r
141                 g_QglTable.m_pfn_qglMatrixMode( GL_MODELVIEW );\r
142 \r
143                 g_QglTable.m_pfn_qglLoadIdentity();\r
144                 g_QglTable.m_pfn_qglColor3f( 1.f, 1.f, 1.f );\r
145                 g_QglTable.m_pfn_qglBegin( GL_LINE_LOOP );\r
146                 g_QglTable.m_pfn_qglVertex2f( 10, 10 );\r
147                 g_QglTable.m_pfn_qglVertex2f( 40, 10 );\r
148                 g_QglTable.m_pfn_qglVertex2f( 40, 25 );\r
149                 g_QglTable.m_pfn_qglVertex2f( 10, 25 );\r
150                 g_QglTable.m_pfn_qglEnd();\r
151 \r
152                 g_QglTable.m_pfn_qglBegin( GL_LINE_LOOP );\r
153                 for( i = 0; i < 360; i += 60 ) {\r
154                         degInRad = i * (3.14159265358979323846/180.f);\r
155                         g_QglTable.m_pfn_qglVertex2f( 18 + cos(degInRad) * 5, 18 + sin(degInRad) * 5 );\r
156                 }\r
157                 g_QglTable.m_pfn_qglEnd();\r
158 \r
159                 degInRad = (360-((current - start) % 360)) * (3.14159265358979323846/180.f);\r
160                 g_QglTable.m_pfn_qglBegin( GL_LINES );\r
161                 g_QglTable.m_pfn_qglVertex2f( 18, 18 );\r
162                 g_QglTable.m_pfn_qglVertex2f( 18 + cos(degInRad) * 5, 18 + sin(degInRad) * 5 );\r
163                 g_QglTable.m_pfn_qglVertex2f( 32, 18 );\r
164                 g_QglTable.m_pfn_qglVertex2f( 32 + cos(degInRad) * 5, 18 + sin(degInRad) * 5 );\r
165                 g_QglTable.m_pfn_qglEnd();\r
166 \r
167                 g_QglTable.m_pfn_qglBegin( GL_LINE_LOOP );\r
168                 for( i = 0; i < 360; i += 60 ) {\r
169                         degInRad = i * (3.14159265358979323846/180.f);\r
170                         g_QglTable.m_pfn_qglVertex2f( 32 + cos(degInRad) * 5, 18 + sin(degInRad) * 5 );\r
171                 }\r
172                 g_QglTable.m_pfn_qglEnd();\r
173 \r
174                 g_QglTable.m_pfn_qglBegin( GL_LINES );\r
175                 g_QglTable.m_pfn_qglVertex2f( 40, 22 );\r
176                 g_QglTable.m_pfn_qglVertex2f( 52, 31 );\r
177                 g_QglTable.m_pfn_qglVertex2f( 40, 13 );\r
178                 g_QglTable.m_pfn_qglVertex2f( 52, 4 );\r
179                 g_QglTable.m_pfn_qglEnd();\r
180         }\r
181 \r
182   g_QglTable.m_pfn_qglPopAttrib();\r
183 }\r