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