/* Copyright (C) 1999-2006 Id Software, Inc. and contributors. For a list of contributors, see the accompanying CONTRIBUTORS file. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* Camera plugin for GtkRadiant Copyright (C) 2002 Splash Damage Ltd. */ #include "camera.h" CRenderer::CRenderer() { refCount = 1; m_bHooked = FALSE; Register(); Initialize(); } CRenderer::~CRenderer() { if ( m_bHooked ) { UnRegister(); } } void CRenderer::Register() { g_QglTable.m_pfnHookGL2DWindow( this ); g_QglTable.m_pfnHookGL3DWindow( this ); m_bHooked = TRUE; } void CRenderer::UnRegister() { if ( g_QglTable.m_nSize ) { g_QglTable.m_pfnUnHookGL2DWindow( this ); g_QglTable.m_pfnUnHookGL3DWindow( this ); } m_bHooked = FALSE; } void CRenderer::Initialize() { } void CRenderer::Draw2D( VIEWTYPE vt ) { g_QglTable.m_pfn_qglPushAttrib( GL_ALL_ATTRIB_BITS ); g_QglTable.m_pfn_qglPushMatrix(); switch ( vt ) { case XY: break; case XZ: g_QglTable.m_pfn_qglRotatef( 270.0f, 1.0f, 0.0f, 0.0f ); break; case YZ: g_QglTable.m_pfn_qglRotatef( 270.0f, 1.0f, 0.0f, 0.0f ); g_QglTable.m_pfn_qglRotatef( 270.0f, 0.0f, 0.0f, 1.0f ); break; } CCamera *cam = firstCam; while ( cam ) { cam->GetCam()->draw( ( ( Listener && cam == g_pCurrentEditCam ) ? true : false ) ); cam = cam->GetNext(); } g_QglTable.m_pfn_qglPopMatrix(); g_QglTable.m_pfn_qglPopAttrib(); } void CRenderer::Draw3D() { // FIXME: really need a mainloop callback from the editor core static long start; static float cycle; static long msecs; static long current; if ( g_iPreviewRunning ) { if ( g_iPreviewRunning == 1 ) { start = Q_QGetTickCount(); GetCurrentCam()->GetCam()->startCamera( start ); cycle = GetCurrentCam()->GetCam()->getTotalTime(); msecs = (long)( cycle * 1000 ); current = start; g_iPreviewRunning = 2; } if ( current < start + msecs ) { float fov; vec3_t origin = {0.0f, 0.0f, 0.0f}, dir = {0.0f, 0.0f, 0.0f}, angles; GetCurrentCam()->GetCam()->getCameraInfo( current, &origin[0], &dir[0], &fov ); VectorSet( angles, asin( dir[2] ) * 180 / 3.14159, atan2( dir[1], dir[0] ) * 180 / 3.14159, 0 ); g_CameraTable.m_pfnSetCamera( origin, angles ); current = Q_QGetTickCount(); } else { g_iPreviewRunning = 0; GetCurrentCam()->GetCam()->setRunning( false ); g_FuncTable.m_pfnSysUpdateWindows( W_XY_OVERLAY | W_CAMERA ); } } g_QglTable.m_pfn_qglPushAttrib( GL_ALL_ATTRIB_BITS ); CCamera *cam = firstCam; while ( cam ) { cam->GetCam()->draw( ( ( Listener && cam == g_pCurrentEditCam ) ? true : false ) ); cam = cam->GetNext(); } if ( g_iPreviewRunning ) { int x, y, width, height, i; float degInRad; g_CameraTable.m_pfnGetCamWindowExtents( &x, &y, &width, &height ); // setup orthographic projection mode g_QglTable.m_pfn_qglMatrixMode( GL_PROJECTION ); g_QglTable.m_pfn_qglLoadIdentity(); g_QglTable.m_pfn_qglDisable( GL_DEPTH_TEST ); g_QglTable.m_pfn_qglOrtho( 0, (float)width, 0, (float)height, -100, 100 ); g_QglTable.m_pfn_qglMatrixMode( GL_MODELVIEW ); g_QglTable.m_pfn_qglLoadIdentity(); g_QglTable.m_pfn_qglColor3f( 1.f, 1.f, 1.f ); g_QglTable.m_pfn_qglBegin( GL_LINE_LOOP ); g_QglTable.m_pfn_qglVertex2f( 10, 10 ); g_QglTable.m_pfn_qglVertex2f( 40, 10 ); g_QglTable.m_pfn_qglVertex2f( 40, 25 ); g_QglTable.m_pfn_qglVertex2f( 10, 25 ); g_QglTable.m_pfn_qglEnd(); g_QglTable.m_pfn_qglBegin( GL_LINE_LOOP ); for ( i = 0; i < 360; i += 60 ) { degInRad = i * ( 3.14159265358979323846 / 180.f ); g_QglTable.m_pfn_qglVertex2f( 18 + cos( degInRad ) * 5, 18 + sin( degInRad ) * 5 ); } g_QglTable.m_pfn_qglEnd(); degInRad = ( 360 - ( ( current - start ) % 360 ) ) * ( 3.14159265358979323846 / 180.f ); g_QglTable.m_pfn_qglBegin( GL_LINES ); g_QglTable.m_pfn_qglVertex2f( 18, 18 ); g_QglTable.m_pfn_qglVertex2f( 18 + cos( degInRad ) * 5, 18 + sin( degInRad ) * 5 ); g_QglTable.m_pfn_qglVertex2f( 32, 18 ); g_QglTable.m_pfn_qglVertex2f( 32 + cos( degInRad ) * 5, 18 + sin( degInRad ) * 5 ); g_QglTable.m_pfn_qglEnd(); g_QglTable.m_pfn_qglBegin( GL_LINE_LOOP ); for ( i = 0; i < 360; i += 60 ) { degInRad = i * ( 3.14159265358979323846 / 180.f ); g_QglTable.m_pfn_qglVertex2f( 32 + cos( degInRad ) * 5, 18 + sin( degInRad ) * 5 ); } g_QglTable.m_pfn_qglEnd(); g_QglTable.m_pfn_qglBegin( GL_LINES ); g_QglTable.m_pfn_qglVertex2f( 40, 22 ); g_QglTable.m_pfn_qglVertex2f( 52, 31 ); g_QglTable.m_pfn_qglVertex2f( 40, 13 ); g_QglTable.m_pfn_qglVertex2f( 52, 4 ); g_QglTable.m_pfn_qglEnd(); } g_QglTable.m_pfn_qglPopAttrib(); }