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 //////////////////////////////////////////////////////////////////////
49 boundingShow = BOUNDS_APEX;
52 GlobalShaderCache().attachRenderable( *this );
55 DBobView::~DBobView(){
56 GlobalShaderCache().detachRenderable( *this );
66 //////////////////////////////////////////////////////////////////////
68 //////////////////////////////////////////////////////////////////////
70 void DBobView::render( RenderStateFlags state ) const {
71 glBegin( GL_LINE_STRIP );
73 for ( int i = 0; i < nPathCount; i++ )
74 glVertex3fv( path[i] );
79 const char* DBobView_state_line = "$bobtoolz/bobview/line";
80 const char* DBobView_state_box = "$bobtoolz/bobview/box";
82 void DBobView::constructShaders(){
84 GlobalOpenGLStateLibrary().getDefaultState( state );
85 state.m_state = RENDER_COLOURWRITE | RENDER_DEPTHWRITE | RENDER_BLEND | RENDER_LINESMOOTH;
86 state.m_sort = OpenGLState::eSortOpaque;
87 state.m_linewidth = 1;
88 state.m_colour[0] = 1;
89 state.m_colour[1] = 0;
90 state.m_colour[2] = 0;
91 state.m_colour[3] = 1;
92 GlobalOpenGLStateLibrary().insert( DBobView_state_line, state );
94 state.m_colour[0] = 0.25f;
95 state.m_colour[1] = 0.75f;
96 state.m_colour[2] = 0.75f;
97 state.m_colour[3] = 1;
98 GlobalOpenGLStateLibrary().insert( DBobView_state_box, state );
100 m_shader_line = GlobalShaderCache().capture( DBobView_state_line );
101 m_shader_box = GlobalShaderCache().capture( DBobView_state_box );
104 void DBobView::destroyShaders(){
105 GlobalOpenGLStateLibrary().erase( DBobView_state_line );
106 GlobalOpenGLStateLibrary().erase( DBobView_state_box );
107 GlobalShaderCache().release( DBobView_state_line );
108 GlobalShaderCache().release( DBobView_state_box );
111 Matrix4 g_transform_box1 = matrix4_translation_for_vec3( Vector3( 16.0f, 16.0f, 28.0f ) );
112 Matrix4 g_transform_box2 = matrix4_translation_for_vec3( Vector3( -16.0f, 16.0f, 28.0f ) );
113 Matrix4 g_transform_box3 = matrix4_translation_for_vec3( Vector3( 16.0f, -16.0f, -28.0f ) );
114 Matrix4 g_transform_box4 = matrix4_translation_for_vec3( Vector3( -16.0f, -16.0f, -28.0f ) );
116 void DBobView::renderSolid( Renderer& renderer, const VolumeTest& volume ) const {
121 renderer.SetState( m_shader_line, Renderer::eWireframeOnly );
122 renderer.SetState( m_shader_line, Renderer::eFullMaterials );
123 renderer.addRenderable( *this, g_matrix4_identity );
125 if ( m_bShowExtra ) {
126 renderer.SetState( m_shader_box, Renderer::eWireframeOnly );
127 renderer.SetState( m_shader_box, Renderer::eFullMaterials );
128 renderer.addRenderable( *this, g_transform_box1 );
129 renderer.addRenderable( *this, g_transform_box2 );
130 renderer.addRenderable( *this, g_transform_box3 );
131 renderer.addRenderable( *this, g_transform_box4 );
134 void DBobView::renderWireframe( Renderer& renderer, const VolumeTest& volume ) const {
135 renderSolid( renderer, volume );
138 void DBobView::SetPath( vec3_t *pPath ){
146 const float LOCAL_GRAVITY = -800.0f;
148 bool DBobView::CalculateTrajectory( vec3_t start, vec3_t apex, float multiplier, int points, float varGravity ){
149 if ( apex[2] <= start[2] ) {
153 // ----think q3a actually would allow these
154 //scrub that, coz the plugin wont :]
157 VectorSubtract( apex, start, dist );
159 vec_t speed_z = (float)sqrt( -2 * LOCAL_GRAVITY * dist[2] );
160 float flight_time = -speed_z / LOCAL_GRAVITY;
163 VectorScale( dist, 1 / flight_time, speed );
166 // Sys_Printf("Speed: (%.4f %.4f %.4f)\n", speed[0], speed[1], speed[2]);
168 vec3_t* pPath = new vec3_t[points];
170 float interval = multiplier * flight_time / points;
171 for ( int i = 0; i < points; i++ )
173 float ltime = interval * i;
175 VectorScale( speed, ltime, pPath[i] );
176 VectorAdd( pPath[i], start, pPath[i] );
178 // could do this all with vectors
179 // vGrav = {0, 0, -800.0f}
180 // VectorScale(vGrav, 0.5f*ltime*ltime, vAdd);
181 // VectorScale(speed, ltime, pPath[i]);
182 // _VectorAdd(pPath[i], start, pPath[i])
183 // _VectorAdd(pPath[i], vAdd, pPath[i])
185 pPath[i][2] = start[2] + ( speed_z * ltime ) + ( varGravity * 0.5f * ltime * ltime );
192 void DBobView::Begin( const char* trigger, const char *target, float multiplier, int points, float varGravity, bool bNoUpdate, bool bShowExtra ){
193 strcpy( entTrigger, trigger );
194 strcpy( entTarget, target );
196 fMultiplier = multiplier;
197 fVarGravity = varGravity;
199 m_bShowExtra = bShowExtra;
201 if ( !UpdatePath() ) {
202 globalErrorStream() << "Initialization Failure in DBobView::Begin";
205 globalOutputStream() << "Initialization of Path Plotter succeeded.";
208 bool DBobView::UpdatePath(){
211 if ( GetEntityCentre( entTrigger, start ) ) {
212 if ( GetEntityCentre( entTarget, apex ) ) {
213 CalculateTrajectory( start, apex, fMultiplier, nPathCount, fVarGravity );
220 void DBobView_setEntity( Entity& entity, float multiplier, int points, float varGravity, bool bNoUpdate, bool bShowExtra ){
222 trigger.LoadEPairList( &entity );
224 DEPair* trigger_ep = trigger.FindEPairByKey( "targetname" );
227 if ( !strcmp( trigger.m_Classname, "trigger_push" ) ) {
228 DEPair* target_ep = trigger.FindEPairByKey( "target" );
230 const scene::Path* entTarget = FindEntityFromTargetname( target_ep->value );
235 g_PathView = new DBobView;
237 Entity* target = Node_getEntity( entTarget->top() );
240 g_PathView->trigger = &entity;
241 entity.attach( *g_PathView );
242 g_PathView->target = target;
243 target->attach( *g_PathView );
245 g_PathView->Begin( trigger_ep->value, target_ep->value, multiplier, points, varGravity, bNoUpdate, bShowExtra );
248 globalErrorStream() << "bobToolz PathPlotter: trigger_push ARGH\n";
252 globalErrorStream() << "bobToolz PathPlotter: trigger_push target could not be found..\n";
256 globalErrorStream() << "bobToolz PathPlotter: trigger_push has no target..\n";
260 globalErrorStream() << "bobToolz PathPlotter: You must select a 'trigger_push' entity..\n";
264 globalErrorStream() << "bobToolz PathPlotter: Entity must have a targetname.\n";