/* 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 MouseDownCaller; void destroyed(){ m_mouseDown = MouseEventHandlerId(); m_destroyed = SignalHandlerId(); } typedef Member 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( atof( pToken ) ); GT; CT; m_maxScale = static_cast( 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