]> de.git.xonotic.org Git - voretournament/voretournament.git/blobdiff - misc/mediasource/netradiant-src/contrib/camera/renderer.cpp
Move the netradiant and fteqcc sources
[voretournament/voretournament.git] / misc / mediasource / netradiant-src / contrib / camera / renderer.cpp
diff --git a/misc/mediasource/netradiant-src/contrib/camera/renderer.cpp b/misc/mediasource/netradiant-src/contrib/camera/renderer.cpp
new file mode 100644 (file)
index 0000000..08e6664
--- /dev/null
@@ -0,0 +1,183 @@
+/*
+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();
+}