/*
-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.
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;
}
{
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;
}
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";
}