2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
\r
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
\r
5 This file is part of GtkRadiant.
\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
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
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
23 Camera plugin for GtkRadiant
\r
24 Copyright (C) 2002 Splash Damage Ltd.
\r
29 CRenderer::CRenderer() {
\r
39 CRenderer::~CRenderer() {
\r
44 void CRenderer::Register() {
\r
45 g_QglTable.m_pfnHookGL2DWindow( this );
\r
46 g_QglTable.m_pfnHookGL3DWindow( this );
\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
58 void CRenderer::Initialize() {
\r
62 void CRenderer::Draw2D( VIEWTYPE vt ) {
\r
64 g_QglTable.m_pfn_qglPushAttrib(GL_ALL_ATTRIB_BITS);
\r
65 g_QglTable.m_pfn_qglPushMatrix();
\r
72 g_QglTable.m_pfn_qglRotatef(270.0f, 1.0f, 0.0f, 0.0f);
\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
80 CCamera *cam = firstCam;
\r
82 cam->GetCam()->draw( ((Listener && cam == g_pCurrentEditCam) ? true : false) );
\r
83 cam = cam->GetNext();
\r
86 g_QglTable.m_pfn_qglPopMatrix();
\r
87 g_QglTable.m_pfn_qglPopAttrib();
\r
90 void CRenderer::Draw3D() {
\r
91 // FIXME: really need a mainloop callback from the editor core
\r
95 static long current;
\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
104 g_iPreviewRunning = 2;
\r
107 if( current < start + msecs ) {
\r
109 vec3_t origin = {0.0f, 0.0f, 0.0f}, dir = {0.0f, 0.0f, 0.0f}, angles;
\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
116 g_iPreviewRunning = 0;
\r
117 GetCurrentCam()->GetCam()->setRunning( false );
\r
118 g_FuncTable.m_pfnSysUpdateWindows( W_XY_OVERLAY | W_CAMERA );
\r
122 g_QglTable.m_pfn_qglPushAttrib(GL_ALL_ATTRIB_BITS);
\r
124 CCamera *cam = firstCam;
\r
126 cam->GetCam()->draw( ((Listener && cam == g_pCurrentEditCam) ? true : false) );
\r
127 cam = cam->GetNext();
\r
130 if( g_iPreviewRunning ) {
\r
131 int x, y, width, height, i;
\r
134 g_CameraTable.m_pfnGetCamWindowExtents( &x, &y, &width, &height );
\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
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
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
157 g_QglTable.m_pfn_qglEnd();
\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
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
172 g_QglTable.m_pfn_qglEnd();
\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
182 g_QglTable.m_pfn_qglPopAttrib();
\r