]> git.xonotic.org Git - xonotic/netradiant.git/blob - contrib/bobtoolz/DTreePlanter.h
transfer from internal tree r5311 branches/1.4-gpl
[xonotic/netradiant.git] / contrib / bobtoolz / DTreePlanter.h
1 /*\r
2 BobToolz plugin for GtkRadiant\r
3 Copyright (C) 2001 Gordon Biggans\r
4 \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
9 \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
14 \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
18 */\r
19 \r
20 #ifndef __DTREE_H__\r
21 #define __DTREE_H__\r
22 \r
23 #include "../include/igl.h"\r
24 #include "DEntity.h"\r
25 #include "misc.h"\r
26 #include "ScriptParser.h"\r
27 \r
28 #define MAX_QPATH 64\r
29 \r
30 typedef struct treeModel_s {\r
31         char name[MAX_QPATH];\r
32 } treeModel_t;\r
33 \r
34 #define MAX_TP_MODELS 256\r
35 \r
36 class DTreePlanter : public IWindowListener {\r
37 public:\r
38         virtual bool OnMouseMove(guint32 nFlags, gdouble x, gdouble y);\r
39         virtual bool OnLButtonDown(guint32 nFlags, gdouble x, gdouble y);\r
40         virtual bool OnMButtonDown(guint32 nFlags, gdouble x, gdouble y);\r
41         virtual bool OnRButtonDown(guint32 nFlags, gdouble x, gdouble y);\r
42         virtual bool OnLButtonUp(guint32 nFlags, gdouble x, gdouble y);\r
43         virtual bool OnMButtonUp(guint32 nFlags, gdouble x, gdouble y);\r
44         virtual bool OnRButtonUp(guint32 nFlags, gdouble x, gdouble y);\r
45         virtual bool OnKeyPressed(char *s) { return false; }\r
46         virtual bool Paint() { return true; }\r
47         virtual void Close() { }\r
48         \r
49         DTreePlanter() {\r
50                 m_refCount =    1;\r
51                 m_hooked =              false;\r
52                 m_XYWrapper =   NULL;\r
53                 m_numModels =   0;\r
54                 m_offset =              0;\r
55                 m_maxPitch =    0;\r
56                 m_minPitch =    0;\r
57                 m_maxYaw =              0;\r
58                 m_minYaw =              0;\r
59                 m_setAngles =   false;\r
60                 m_useScale =    false;\r
61                 m_autoLink =    false;\r
62                 m_linkNum =             0;\r
63 \r
64                 Register();\r
65 \r
66                 m_world.LoadSelectedBrushes();\r
67 \r
68                 char buffer[256];\r
69                 GetFilename( buffer, "bt/tp_ent.txt" );\r
70 \r
71                 FILE* file = fopen( buffer, "rb" );\r
72                 if(file) {\r
73                         fseek( file, 0, SEEK_END );\r
74                         int len = ftell( file );\r
75                         fseek( file, 0, SEEK_SET );\r
76 \r
77                         if(len) {\r
78                                 char* buf = new char[len+1];\r
79                                 buf[len] = '\0';\r
80                                 // parser will do the cleanup, dont delete.\r
81 \r
82                                 fread( buf, len, 1, file );\r
83 \r
84                                 CScriptParser parser;\r
85                                 parser.SetScript( buf );\r
86 \r
87                                 ReadConfig( &parser );\r
88                         }\r
89 \r
90                         fclose( file );\r
91                 }\r
92         }\r
93 \r
94 #define MT(t)   !stricmp( pToken, t )\r
95 #define GT              pToken = pScriptParser->GetToken( true )\r
96 #define CT              if(!*pToken) { return; }\r
97 \r
98         void ReadConfig( CScriptParser* pScriptParser ) {\r
99                 const char* GT;\r
100                 CT;\r
101 \r
102                 do {\r
103                         GT;\r
104                         if(*pToken == '}') {\r
105                                 break;\r
106                         }\r
107 \r
108                         if(MT("model")) {\r
109                                 if(m_numModels >= MAX_TP_MODELS) {\r
110                                         return;\r
111                                 }\r
112 \r
113                                 GT; CT;\r
114 \r
115                                 strncpy( m_trees[m_numModels++].name, pToken, MAX_QPATH );\r
116                         } else if(MT("link")) {\r
117                                 GT; CT;\r
118 \r
119                                 strncpy( m_linkName, pToken, MAX_QPATH );\r
120 \r
121                                 m_autoLink = true;\r
122                         } else if(MT("entity")) {\r
123                                 GT; CT;\r
124 \r
125                                 strncpy( m_entType, pToken, MAX_QPATH );\r
126                         } else if(MT("offset")) {\r
127                                 GT; CT;\r
128 \r
129                                 m_offset = atoi(pToken);\r
130                         } else if(MT("pitch")) {\r
131                                 GT; CT;\r
132 \r
133                                 m_minPitch = atoi(pToken);\r
134 \r
135                                 GT; CT;\r
136 \r
137                                 m_maxPitch = atoi(pToken);\r
138 \r
139                                 m_setAngles = true;\r
140                         } else if(MT("yaw")) {\r
141                                 GT; CT;\r
142 \r
143                                 m_minYaw = atoi(pToken);\r
144 \r
145                                 GT; CT;\r
146 \r
147                                 m_maxYaw = atoi(pToken);\r
148 \r
149                                 m_setAngles = true;\r
150                         } else if(MT("scale")) {\r
151                                 GT; CT;\r
152 \r
153                                 m_minScale = static_cast< float >( atof( pToken ) );\r
154 \r
155                                 GT; CT;\r
156 \r
157                                 m_maxScale = static_cast< float >( atof( pToken ) );\r
158 \r
159                                 m_useScale = true;\r
160                         } else if(MT("numlinks")) {\r
161                                 GT; CT;\r
162 \r
163                                 m_linkNum = atoi( pToken );\r
164                         }\r
165                 } while( true );\r
166         }\r
167 \r
168         virtual ~DTreePlanter() {\r
169                 UnRegister();\r
170         }\r
171 \r
172         virtual void IncRef() { m_refCount++; }\r
173         virtual void DecRef() { m_refCount--; if (m_refCount <= 0) delete this; }\r
174 \r
175         void Register() {\r
176                 if(!m_hooked) {\r
177                         g_MessageTable.m_pfnHookWindow( this );\r
178                         m_XYWrapper = g_MessageTable.m_pfnGetXYWndWrapper();\r
179                         m_hooked = true;\r
180                 }\r
181         }\r
182 \r
183         void UnRegister() {\r
184                 if(m_hooked) {\r
185                         g_MessageTable.m_pfnUnHookWindow( this );\r
186                         m_XYWrapper = NULL;\r
187                         m_hooked = false;\r
188                 }\r
189         }\r
190 \r
191         bool FindDropPoint(vec3_t in, vec3_t out);\r
192         void DropEntsToGround( void );\r
193         void MakeChain( void );\r
194         void SelectChain( void );\r
195 \r
196 private:\r
197         IXYWndWrapper*  m_XYWrapper;\r
198         DEntity                 m_world;\r
199 \r
200         treeModel_t             m_trees[MAX_TP_MODELS];\r
201 \r
202         int                             m_refCount;\r
203         int                             m_numModels;\r
204         int                             m_offset;\r
205         int                             m_maxPitch;\r
206         int                             m_minPitch;\r
207         int                             m_maxYaw;\r
208         int                             m_minYaw;\r
209 \r
210         char                    m_entType[MAX_QPATH];\r
211         char                    m_linkName[MAX_QPATH];\r
212         int                             m_linkNum;\r
213 \r
214         float                   m_minScale;\r
215         float                   m_maxScale;\r
216 \r
217         bool                    m_hooked;\r
218         bool                    m_useScale;\r
219         bool                    m_setAngles;\r
220         bool                    m_autoLink;\r
221 };\r
222 \r
223 #endif\r