]> de.git.xonotic.org Git - voretournament/voretournament.git/blobdiff - misc/mediasource/netradiant-src/contrib/bobtoolz/DTreePlanter.h
Move the netradiant and fteqcc sources
[voretournament/voretournament.git] / misc / mediasource / netradiant-src / contrib / bobtoolz / DTreePlanter.h
diff --git a/misc/mediasource/netradiant-src/contrib/bobtoolz/DTreePlanter.h b/misc/mediasource/netradiant-src/contrib/bobtoolz/DTreePlanter.h
new file mode 100644 (file)
index 0000000..fec8910
--- /dev/null
@@ -0,0 +1,211 @@
+/*
+BobToolz plugin for GtkRadiant
+Copyright (C) 2001 Gordon Biggans
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+#ifndef __DTREE_H__
+#define __DTREE_H__
+
+#include "qerplugin.h"
+#include "signal/isignal.h"
+#include "string/string.h"
+
+#include "DEntity.h"
+#include "ScriptParser.h"
+#include "mathlib.h"
+#include "misc.h"
+
+#define MAX_QPATH 64
+
+typedef struct treeModel_s {
+       char name[MAX_QPATH];
+} treeModel_t;
+
+#define MAX_TP_MODELS 256
+
+class DTreePlanter {
+  MouseEventHandlerId m_mouseDown;
+  SignalHandlerId m_destroyed;
+public:
+       SignalHandlerResult mouseDown(const WindowVector& position, ButtonIdentifier button, ModifierFlags modifiers);
+  typedef Member3<DTreePlanter, const WindowVector&, ButtonIdentifier, ModifierFlags, SignalHandlerResult, &DTreePlanter::mouseDown> MouseDownCaller;
+       void destroyed()
+  {
+    m_mouseDown = MouseEventHandlerId();
+    m_destroyed = SignalHandlerId();
+  }
+  typedef Member<DTreePlanter, void, &DTreePlanter::destroyed> DestroyedCaller;
+
+  DTreePlanter() {
+               m_numModels =   0;
+               m_offset =              0;
+               m_maxPitch =    0;
+               m_minPitch =    0;
+               m_maxYaw =              0;
+               m_minYaw =              0;
+               m_setAngles =   false;
+               m_useScale =    false;
+               m_autoLink =    false;
+               m_linkNum =             0;
+
+               m_world.LoadSelectedBrushes();
+
+               char buffer[256];
+               GetFilename( buffer, "bt/tp_ent.txt" );
+
+               FILE* file = fopen( buffer, "rb" );
+               if(file) {
+                       fseek( file, 0, SEEK_END );
+                       int len = ftell( file );
+                       fseek( file, 0, SEEK_SET );
+
+                       if(len) {
+                               char* buf = new char[len+1];
+                               buf[len] = '\0';
+                               // parser will do the cleanup, dont delete.
+
+                               fread( buf, len, 1, file );
+
+                               CScriptParser parser;
+                               parser.SetScript( buf );
+
+                               ReadConfig( &parser );
+                       }
+
+                       fclose( file );
+               }
+
+    m_mouseDown = GlobalRadiant().XYWindowMouseDown_connect(makeSignalHandler3(MouseDownCaller(), *this));
+    m_destroyed = GlobalRadiant().XYWindowDestroyed_connect(makeSignalHandler(DestroyedCaller(), *this));
+       }
+
+  virtual ~DTreePlanter()
+  {
+    if(!m_mouseDown.isNull())
+    {
+      GlobalRadiant().XYWindowMouseDown_disconnect(m_mouseDown);
+    }
+    if(!m_destroyed.isNull())
+    {
+      GlobalRadiant().XYWindowDestroyed_disconnect(m_destroyed);
+    }
+  }
+
+#define MT(t)  string_equal_nocase( pToken, t )
+#define GT             pToken = pScriptParser->GetToken( true )
+#define CT             if(!*pToken) { return; }
+
+       void ReadConfig( CScriptParser* pScriptParser ) {
+               const char* GT;
+               CT;
+
+               do {
+                       GT;
+                       if(*pToken == '}') {
+                               break;
+                       }
+
+                       if(MT("model")) {
+                               if(m_numModels >= MAX_TP_MODELS) {
+                                       return;
+                               }
+
+                               GT; CT;
+
+                               strncpy( m_trees[m_numModels++].name, pToken, MAX_QPATH );
+                       } else if(MT("link")) {
+                               GT; CT;
+
+                               strncpy( m_linkName, pToken, MAX_QPATH );
+
+                               m_autoLink = true;
+                       } else if(MT("entity")) {
+                               GT; CT;
+
+                               strncpy( m_entType, pToken, MAX_QPATH );
+                       } else if(MT("offset")) {
+                               GT; CT;
+
+                               m_offset = atoi(pToken);
+                       } else if(MT("pitch")) {
+                               GT; CT;
+
+                               m_minPitch = atoi(pToken);
+
+                               GT; CT;
+
+                               m_maxPitch = atoi(pToken);
+
+                               m_setAngles = true;
+                       } else if(MT("yaw")) {
+                               GT; CT;
+
+                               m_minYaw = atoi(pToken);
+
+                               GT; CT;
+
+                               m_maxYaw = atoi(pToken);
+
+                               m_setAngles = true;
+                       } else if(MT("scale")) {
+                               GT; CT;
+
+                               m_minScale = static_cast<float>(atof(pToken));
+
+                               GT; CT;
+
+                               m_maxScale = static_cast<float>(atof(pToken));
+
+                               m_useScale = true;
+                       } else if(MT("numlinks")) {
+                               GT; CT;
+
+                               m_linkNum = atoi( pToken );
+                       }
+               } while( true );
+       }
+
+       bool FindDropPoint(vec3_t in, vec3_t out);
+       void DropEntsToGround( void );
+       void MakeChain( int linkNum, const char* linkName );
+       void SelectChain( void );
+
+private:
+       DEntity                 m_world;
+
+       treeModel_t             m_trees[MAX_TP_MODELS];
+
+       int                             m_numModels;
+       int                             m_offset;
+       int                             m_maxPitch;
+       int                             m_minPitch;
+       int                             m_maxYaw;
+       int                             m_minYaw;
+
+       char                    m_entType[MAX_QPATH];
+       char                    m_linkName[MAX_QPATH];
+       int                             m_linkNum;
+
+       float                   m_minScale;
+       float                   m_maxScale;
+
+       bool                    m_useScale;
+       bool                    m_setAngles;
+       bool                    m_autoLink;
+};
+
+#endif