2 Copyright (C) 1999-2007 id Software, Inc. and contributors.
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
5 This file is part of GtkRadiant.
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24 #define MAX_POINTFILE 8192
25 static vec3_t s_pointvecs[MAX_POINTFILE];
26 static int s_num_points, s_check_point;
28 CPointfile g_pointfile;
30 // CPointfile routine used by the standard code ---------------------------------
32 void CPointfile::Init()
37 void CPointfile::PushPoint (vec3_t v)
39 if (s_num_points < MAX_POINTFILE)
41 VectorCopy (v, s_pointvecs[s_num_points]);
46 // create the display list at the end
47 void CPointfile::GenerateDisplayList()
51 if (!g_qeglobals.d_pointfile_display_list)
52 g_qeglobals.d_pointfile_display_list = qglGenLists(1);
54 qglNewList (g_qeglobals.d_pointfile_display_list, GL_COMPILE);
57 qglDisable(GL_TEXTURE_2D);
58 qglDisable(GL_TEXTURE_1D);
60 qglBegin(GL_LINE_STRIP);
61 for (i=0;i<s_num_points;i++)
63 if (s_num_points < MAX_POINTFILE)
65 qglVertex3fv (s_pointvecs[i]);
76 // old (but still relevant) pointfile code -------------------------------------
78 void Pointfile_Delete (void)
82 strcpy (name, currentmap);
83 StripExtension (name);
84 strcat (name, ".lin");
89 // advance camera to next point
90 void Pointfile_Next (void)
94 if (s_check_point >= s_num_points-2)
96 Sys_Status ("End of pointfile", 0);
100 VectorCopy (s_pointvecs[s_check_point], g_pParentWnd->GetCamWnd()->Camera()->origin);
101 VectorCopy (s_pointvecs[s_check_point], g_pParentWnd->GetXYWnd()->GetOrigin());
102 VectorSubtract (s_pointvecs[s_check_point+1], g_pParentWnd->GetCamWnd()->Camera()->origin, dir);
103 VectorNormalize (dir, dir);
104 g_pParentWnd->GetCamWnd()->Camera()->angles[1] = atan2 (dir[1], dir[0])*180/3.14159;
105 g_pParentWnd->GetCamWnd()->Camera()->angles[0] = asin (dir[2])*180/3.14159;
107 Sys_UpdateWindows (W_ALL);
110 // advance camera to previous point
111 void Pointfile_Prev (void)
115 if ( s_check_point == 0)
117 Sys_Status ("Start of pointfile", 0);
121 VectorCopy (s_pointvecs[s_check_point], g_pParentWnd->GetCamWnd()->Camera()->origin);
122 VectorCopy (s_pointvecs[s_check_point], g_pParentWnd->GetXYWnd()->GetOrigin());
123 VectorSubtract (s_pointvecs[s_check_point+1], g_pParentWnd->GetCamWnd()->Camera()->origin, dir);
124 VectorNormalize (dir, dir);
125 g_pParentWnd->GetCamWnd()->Camera()->angles[1] = atan2 (dir[1], dir[0])*180/3.14159;
126 g_pParentWnd->GetCamWnd()->Camera()->angles[0] = asin (dir[2])*180/3.14159;
128 Sys_UpdateWindows (W_ALL);
131 void WINAPI Pointfile_Check (void)
140 strcpy (name, currentmap);
141 StripExtension (name);
142 strcat (name, ".lin");
144 size = vfsLoadFullPathFile (name, (void**)&data);
147 Sys_FPrintf (SYS_ERR, "Pointfile %s not found\n", name);
154 Sys_Printf ("Reading pointfile %s\n", name);
160 if (sscanf(data,"%f %f %f", &v[0], &v[1], &v[2]) != 3)
162 Sys_Printf("Corrupt point file, line %d\n",line);
166 while (*data && *data != '\n')
168 if (*(data-1) == ' ' && *(data) == '-' && *(data+1) == ' ')
172 // deal with zhlt style point files.
175 if (sscanf(data,"- %f %f %f", &v[0], &v[1], &v[2]) != 3)
177 Sys_Printf("Corrupt point file, line %d\n",line);
181 while (*data && *data != '\n')
185 while (*data == '\n')
187 data++; // skip the \n
190 g_pointfile.PushPoint (v);
195 g_pointfile.GenerateDisplayList();
197 Sys_UpdateWindows (W_ALL);
200 void Pointfile_Draw( void )
202 qglCallList (g_qeglobals.d_pointfile_display_list);
205 void Pointfile_Clear (void)
207 if (!g_qeglobals.d_pointfile_display_list)
210 qglDeleteLists (g_qeglobals.d_pointfile_display_list, 1);
211 g_qeglobals.d_pointfile_display_list = 0;
212 Sys_UpdateWindows (W_ALL);
215 // CPointfile implementation for SAX speicific stuff -------------------------------
216 void CPointfile::saxStartElement (message_info_t *ctx, const xmlChar *name, const xmlChar **attrs)
218 if (strcmp ((char *)name, "polyline")==0)
221 // there's a prefs setting to avoid stopping on leak
222 if (!g_PrefsDlg.m_bLeakStop)
227 void CPointfile::saxEndElement (message_info_t *ctx, const xmlChar *name)
229 if (strcmp ((char *)name, "polyline")==0)
232 GenerateDisplayList();
233 ctx->bGeometry = false;
237 // only "point" is expected to have characters around here
238 void CPointfile::saxCharacters (message_info_t *ctx, const xmlChar *ch, int len)
242 sscanf ((char *)ch, "%f %f %f\n", &v[0], &v[1], &v[2]);
246 char * CPointfile::getName()
248 return "Map is leaked";