]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/points.cpp
Slight fix to r353 in Rambetter-fixes temp: the file suffix in
[xonotic/netradiant.git] / radiant / points.cpp
index 0f50ebdfe535b947d28aef3199c2814c17eabb00..2da929768596ab0574e77e457c8153a373b4a1b5 100644 (file)
@@ -1,5 +1,5 @@
 /*
-Copyright (C) 1999-2006 Id Software, Inc. and contributors.
+Copyright (C) 1999-2007 id Software, Inc. and contributors.
 For a list of contributors, see the accompanying CONTRIBUTORS file.
 
 This file is part of GtkRadiant.
@@ -19,294 +19,147 @@ along with GtkRadiant; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */
 
-/*
-The following source code is licensed by Id Software and subject to the terms of 
-its LIMITED USE SOFTWARE LICENSE AGREEMENT, a copy of which is included with 
-GtkRadiant. If you did not receive a LIMITED USE SOFTWARE LICENSE AGREEMENT, 
-please contact Id Software immediately at info@idsoftware.com.
-*/
-
-#include "points.h"
-
-#include "debugging/debugging.h"
-
-#include "irender.h"
-#include "igl.h"
-#include "renderable.h"
-
-#include "stream/stringstream.h"
-#include "os/path.h"
-#include "os/file.h"
-#include "cmdlib.h"
-
-#include "map.h"
-#include "qe3.h"
-#include "camwindow.h"
-#include "xywindow.h"
-#include "xmlstuff.h"
-#include "mainframe.h"
-#include "watchbsp.h"
-#include "commands.h"
-
-
-class CPointfile;
-void Pointfile_Parse(CPointfile& pointfile);
-
-
-class CPointfile : public ISAXHandler, public Renderable, public OpenGLRenderable
-{
-  enum
-  {
-    MAX_POINTFILE = 8192,
-  };
-  Vector3 s_pointvecs[MAX_POINTFILE];
-  std::size_t s_num_points;
-  int m_displaylist;
-  static Shader* m_renderstate;
-  StringOutputStream m_characters;
-public:
-  CPointfile()
-  {
-  }
-  ~CPointfile()
-  {
-  }
-  void Init();
-  void PushPoint (const Vector3& v);
-  void GenerateDisplayList();
-  // SAX interface
-  void Release()
-  {
-    // blank because not heap-allocated
-  }
-  void saxStartElement (message_info_t *ctx, const xmlChar *name, const xmlChar **attrs);
-  void saxEndElement (message_info_t *ctx, const xmlChar *name);
-  void saxCharacters (message_info_t *ctx, const xmlChar *ch, int len);
-  const char* getName();
-
-  typedef const Vector3* const_iterator;
-
-  const_iterator begin() const
-  {
-    return &s_pointvecs[0];
-  }
-  const_iterator end() const
-  {
-    return &s_pointvecs[s_num_points];
-  }
-
-  bool shown() const
-  {
-    return m_displaylist != 0;
-  }
-  void show(bool show)
-  {
-    if(show && !shown())
-    {
-      Pointfile_Parse(*this);
-           GenerateDisplayList();
-      SceneChangeNotify();
-    }
-    else if(!show && shown())
-    {
-           glDeleteLists (m_displaylist, 1);
-           m_displaylist = 0;
-      SceneChangeNotify();
-    }
-  }
-
-  void render(RenderStateFlags state) const
-  {
-    glCallList(m_displaylist);
-  }
-
-  void renderSolid(Renderer& renderer, const VolumeTest& volume) const
-  {
-    if(shown())
-    {
-      renderer.SetState(m_renderstate, Renderer::eWireframeOnly);
-      renderer.SetState(m_renderstate, Renderer::eFullMaterials);
-      renderer.addRenderable(*this, g_matrix4_identity);
-    }
-  }
-  void renderWireframe(Renderer& renderer, const VolumeTest& volume) const
-  {
-    renderSolid(renderer, volume);
-  }
+#include "stdafx.h"
 
-  static void constructStatic()
-  {
-    m_renderstate = GlobalShaderCache().capture("$POINTFILE");
-  }
+#define        MAX_POINTFILE   8192
+static vec3_t  s_pointvecs[MAX_POINTFILE];
+static int             s_num_points, s_check_point;
 
-  static void destroyStatic()
-  {
-    GlobalShaderCache().release("$POINTFILE");
-  }
-};
+CPointfile g_pointfile;
 
