2 BobToolz plugin for GtkRadiant
\r
3 Copyright (C) 2001 Gordon Biggans
\r
5 This library is free software; you can redistribute it and/or
\r
6 modify it under the terms of the GNU Lesser General Public
\r
7 License as published by the Free Software Foundation; either
\r
8 version 2.1 of the License, or (at your option) any later version.
\r
10 This library is distributed in the hope that it will be useful,
\r
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
\r
13 Lesser General Public License for more details.
\r
15 You should have received a copy of the GNU Lesser General Public
\r
16 License along with this library; if not, write to the Free Software
\r
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\r
23 #include "DTrainDrawer.h"
\r
27 #include "funchandlers.h"
\r
29 #include "dialogs/dialogs-gtk.h"
\r
31 DTrainDrawer::DTrainDrawer() {
\r
39 DTrainDrawer::~DTrainDrawer(void) {
\r
47 void DTrainDrawer::ClearSplines() {
\r
48 for(list<splinePoint_t *>::const_iterator deadSpline = m_splineList.begin(); deadSpline != m_splineList.end(); deadSpline++) {
\r
49 (*deadSpline)->m_pointList.clear();
\r
50 (*deadSpline)->m_vertexList.clear();
\r
51 delete (*deadSpline);
\r
54 m_splineList.clear();
\r
57 void DTrainDrawer::ClearPoints() {
\r
58 for(list<controlPoint_t *>::const_iterator deadPoint = m_pointList.begin(); deadPoint != m_pointList.end(); deadPoint++) {
\r
62 m_pointList.clear();
\r
65 void DTrainDrawer::Register() {
\r
66 g_QglTable.m_pfnHookGL2DWindow( this );
\r
67 g_QglTable.m_pfnHookGL3DWindow( this );
\r
71 void DTrainDrawer::UnRegister() {
\r
72 g_QglTable.m_pfnUnHookGL2DWindow( this );
\r
73 g_QglTable.m_pfnUnHookGL3DWindow( this );
\r
77 void CalculateSpline_r(vec3_t* v, int count, vec3_t out, float tension) {
\r
85 VectorSubtract( v[1], v[0], dist );
\r
86 VectorMA(v[0], tension, dist, out);
\r
90 vec3_t* v2 = new vec3_t[count-1];
\r
92 for( int i = 0; i < count-1; i++ ) {
\r
93 VectorSubtract( v[i+1], v[i], dist );
\r
94 VectorMA(v[i], tension, dist, v2[i]);
\r
97 CalculateSpline_r( v2, count-1, out, tension);
\r
102 void DTrainDrawer::Draw3D() {
\r
108 g_QglTable.m_pfn_qglPushAttrib(GL_ALL_ATTRIB_BITS);
\r
110 g_QglTable.m_pfn_qglDisable(GL_BLEND);
\r
111 g_QglTable.m_pfn_qglDisable(GL_LINE_SMOOTH);
\r
113 g_QglTable.m_pfn_qglPushMatrix();
\r
115 g_QglTable.m_pfn_qglLineWidth(2.0f);
\r
116 g_QglTable.m_pfn_qglColor4f(1.0f, 1.0f, 1.0f, 1.0f);
\r
118 g_QglTable.m_pfn_qglEnable(GL_BLEND);
\r
119 g_QglTable.m_pfn_qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
\r
120 g_QglTable.m_pfn_qglDisable(GL_POLYGON_SMOOTH);
\r
122 g_QglTable.m_pfn_qglDepthFunc(GL_ALWAYS);
\r
124 for(list<splinePoint_t* >::const_iterator sp = m_splineList.begin(); sp != m_splineList.end(); sp++) {
\r
125 splinePoint_t* pSP = (*sp);
\r
127 g_QglTable.m_pfn_qglBegin(GL_LINE_STRIP);
\r
128 for(list<DPoint >::const_iterator v = pSP->m_vertexList.begin(); v != pSP->m_vertexList.end(); v++) {
\r
129 g_QglTable.m_pfn_qglVertex3fv((*v)._pnt);
\r
131 g_QglTable.m_pfn_qglEnd();
\r
135 g_QglTable.m_pfn_qglPopMatrix();
\r
136 g_QglTable.m_pfn_qglPopAttrib();
\r
139 void DTrainDrawer::Draw2D(VIEWTYPE vt) {
\r
145 g_QglTable.m_pfn_qglPushAttrib(GL_ALL_ATTRIB_BITS);
\r
147 g_QglTable.m_pfn_qglDisable(GL_BLEND);
\r
148 g_QglTable.m_pfn_qglDisable(GL_LINE_SMOOTH);
\r
150 g_QglTable.m_pfn_qglPushMatrix();
\r
157 g_QglTable.m_pfn_qglRotatef(270.0f, 1.0f, 0.0f, 0.0f);
\r
160 g_QglTable.m_pfn_qglRotatef(270.0f, 1.0f, 0.0f, 0.0f);
\r
161 g_QglTable.m_pfn_qglRotatef(270.0f, 0.0f, 0.0f, 1.0f);
\r
165 g_QglTable.m_pfn_qglLineWidth(1.0f);
\r
166 g_QglTable.m_pfn_qglColor4f(1.0f, 0.0f, 0.0f, 0.5f);
\r
168 g_QglTable.m_pfn_qglEnable(GL_BLEND);
\r
169 g_QglTable.m_pfn_qglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
\r
170 g_QglTable.m_pfn_qglDisable(GL_POLYGON_SMOOTH);
\r
172 g_QglTable.m_pfn_qglDepthFunc(GL_ALWAYS);
\r
174 g_QglTable.m_pfn_qglColor4f(1.f, 0.f, 0.f, 1.f);
\r
176 for(list<splinePoint_t* >::const_iterator sp = m_splineList.begin(); sp != m_splineList.end(); sp++) {
\r
177 splinePoint_t* pSP = (*sp);
\r
179 g_QglTable.m_pfn_qglBegin(GL_LINE_STRIP);
\r
180 for(list<DPoint >::const_iterator v = pSP->m_vertexList.begin(); v != pSP->m_vertexList.end(); v++) {
\r
181 g_QglTable.m_pfn_qglVertex3fv((*v)._pnt);
\r
183 g_QglTable.m_pfn_qglEnd();
\r
187 g_QglTable.m_pfn_qglPopMatrix();
\r
188 g_QglTable.m_pfn_qglPopAttrib();
\r
191 void AddSplineControl(const char* control, splinePoint_t* pSP) {
\r
193 strncpy(cp.strName, control, 64);
\r
195 pSP->m_pointList.push_front(cp);
\r
198 void DTrainDrawer::BuildPaths() {
\r
199 int count = g_FuncTable.m_pfnGetEntityCount();
\r
203 for(int i = 0; i < count; i++) {
\r
204 entity_s* ent = (entity_s*)g_FuncTable.m_pfnGetEntityHandle(i);
\r
206 e.LoadEPairList(*g_EntityTable.m_pfnGetEntityKeyValList(ent));
\r
208 const char* classname = e.m_Classname.GetBuffer();
\r
209 const char* target;
\r
210 const char* control;
\r
211 const char* targetname;
\r
214 e.SpawnString("targetname", NULL, &targetname);
\r
215 e.SpawnVector("origin", "0 0 0", vOrigin);
\r
217 if(!strcmp(classname, "info_train_spline_main")) {
\r
219 Sys_Printf( "info_train_spline_main with no targetname" );
\r
223 e.SpawnString("target", NULL, &target);
\r
226 AddControlPoint( targetname, vOrigin );
\r
228 splinePoint_t* pSP = AddSplinePoint( targetname, target, vOrigin );
\r
230 e.SpawnString("control", NULL, &control);
\r
233 AddSplineControl( control, pSP );
\r
235 for(int j = 2;; j++) {
\r
237 sprintf(buffer, "control%i", j);
\r
239 e.SpawnString(buffer, NULL, &control);
\r
244 AddSplineControl( control, pSP );
\r
248 } else if(!strcmp(classname, "info_train_spline_control")) {
\r
250 Sys_Printf( "info_train_spline_control with no targetname" );
\r
254 AddControlPoint( targetname, vOrigin );
\r
258 list<splinePoint_t* >::const_iterator sp;
\r
259 for(sp = m_splineList.begin(); sp != m_splineList.end(); sp++) {
\r
260 splinePoint_t* pSP = (*sp);
\r
262 controlPoint_t* pTarget = FindControlPoint( pSP->strTarget );
\r
265 Sys_Printf( "couldn't find target %s", pSP->strTarget );
\r
270 pSP->pTarget = pTarget;
\r
273 for(list<controlPoint_t >::iterator cp = pSP->m_pointList.begin(); cp != pSP->m_pointList.end(); cp++) {
\r
274 controlPoint_t* pControl = FindControlPoint( (*cp).strName );
\r
276 Sys_Printf( "couldn't find control %s", (*cp).strName );
\r
280 VectorCopy(pControl->vOrigin, (*cp).vOrigin);
\r
287 for(sp = m_splineList.begin(); sp != m_splineList.end(); sp++) {
\r
288 splinePoint_t* pSP = (*sp);
\r
291 if(!pSP->pTarget) {
\r
295 int count = pSP->m_pointList.size() + 2;
\r
296 vec3_t* v = new vec3_t[count];
\r
298 VectorCopy(pSP->point.vOrigin, v[0]);
\r
301 for(list<controlPoint_t>::reverse_iterator cp = pSP->m_pointList.rbegin(); cp != pSP->m_pointList.rend(); cp++) {
\r
302 VectorCopy((*cp).vOrigin, v[i]);
\r
305 VectorCopy(pSP->pTarget->vOrigin, v[i]);
\r
307 for (float tension = 0.0f; tension <= 1.f; tension += 0.01f) {
\r
308 CalculateSpline_r(v, count, out._pnt, tension);
\r
309 pSP->m_vertexList.push_front(out);
\r
314 VectorCopy(pSP->pTarget->vOrigin, out._pnt);
\r
315 pSP->m_vertexList.push_front(out);
\r
321 void DTrainDrawer::AddControlPoint(const char* name, vec_t* origin)
\r
323 controlPoint_t* pCP = new controlPoint_t;
\r
325 strncpy(pCP->strName, name, 64);
\r
326 VectorCopy( origin, pCP->vOrigin );
\r
328 m_pointList.push_back( pCP );
\r
331 splinePoint_t* DTrainDrawer::AddSplinePoint(const char* name, const char* target, vec_t* origin)
\r
333 splinePoint_t* pSP = new splinePoint_t;
\r
335 strncpy(pSP->point.strName, name, 64);
\r
336 strncpy(pSP->strTarget, target, 64);
\r
337 VectorCopy( origin, pSP->point.vOrigin );
\r
338 m_splineList.push_back( pSP );
\r
343 controlPoint_t* DTrainDrawer::FindControlPoint(const char* name)
\r
345 for(list<controlPoint_t*>::const_iterator cp = m_pointList.begin(); cp != m_pointList.end(); cp++) {
\r
346 if(!strcmp(name, (*cp)->strName)) {
\r
351 for(list<splinePoint_t*>::const_iterator sp = m_splineList.begin(); sp != m_splineList.end(); sp++) {
\r
352 if(!strcmp(name, (*sp)->point.strName)) {
\r
353 return &((*sp)->point);
\r