void CPlayerPickupController::ComputePlayerMatrix( matrix3x4_t &out ) { QAngle angles = m_pPlayer->EyeAngles(); Vector origin = m_pPlayer->EyePosition(); // 0-360 / -180-180 angles.x = AngleDistance( angles.x, 0 ); angles.x = clamp( angles.x, -PLAYER_LOOK_PITCH_RANGE, PLAYER_LOOK_PITCH_RANGE ); float feet = m_pPlayer->GetAbsMins().z; float eyes = origin.z; float zoffset = 0; // moving up (negative pitch is up) if ( angles.x < 0 ) { zoffset = RemapVal( angles.x, 0, -PLAYER_LOOK_PITCH_RANGE, PLAYER_HOLD_LEVEL_EYES, PLAYER_HOLD_UP_EYES ); } else { zoffset = RemapVal( angles.x, 0, PLAYER_LOOK_PITCH_RANGE, PLAYER_HOLD_LEVEL_EYES, PLAYER_HOLD_DOWN_FEET + (feet - eyes) ); } // origin.z += zoffset; angles.x = 0; AngleMatrix( angles, origin, out ); }
bool IsSameEnough(const Edge& lhs, const Edge& rhs) { if (IsSameEnough(lhs.Center(), rhs.Center()) && lhs.Length() == rhs.Length()) { Q_ASSERT((IsSameEnough(lhs.Begin(), rhs.Begin()) && IsSameEnough(lhs.End(), rhs.End()) && !IsSameEnough(lhs.Begin(), rhs.End()) && !IsSameEnough(lhs.End(), rhs.Begin()) && AngleDistance(lhs, rhs) == 0.0) || (!IsSameEnough(lhs.Begin(), rhs.Begin()) && !IsSameEnough(lhs.End(), rhs.End()) && IsSameEnough(lhs.Begin(), rhs.End()) && IsSameEnough(lhs.End(), rhs.Begin()) && AngleDistance(lhs, rhs) == 180.0)); return true; } else { return false; } }
float Reaching::FindNearestPosition(pArmConfig_t pos1,pArmConfig_t out) { ArmConfigList_t::iterator it; pArmConfig_t min; float mindist,dist; // cout<<"manifold size: "<< configManifold.size()<<endl; mindist = AngleDistance(pos1,&(configManifold[0])); min = &(configManifold[0]); for(it=configManifold.begin();it!=configManifold.end();it++){ dist = AngleDistance(pos1,&(*it)); if(dist<mindist){ mindist = dist; min = &(*it); } } out->sfe = min->sfe; out->saa = min->saa; out->shr = min->shr; out->eb = min->eb; return mindist; }
//----------------------------------------------------------------------------- //----------------------------------------------------------------------------- bool CGrabController::UpdateObject( CBasePlayer *pPlayer, float flError ) { CBaseEntity *pEntity = GetAttached(); if ( !pEntity || ComputeError() > flError || pPlayer->GetGroundEntity() == pEntity || !pEntity->VPhysicsGetObject() ) { return false; } //Adrian: Oops, our object became motion disabled, let go! IPhysicsObject *pPhys = pEntity->VPhysicsGetObject(); if ( pPhys && pPhys->IsMoveable() == false ) { return false; } Vector forward, right, up; QAngle playerAngles = pPlayer->EyeAngles(); AngleVectors( playerAngles, &forward, &right, &up ); float pitch = AngleDistance(playerAngles.x,0); if( !m_bAllowObjectOverhead ) { playerAngles.x = clamp( pitch, -75, 75 ); } else { playerAngles.x = clamp( pitch, -90, 75 ); } // Now clamp a sphere of object radius at end to the player's bbox Vector radial = physcollision->CollideGetExtent( pPhys->GetCollide(), vec3_origin, pEntity->GetAbsAngles(), -forward ); Vector player2d = pPlayer->CollisionProp()->OBBMaxs(); float playerRadius = player2d.Length2D(); float radius = playerRadius + fabs(DotProduct( forward, radial )); float distance = 24 + ( radius * 2.0f ); // Add the prop's distance offset distance += m_flDistanceOffset; Vector start = pPlayer->Weapon_ShootPosition(); Vector end = start + ( forward * distance ); trace_t tr; CTraceFilterSkipTwoEntities traceFilter( pPlayer, pEntity, COLLISION_GROUP_NONE ); Ray_t ray; ray.Init( start, end ); enginetrace->TraceRay( ray, MASK_SOLID_BRUSHONLY, &traceFilter, &tr ); if ( tr.fraction < 0.5 ) { end = start + forward * (radius*0.5f); } else if ( tr.fraction <= 1.0f ) { end = start + forward * ( distance - radius ); } Vector playerMins, playerMaxs, nearest; pPlayer->CollisionProp()->WorldSpaceAABB( &playerMins, &playerMaxs ); Vector playerLine = pPlayer->CollisionProp()->WorldSpaceCenter(); CalcClosestPointOnLine( end, playerLine+Vector(0,0,playerMins.z), playerLine+Vector(0,0,playerMaxs.z), nearest, NULL ); if( !m_bAllowObjectOverhead ) { Vector delta = end - nearest; float len = VectorNormalize(delta); if ( len < radius ) { end = nearest + radius * delta; } } //Show overlays of radius if ( g_debug_physcannon.GetBool() ) { NDebugOverlay::Box( end, -Vector( 2,2,2 ), Vector(2,2,2), 0, 255, 0, true, 0 ); NDebugOverlay::Box( GetAttached()->WorldSpaceCenter(), -Vector( radius, radius, radius), Vector( radius, radius, radius ), 255, 0, 0, true, 0.0f ); } QAngle angles = TransformAnglesFromPlayerSpace( m_attachedAnglesPlayerSpace, pPlayer ); // If it has a preferred orientation, update to ensure we're still oriented correctly. Pickup_GetPreferredCarryAngles( pEntity, pPlayer, pPlayer->EntityToWorldTransform(), angles ); // We may be holding a prop that has preferred carry angles if ( m_bHasPreferredCarryAngles ) { matrix3x4_t tmp; ComputePlayerMatrix( pPlayer, tmp ); angles = TransformAnglesToWorldSpace( m_vecPreferredCarryAngles, tmp ); } matrix3x4_t attachedToWorld; Vector offset; AngleMatrix( angles, attachedToWorld ); VectorRotate( m_attachedPositionObjectSpace, attachedToWorld, offset ); SetTargetPosition( end - offset, angles ); return true; }