2 Copyright (C) 1999-2006 Id Software, Inc. and contributors.
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
5 This file is part of GtkRadiant.
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.
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.
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
23 Camera plugin for GtkRadiant
24 Copyright (C) 2002 Splash Damage Ltd.
29 CRenderer::CRenderer() {
39 CRenderer::~CRenderer() {
45 void CRenderer::Register() {
46 g_QglTable.m_pfnHookGL2DWindow( this );
47 g_QglTable.m_pfnHookGL3DWindow( this );
51 void CRenderer::UnRegister() {
52 if ( g_QglTable.m_nSize ) {
53 g_QglTable.m_pfnUnHookGL2DWindow( this );
54 g_QglTable.m_pfnUnHookGL3DWindow( this );
59 void CRenderer::Initialize() {
63 void CRenderer::Draw2D( VIEWTYPE vt ) {
65 g_QglTable.m_pfn_qglPushAttrib( GL_ALL_ATTRIB_BITS );
66 g_QglTable.m_pfn_qglPushMatrix();
73 g_QglTable.m_pfn_qglRotatef( 270.0f, 1.0f, 0.0f, 0.0f );
76 g_QglTable.m_pfn_qglRotatef( 270.0f, 1.0f, 0.0f, 0.0f );
77 g_QglTable.m_pfn_qglRotatef( 270.0f, 0.0f, 0.0f, 1.0f );
81 CCamera *cam = firstCam;
83 cam->GetCam()->draw( ( ( Listener && cam == g_pCurrentEditCam ) ? true : false ) );
87 g_QglTable.m_pfn_qglPopMatrix();
88 g_QglTable.m_pfn_qglPopAttrib();
91 void CRenderer::Draw3D() {
92 // FIXME: really need a mainloop callback from the editor core
98 if ( g_iPreviewRunning ) {
99 if ( g_iPreviewRunning == 1 ) {
100 start = Q_QGetTickCount();
101 GetCurrentCam()->GetCam()->startCamera( start );
102 cycle = GetCurrentCam()->GetCam()->getTotalTime();
103 msecs = (long)( cycle * 1000 );
105 g_iPreviewRunning = 2;
108 if ( current < start + msecs ) {
110 vec3_t origin = {0.0f, 0.0f, 0.0f}, dir = {0.0f, 0.0f, 0.0f}, angles;
112 GetCurrentCam()->GetCam()->getCameraInfo( current, &origin[0], &dir[0], &fov );
113 VectorSet( angles, asin( dir[2] ) * 180 / 3.14159, atan2( dir[1], dir[0] ) * 180 / 3.14159, 0 );
114 g_CameraTable.m_pfnSetCamera( origin, angles );
115 current = Q_QGetTickCount();
118 g_iPreviewRunning = 0;
119 GetCurrentCam()->GetCam()->setRunning( false );
120 g_FuncTable.m_pfnSysUpdateWindows( W_XY_OVERLAY | W_CAMERA );
124 g_QglTable.m_pfn_qglPushAttrib( GL_ALL_ATTRIB_BITS );
126 CCamera *cam = firstCam;
128 cam->GetCam()->draw( ( ( Listener && cam == g_pCurrentEditCam ) ? true : false ) );
129 cam = cam->GetNext();
132 if ( g_iPreviewRunning ) {
133 int x, y, width, height, i;
136 g_CameraTable.m_pfnGetCamWindowExtents( &x, &y, &width, &height );
138 // setup orthographic projection mode
139 g_QglTable.m_pfn_qglMatrixMode( GL_PROJECTION );
140 g_QglTable.m_pfn_qglLoadIdentity();
141 g_QglTable.m_pfn_qglDisable( GL_DEPTH_TEST );
142 g_QglTable.m_pfn_qglOrtho( 0, (float)width, 0, (float)height, -100, 100 );
143 g_QglTable.m_pfn_qglMatrixMode( GL_MODELVIEW );
145 g_QglTable.m_pfn_qglLoadIdentity();
146 g_QglTable.m_pfn_qglColor3f( 1.f, 1.f, 1.f );
147 g_QglTable.m_pfn_qglBegin( GL_LINE_LOOP );
148 g_QglTable.m_pfn_qglVertex2f( 10, 10 );
149 g_QglTable.m_pfn_qglVertex2f( 40, 10 );
150 g_QglTable.m_pfn_qglVertex2f( 40, 25 );
151 g_QglTable.m_pfn_qglVertex2f( 10, 25 );
152 g_QglTable.m_pfn_qglEnd();
154 g_QglTable.m_pfn_qglBegin( GL_LINE_LOOP );
155 for ( i = 0; i < 360; i += 60 ) {
156 degInRad = i * ( 3.14159265358979323846 / 180.f );
157 g_QglTable.m_pfn_qglVertex2f( 18 + cos( degInRad ) * 5, 18 + sin( degInRad ) * 5 );
159 g_QglTable.m_pfn_qglEnd();
161 degInRad = ( 360 - ( ( current - start ) % 360 ) ) * ( 3.14159265358979323846 / 180.f );
162 g_QglTable.m_pfn_qglBegin( GL_LINES );
163 g_QglTable.m_pfn_qglVertex2f( 18, 18 );
164 g_QglTable.m_pfn_qglVertex2f( 18 + cos( degInRad ) * 5, 18 + sin( degInRad ) * 5 );
165 g_QglTable.m_pfn_qglVertex2f( 32, 18 );
166 g_QglTable.m_pfn_qglVertex2f( 32 + cos( degInRad ) * 5, 18 + sin( degInRad ) * 5 );
167 g_QglTable.m_pfn_qglEnd();
169 g_QglTable.m_pfn_qglBegin( GL_LINE_LOOP );
170 for ( i = 0; i < 360; i += 60 ) {
171 degInRad = i * ( 3.14159265358979323846 / 180.f );
172 g_QglTable.m_pfn_qglVertex2f( 32 + cos( degInRad ) * 5, 18 + sin( degInRad ) * 5 );
174 g_QglTable.m_pfn_qglEnd();
176 g_QglTable.m_pfn_qglBegin( GL_LINES );
177 g_QglTable.m_pfn_qglVertex2f( 40, 22 );
178 g_QglTable.m_pfn_qglVertex2f( 52, 31 );
179 g_QglTable.m_pfn_qglVertex2f( 40, 13 );
180 g_QglTable.m_pfn_qglVertex2f( 52, 4 );
181 g_QglTable.m_pfn_qglEnd();
184 g_QglTable.m_pfn_qglPopAttrib();