X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=radiant%2Fpoints.cpp;h=2da929768596ab0574e77e457c8153a373b4a1b5;hb=88cea027e6e647250b1f19862393306948801fca;hp=64e676672f45b0b0ada10000120bb68bc1b4ad85;hpb=80378101101ca1762bbf5638a9e3566893096d8a;p=xonotic%2Fnetradiant.git diff --git a/radiant/points.cpp b/radiant/points.cpp index 64e67667..2da92976 100644 --- a/radiant/points.cpp +++ b/radiant/points.cpp @@ -1,249 +1,249 @@ -/* -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. - -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 -*/ - -#include "stdafx.h" - -#define MAX_POINTFILE 8192 -static vec3_t s_pointvecs[MAX_POINTFILE]; -static int s_num_points, s_check_point; - -CPointfile g_pointfile; - -// CPointfile routine used by the standard code --------------------------------- - -void CPointfile::Init() -{ - s_num_points = 0; -} - -void CPointfile::PushPoint (vec3_t v) -{ - if (s_num_points < MAX_POINTFILE) - { - VectorCopy (v, s_pointvecs[s_num_points]); - s_num_points++; - } -} - -// create the display list at the end -void CPointfile::GenerateDisplayList() -{ - int i; - - if (!g_qeglobals.d_pointfile_display_list) - g_qeglobals.d_pointfile_display_list = qglGenLists(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-2) - { - 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; - - Sys_UpdateWindows (W_ALL); -} - -// advance camera to previous point -void Pointfile_Prev (void) -{ - vec3_t dir; - - if ( s_check_point == 0) - { - 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; - - Sys_UpdateWindows (W_ALL); -} - -void WINAPI Pointfile_Check (void) -{ - char name[1024]; - int size; - char *data; - char *text; - int line = 1; - vec3_t v; - - strcpy (name, currentmap); - StripExtension (name); - strcat (name, ".lin"); - - size = vfsLoadFullPathFile (name, (void**)&data); - if (size <= 0) - { - Sys_FPrintf (SYS_ERR, "Pointfile %s not found\n", name); - return; - } - - // store a pointer - text = data; - - Sys_Printf ("Reading pointfile %s\n", name); - - g_pointfile.Init(); - - while (*data) - { - if (sscanf(data,"%f %f %f", &v[0], &v[1], &v[2]) != 3) - { - Sys_Printf("Corrupt point file, line %d\n",line); - break; - } - - while (*data && *data != '\n') - { - if (*(data-1) == ' ' && *(data) == '-' && *(data+1) == ' ') - break; - data++; - } - // deal with zhlt style point files. - if (*data == '-') - { - if (sscanf(data,"- %f %f %f", &v[0], &v[1], &v[2]) != 3) - { - Sys_Printf("Corrupt point file, line %d\n",line); - break; - } - - while (*data && *data != '\n') - data++; - - } - while (*data == '\n') - { - data++; // skip the \n - line++; - } - g_pointfile.PushPoint (v); - } - - g_free(text); - - g_pointfile.GenerateDisplayList(); - - Sys_UpdateWindows (W_ALL); -} - -void Pointfile_Draw( void ) -{ - qglCallList (g_qeglobals.d_pointfile_display_list); -} - -void Pointfile_Clear (void) -{ - if (!g_qeglobals.d_pointfile_display_list) - return; - - qglDeleteLists (g_qeglobals.d_pointfile_display_list, 1); - g_qeglobals.d_pointfile_display_list = 0; - Sys_UpdateWindows (W_ALL); -} - -// CPointfile implementation for SAX speicific stuff ------------------------------- -void CPointfile::saxStartElement (message_info_t *ctx, const xmlChar *name, const xmlChar **attrs) -{ - if (strcmp ((char *)name, "polyline")==0) - { - Init(); - // there's a prefs setting to avoid stopping on leak - if (!g_PrefsDlg.m_bLeakStop) - ctx->stop_depth = 0; - } -} - -void CPointfile::saxEndElement (message_info_t *ctx, const xmlChar *name) -{ - if (strcmp ((char *)name, "polyline")==0) - { - // we are done - GenerateDisplayList(); - ctx->bGeometry = false; - } -} - -// only "point" is expected to have characters around here -void CPointfile::saxCharacters (message_info_t *ctx, const xmlChar *ch, int len) -{ - vec3_t v; - - sscanf ((char *)ch, "%f %f %f\n", &v[0], &v[1], &v[2]); - PushPoint (v); -} - -char * CPointfile::getName() -{ - return "Map is leaked"; -} +/* +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. + +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 +*/ + +#include "stdafx.h" + +#define MAX_POINTFILE 8192 +static vec3_t s_pointvecs[MAX_POINTFILE]; +static int s_num_points, s_check_point; + +CPointfile g_pointfile; + +// CPointfile routine used by the standard code --------------------------------- + +void CPointfile::Init() +{ + s_num_points = 0; +} + +void CPointfile::PushPoint (vec3_t v) +{ + if (s_num_points < MAX_POINTFILE) + { + VectorCopy (v, s_pointvecs[s_num_points]); + s_num_points++; + } +} + +// create the display list at the end +void CPointfile::GenerateDisplayList() +{ + int i; + + if (!g_qeglobals.d_pointfile_display_list) + g_qeglobals.d_pointfile_display_list = qglGenLists(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-2) + { + 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; + + Sys_UpdateWindows (W_ALL); +} + +// advance camera to previous point +void Pointfile_Prev (void) +{ + vec3_t dir; + + if ( s_check_point == 0) + { + 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; + + Sys_UpdateWindows (W_ALL); +} + +void WINAPI Pointfile_Check (void) +{ + char name[1024]; + int size; + char *data; + char *text; + int line = 1; + vec3_t v; + + strcpy (name, currentmap); + StripExtension (name); + strcat (name, ".lin"); + + size = vfsLoadFullPathFile (name, (void**)&data); + if (size <= 0) + { + Sys_FPrintf (SYS_ERR, "Pointfile %s not found\n", name); + return; + } + + // store a pointer + text = data; + + Sys_Printf ("Reading pointfile %s\n", name); + + g_pointfile.Init(); + + while (*data) + { + if (sscanf(data,"%f %f %f", &v[0], &v[1], &v[2]) != 3) + { + Sys_Printf("Corrupt point file, line %d\n",line); + break; + } + + while (*data && *data != '\n') + { + if (*(data-1) == ' ' && *(data) == '-' && *(data+1) == ' ') + break; + data++; + } + // deal with zhlt style point files. + if (*data == '-') + { + if (sscanf(data,"- %f %f %f", &v[0], &v[1], &v[2]) != 3) + { + Sys_Printf("Corrupt point file, line %d\n",line); + break; + } + + while (*data && *data != '\n') + data++; + + } + while (*data == '\n') + { + data++; // skip the \n + line++; + } + g_pointfile.PushPoint (v); + } + + g_free(text); + + g_pointfile.GenerateDisplayList(); + + Sys_UpdateWindows (W_ALL); +} + +void Pointfile_Draw( void ) +{ + qglCallList (g_qeglobals.d_pointfile_display_list); +} + +void Pointfile_Clear (void) +{ + if (!g_qeglobals.d_pointfile_display_list) + return; + + qglDeleteLists (g_qeglobals.d_pointfile_display_list, 1); + g_qeglobals.d_pointfile_display_list = 0; + Sys_UpdateWindows (W_ALL); +} + +// CPointfile implementation for SAX speicific stuff ------------------------------- +void CPointfile::saxStartElement (message_info_t *ctx, const xmlChar *name, const xmlChar **attrs) +{ + if (strcmp ((char *)name, "polyline")==0) + { + Init(); + // there's a prefs setting to avoid stopping on leak + if (!g_PrefsDlg.m_bLeakStop) + ctx->stop_depth = 0; + } +} + +void CPointfile::saxEndElement (message_info_t *ctx, const xmlChar *name) +{ + if (strcmp ((char *)name, "polyline")==0) + { + // we are done + GenerateDisplayList(); + ctx->bGeometry = false; + } +} + +// only "point" is expected to have characters around here +void CPointfile::saxCharacters (message_info_t *ctx, const xmlChar *ch, int len) +{ + vec3_t v; + + sscanf ((char *)ch, "%f %f %f\n", &v[0], &v[1], &v[2]); + PushPoint (v); +} + +char * CPointfile::getName() +{ + return "Map is leaked"; +}