]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - contrib/bobtoolz/DTreePlanter.cpp
transfer from internal tree r5311 branches/1.4-gpl
[xonotic/netradiant.git] / contrib / bobtoolz / DTreePlanter.cpp
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 #include "StdAfx.h"\r
21 #include "DTreePlanter.h"\r
22 #include "funchandlers.h"\r
23 \r
24 bool DTreePlanter::OnMouseMove(guint32 nFlags, gdouble x, gdouble y) {\r
25         return false;\r
26 }\r
27 \r
28 bool DTreePlanter::OnLButtonDown(guint32 nFlags, gdouble x, gdouble y) {\r
29         VIEWTYPE vt = m_XYWrapper->GetViewType();\r
30 \r
31         switch(vt) {\r
32                 case XY:\r
33                         break;\r
34                 case YZ:\r
35                 case XZ:\r
36                 default:\r
37                         return false;\r
38         }\r
39 \r
40         vec3_t pt, vhit;\r
41 \r
42         m_XYWrapper->SnapToGrid( static_cast< int >( x ), static_cast< int >( y ), pt );\r
43 \r
44         if(FindDropPoint(pt, vhit)) {\r
45                 vhit[2] += m_offset;\r
46 \r
47                 char buffer[128];\r
48                 DEntity e(m_entType);\r
49 \r
50                 sprintf(buffer, "%i %i %i", (int)vhit[0], (int)vhit[1], (int)vhit[2]);\r
51                 e.AddEPair("origin", buffer);\r
52 \r
53                 if(m_autoLink) {\r
54                         entity_t* pLastEntity = NULL;\r
55                         entity_t* pThisEntity = NULL;\r
56 \r
57                         int entNum = -1, lastEntNum = -1, entpos;\r
58                         for(int i = 0; i < 256; i++) {\r
59                                 sprintf(buffer, m_linkName, i);\r
60                                 pThisEntity = FindEntityFromTargetname( buffer, &entNum );\r
61 \r
62                                 if(pThisEntity) {\r
63                                         entpos = i;\r
64                                         lastEntNum = entNum;\r
65                                         pLastEntity = pThisEntity;\r
66                                 }\r
67                         }\r
68 \r
69                         if(!pLastEntity) {\r
70                                 sprintf(buffer, m_linkName, 0);\r
71                         } else {\r
72                                 sprintf(buffer, m_linkName, entpos + 1);\r
73                         }\r
74 \r
75                         e.AddEPair( "targetname", buffer );\r
76 \r
77                         if(pLastEntity) {\r
78                                 DEntity e2;\r
79                                 e2.LoadFromEntity(lastEntNum, TRUE);\r
80                                 e2.AddEPair("target", buffer);\r
81                                 e2.RemoveFromRadiant();\r
82                                 e2.BuildInRadiant(FALSE);\r
83                         }\r
84                 }\r
85 \r
86                 if(m_setAngles) {\r
87                         int angleYaw = (rand() % (m_maxYaw - m_minYaw + 1)) + m_minYaw;\r
88                         int anglePitch = (rand() % (m_maxPitch - m_minPitch + 1)) + m_minPitch;\r
89 \r
90                         sprintf(buffer, "%i %i 0", anglePitch, angleYaw);\r
91                         e.AddEPair("angles", buffer);\r
92                 }\r
93 \r
94                 if(m_numModels) {\r
95                         int treetype = rand() % m_numModels;\r
96                         e.AddEPair("model", m_trees[treetype].name);\r
97                 }\r
98 \r
99                 if(m_useScale) {\r
100                         float scale = (((rand()%1000)*0.001f) * (m_maxScale - m_minScale)) + m_minScale;\r
101 \r
102                         sprintf(buffer, "%f", scale );\r
103                         e.AddEPair("modelscale", buffer);\r
104                 }\r
105 \r
106                 e.BuildInRadiant( FALSE );\r
107         }\r
108 \r
109         if(m_autoLink) {\r
110                 DoTrainPathPlot();\r
111         }\r
112 \r
113         return true;\r
114 }\r
115 \r
116 bool DTreePlanter::OnLButtonUp(guint32 nFlags, gdouble x, gdouble y) {\r
117         return false;\r
118 }\r
119 \r
120 bool DTreePlanter::OnRButtonDown(guint32 nFlags, gdouble x, gdouble y) {\r
121         return false;\r
122 }\r
123 \r
124 bool DTreePlanter::OnRButtonUp(guint32 nFlags, gdouble x, gdouble y) {\r
125         return false;\r
126 }\r
127 \r
128 bool DTreePlanter::OnMButtonDown(guint32 nFlags, gdouble x, gdouble y) {\r
129         return false;\r
130 }\r
131 \r
132 bool DTreePlanter::OnMButtonUp(guint32 nFlags, gdouble x, gdouble y) {\r
133         return false;\r
134 }\r
135 \r
136 bool DTreePlanter::FindDropPoint(vec3_t in, vec3_t out) {\r
137         DPlane p1;\r
138         DPlane p2;\r
139 \r
140         vec3_t vUp =            { 0, 0, 1 };\r
141         vec3_t vForward =       { 0, 1, 0 };\r
142         vec3_t vLeft =          { 1, 0, 0 };\r
143 \r
144         in[2] = 65535;\r
145 \r
146         VectorCopy(in, p1.points[0]);\r
147         VectorCopy(in, p1.points[1]);\r
148         VectorCopy(in, p1.points[2]);\r
149         VectorMA(p1.points[1], 20, vUp,                 p1.points[1]);\r
150         VectorMA(p1.points[1], 20, vLeft,               p1.points[2]);\r
151 \r
152         VectorCopy(in, p2.points[0]);\r
153         VectorCopy(in, p2.points[1]);\r
154         VectorCopy(in, p2.points[2]);\r
155         VectorMA(p1.points[1], 20, vUp,                 p2.points[1]);\r
156         VectorMA(p1.points[1], 20, vForward,    p2.points[2]);\r
157 \r
158         p1.Rebuild();\r
159         p2.Rebuild();\r
160 \r
161         bool found = false;\r
162         vec3_t temp;\r
163         vec_t dist;\r
164         int cnt = m_world.GetIDMax();\r
165         for(int i = 0; i < cnt; i++) {\r
166                 DBrush* pBrush = m_world.GetBrushForID( i );\r
167                 \r
168                 if(pBrush->IntersectsWith( &p1, &p2, temp )) {\r
169                         vec3_t diff;\r
170                         vec_t tempdist;\r
171                         VectorSubtract(in, temp, diff);\r
172                         tempdist = VectorLength( diff );\r
173                         if(!found || (tempdist < dist)) {\r
174                                 dist = tempdist;\r
175                                 VectorCopy( temp, out );\r
176                                 found  = true;\r
177                         }\r
178                 }\r
179         }\r
180 \r
181         return found;\r
182 }\r
183 \r
184 void DTreePlanter::DropEntsToGround( void ) {\r
185         // tell Radiant we want to access the selected brushes\r
186         g_FuncTable.m_pfnAllocateSelectedBrushHandles();\r
187                         \r
188         DEntity ent;\r
189 \r
190         int cnt = g_FuncTable.m_pfnSelectedBrushCount();\r
191         for(int i = 0; i < cnt; i++) {\r
192                 brush_t *brush = (brush_t*)g_FuncTable.m_pfnGetSelectedBrushHandle(i);\r
193 \r
194                 ent.LoadFromEntity(brush->owner, TRUE);\r
195 \r
196                 DEPair* pEpair = ent.FindEPairByKey("origin");\r
197                 if(!pEpair) {\r
198                         continue;\r
199                 }\r
200 \r
201                 vec3_t vec, out;\r
202                 sscanf( pEpair->value.GetBuffer(), "%f %f %f", &vec[0], &vec[1], &vec[2]);\r
203 \r
204                 FindDropPoint( vec, out );\r
205 \r
206                 char buffer[256];\r
207                 sprintf( buffer, "%f %f %f", out[0], out[1], out[2] );\r
208                 ent.AddEPair( "origin", buffer );\r
209                 ent.RemoveFromRadiant();\r
210                 ent.BuildInRadiant(FALSE);\r
211         }\r
212 \r
213         g_FuncTable.m_pfnReleaseSelectedBrushHandles();\r
214 }\r
215 \r
216 void DTreePlanter::MakeChain( void ) {\r
217         char buffer[256];\r
218         int i;\r
219 \r
220         for(i = 0; i < m_linkNum; i++) {\r
221                 DEntity e("info_train_spline_main");\r
222 \r
223                 sprintf( buffer, "%s_pt%i", m_linkName, i );\r
224                 e.AddEPair( "targetname", buffer );\r
225 \r
226                 sprintf( buffer, "0 %i 0", i * 64 );\r
227                 e.AddEPair( "origin", buffer );\r
228 \r
229                 if(i != m_linkNum-1) {\r
230                         sprintf( buffer, "%s_pt%i", m_linkName, i+1 );\r
231                         e.AddEPair( "target", buffer );\r
232 \r
233                         sprintf( buffer, "%s_ctl%i", m_linkName, i );\r
234                         e.AddEPair( "control", buffer );\r
235                 }\r
236 \r
237                 e.BuildInRadiant( FALSE );\r
238         }\r
239 \r
240         for(i = 0; i < m_linkNum-1; i++) {\r
241                 DEntity e("info_train_spline_control");\r
242 \r
243                 sprintf( buffer, "%s_ctl%i", m_linkName, i );\r
244                 e.AddEPair( "targetname", buffer );\r
245 \r
246                 sprintf( buffer, "0 %i 0", (i * 64) + 32);\r
247                 e.AddEPair( "origin", buffer );\r
248 \r
249                 e.BuildInRadiant( FALSE );\r
250         }\r
251 }\r
252 \r
253 void DTreePlanter::SelectChain( void ) {\r
254 /*      char buffer[256];\r
255         \r
256         for(int i = 0; i < m_linkNum; i++) {\r
257                 DEntity e("info_train_spline_main");\r
258 \r
259                 sprintf( buffer, "%s_pt%i", m_linkName, i );\r
260                 e.AddEPair( "targetname", buffer );\r
261 \r
262                 sprintf( buffer, "0 %i 0", i * 64 );\r
263                 e.AddEPair( "origin", buffer );\r
264 \r
265                 if(i != m_linkNum-1) {\r
266                         sprintf( buffer, "%s_pt%i", m_linkName, i+1 );\r
267                         e.AddEPair( "target", buffer );\r
268 \r
269                         sprintf( buffer, "%s_ctl%i", m_linkName, i );\r
270                         e.AddEPair( "control", buffer );\r
271                 }\r
272 \r
273                 e.BuildInRadiant( FALSE );\r
274         }\r
275 \r
276         for(int i = 0; i < m_linkNum-1; i++) {\r
277                 DEntity e("info_train_spline_control");\r
278 \r
279                 sprintf( buffer, "%s_ctl%i", m_linkName, i );\r
280                 e.AddEPair( "targetname", buffer );\r
281 \r
282                 sprintf( buffer, "0 %i 0", (i * 64) + 32);\r
283                 e.AddEPair( "origin", buffer );\r
284 \r
285                 e.BuildInRadiant( FALSE );\r
286         }*/\r
287 }\r