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