/* 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(); }