--- /dev/null
+/*
+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