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