-Shader* CPointfile::m_renderstate = 0;
-
-namespace
-{
-  CPointfile s_pointfile;
-}
-
-ISAXHandler& g_pointfile = s_pointfile;
-
-static CPointfile::const_iterator s_check_point;
+// CPointfile routine used by the standard code ---------------------------------
 
 void CPointfile::Init()
 {
   s_num_points = 0;
-  m_displaylist = 0;
 }
 
-void CPointfile::PushPoint(const Vector3& v)
+void CPointfile::PushPoint (vec3_t v)
 {
        if (s_num_points < MAX_POINTFILE)
        {
-               s_pointvecs[s_num_points] = v;
-               ++s_num_points;
+               VectorCopy (v, s_pointvecs[s_num_points]);
+               s_num_points++;
        }
 }
 
 // create the display list at the end
 void CPointfile::GenerateDisplayList()
 {
-  m_displaylist = glGenLists(1);
+  int i;
 
-  glNewList (m_displaylist,  GL_COMPILE);
+       if (!g_qeglobals.d_pointfile_display_list)
+               g_qeglobals.d_pointfile_display_list = qglGenLists(1);
 
-  glBegin(GL_LINE_STRIP);
-       for(std::size_t i=0;i<s_num_points;i++)
-         glVertex3fv (vector3_to_array(s_pointvecs[i]));
-  glEnd();
-  glLineWidth (1);
+  qglNewList (g_qeglobals.d_pointfile_display_list,  GL_COMPILE);
+  
+       qglColor3f (1, 0, 0);
+       qglDisable(GL_TEXTURE_2D);
+       qglDisable(GL_TEXTURE_1D);
+       qglLineWidth (4);
+       qglBegin(GL_LINE_STRIP);
+       for (i=0;i<s_num_points;i++)
+       {
+         if (s_num_points < MAX_POINTFILE)
+         {
+           qglVertex3fv (s_pointvecs[i]);
+         }
+       }
+       qglEnd();
+       qglLineWidth (1);
        
-  glEndList();
+       qglEndList ();
+       
+       s_check_point = 0;
 }
 
 // old (but still relevant) pointfile code -------------------------------------
 
 void Pointfile_Delete (void)
 {
-  const char* mapname = Map_Name(g_map);
-  StringOutputStream name(256);
-  name << StringRange(mapname, path_get_filename_base_end(mapname)) << ".lin";
-       file_remove(name.c_str());
+       char    name[1024];
+
+       strcpy (name, currentmap);
+       StripExtension (name);
+       strcat (name, ".lin");
+
+       remove(name);
 }
 
 // advance camera to next point
 void Pointfile_Next (void)
 {
-  if(!s_pointfile.shown())
-    return;
+       vec3_t  dir;
 
-       if (s_check_point+2 == s_pointfile.end())
+       if (s_check_point >= s_num_points-2)
        {
-               globalOutputStream() << "End of pointfile\n";
+               Sys_Status ("End of pointfile", 0);
                return;
        }
+       s_check_point++;
+       VectorCopy (s_pointvecs[s_check_point], g_pParentWnd->GetCamWnd()->Camera()->origin);
+       VectorCopy (s_pointvecs[s_check_point], g_pParentWnd->GetXYWnd()->GetOrigin());
+       VectorSubtract (s_pointvecs[s_check_point+1], g_pParentWnd->GetCamWnd()->Camera()->origin, dir);
+       VectorNormalize (dir, dir);
+       g_pParentWnd->GetCamWnd()->Camera()->angles[1] = atan2 (dir[1], dir[0])*180/3.14159;
+       g_pParentWnd->GetCamWnd()->Camera()->angles[0] = asin (dir[2])*180/3.14159;
 
-  CPointfile::const_iterator i = ++s_check_point;
-
-
-  CamWnd& camwnd = *g_pParentWnd->GetCamWnd();
-       Camera_setOrigin(camwnd, *i);
-       g_pParentWnd->GetXYWnd()->SetOrigin(*i);
-  {
-         Vector3 dir(vector3_normalised(vector3_subtracted(*(++i), Camera_getOrigin(camwnd))));
-    Vector3 angles(Camera_getAngles(camwnd));
-         angles[CAMERA_YAW] = static_cast<float>(radians_to_degrees(atan2(dir[1], dir[0])));
-         angles[CAMERA_PITCH] = static_cast<float>(radians_to_degrees(asin(dir[2])));
-    Camera_setAngles(camwnd, angles);
-  }
+       Sys_UpdateWindows (W_ALL);
 }
 
 // advance camera to previous point
 void Pointfile_Prev (void)
 {
-  if(!s_pointfile.shown())
-    return;
+       vec3_t  dir;
 
-       if (s_check_point == s_pointfile.begin())
+       if ( s_check_point == 0)
        {
-               globalOutputStream() << "Start of pointfile\n";
+               Sys_Status ("Start of pointfile", 0);
                return;
        }
+       s_check_point--;
+       VectorCopy (s_pointvecs[s_check_point], g_pParentWnd->GetCamWnd()->Camera()->origin);
+       VectorCopy (s_pointvecs[s_check_point], g_pParentWnd->GetXYWnd()->GetOrigin());
+       VectorSubtract (s_pointvecs[s_check_point+1], g_pParentWnd->GetCamWnd()->Camera()->origin, dir);
+       VectorNormalize (dir, dir);
+       g_pParentWnd->GetCamWnd()->Camera()->angles[1] = atan2 (dir[1], dir[0])*180/3.14159;
+       g_pParentWnd->GetCamWnd()->Camera()->angles[0] = asin (dir[2])*180/3.14159;
 
-       CPointfile::const_iterator i = --s_check_point;
-
-  CamWnd& camwnd = *g_pParentWnd->GetCamWnd();
-       Camera_setOrigin(camwnd, *i);
-       g_pParentWnd->GetXYWnd()->SetOrigin(*i);
-  {
-         Vector3 dir(vector3_normalised(vector3_subtracted(*(++i), Camera_getOrigin(camwnd))));
-    Vector3 angles(Camera_getAngles(camwnd));
-         angles[CAMERA_YAW] = static_cast<float>(radians_to_degrees(atan2(dir[1], dir[0])));
-         angles[CAMERA_PITCH] = static_cast<float>(radians_to_degrees(asin(dir[2])));
-    Camera_setAngles(camwnd, angles);
-  }
-}
-
-int LoadFile (const char *filename, void **bufferptr)
-{
-  FILE *f;
-  long len;
-
-  f = fopen (filename, "rb");
-  if (f == 0)
-    return -1;
-
-  fseek (f, 0, SEEK_END);
-  len = ftell (f);
-  rewind (f);
-
-  *bufferptr = malloc (len+1);
-  if (*bufferptr == 0)
-    return -1;
-
-  fread (*bufferptr, 1, len, f);
-  fclose (f);
-
-  // we need to end the buffer with a 0
-  ((char*) (*bufferptr))[len] = 0;
-
-  return len;
+       Sys_UpdateWindows (W_ALL);
 }
 
