2 Copyright (C) 1999-2007 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() {
44 void CRenderer::Register() {
45 g_QglTable.m_pfnHookGL2DWindow( this );
46 g_QglTable.m_pfnHookGL3DWindow( this );
50 void CRenderer::UnRegister() {
51 if( g_QglTable.m_nSize ) {
52 g_QglTable.m_pfnUnHookGL2DWindow( this );
53 g_QglTable.m_pfnUnHookGL3DWindow( this );
58 void CRenderer::Initialize() {
62 void CRenderer::Draw2D( VIEWTYPE vt ) {
64 g_QglTable.m_pfn_qglPushAttrib(GL_ALL_ATTRIB_BITS);
65 g_QglTable.m_pfn_qglPushMatrix();
72 g_QglTable.m_pfn_qglRotatef(270.0f, 1.0f, 0.0f, 0.0f);
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);
80 CCamera *cam = firstCam;
82 cam->GetCam()->draw( ((Listener && cam == g_pCurrentEditCam) ? true : false) );
86 g_QglTable.m_pfn_qglPopMatrix();
87 g_QglTable.m_pfn_qglPopAttrib();
90 void CRenderer::Draw3D() {
91 // FIXME: really need a mainloop callback from the editor core
97 if( g_iPreviewRunning ) {
98 if( g_iPreviewRunning == 1 ) {
99 start = g_FuncTable.m_pfnQGetTickCount();
100 GetCurrentCam()->GetCam()->startCamera( start );
101 cycle = GetCurrentCam()->GetCam()->getTotalTime();
102 msecs = (long)(cycle * 1000);
104 g_iPreviewRunning = 2;
107 if( current < start + msecs ) {
109 vec3_t origin = {0.0f, 0.0f, 0.0f}, dir = {0.0f, 0.0f, 0.0f}, angles;
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 = g_FuncTable.m_pfnQGetTickCount();
116 g_iPreviewRunning = 0;
117 GetCurrentCam()->GetCam()->setRunning( false );
118 g_FuncTable.m_pfnSysUpdateWindows( W_XY_OVERLAY | W_CAMERA );
122 g_QglTable.m_pfn_qglPushAttrib(GL_ALL_ATTRIB_BITS);
124 CCamera *cam = firstCam;
126 cam->GetCam()->draw( ((Listener && cam == g_pCurrentEditCam) ? true : false) );
127 cam = cam->GetNext();
130 if( g_iPreviewRunning ) {
131 int x, y, width, height, i;
134 g_CameraTable.m_pfnGetCamWindowExtents( &x, &y, &width, &height );
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 );
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();
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 );
157 g_QglTable.m_pfn_qglEnd();
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();
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 );
172 g_QglTable.m_pfn_qglEnd();
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();
182 g_QglTable.m_pfn_qglPopAttrib();