本文整理匯總了C++中AngleNormalize360函數的典型用法代碼示例。如果您正苦於以下問題:C++ AngleNormalize360函數的具體用法?C++ AngleNormalize360怎麽用?C++ AngleNormalize360使用的例子?那麽, 這裏精選的函數代碼示例或許可以為您提供幫助。
在下文中一共展示了AngleNormalize360函數的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的C++代碼示例。
示例1: ImperialProbe_Wait
/*
-------------------------
ImperialProbe_Wait
-------------------------
*/
void ImperialProbe_Wait(void)
{
if ( NPCInfo->localState == LSTATE_DROP )
{
vec3_t endPos;
trace_t trace;
NPCInfo->desiredYaw = AngleNormalize360( NPCInfo->desiredYaw + 25 );
VectorSet( endPos, NPC->r.currentOrigin[0], NPC->r.currentOrigin[1], NPC->r.currentOrigin[2] - 32 );
trap_Trace( &trace, NPC->r.currentOrigin, NULL, NULL, endPos, NPC->s.number, MASK_SOLID );
if ( trace.fraction != 1.0f )
{
G_Damage(NPC, NPC->enemy, NPC->enemy, NULL, NULL, 2000, 0,MOD_UNKNOWN);
}
}
NPC_UpdateAngles( qtrue, qtrue );
}
示例2: R2D2_PartsMove
void R2D2_PartsMove( void ) {
// Front 'eye' lense
if ( TIMER_Done( NPC, "eyeDelay" ) ) {
NPC->pos1.yaw = AngleNormalize360( NPC->pos1.yaw );
NPC->pos1.pitch += Q_irand( -20, 20 ); // Roll
NPC->pos1.yaw = Q_irand( -20, 20 );
NPC->pos1.roll = Q_irand( -20, 20 );
/*
if (NPC->genericBone1)
{
gi.G2API_SetBoneAnglesIndex( &NPC->ghoul2[NPC->playerModel], NPC->genericBone1, NPC->pos1, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL );
}
*/
NPC_SetBoneAngles( NPC, "f_eye", &NPC->pos1 );
TIMER_Set( NPC, "eyeDelay", Q_irand( 100, 1000 ) );
}
}
示例3: assert
// TODO: Use new vector math library for all calculations.
void ArmorComponent::HandleApplyDamageModifier(float& damage, Util::optional<Vec3> location,
Util::optional<Vec3> direction, int flags, meansOfDeath_t meansOfDeath) {
vec3_t origin, bulletPath, bulletAngle, locationRelativeToFloor, floor, normal;
// TODO: Remove dependency on client.
assert(entity.oldEnt->client);
// Use non-regional damage where appropriate.
if (flags & DAMAGE_NO_LOCDAMAGE || !location) {
// TODO: Move G_GetNonLocDamageMod to ArmorComponent.
damage *= GetNonLocationalDamageMod();
return;
}
// Get hit location relative to the floor beneath.
if (g_unlagged.integer && entity.oldEnt->client->unlaggedCalc.used) {
VectorCopy(entity.oldEnt->client->unlaggedCalc.origin, origin);
} else {
VectorCopy(entity.oldEnt->r.currentOrigin, origin);
}
BG_GetClientNormal(&entity.oldEnt->client->ps, normal);
VectorMA(origin, entity.oldEnt->r.mins[2], normal, floor);
VectorSubtract(location.value().Data(), floor, locationRelativeToFloor);
// Get fraction of height where the hit landed.
float height = entity.oldEnt->r.maxs[2] - entity.oldEnt->r.mins[2];
if (!height) height = 1.0f;
float hitRatio = Math::Clamp(DotProduct(normal, locationRelativeToFloor) / VectorLength(normal),
0.0f, height) / height;
// Get the yaw of the attack relative to the target's view yaw
VectorSubtract(location.value().Data(), origin, bulletPath);
vectoangles(bulletPath, bulletAngle);
int hitRotation = AngleNormalize360(entity.oldEnt->client->ps.viewangles[YAW] - bulletAngle[YAW]);
// Use regional modifier.
// TODO: Move G_GetPointDamageMod to ArmorComponent.
damage *= GetLocationalDamageMod(hitRotation, hitRatio);
}
示例4: G_CallSpawn
/*
===============
G_CallSpawn
Finds the spawn function for the entity and calls it,
returning qfalse if not found
===============
*/
qboolean G_CallSpawn( gentity_t *ent )
{
spawn_t *s;
buildable_t buildable;
if ( !ent->classname )
{
G_Printf( "G_CallSpawn: NULL classname\n" );
return qfalse;
}
//check buildable spawn functions
if ( ( buildable = BG_FindBuildNumForEntityName( ent->classname ) ) != BA_NONE )
{
if ( buildable == BA_A_SPAWN || buildable == BA_H_SPAWN )
{
ent->s.angles[ YAW ] += 180.0f;
AngleNormalize360( ent->s.angles[ YAW ] );
}
G_SpawnBuildable( ent, buildable );
return qtrue;
}
// check normal spawn functions
for ( s = spawns; s->name; s++ )
{
if ( !strcmp( s->name, ent->classname ) )
{
// found it
s->spawn( ent );
return qtrue;
}
}
G_Printf( "%s doesn't have a spawn function\n", ent->classname );
return qfalse;
}
示例5: G_CallSpawn
/*
===============
G_CallSpawn
Finds the spawn function for the entity and calls it,
returning qfalse if not found
===============
*/
qboolean G_CallSpawn(gentity_t *ent) {
spawn_t *s;
buildable_t buildable;
if (!ent->classname) {
G_Printf("G_CallSpawn: NULL classname\n");
return qfalse;
}
//check buildable spawn functions
if ((buildable = BG_FindBuildNumForEntityName(ent->classname)) != BA_NONE) {
// don't spawn built-in buildings if we are using a custom layout
if (level.layout[ 0 ] && Q_stricmp(level.layout, "*BUILTIN*"))
return qtrue;
if (buildable == BA_A_SPAWN || buildable == BA_H_SPAWN) {
ent->s.angles[ YAW ] += 180.0f;
AngleNormalize360(ent->s.angles[ YAW ]);
}
G_SpawnBuildable(ent, buildable, ent->biteam, level.survivalStage);
return qtrue;
}
// check normal spawn functions
for (s = spawns; s->name; s++) {
if (!strcmp(s->name, ent->classname)) {
// found it
s->spawn(ent);
return qtrue;
}
}
G_Printf("%s doesn't have a spawn function\n", ent->classname);
return qfalse;
}
示例6: NPC_BSJump
void NPC_BSJump (void)
{
vec3_t dir, angles, p1, p2, apex;
float time, height, forward, z, xy, dist, yawError, apexHeight;
if( !NPCInfo->goalEntity )
{//Should have task completed the navgoal
return;
}
if ( NPCInfo->jumpState != JS_JUMPING && NPCInfo->jumpState != JS_LANDING )
{
//Face navgoal
VectorSubtract(NPCInfo->goalEntity->currentOrigin, NPC->currentOrigin, dir);
vectoangles(dir, angles);
NPCInfo->desiredPitch = NPCInfo->lockedDesiredPitch = AngleNormalize360(angles[PITCH]);
NPCInfo->desiredYaw = NPCInfo->lockedDesiredYaw = AngleNormalize360(angles[YAW]);
}
NPC_UpdateAngles ( qtrue, qtrue );
yawError = AngleDelta ( NPC->client->ps.viewangles[YAW], NPCInfo->desiredYaw );
//We don't really care about pitch here
switch ( NPCInfo->jumpState )
{
case JS_FACING:
if ( yawError < MIN_ANGLE_ERROR )
{//Facing it, Start crouching
NPC_SetAnim(NPC, SETANIM_LEGS, BOTH_CROUCH1, SETANIM_FLAG_OVERRIDE|SETANIM_FLAG_HOLD);
NPCInfo->jumpState = JS_CROUCHING;
}
break;
case JS_CROUCHING:
if ( NPC->client->ps.legsAnimTimer > 0 )
{//Still playing crouching anim
return;
}
//Create a parabola
if ( NPC->currentOrigin[2] > NPCInfo->goalEntity->currentOrigin[2] )
{
VectorCopy( NPC->currentOrigin, p1 );
VectorCopy( NPCInfo->goalEntity->currentOrigin, p2 );
}
else if ( NPC->currentOrigin[2] < NPCInfo->goalEntity->currentOrigin[2] )
{
VectorCopy( NPCInfo->goalEntity->currentOrigin, p1 );
VectorCopy( NPC->currentOrigin, p2 );
}
else
{
VectorCopy( NPC->currentOrigin, p1 );
VectorCopy( NPCInfo->goalEntity->currentOrigin, p2 );
}
//z = xy*xy
VectorSubtract( p2, p1, dir );
dir[2] = 0;
//Get xy and z diffs
xy = VectorNormalize( dir );
z = p1[2] - p2[2];
apexHeight = APEX_HEIGHT/2;
/*
//Determine most desirable apex height
apexHeight = (APEX_HEIGHT * PARA_WIDTH/xy) + (APEX_HEIGHT * z/128);
if ( apexHeight < APEX_HEIGHT * 0.5 )
{
apexHeight = APEX_HEIGHT*0.5;
}
else if ( apexHeight > APEX_HEIGHT * 2 )
{
apexHeight = APEX_HEIGHT*2;
}
*/
//FIXME: length of xy will change curve of parabola, need to account for this
//somewhere... PARA_WIDTH
z = (sqrt(apexHeight + z) - sqrt(apexHeight));
assert(z >= 0);
// gi.Printf("apex is %4.2f percent from p1: ", (xy-z)*0.5/xy*100.0f);
xy -= z;
xy *= 0.5;
assert(xy > 0);
VectorMA( p1, xy, dir, apex );
apex[2] += apexHeight;
VectorCopy(apex, NPC->pos1);
//Now we have the apex, aim for it
height = apex[2] - NPC->currentOrigin[2];
time = sqrt( height / ( .5 * NPC->client->ps.gravity ) );
//.........這裏部分代碼省略.........
示例7: Pilot_Steer_Vehicle
//.........這裏部分代碼省略.........
// APPLY RESULTS
//=======================
// Decide Turbo
//--------------
if (ActorDoTurbo || ActorInTurbo)
{
ucmd.buttons |= BUTTON_ALT_ATTACK;
}
else
{
ucmd.buttons &=~BUTTON_ALT_ATTACK;
}
// Decide Acceleration
//---------------------
ucmd.forwardmove = (ActorAccelerate)?(127):(0);
// Decide To Shoot
//-----------------
ucmd.buttons &=~BUTTON_ATTACK;
ucmd.rightmove = 0;
if (AimDistance<2000 && !EnemyDead)
{
// If Doing A Ram Attack
//-----------------------
if (ActorYawOffset!=0)
{
if (NPC->client->ps.weapon!=WP_NONE)
{
NPC_ChangeWeapon(WP_NONE);
}
ucmd.buttons &=~BUTTON_ATTACK;
}
else if (AimAccuracy>ATTACK_FWD)
{
if (NPC->client->ps.weapon!=WP_NONE)
{
NPC_ChangeWeapon(WP_NONE);
}
ucmd.buttons |= BUTTON_ATTACK;
}
else if (AimAccuracy<AIM_SIDE && AimAccuracy>-AIM_SIDE)
{
if (NPC->client->ps.weapon!=WP_BLASTER)
{
NPC_ChangeWeapon(WP_BLASTER);
}
if (AimAccuracy<ATTACK_SIDE && AimAccuracy>-ATTACK_SIDE)
{
//if (!TIMER_Done(NPC, "RiderAltAttack"))
//{
// ucmd.buttons |= BUTTON_ALT_ATTACK;
//}
//else
//{
ucmd.buttons |= BUTTON_ATTACK;
/* if (TIMER_Done(NPC, "RiderAltAttackCheck"))
{
TIMER_Set(NPC, "RiderAltAttackCheck", Q_irand(1000, 3000));
if (Q_irand(0, 2)==0)
{
TIMER_Set(NPC, "RiderAltAttack", 300);
}
}*/
//}
WeaponThink(true);
}
ucmd.rightmove = (EnemySide==Side_Left)?( 127):(-127);
}
else
{
if (NPC->client->ps.weapon!=WP_NONE)
{
NPC_ChangeWeapon(WP_NONE);
}
}
}
else
{
if (NPC->client->ps.weapon!=WP_NONE)
{
NPC_ChangeWeapon(WP_NONE);
}
}
// Aim At Target
//---------------
if (ActorAimAtTarget)
{
MoveDirection.VecToAng();
NPCInfo->desiredPitch = AngleNormalize360(MoveDirection[PITCH]);
NPCInfo->desiredYaw = AngleNormalize360(MoveDirection[YAW] + ActorYawOffset);
}
NPC_UpdateAngles(qtrue, qtrue);
}
示例8: Interrogator_PartsMove
/*
-------------------------
Interrogator_PartsMove
-------------------------
*/
void Interrogator_PartsMove(void)
{
// Syringe
if ( TIMER_Done(NPC,"syringeDelay") )
{
NPC->pos1[1] = AngleNormalize360( NPC->pos1[1]);
if ((NPC->pos1[1] < 60) || (NPC->pos1[1] > 300))
{
NPC->pos1[1]+=Q_irand( -20, 20 ); // Pitch
}
else if (NPC->pos1[1] > 180)
{
NPC->pos1[1]=Q_irand( 300, 360 ); // Pitch
}
else
{
NPC->pos1[1]=Q_irand( 0, 60 ); // Pitch
}
// gi.G2API_SetBoneAnglesIndex( &NPC->ghoul2[NPC->playerModel], NPC->genericBone1, NPC->pos1, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL );
NPC_SetBoneAngles(NPC, "left_arm", NPC->pos1);
TIMER_Set( NPC, "syringeDelay", Q_irand( 100, 1000 ) );
}
// Scalpel
if ( TIMER_Done(NPC,"scalpelDelay") )
{
// Change pitch
if ( NPCInfo->localState == LSTATE_BLADEDOWN ) // Blade is moving down
{
NPC->pos2[0]-= 30;
if (NPC->pos2[0] < 180)
{
NPC->pos2[0] = 180;
NPCInfo->localState = LSTATE_BLADEUP; // Make it move up
}
}
else // Blade is coming back up
{
NPC->pos2[0]+= 30;
if (NPC->pos2[0] >= 360)
{
NPC->pos2[0] = 360;
NPCInfo->localState = LSTATE_BLADEDOWN; // Make it move down
TIMER_Set( NPC, "scalpelDelay", Q_irand( 100, 1000 ) );
}
}
NPC->pos2[0] = AngleNormalize360( NPC->pos2[0]);
// gi.G2API_SetBoneAnglesIndex( &NPC->ghoul2[NPC->playerModel], NPC->genericBone2, NPC->pos2, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL );
NPC_SetBoneAngles(NPC, "right_arm", NPC->pos2);
}
// Claw
NPC->pos3[1] += Q_irand( 10, 30 );
NPC->pos3[1] = AngleNormalize360( NPC->pos3[1]);
//gi.G2API_SetBoneAnglesIndex( &NPC->ghoul2[NPC->playerModel], NPC->genericBone3, NPC->pos3, BONE_ANGLES_POSTMULT, POSITIVE_X, NEGATIVE_Y, NEGATIVE_Z, NULL );
NPC_SetBoneAngles(NPC, "claw", NPC->pos3);
}
示例9: Sniper_FaceEnemy
void Sniper_FaceEnemy( void )
{
//FIXME: the ones behind kill holes are facing some arbitrary direction and not firing
//FIXME: If actually trying to hit enemy, don't fire unless enemy is at least in front of me?
//FIXME: need to give designers option to make them not miss first few shots
if ( NPC->enemy )
{
vec3_t muzzle, target, angles, forward, right, up;
//Get the positions
AngleVectors( NPC->client->ps.viewangles, forward, right, up );
CalcMuzzlePoint( NPC, forward, right, up, muzzle, 0 );
//CalcEntitySpot( NPC, SPOT_WEAPON, muzzle );
CalcEntitySpot( NPC->enemy, SPOT_ORIGIN, target );
if ( enemyDist > 65536 && NPCInfo->stats.aim < 5 )//is 256 squared, was 16384 (128*128)
{
if ( NPC->count < (5-NPCInfo->stats.aim) )
{//miss a few times first
if ( shoot && TIMER_Done( NPC, "attackDelay" ) && level.time >= NPCInfo->shotTime )
{//ready to fire again
qboolean aimError = qfalse;
qboolean hit = qtrue;
int tryMissCount = 0;
trace_t trace;
GetAnglesForDirection( muzzle, target, angles );
AngleVectors( angles, forward, right, up );
while ( hit && tryMissCount < 10 )
{
tryMissCount++;
if ( !Q_irand( 0, 1 ) )
{
aimError = qtrue;
if ( !Q_irand( 0, 1 ) )
{
VectorMA( target, NPC->enemy->maxs[2]*Q_flrand(1.5, 4), right, target );
}
else
{
VectorMA( target, NPC->enemy->mins[2]*Q_flrand(1.5, 4), right, target );
}
}
if ( !aimError || !Q_irand( 0, 1 ) )
{
if ( !Q_irand( 0, 1 ) )
{
VectorMA( target, NPC->enemy->maxs[2]*Q_flrand(1.5, 4), up, target );
}
else
{
VectorMA( target, NPC->enemy->mins[2]*Q_flrand(1.5, 4), up, target );
}
}
gi.trace( &trace, muzzle, vec3_origin, vec3_origin, target, NPC->s.number, MASK_SHOT, G2_NOCOLLIDE, 0 );
hit = Sniper_EvaluateShot( trace.entityNum );
}
NPC->count++;
}
else
{
if ( !enemyLOS )
{
NPC_UpdateAngles( qtrue, qtrue );
return;
}
}
}
else
{//based on distance, aim value, difficulty and enemy movement, miss
//FIXME: incorporate distance as a factor?
int missFactor = 8-(NPCInfo->stats.aim+g_spskill->integer) * 3;
if ( missFactor > ENEMY_POS_LAG_STEPS )
{
missFactor = ENEMY_POS_LAG_STEPS;
}
else if ( missFactor < 0 )
{//???
missFactor = 0 ;
}
VectorCopy( NPCInfo->enemyLaggedPos[missFactor], target );
}
GetAnglesForDirection( muzzle, target, angles );
}
else
{
target[2] += Q_flrand( 0, NPC->enemy->maxs[2] );
//CalcEntitySpot( NPC->enemy, SPOT_HEAD_LEAN, target );
GetAnglesForDirection( muzzle, target, angles );
}
NPCInfo->desiredYaw = AngleNormalize360( angles[YAW] );
NPCInfo->desiredPitch = AngleNormalize360( angles[PITCH] );
}
NPC_UpdateAngles( qtrue, qtrue );
}
示例10: ClientSpawn
//.........這裏部分代碼省略.........
ent->health = client->ps.stats[ STAT_HEALTH ] = client->ps.stats[ STAT_MAX_HEALTH ]; //* 1.25;
//if evolving scale health
if( ent == spawn )
{
ent->health *= ent->client->pers.evolveHealthFraction;
client->ps.stats[ STAT_HEALTH ] *= ent->client->pers.evolveHealthFraction;
}
//clear the credits array
for( i = 0; i < MAX_CLIENTS; i++ )
ent->credits[ i ] = 0;
client->ps.stats[ STAT_STAMINA ] = STAMINA_MAX;
G_SetOrigin( ent, spawn_origin );
VectorCopy( spawn_origin, client->ps.origin );
#define UP_VEL 150.0f
#define F_VEL 50.0f
//give aliens some spawn velocity
if( client->sess.spectatorState == SPECTATOR_NOT &&
client->ps.stats[ STAT_TEAM ] == TEAM_ALIENS )
{
if( ent == spawn )
{
//evolution particle system
G_AddPredictableEvent( ent, EV_ALIEN_EVOLVE, DirToByte( up ) );
}
else
{
spawn_angles[ YAW ] += 180.0f;
AngleNormalize360( spawn_angles[ YAW ] );
if( spawnPoint->s.origin2[ 2 ] > 0.0f )
{
vec3_t forward, dir;
AngleVectors( spawn_angles, forward, NULL, NULL );
VectorScale( forward, F_VEL, forward );
VectorAdd( spawnPoint->s.origin2, forward, dir );
VectorNormalize( dir );
VectorScale( dir, UP_VEL, client->ps.velocity );
}
G_AddPredictableEvent( ent, EV_PLAYER_RESPAWN, 0 );
}
}
else if( client->sess.spectatorState == SPECTATOR_NOT &&
client->ps.stats[ STAT_TEAM ] == TEAM_HUMANS )
{
spawn_angles[ YAW ] += 180.0f;
AngleNormalize360( spawn_angles[ YAW ] );
}
// the respawned flag will be cleared after the attack and jump keys come up
client->ps.pm_flags |= PMF_RESPAWNED;
trap_GetUsercmd( client - level.clients, &ent->client->pers.cmd );
G_SetClientViewAngle( ent, spawn_angles );
if( client->sess.spectatorState == SPECTATOR_NOT )
{
trap_LinkEntity( ent );
示例11: NPC_MoveToGoal
qboolean NPC_MoveToGoal( qboolean tryStraight )
{
float distance;
vec3_t dir;
#if AI_TIMERS
int startTime = GetTime(0);
#endif// AI_TIMERS
//If taking full body pain, don't move
if ( PM_InKnockDown( &NPC->client->ps ) || ( ( NPC->s.legsAnim >= BOTH_PAIN1 ) && ( NPC->s.legsAnim <= BOTH_PAIN18 ) ) )
{
return qtrue;
}
/*
if( NPC->s.eFlags & EF_LOCKED_TO_WEAPON )
{//If in an emplaced gun, never try to navigate!
return qtrue;
}
*/
//rwwFIXMEFIXME: emplaced support
//FIXME: if can't get to goal & goal is a target (enemy), try to find a waypoint that has line of sight to target, at least?
//Get our movement direction
#if 1
if ( NPC_GetMoveDirectionAltRoute( dir, &distance, tryStraight ) == qfalse )
#else
if ( NPC_GetMoveDirection( dir, &distance ) == qfalse )
#endif
return qfalse;
NPCInfo->distToGoal = distance;
//Convert the move to angles
vectoangles( dir, NPCInfo->lastPathAngles );
if ( (ucmd.buttons&BUTTON_WALKING) )
{
NPC->client->ps.speed = NPCInfo->stats.walkSpeed;
}
else
{
NPC->client->ps.speed = NPCInfo->stats.runSpeed;
}
//FIXME: still getting ping-ponging in certain cases... !!! Nav/avoidance error? WTF???!!!
//If in combat move, then move directly towards our goal
if ( NPC_CheckCombatMove() )
{//keep current facing
G_UcmdMoveForDir( NPC, &ucmd, dir );
}
else
{//face our goal
//FIXME: strafe instead of turn if change in dir is small and temporary
NPCInfo->desiredPitch = 0.0f;
NPCInfo->desiredYaw = AngleNormalize360( NPCInfo->lastPathAngles[YAW] );
//Pitch towards the goal and also update if flying or swimming
if ( (NPC->client->ps.eFlags2&EF2_FLYING) )//moveType == MT_FLYSWIM )
{
NPCInfo->desiredPitch = AngleNormalize360( NPCInfo->lastPathAngles[PITCH] );
if ( dir[2] )
{
float scale = (dir[2] * distance);
if ( scale > 64 )
{
scale = 64;
}
else if ( scale < -64 )
{
scale = -64;
}
NPC->client->ps.velocity[2] = scale;
//NPC->client->ps.velocity[2] = (dir[2] > 0) ? 64 : -64;
}
}
//Set any final info
ucmd.forwardmove = 127;
}
#if AI_TIMERS
navTime += GetTime( startTime );
#endif// AI_TIMERS
return qtrue;
}
示例12: NAVNEW_SidestepBlocker
/*
-------------------------
NAVNEW_SidestepBlocker
-------------------------
*/
qboolean NAVNEW_SidestepBlocker( gentity_t *self, gentity_t *blocker, vec3_t blocked_dir, float blocked_dist, vec3_t movedir, vec3_t right )
{//trace to sides of blocker and see if either is clear
trace_t tr;
vec3_t avoidAngles;
vec3_t avoidRight_dir, avoidLeft_dir, block_pos, mins;
float rightSucc, leftSucc, yaw, avoidRadius, arcAngle;
VectorCopy( self->r.mins, mins );
mins[2] += STEPSIZE;
//Get the blocked direction
yaw = vectoyaw( blocked_dir );
//Get the avoid radius
avoidRadius = sqrt( ( blocker->r.maxs[0] * blocker->r.maxs[0] ) + ( blocker->r.maxs[1] * blocker->r.maxs[1] ) ) +
sqrt( ( self->r.maxs[0] * self->r.maxs[0] ) + ( self->r.maxs[1] * self->r.maxs[1] ) );
//See if we're inside our avoidance radius
arcAngle = ( blocked_dist <= avoidRadius ) ? 135 : ( ( avoidRadius / blocked_dist ) * 90 );
/*
float dot = DotProduct( blocked_dir, right );
//Go right on the first try if that works better
if ( dot < 0.0f )
arcAngle *= -1;
*/
VectorClear( avoidAngles );
//need to stop it from ping-ponging, so we have a bit of a debounce time on which side you try
if ( self->NPC->sideStepHoldTime > level.time )
{
if ( self->NPC->lastSideStepSide == -1 )//left
{
arcAngle *= -1;
}//else right
avoidAngles[YAW] = AngleNormalize360( yaw + arcAngle );
AngleVectors( avoidAngles, movedir, NULL, NULL );
VectorMA( self->r.currentOrigin, blocked_dist, movedir, block_pos );
trap->Trace( &tr, self->r.currentOrigin, mins, self->r.maxs, block_pos, self->s.number, self->clipmask|CONTENTS_BOTCLIP, qfalse, 0, 0 );
return (tr.fraction==1.0&&!tr.allsolid&&!tr.startsolid);
}
//test right
avoidAngles[YAW] = AngleNormalize360( yaw + arcAngle );
AngleVectors( avoidAngles, avoidRight_dir, NULL, NULL );
VectorMA( self->r.currentOrigin, blocked_dist, avoidRight_dir, block_pos );
trap->Trace( &tr, self->r.currentOrigin, mins, self->r.maxs, block_pos, self->s.number, self->clipmask|CONTENTS_BOTCLIP, qfalse, 0, 0 );
if ( !tr.allsolid && !tr.startsolid )
{
if ( tr.fraction >= 1.0f )
{//all clear, go for it (favor the right if both are equal)
VectorCopy( avoidRight_dir, movedir );
self->NPC->lastSideStepSide = 1;
self->NPC->sideStepHoldTime = level.time + 2000;
return qtrue;
}
rightSucc = tr.fraction;
}
else
{
rightSucc = 0.0f;
}
//now test left
arcAngle *= -1;
avoidAngles[YAW] = AngleNormalize360( yaw + arcAngle );
AngleVectors( avoidAngles, avoidLeft_dir, NULL, NULL );
VectorMA( self->r.currentOrigin, blocked_dist, avoidLeft_dir, block_pos );
trap->Trace( &tr, self->r.currentOrigin, mins, self->r.maxs, block_pos, self->s.number, self->clipmask|CONTENTS_BOTCLIP, qfalse, 0, 0 );
if ( !tr.allsolid && !tr.startsolid )
{
if ( tr.fraction >= 1.0f )
{//all clear, go for it (right side would have already succeeded if as good as this)
VectorCopy( avoidLeft_dir, movedir );
self->NPC->lastSideStepSide = -1;
self->NPC->sideStepHoldTime = level.time + 2000;
return qtrue;
}
leftSucc = tr.fraction;
}
else
{
leftSucc = 0.0f;
}
if ( leftSucc == 0.0f && rightSucc == 0.0f )
//.........這裏部分代碼省略.........
示例13: CG_Democam_CalcView
//.........這裏部分代碼省略.........
lerpspline = A * pow( lerpfrac, 2 ) + B * lerpfrac;
} else if( previouscam && nextcam && !secondnextcam ) {
n2 = currentcam->timeStamp - previouscam->timeStamp;
n3 = nextcam->timeStamp - currentcam->timeStamp;
A = n3 * ( n2 - n3 ) / ( -n2 - n3 + n2 * n3 + pow( n3, 2 ) );
B = -1 / ( -n2 - n3 + n2 * n3 + pow( n3, 2 ) ) * ( n2 + n3 - 2 * pow( n3, 2 ) );
lerpfrac = (float)( demo_time - currentcam->timeStamp ) / (float)( nextcam->timeStamp - currentcam->timeStamp );
lerpspline = A * pow( lerpfrac, 2 ) + B * lerpfrac;
} else if( previouscam && nextcam && secondnextcam ) {
n1 = currentcam->timeStamp - previouscam->timeStamp;
n2 = nextcam->timeStamp - currentcam->timeStamp;
n3 = secondnextcam->timeStamp - nextcam->timeStamp;
A = -2 * pow( n2, 2 ) * ( -pow( n2, 2 ) + n1 * n3 ) / ( 2 * n2 * n3 + pow( n2, 3 ) * n3 - 3 * pow( n2, 2 ) * n1 + n1 * pow( n2, 3 ) + 2 * n1 * n2 - 3 * pow( n2, 2 ) * n3 - 3 * pow( n2, 3 ) + 2 * pow( n2, 2 ) + pow( n2, 4 ) + n1 * pow( n2, 2 ) * n3 - 3 * n1 * n2 * n3 + 2 * n1 * n3 );
B = pow( n2, 2 ) * ( -2 * n1 - 3 * pow( n2, 2 ) - n2 * n3 + 2 * n3 + 3 * n1 * n3 + n1 * n2 ) / ( 2 * n2 * n3 + pow( n2, 3 ) * n3 - 3 * pow( n2, 2 ) * n1 + n1 * pow( n2, 3 ) + 2 * n1 * n2 - 3 * pow( n2, 2 ) * n3 - 3 * pow( n2, 3 ) + 2 * pow( n2, 2 ) + pow( n2, 4 ) + n1 * pow( n2, 2 ) * n3 - 3 * n1 * n2 * n3 + 2 * n1 * n3 );
C = -( pow( n2, 2 ) * n1 - 2 * n1 * n2 + 3 * n1 * n2 * n3 - 2 * n1 * n3 - 2 * pow( n2, 4 ) + 3 * pow( n2, 3 ) - 2 * pow( n2, 3 ) * n3 + 5 * pow( n2, 2 ) * n3 - 2 * pow( n2, 2 ) - 2 * n2 * n3 ) / ( 2 * n2 * n3 + pow( n2, 3 ) * n3 - 3 * pow( n2, 2 ) * n1 + n1 * pow( n2, 3 ) + 2 * n1 * n2 - 3 * pow( n2, 2 ) * n3 - 3 * pow( n2, 3 ) + 2 * pow( n2, 2 ) + pow( n2, 4 ) + n1 * pow( n2, 2 ) * n3 - 3 * n1 * n2 * n3 + 2 * n1 * n3 );
lerpfrac = (float)( demo_time - currentcam->timeStamp ) / (float)( nextcam->timeStamp - currentcam->timeStamp );
lerpspline = A * pow( lerpfrac, 3 ) + B * pow( lerpfrac, 2 ) + C * lerpfrac;
} else {
lerpfrac = 0;
lerpspline = 0;
}
VectorHermiteInterp( currentcam->origin, currentcam->tangent, nextcam->origin, nextcam->tangent, lerpspline, cam_origin );
if( !CG_DemoCam_LookAt( currentcam->trackEnt, cam_origin, cam_angles ) ) {
VectorHermiteInterp( currentcam->angles, currentcam->angles_tangent, nextcam->angles, nextcam->angles_tangent, lerpspline, cam_angles );
}
cam_fov = (float)currentcam->fov + (float)( nextcam->fov - currentcam->fov ) * lerpfrac;
#undef VectorHermiteInterp
}
// set velocity
VectorSubtract( cam_origin, v, cam_velocity );
VectorScale( cam_velocity, 1.0f / (float)cg.frameTime, cam_velocity );
break;
case DEMOCAM_ORBITAL:
viewType = VIEWDEF_DEMOCAM;
cam_POVent = 0;
cam_fov = currentcam->fov;
VectorCopy( cam_origin, v );
if( !currentcam->trackEnt || currentcam->trackEnt >= MAX_EDICTS ) {
CG_Printf( "Warning: CG_DemoCam: orbital cam needs a track entity set\n" );
VectorCopy( currentcam->origin, cam_origin );
VectorClear( cam_angles );
VectorClear( cam_velocity );
} else {
vec3_t center, forward;
struct cmodel_s *cmodel;
const float ft = (float)cg.frameTime * 0.001f;
// find the trackEnt origin
VectorLerp( cg_entities[currentcam->trackEnt].prev.origin, cg.lerpfrac, cg_entities[currentcam->trackEnt].current.origin, center );
// if having a bounding box, look to its center
if( ( cmodel = CG_CModelForEntity( currentcam->trackEnt ) ) != NULL ) {
vec3_t mins, maxs;
trap_CM_InlineModelBounds( cmodel, mins, maxs );
for( i = 0; i < 3; i++ )
center[i] += ( mins[i] + maxs[i] );
}
if( !cam_orbital_radius ) {
// cam is just started, find distance from cam to trackEnt and keep it as radius
VectorSubtract( currentcam->origin, center, forward );
cam_orbital_radius = VectorNormalize( forward );
VecToAngles( forward, cam_orbital_angles );
}
for( i = 0; i < 3; i++ ) {
cam_orbital_angles[i] += currentcam->angles[i] * ft;
cam_orbital_angles[i] = AngleNormalize360( cam_orbital_angles[i] );
}
AngleVectors( cam_orbital_angles, forward, NULL, NULL );
VectorMA( center, cam_orbital_radius, forward, cam_origin );
// lookat
VectorInverse( forward );
VecToAngles( forward, cam_angles );
}
// set velocity
VectorSubtract( cam_origin, v, cam_velocity );
VectorScale( cam_velocity, 1.0f / ( cg.frameTime * 1000.0f ), cam_velocity );
break;
default:
break;
}
if( currentcam->type != DEMOCAM_ORBITAL ) {
VectorClear( cam_orbital_angles );
cam_orbital_radius = 0;
}
}
return viewType;
}
示例14: turretG2_aim
//-----------------------------------------------------
static void turretG2_aim( gentity_t *self )
//-----------------------------------------------------
{
vec3_t enemyDir, org, org2;
vec3_t desiredAngles, setAngle;
float diffYaw = 0.0f, diffPitch = 0.0f;
float maxYawSpeed = (self->spawnflags&SPF_TURRETG2_TURBO)?30.0f:14.0f;
float maxPitchSpeed = (self->spawnflags&SPF_TURRETG2_TURBO)?15.0f:3.0f;
// move our gun base yaw to where we should be at this time....
BG_EvaluateTrajectory( &self->s.apos, level.time, self->r.currentAngles );
self->r.currentAngles[YAW] = AngleNormalize360( self->r.currentAngles[YAW] );
self->speed = AngleNormalize360( self->speed );
if ( self->enemy )
{
mdxaBone_t boltMatrix;
// ...then we'll calculate what new aim adjustments we should attempt to make this frame
// Aim at enemy
if ( self->enemy->client )
{
VectorCopy( self->enemy->client->renderInfo.eyePoint, org );
}
else
{
VectorCopy( self->enemy->r.currentOrigin, org );
}
if ( self->spawnflags & 2 )
{
org[2] -= 15;
}
else
{
org[2] -= 5;
}
if ( (self->spawnflags&SPF_TURRETG2_LEAD_ENEMY) )
{ //we want to lead them a bit
vec3_t diff, velocity;
float dist;
VectorSubtract( org, self->s.origin, diff );
dist = VectorNormalize( diff );
if ( self->enemy->client )
{
VectorCopy( self->enemy->client->ps.velocity, velocity );
}
else
{
VectorCopy( self->enemy->s.pos.trDelta, velocity );
}
VectorMA( org, (dist/self->mass), velocity, org );
}
// Getting the "eye" here
trap_G2API_GetBoltMatrix( self->ghoul2,
0,
(self->alt_fire?self->genericValue12:self->genericValue11),
&boltMatrix,
self->r.currentAngles,
self->s.origin,
level.time,
NULL,
self->modelScale );
BG_GiveMeVectorFromMatrix( &boltMatrix, ORIGIN, org2 );
VectorSubtract( org, org2, enemyDir );
vectoangles( enemyDir, desiredAngles );
diffYaw = AngleSubtract( self->r.currentAngles[YAW], desiredAngles[YAW] );
diffPitch = AngleSubtract( self->speed, desiredAngles[PITCH] );
}
else
{
// no enemy, so make us slowly sweep back and forth as if searching for a new one
// diffYaw = sin( level.time * 0.0001f + self->count ) * 5.0f; // don't do this for now since it can make it go into walls.
}
if ( diffYaw )
{
// cap max speed....
if ( fabs(diffYaw) > maxYawSpeed )
{
diffYaw = ( diffYaw >= 0 ? maxYawSpeed : -maxYawSpeed );
}
// ...then set up our desired yaw
VectorSet( setAngle, 0.0f, diffYaw, 0.0f );
VectorCopy( self->r.currentAngles, self->s.apos.trBase );
VectorScale( setAngle,- 5, self->s.apos.trDelta );
self->s.apos.trTime = level.time;
self->s.apos.trType = TR_LINEAR;
}
if ( diffPitch )
{
if ( fabs(diffPitch) > maxPitchSpeed )
{
//.........這裏部分代碼省略.........
示例15: GCam_Update
void GCam_Update( void )
{
int i;
qboolean checkFollow = qfalse;
qboolean checkTrack = qfalse;
//Check for roffing angles
if ( (client_camera.info_state & CAMERA_ROFFING) && !(client_camera.info_state & CAMERA_FOLLOWING) )
{
if (client_camera.info_state & CAMERA_CUT)
{
// we're doing a cut, so just go to the new angles. none of this hifalutin lerping business.
for ( i = 0; i < 3; i++ )
{
cameraang[i] = AngleNormalize360( ( client_camera.angles[i] + client_camera.angles2[i] ) );
}
}
else
{
for ( i = 0; i < 3; i++ )
{
cameraang[i] = client_camera.angles[i] + ( client_camera.angles2[i] / client_camera.pan_duration ) * ( level.time - client_camera.pan_time );
}
}
}
else if ( client_camera.info_state & CAMERA_PANNING )
{
if (client_camera.info_state & CAMERA_CUT)
{
// we're doing a cut, so just go to the new angles. none of this hifalutin lerping business.
for ( i = 0; i < 3; i++ )
{
cameraang[i] = AngleNormalize360( ( client_camera.angles[i] + client_camera.angles2[i] ) );
}
}
else
{
//Note: does not actually change the camera's angles until the pan time is done!
if ( client_camera.pan_time + client_camera.pan_duration < level.time )
{//finished panning
for ( i = 0; i < 3; i++ )
{
cameraang[i] = AngleNormalize360( ( client_camera.angles[i] + client_camera.angles2[i] ) );
}
client_camera.info_state &= ~CAMERA_PANNING;
VectorCopy(client_camera.angles, cameraang );
}
else
{//still panning
for ( i = 0; i < 3; i++ )
{
//NOTE: does not store the resultant angle in client_camera.angles until pan is done
cameraang[i] = client_camera.angles[i] + ( client_camera.angles2[i] / client_camera.pan_duration ) * ( level.time - client_camera.pan_time );
}
}
}
}
else
{
checkFollow = qtrue;
}
//Check for movement
if ( client_camera.info_state & CAMERA_MOVING )
{
//NOTE: does not actually move the camera until the movement time is done!
if ( client_camera.move_time + client_camera.move_duration < level.time )
{
VectorCopy( client_camera.origin2, client_camera.origin );
client_camera.info_state &= ~CAMERA_MOVING;
VectorCopy( client_camera.origin, camerapos );
}
else
{
if (client_camera.info_state & CAMERA_CUT)
{
// we're doing a cut, so just go to the new origin. none of this fancypants lerping stuff.
for ( i = 0; i < 3; i++ )
{
camerapos[i] = client_camera.origin2[i];
}
}
else
{
for ( i = 0; i < 3; i++ )
{
camerapos[i] = client_camera.origin[i] + (( ( client_camera.origin2[i] - client_camera.origin[i] ) ) / client_camera.move_duration ) * ( level.time - client_camera.move_time );
}
}
}
}
else
{
checkTrack = qtrue;
}
if ( checkFollow )
{
if ( client_camera.info_state & CAMERA_FOLLOWING )
//.........這裏部分代碼省略.........