X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=radiant%2Fpoints.cpp;h=2da929768596ab0574e77e457c8153a373b4a1b5;hb=cc5172d5a3d412d80252a4a1999f228289d7cb1c;hp=0f50ebdfe535b947d28aef3199c2814c17eabb00;hpb=86934e9cf051c28a95e5919302063613cefd2753;p=xonotic%2Fnetradiant.git diff --git a/radiant/points.cpp b/radiant/points.cpp index 0f50ebdf..2da92976 100644 --- a/radiant/points.cpp +++ b/radiant/points.cpp @@ -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-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(radians_to_degrees(atan2(dir[1], dir[0]))); - angles[CAMERA_PITCH] = static_cast(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(radians_to_degrees(atan2(dir[1], dir[0]))); - angles[CAMERA_PITCH] = static_cast(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()); - GlobalCommands_insert("NextLeakSpot", FreeCaller(), Accelerator('K', (GdkModifierType)(GDK_SHIFT_MASK|GDK_CONTROL_MASK))); - GlobalCommands_insert("PrevLeakSpot", FreeCaller(), 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(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(name), "polyline")) + if (strcmp ((char *)name, "polyline")==0) { // we are done GenerateDisplayList(); - SceneChangeNotify(); - } - else if(string_equal(reinterpret_cast(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(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"; }