2 BobToolz plugin for GtkRadiant
3 Copyright (C) 2001 Gordon Biggans
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public
16 License along with this library; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // BobView.cpp: implementation of the DBobView class.
22 //////////////////////////////////////////////////////////////////////
26 #include "funchandlers.h"
30 #include "iglrender.h"
31 #include "qerplugin.h"
33 #include "math/matrix.h"
38 #include "dialogs/dialogs-gtk.h"
40 //////////////////////////////////////////////////////////////////////
41 // Construction/Destruction
42 //////////////////////////////////////////////////////////////////////
50 boundingShow = BOUNDS_APEX;
53 GlobalShaderCache().attachRenderable(*this);
58 GlobalShaderCache().detachRenderable(*this);
67 //////////////////////////////////////////////////////////////////////
69 //////////////////////////////////////////////////////////////////////
71 void DBobView::render(RenderStateFlags state) const
73 glBegin(GL_LINE_STRIP);
75 for(int i = 0; i < nPathCount; i++)
81 const char* DBobView_state_line = "$bobtoolz/bobview/line";
82 const char* DBobView_state_box = "$bobtoolz/bobview/box";
84 void DBobView::constructShaders()
87 GlobalOpenGLStateLibrary().getDefaultState(state);
88 state.m_state = RENDER_COLOURWRITE|RENDER_DEPTHWRITE|RENDER_BLEND|RENDER_LINESMOOTH;
89 state.m_sort = OpenGLState::eSortOpaque;
90 state.m_linewidth = 1;
91 state.m_colour[0] = 1;
92 state.m_colour[1] = 0;
93 state.m_colour[2] = 0;
94 state.m_colour[3] = 1;
95 GlobalOpenGLStateLibrary().insert(DBobView_state_line, state);
97 state.m_colour[0] = 0.25f;
98 state.m_colour[1] = 0.75f;
99 state.m_colour[2] = 0.75f;
100 state.m_colour[3] = 1;
101 GlobalOpenGLStateLibrary().insert(DBobView_state_box, state);
103 m_shader_line = GlobalShaderCache().capture(DBobView_state_line);
104 m_shader_box = GlobalShaderCache().capture(DBobView_state_box);
107 void DBobView::destroyShaders()
109 GlobalOpenGLStateLibrary().erase(DBobView_state_line);
110 GlobalOpenGLStateLibrary().erase(DBobView_state_box);
111 GlobalShaderCache().release(DBobView_state_line);
112 GlobalShaderCache().release(DBobView_state_box);
115 Matrix4 g_transform_box1 = matrix4_translation_for_vec3(Vector3(16.0f, 16.0f, 28.0f));
116 Matrix4 g_transform_box2 = matrix4_translation_for_vec3(Vector3(-16.0f, 16.0f, 28.0f));
117 Matrix4 g_transform_box3 = matrix4_translation_for_vec3(Vector3(16.0f, -16.0f, -28.0f));
118 Matrix4 g_transform_box4 = matrix4_translation_for_vec3(Vector3(-16.0f, -16.0f, -28.0f));
120 void DBobView::renderSolid(Renderer& renderer, const VolumeTest& volume) const
125 renderer.SetState(m_shader_line, Renderer::eWireframeOnly);
126 renderer.SetState(m_shader_line, Renderer::eFullMaterials);
127 renderer.addRenderable(*this, g_matrix4_identity);
131 renderer.SetState(m_shader_box, Renderer::eWireframeOnly);
132 renderer.SetState(m_shader_box, Renderer::eFullMaterials);
133 renderer.addRenderable(*this, g_transform_box1);
134 renderer.addRenderable(*this, g_transform_box2);
135 renderer.addRenderable(*this, g_transform_box3);
136 renderer.addRenderable(*this, g_transform_box4);
139 void DBobView::renderWireframe(Renderer& renderer, const VolumeTest& volume) const
141 renderSolid(renderer, volume);
144 void DBobView::SetPath(vec3_t *pPath)
152 #define LOCAL_GRAVITY -800.0f
154 bool DBobView::CalculateTrajectory(vec3_t start, vec3_t apex, float multiplier, int points, float varGravity)
156 if(apex[2] <= start[2])
161 // ----think q3a actually would allow these
162 //scrub that, coz the plugin wont :]
165 VectorSubtract(apex, start, dist);
167 vec_t speed_z = (float)sqrt(-2*LOCAL_GRAVITY*dist[2]);
168 float flight_time = -speed_z/LOCAL_GRAVITY;
171 VectorScale(dist, 1/flight_time, speed);
174 // Sys_Printf("Speed: (%.4f %.4f %.4f)\n", speed[0], speed[1], speed[2]);
176 vec3_t* pPath = new vec3_t[points];
178 float interval = multiplier*flight_time/points;
179 for(int i = 0; i < points; i++)
181 float ltime = interval*i;
183 VectorScale(speed, ltime, pPath[i]);
184 VectorAdd(pPath[i], start, pPath[i]);
186 // could do this all with vectors
187 // vGrav = {0, 0, -800.0f}
188 // VectorScale(vGrav, 0.5f*ltime*ltime, vAdd);
189 // VectorScale(speed, ltime, pPath[i]);
190 // _VectorAdd(pPath[i], start, pPath[i])
191 // _VectorAdd(pPath[i], vAdd, pPath[i])
193 pPath[i][2] = start[2] + (speed_z*ltime) + (varGravity*0.5f*ltime*ltime);
200 void DBobView::Begin(const char* trigger, const char *target, float multiplier, int points, float varGravity, bool bNoUpdate, bool bShowExtra)
202 strcpy(entTrigger, trigger);
203 strcpy(entTarget, target);
205 fMultiplier = multiplier;
206 fVarGravity = varGravity;
208 m_bShowExtra = bShowExtra;
212 globalErrorStream() << "Initialization Failure in DBobView::Begin";
215 globalOutputStream() << "Initialization of Path Plotter succeeded.";
218 bool DBobView::UpdatePath()
222 if(GetEntityCentre(entTrigger, start))
224 if(GetEntityCentre(entTarget, apex))
226 CalculateTrajectory(start, apex, fMultiplier, nPathCount, fVarGravity);
233 void DBobView_setEntity(Entity& entity, float multiplier, int points, float varGravity, bool bNoUpdate, bool bShowExtra)
236 trigger.LoadEPairList(&entity);
238 DEPair* trigger_ep = trigger.FindEPairByKey("targetname");
242 if(!strcmp(trigger.m_Classname, "trigger_push"))
244 DEPair* target_ep = trigger.FindEPairByKey("target");
247 const scene::Path* entTarget = FindEntityFromTargetname(target_ep->value);
252 g_PathView = new DBobView;
254 Entity* target = Node_getEntity(entTarget->top());
259 g_PathView->trigger = &entity;
260 entity.attach(*g_PathView);
261 g_PathView->target = target;
262 target->attach(*g_PathView);
264 g_PathView->Begin(trigger_ep->value, target_ep->value, multiplier, points, varGravity, bNoUpdate, bShowExtra);
267 globalErrorStream() << "bobToolz PathPlotter: trigger_push ARGH\n";
270 globalErrorStream() << "bobToolz PathPlotter: trigger_push target could not be found..\n";
273 globalErrorStream() << "bobToolz PathPlotter: trigger_push has no target..\n";
276 globalErrorStream() << "bobToolz PathPlotter: You must select a 'trigger_push' entity..\n";
279 globalErrorStream() << "bobToolz PathPlotter: Entity must have a targetname.\n";