-void Pointfile_Parse(CPointfile& pointfile)
+void WINAPI Pointfile_Check (void)
 {
+       char    name[1024];
        int             size;
        char    *data;
   char  *text;
   int   line = 1;
+       vec3_t v;
 
-  const char* mapname = Map_Name(g_map);
-  StringOutputStream name(256);
-  name << StringRange(mapname, path_get_filename_base_end(mapname)) << ".lin";
+       strcpy (name, currentmap);
+       StripExtension (name);
+       strcat (name, ".lin");
 
-       size = LoadFile (name.c_str(), (void**)&data);
-  if (size == -1)
+       size = vfsLoadFullPathFile (name, (void**)&data);
+  if (size <= 0)
   {
-    globalErrorStream() << "Pointfile " << name.c_str() << " not found\n";
+    Sys_FPrintf (SYS_ERR, "Pointfile %s not found\n", name);
                return;
   }
 
   // store a pointer
   text = data;
 
-       globalOutputStream() << "Reading pointfile " << name.c_str() << "\n";
+       Sys_Printf ("Reading pointfile %s\n", name);
 
-  pointfile.Init();
+  g_pointfile.Init();
 
        while (*data)
        {
-         Vector3 v;
     if (sscanf(data,"%f %f %f", &v[0], &v[1], &v[2]) != 3)
     {
-      globalOutputStream() << "Corrupt point file, line " << line << "\n";
+      Sys_Printf("Corrupt point file, line %d\n",line);
                        break;
     }
 
@@ -321,7 +174,7 @@ void Pointfile_Parse(CPointfile& pointfile)
     {
       if (sscanf(data,"- %f %f %f", &v[0], &v[1], &v[2]) != 3)
       {
-        globalOutputStream() << "Corrupt point file, line " << line << "\n";
+        Sys_Printf("Corrupt point file, line %d\n",line);
         break;
       }
 
@@ -334,80 +187,63 @@ void Pointfile_Parse(CPointfile& pointfile)
       data++; // skip the \n
       line++;
     }
-               pointfile.PushPoint (v);
+               g_pointfile.PushPoint (v);
        }
 
   g_free(text);
-}
-
-void Pointfile_Clear()
-{
-  s_pointfile.show(false);
-}
-
-void Pointfile_Toggle()
-{
-  s_pointfile.show(!s_pointfile.shown());
+       
+       g_pointfile.GenerateDisplayList();
 
-  s_check_point = s_pointfile.begin();
+  Sys_UpdateWindows (W_ALL);
 }
 
