2 BobToolz plugin for GtkRadiant
\r
3 Copyright (C) 2001 Gordon Biggans
\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
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
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
21 #include "DTreePlanter.h"
\r
22 #include "funchandlers.h"
\r
24 bool DTreePlanter::OnMouseMove(guint32 nFlags, gdouble x, gdouble y) {
\r
28 bool DTreePlanter::OnLButtonDown(guint32 nFlags, gdouble x, gdouble y) {
\r
29 VIEWTYPE vt = m_XYWrapper->GetViewType();
\r
42 m_XYWrapper->SnapToGrid( static_cast< int >( x ), static_cast< int >( y ), pt );
\r
44 if(FindDropPoint(pt, vhit)) {
\r
45 vhit[2] += m_offset;
\r
48 DEntity e(m_entType);
\r
50 sprintf(buffer, "%i %i %i", (int)vhit[0], (int)vhit[1], (int)vhit[2]);
\r
51 e.AddEPair("origin", buffer);
\r
54 entity_t* pLastEntity = NULL;
\r
55 entity_t* pThisEntity = NULL;
\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
64 lastEntNum = entNum;
\r
65 pLastEntity = pThisEntity;
\r
70 sprintf(buffer, m_linkName, 0);
\r
72 sprintf(buffer, m_linkName, entpos + 1);
\r
75 e.AddEPair( "targetname", buffer );
\r
79 e2.LoadFromEntity(lastEntNum, TRUE);
\r
80 e2.AddEPair("target", buffer);
\r
81 e2.RemoveFromRadiant();
\r
82 e2.BuildInRadiant(FALSE);
\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
90 sprintf(buffer, "%i %i 0", anglePitch, angleYaw);
\r
91 e.AddEPair("angles", buffer);
\r
95 int treetype = rand() % m_numModels;
\r
96 e.AddEPair("model", m_trees[treetype].name);
\r
100 float scale = (((rand()%1000)*0.001f) * (m_maxScale - m_minScale)) + m_minScale;
\r
102 sprintf(buffer, "%f", scale );
\r
103 e.AddEPair("modelscale", buffer);
\r
106 e.BuildInRadiant( FALSE );
\r
116 bool DTreePlanter::OnLButtonUp(guint32 nFlags, gdouble x, gdouble y) {
\r
120 bool DTreePlanter::OnRButtonDown(guint32 nFlags, gdouble x, gdouble y) {
\r
124 bool DTreePlanter::OnRButtonUp(guint32 nFlags, gdouble x, gdouble y) {
\r
128 bool DTreePlanter::OnMButtonDown(guint32 nFlags, gdouble x, gdouble y) {
\r
132 bool DTreePlanter::OnMButtonUp(guint32 nFlags, gdouble x, gdouble y) {
\r
136 bool DTreePlanter::FindDropPoint(vec3_t in, vec3_t out) {
\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
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
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
161 bool found = false;
\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
168 if(pBrush->IntersectsWith( &p1, &p2, temp )) {
\r
171 VectorSubtract(in, temp, diff);
\r
172 tempdist = VectorLength( diff );
\r
173 if(!found || (tempdist < dist)) {
\r
175 VectorCopy( temp, out );
\r
184 void DTreePlanter::DropEntsToGround( void ) {
\r
185 // tell Radiant we want to access the selected brushes
\r
186 g_FuncTable.m_pfnAllocateSelectedBrushHandles();
\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
194 ent.LoadFromEntity(brush->owner, TRUE);
\r
196 DEPair* pEpair = ent.FindEPairByKey("origin");
\r
202 sscanf( pEpair->value.GetBuffer(), "%f %f %f", &vec[0], &vec[1], &vec[2]);
\r
204 FindDropPoint( vec, out );
\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
213 g_FuncTable.m_pfnReleaseSelectedBrushHandles();
\r
216 void DTreePlanter::MakeChain( void ) {
\r
220 for(i = 0; i < m_linkNum; i++) {
\r
221 DEntity e("info_train_spline_main");
\r
223 sprintf( buffer, "%s_pt%i", m_linkName, i );
\r
224 e.AddEPair( "targetname", buffer );
\r
226 sprintf( buffer, "0 %i 0", i * 64 );
\r
227 e.AddEPair( "origin", buffer );
\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
233 sprintf( buffer, "%s_ctl%i", m_linkName, i );
\r
234 e.AddEPair( "control", buffer );
\r
237 e.BuildInRadiant( FALSE );
\r
240 for(i = 0; i < m_linkNum-1; i++) {
\r
241 DEntity e("info_train_spline_control");
\r
243 sprintf( buffer, "%s_ctl%i", m_linkName, i );
\r
244 e.AddEPair( "targetname", buffer );
\r
246 sprintf( buffer, "0 %i 0", (i * 64) + 32);
\r
247 e.AddEPair( "origin", buffer );
\r
249 e.BuildInRadiant( FALSE );
\r
253 void DTreePlanter::SelectChain( void ) {
\r
254 /* char buffer[256];
\r
256 for(int i = 0; i < m_linkNum; i++) {
\r
257 DEntity e("info_train_spline_main");
\r
259 sprintf( buffer, "%s_pt%i", m_linkName, i );
\r
260 e.AddEPair( "targetname", buffer );
\r
262 sprintf( buffer, "0 %i 0", i * 64 );
\r
263 e.AddEPair( "origin", buffer );
\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
269 sprintf( buffer, "%s_ctl%i", m_linkName, i );
\r
270 e.AddEPair( "control", buffer );
\r
273 e.BuildInRadiant( FALSE );
\r
276 for(int i = 0; i < m_linkNum-1; i++) {
\r
277 DEntity e("info_train_spline_control");
\r
279 sprintf( buffer, "%s_ctl%i", m_linkName, i );
\r
280 e.AddEPair( "targetname", buffer );
\r
282 sprintf( buffer, "0 %i 0", (i * 64) + 32);
\r
283 e.AddEPair( "origin", buffer );
\r
285 e.BuildInRadiant( FALSE );
\r