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);
68 //////////////////////////////////////////////////////////////////////
70 //////////////////////////////////////////////////////////////////////
72 void DBobView::render(RenderStateFlags state) const
74 glBegin(GL_LINE_STRIP);
76 for (int i = 0; i < nPathCount; i++)
82 const char *DBobView_state_line = "$bobtoolz/bobview/line";
83 const char *DBobView_state_box = "$bobtoolz/bobview/box";
85 void DBobView::constructShaders()
88 GlobalOpenGLStateLibrary().getDefaultState(state);
89 state.m_state = RENDER_COLOURWRITE | RENDER_DEPTHWRITE | RENDER_BLEND | RENDER_LINESMOOTH;
90 state.m_sort = OpenGLState::eSortOpaque;
91 state.m_linewidth = 1;
92 state.m_colour[0] = 1;
93 state.m_colour[1] = 0;
94 state.m_colour[2] = 0;
95 state.m_colour[3] = 1;
96 GlobalOpenGLStateLibrary().insert(DBobView_state_line, state);
98 state.m_colour[0] = 0.25f;
99 state.m_colour[1] = 0.75f;
100 state.m_colour[2] = 0.75f;
101 state.m_colour[3] = 1;
102 GlobalOpenGLStateLibrary().insert(DBobView_state_box, state);
104 m_shader_line = GlobalShaderCache().capture(DBobView_state_line);
105 m_shader_box = GlobalShaderCache().capture(DBobView_state_box);
108 void DBobView::destroyShaders()
110 GlobalOpenGLStateLibrary().erase(DBobView_state_line);
111 GlobalOpenGLStateLibrary().erase(DBobView_state_box);
112 GlobalShaderCache().release(DBobView_state_line);
113 GlobalShaderCache().release(DBobView_state_box);
116 Matrix4 g_transform_box1 = matrix4_translation_for_vec3(Vector3(16.0f, 16.0f, 28.0f));
117 Matrix4 g_transform_box2 = matrix4_translation_for_vec3(Vector3(-16.0f, 16.0f, 28.0f));
118 Matrix4 g_transform_box3 = matrix4_translation_for_vec3(Vector3(16.0f, -16.0f, -28.0f));
119 Matrix4 g_transform_box4 = matrix4_translation_for_vec3(Vector3(-16.0f, -16.0f, -28.0f));
121 void DBobView::renderSolid(Renderer &renderer, const VolumeTest &volume) const
127 renderer.SetState(m_shader_line, Renderer::eWireframeOnly);
128 renderer.SetState(m_shader_line, Renderer::eFullMaterials);
129 renderer.addRenderable(*this, g_matrix4_identity);
132 renderer.SetState(m_shader_box, Renderer::eWireframeOnly);
133 renderer.SetState(m_shader_box, Renderer::eFullMaterials);
134 renderer.addRenderable(*this, g_transform_box1);
135 renderer.addRenderable(*this, g_transform_box2);
136 renderer.addRenderable(*this, g_transform_box3);
137 renderer.addRenderable(*this, g_transform_box4);
141 void DBobView::renderWireframe(Renderer &renderer, const VolumeTest &volume) const
143 renderSolid(renderer, volume);
146 void DBobView::SetPath(vec3_t *pPath)
155 const float LOCAL_GRAVITY = -800.0f;
157 bool DBobView::CalculateTrajectory(vec3_t start, vec3_t apex, float multiplier, int points, float varGravity)
159 if (apex[2] <= start[2]) {
163 // ----think q3a actually would allow these
164 //scrub that, coz the plugin wont :]
167 VectorSubtract(apex, start, dist);
169 vec_t speed_z = (float) sqrt(-2 * LOCAL_GRAVITY * dist[2]);
170 float flight_time = -speed_z / LOCAL_GRAVITY;
173 VectorScale(dist, 1 / flight_time, speed);
176 // Sys_Printf("Speed: (%.4f %.4f %.4f)\n", speed[0], speed[1], speed[2]);
178 vec3_t *pPath = new vec3_t[points];
180 float interval = multiplier * flight_time / points;
181 for (int i = 0; i < points; i++) {
182 float ltime = interval * i;
184 VectorScale(speed, ltime, pPath[i]);
185 VectorAdd(pPath[i], start, pPath[i]);
187 // could do this all with vectors
188 // vGrav = {0, 0, -800.0f}
189 // VectorScale(vGrav, 0.5f*ltime*ltime, vAdd);
190 // VectorScale(speed, ltime, pPath[i]);
191 // _VectorAdd(pPath[i], start, pPath[i])
192 // _VectorAdd(pPath[i], vAdd, pPath[i])
194 pPath[i][2] = start[2] + (speed_z * ltime) + (varGravity * 0.5f * ltime * ltime);
202 DBobView::Begin(const char *trigger, const char *target, float multiplier, int points, float varGravity, bool bNoUpdate,
205 strcpy(entTrigger, trigger);
206 strcpy(entTarget, target);
208 fMultiplier = multiplier;
209 fVarGravity = varGravity;
211 m_bShowExtra = bShowExtra;
214 globalErrorStream() << "Initialization Failure in DBobView::Begin";
217 globalOutputStream() << "Initialization of Path Plotter succeeded.";
220 bool DBobView::UpdatePath()
224 if (GetEntityCentre(entTrigger, start)) {
225 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");
241 if (!strcmp(trigger.m_Classname, "trigger_push")) {
242 DEPair *target_ep = trigger.FindEPairByKey("target");
244 const scene::Path *entTarget = FindEntityFromTargetname(target_ep->value);
249 g_PathView = new DBobView;
251 Entity *target = Node_getEntity(entTarget->top());
254 g_PathView->trigger = &entity;
255 entity.attach(*g_PathView);
256 g_PathView->target = target;
257 target->attach(*g_PathView);
259 g_PathView->Begin(trigger_ep->value, target_ep->value, multiplier, points, varGravity,
260 bNoUpdate, bShowExtra);
262 globalErrorStream() << "bobToolz PathPlotter: trigger_push ARGH\n";
265 globalErrorStream() << "bobToolz PathPlotter: trigger_push target could not be found..\n";
268 globalErrorStream() << "bobToolz PathPlotter: trigger_push has no target..\n";
271 globalErrorStream() << "bobToolz PathPlotter: You must select a 'trigger_push' entity..\n";
274 globalErrorStream() << "bobToolz PathPlotter: Entity must have a targetname.\n";