-void Pointfile_Construct()
+void Pointfile_Draw( void )
 {
-  CPointfile::constructStatic();
-
-  GlobalShaderCache().attachRenderable(s_pointfile);
-
-  GlobalCommands_insert("TogglePointfile", FreeCaller<Pointfile_Toggle>());
-  GlobalCommands_insert("NextLeakSpot", FreeCaller<Pointfile_Next>(), Accelerator('K', (GdkModifierType)(GDK_SHIFT_MASK|GDK_CONTROL_MASK)));
-  GlobalCommands_insert("PrevLeakSpot", FreeCaller<Pointfile_Prev>(), Accelerator('L', (GdkModifierType)(GDK_SHIFT_MASK|GDK_CONTROL_MASK)));
+  qglCallList (g_qeglobals.d_pointfile_display_list);
 }
 
-void Pointfile_Destroy()
+void Pointfile_Clear (void)
 {
-  GlobalShaderCache().detachRenderable(s_pointfile);
+       if (!g_qeglobals.d_pointfile_display_list)
+               return;
 
-  CPointfile::destroyStatic();
+       qglDeleteLists (g_qeglobals.d_pointfile_display_list, 1);
+       g_qeglobals.d_pointfile_display_list = 0;
+       Sys_UpdateWindows (W_ALL);
 }
 
-
-
-// CPointfile implementation for SAX-specific stuff -------------------------------
+// CPointfile implementation for SAX speicific stuff -------------------------------
 void CPointfile::saxStartElement (message_info_t *ctx, const xmlChar *name, const xmlChar **attrs)
 {
-  if(string_equal(reinterpret_cast<const char*>(name), "polyline"))
+  if (strcmp ((char *)name, "polyline")==0)
   {
     Init();
     // there's a prefs setting to avoid stopping on leak
-    if (!g_WatchBSP_LeakStop)
+    if (!g_PrefsDlg.m_bLeakStop)
       ctx->stop_depth = 0;
   }
 }
 
 void CPointfile::saxEndElement (message_info_t *ctx, const xmlChar *name)
 {
-  if(string_equal(reinterpret_cast<const char*>(name), "polyline"))
+  if (strcmp ((char *)name, "polyline")==0)
   {
     // we are done
     GenerateDisplayList();
-    SceneChangeNotify();
-  }
-  else if(string_equal(reinterpret_cast<const char*>(name), "point"))
-  {
-    Vector3 v;  
-    sscanf(m_characters.c_str(), "%f %f %f\n", &v[0], &v[1], &v[2]);
-    PushPoint(v);
-    m_characters.clear();
+    ctx->bGeometry = false;
   }
 }
 
 // only "point" is expected to have characters around here
 void CPointfile::saxCharacters (message_info_t *ctx, const xmlChar *ch, int len)
 {
-  m_characters.write(reinterpret_cast<const char*>(ch), len);
+  vec3_t v;
+  
+  sscanf ((char *)ch, "%f %f %f\n", &v[0], &v[1], &v[2]);
+  PushPoint (v);
 }
 
-const char* CPointfile::getName()
+char * CPointfile::getName()
 {
-  return "Map leaked";
+  return "Map is leaked";
 }