summaryrefslogtreecommitdiff
path: root/src/game/bg_slidemove.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/bg_slidemove.c')
-rw-r--r--src/game/bg_slidemove.c408
1 files changed, 0 insertions, 408 deletions
diff --git a/src/game/bg_slidemove.c b/src/game/bg_slidemove.c
deleted file mode 100644
index 47f1ec04..00000000
--- a/src/game/bg_slidemove.c
+++ /dev/null
@@ -1,408 +0,0 @@
-// Copyright (C) 1999-2000 Id Software, Inc.
-//
-// bg_slidemove.c -- part of bg_pmove functionality
-
-/*
- * Portions Copyright (C) 2000-2001 Tim Angus
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the OSML - Open Source Modification License v1.0 as
- * described in the file COPYING which is distributed with this source
- * code.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#include "q_shared.h"
-#include "bg_public.h"
-#include "bg_local.h"
-
-/*
-
-input: origin, velocity, bounds, groundPlane, trace function
-
-output: origin, velocity, impacts, stairup boolean
-
-*/
-
-/*
-==================
-PM_SlideMove
-
-Returns qtrue if the velocity was clipped in some way
-==================
-*/
-#define MAX_CLIP_PLANES 5
-qboolean PM_SlideMove( qboolean gravity )
-{
- int bumpcount, numbumps;
- vec3_t dir;
- float d;
- int numplanes;
- vec3_t planes[MAX_CLIP_PLANES];
- vec3_t primal_velocity;
- vec3_t clipVelocity;
- int i, j, k;
- trace_t trace;
- vec3_t end;
- float time_left;
- float into;
- vec3_t endVelocity;
- vec3_t endClipVelocity;
-
- numbumps = 4;
-
- VectorCopy( pm->ps->velocity, primal_velocity );
-
- if( gravity )
- {
- VectorCopy( pm->ps->velocity, endVelocity );
- endVelocity[ 2 ] -= pm->ps->gravity * pml.frametime;
- pm->ps->velocity[ 2 ] = ( pm->ps->velocity[ 2 ] + endVelocity[ 2 ] ) * 0.5;
- primal_velocity[ 2 ] = endVelocity[ 2 ];
-
- if( pml.groundPlane )
- {
- // slide along the ground plane
- PM_ClipVelocity( pm->ps->velocity, pml.groundTrace.plane.normal,
- pm->ps->velocity, OVERCLIP );
- }
- }
-
- time_left = pml.frametime;
-
- // never turn against the ground plane
- if( pml.groundPlane )
- {
- numplanes = 1;
- VectorCopy( pml.groundTrace.plane.normal, planes[ 0 ] );
- }
- else
- numplanes = 0;
-
- // never turn against original velocity
- VectorNormalize2( pm->ps->velocity, planes[ numplanes ] );
- numplanes++;
-
- for( bumpcount = 0; bumpcount < numbumps; bumpcount++ )
- {
- // calculate position we are trying to move to
- VectorMA( pm->ps->origin, time_left, pm->ps->velocity, end );
-
- // see if we can make it there
- pm->trace( &trace, pm->ps->origin, pm->mins, pm->maxs, end, pm->ps->clientNum, pm->tracemask );
-
- if( trace.allsolid )
- {
- // entity is completely trapped in another solid
- pm->ps->velocity[ 2 ] = 0; // don't build up falling damage, but allow sideways acceleration
- return qtrue;
- }
-
- if( trace.fraction > 0 )
- {
- // actually covered some distance
- VectorCopy( trace.endpos, pm->ps->origin );
- }
-
- if( trace.fraction == 1 )
- break; // moved the entire distance
-
- // save entity for contact
- PM_AddTouchEnt( trace.entityNum );
-
- time_left -= time_left * trace.fraction;
-
- if( numplanes >= MAX_CLIP_PLANES )
- {
- // this shouldn't really happen
- VectorClear( pm->ps->velocity );
- return qtrue;
- }
-
- //
- // if this is the same plane we hit before, nudge velocity
- // out along it, which fixes some epsilon issues with
- // non-axial planes
- //
- for( i = 0 ; i < numplanes ; i++ )
- {
- if( DotProduct( trace.plane.normal, planes[i] ) > 0.99 )
- {
- VectorAdd( trace.plane.normal, pm->ps->velocity, pm->ps->velocity );
- break;
- }
- }
-
- if( i < numplanes )
- continue;
-
- VectorCopy( trace.plane.normal, planes[ numplanes ] );
- numplanes++;
-
- //
- // modify velocity so it parallels all of the clip planes
- //
-
- // find a plane that it enters
- for( i = 0; i < numplanes; i++ )
- {
- into = DotProduct( pm->ps->velocity, planes[ i ] );
- if( into >= 0.1 )
- continue; // move doesn't interact with the plane
-
- // see how hard we are hitting things
- if( -into > pml.impactSpeed )
- pml.impactSpeed = -into;
-
- // slide along the plane
- PM_ClipVelocity( pm->ps->velocity, planes[ i ], clipVelocity, OVERCLIP );
-
- // slide along the plane
- PM_ClipVelocity( endVelocity, planes[ i ], endClipVelocity, OVERCLIP );
-
- // see if there is a second plane that the new move enters
- for( j = 0; j < numplanes; j++ )
- {
- if( j == i )
- continue;
-
- if( DotProduct( clipVelocity, planes[ j ] ) >= 0.1 )
- continue; // move doesn't interact with the plane
-
- // try clipping the move to the plane
- PM_ClipVelocity( clipVelocity, planes[ j ], clipVelocity, OVERCLIP );
- PM_ClipVelocity( endClipVelocity, planes[ j ], endClipVelocity, OVERCLIP );
-
- // see if it goes back into the first clip plane
- if( DotProduct( clipVelocity, planes[ i ] ) >= 0 )
- continue;
-
- // slide the original velocity along the crease
- CrossProduct( planes[ i ], planes[ j ], dir );
- VectorNormalize( dir );
- d = DotProduct( dir, pm->ps->velocity );
- VectorScale( dir, d, clipVelocity );
-
- CrossProduct( planes[ i ], planes[ j ], dir);
- VectorNormalize( dir );
- d = DotProduct( dir, endVelocity );
- VectorScale( dir, d, endClipVelocity );
-
- // see if there is a third plane the the new move enters
- for( k = 0; k < numplanes; k++ )
- {
- if( k == i || k == j )
- continue;
-
- if( DotProduct( clipVelocity, planes[ k ] ) >= 0.1 )
- continue; // move doesn't interact with the plane
-
- // stop dead at a tripple plane interaction
- VectorClear( pm->ps->velocity );
- return qtrue;
- }
- }
-
- // if we have fixed all interactions, try another move
- VectorCopy( clipVelocity, pm->ps->velocity );
- VectorCopy( endClipVelocity, endVelocity );
- break;
- }
- }
-
- if( gravity )
- VectorCopy( endVelocity, pm->ps->velocity );
-
- // don't change velocity if in a timer (FIXME: is this correct?)
- if( pm->ps->pm_time )
- VectorCopy( primal_velocity, pm->ps->velocity );
-
- return ( bumpcount != 0 );
-}
-
-/*
-==================
-PM_StepEvent
-==================
-*/
-void PM_StepEvent( vec3_t from, vec3_t to, vec3_t normal )
-{
- float size;
- vec3_t delta, dNormal;
-
- VectorSubtract( from, to, delta );
- VectorCopy( delta, dNormal );
- VectorNormalize( dNormal );
-
- size = DotProduct( normal, dNormal ) * VectorLength( delta );
-
- if( size > 0.0f )
- {
- if( size > 2.0f )
- {
- if( size < 7.0f )
- PM_AddEvent( EV_STEPDN_4 );
- else if( size < 11.0f )
- PM_AddEvent( EV_STEPDN_8 );
- else if( size < 15.0f )
- PM_AddEvent( EV_STEPDN_12 );
- else
- PM_AddEvent( EV_STEPDN_16 );
- }
- }
- else
- {
- size = fabs( size );
-
- if( size > 2.0f )
- {
- if( size < 7.0f )
- PM_AddEvent( EV_STEP_4 );
- else if( size < 11.0f )
- PM_AddEvent( EV_STEP_8 );
- else if( size < 15.0f )
- PM_AddEvent( EV_STEP_12 );
- else
- PM_AddEvent( EV_STEP_16 );
- }
- }
-
- if( pm->debugLevel )
- Com_Printf( "%i:stepped\n", c_pmove );
-}
-
-/*
-==================
-PM_StepSlideMove
-==================
-*/
-qboolean PM_StepSlideMove( qboolean gravity, qboolean predictive )
-{
- vec3_t start_o, start_v;
- vec3_t down_o, down_v;
- trace_t trace;
- vec3_t normal;
- vec3_t step_v, step_vNormal;
- vec3_t up, down;
- float stepSize;
- qboolean stepped = qfalse;
-
- if( pm->ps->stats[ STAT_STATE ] & SS_WALLCLIMBING )
- {
- if( pm->ps->stats[ STAT_STATE ] & SS_WALLCLIMBINGCEILING )
- VectorSet( normal, 0.0f, 0.0f, -1.0f );
- else
- VectorCopy( pm->ps->grapplePoint, normal );
- }
- else
- VectorSet( normal, 0.0f, 0.0f, 1.0f );
-
- VectorCopy( pm->ps->origin, start_o );
- VectorCopy( pm->ps->velocity, start_v );
-
- if( PM_SlideMove( gravity ) == 0 )
- {
- VectorCopy( start_o, down );
- VectorMA( down, -STEPSIZE, normal, down );
- pm->trace( &trace, start_o, pm->mins, pm->maxs, down, pm->ps->clientNum, pm->tracemask );
-
- //we can step down
- if( trace.fraction > 0.01f && trace.fraction < 1.0f &&
- !trace.allsolid && pml.groundPlane != qfalse )
- {
- if( pm->debugLevel )
- Com_Printf( "%d: step down\n", c_pmove );
-
- stepped = qtrue;
- }
- }
- else
- {
- VectorCopy( start_o, down );
- VectorMA( down, -STEPSIZE, normal, down );
- pm->trace( &trace, start_o, pm->mins, pm->maxs, down, pm->ps->clientNum, pm->tracemask );
- // never step up when you still have up velocity
- if( DotProduct( trace.plane.normal, pm->ps->velocity ) > 0.0f &&
- ( trace.fraction == 1.0f || DotProduct( trace.plane.normal, normal ) < 0.7f ) )
- {
- return stepped;
- }
-
- VectorCopy( pm->ps->origin, down_o );
- VectorCopy( pm->ps->velocity, down_v );
-
- VectorCopy( start_o, up );
- VectorMA( up, STEPSIZE, normal, up );
-
- // test the player position if they were a stepheight higher
- pm->trace( &trace, start_o, pm->mins, pm->maxs, up, pm->ps->clientNum, pm->tracemask );
- if( trace.allsolid )
- {
- if( pm->debugLevel )
- Com_Printf( "%i:bend can't step\n", c_pmove );
-
- return stepped; // can't step up
- }
-
- VectorSubtract( trace.endpos, start_o, step_v );
- VectorCopy( step_v, step_vNormal );
- VectorNormalize( step_vNormal );
-
- stepSize = DotProduct( normal, step_vNormal ) * VectorLength( step_v );
- // try slidemove from this position
- VectorCopy( trace.endpos, pm->ps->origin );
- VectorCopy( start_v, pm->ps->velocity );
-
- if( PM_SlideMove( gravity ) == 0 )
- {
- if( pm->debugLevel )
- Com_Printf( "%d: step up\n", c_pmove );
-
- stepped = qtrue;
- }
-
- // push down the final amount
- VectorCopy( pm->ps->origin, down );
- VectorMA( down, -stepSize, normal, down );
- pm->trace( &trace, pm->ps->origin, pm->mins, pm->maxs, down, pm->ps->clientNum, pm->tracemask );
-
- if( !trace.allsolid )
- VectorCopy( trace.endpos, pm->ps->origin );
-
- if( trace.fraction < 1.0f )
- PM_ClipVelocity( pm->ps->velocity, trace.plane.normal, pm->ps->velocity, OVERCLIP );
- }
-
- if( !predictive && stepped )
- PM_StepEvent( start_o, pm->ps->origin, normal );
-
- return stepped;
-}
-
-/*
-==================
-PM_PredictStepMove
-==================
-*/
-qboolean PM_PredictStepMove( void )
-{
- vec3_t velocity, origin;
- float impactSpeed;
- qboolean stepped = qfalse;
-
- VectorCopy( pm->ps->velocity, velocity );
- VectorCopy( pm->ps->origin, origin );
- impactSpeed = pml.impactSpeed;
-
- if( PM_StepSlideMove( qfalse, qtrue ) )
- stepped = qtrue;
-
- VectorCopy( velocity, pm->ps->velocity );
- VectorCopy( origin, pm->ps->origin );
- pml.impactSpeed = impactSpeed;
-
- return stepped;
-}