void CAI_DynamicLinkController::GenerateLinksFromVolume() { Assert( m_ControlledLinks.Count() == 0 ); int nNodes = g_pBigAINet->NumNodes(); CAI_Node **ppNodes = g_pBigAINet->AccessNodes(); const float MinDistCareSq = Square(MAX_NODE_LINK_DIST + 0.1); const Vector &origin = WorldSpaceCenter(); Vector vAbsMins, vAbsMaxs; CollisionProp()->WorldSpaceAABB( &vAbsMins, &vAbsMaxs ); vAbsMins -= Vector( 1, 1, 1 ); vAbsMaxs += Vector( 1, 1, 1 ); for ( int i = 0; i < nNodes; i++ ) { CAI_Node *pNode = ppNodes[i]; const Vector &nodeOrigin = pNode->GetOrigin(); if ( origin.DistToSqr(nodeOrigin) < MinDistCareSq ) { int nLinks = pNode->NumLinks(); for ( int j = 0; j < nLinks; j++ ) { CAI_Link *pLink = pNode->GetLinkByIndex( j ); int iLinkDest = pLink->DestNodeID( i ); if ( iLinkDest > i ) { const Vector &originOther = ppNodes[iLinkDest]->GetOrigin(); if ( origin.DistToSqr(originOther) < MinDistCareSq ) { if ( IsBoxIntersectingRay( vAbsMins, vAbsMaxs, nodeOrigin, originOther - nodeOrigin ) ) { Assert( IsBoxIntersectingRay( vAbsMins, vAbsMaxs, originOther, nodeOrigin - originOther ) ); CAI_DynamicLink *pLink = (CAI_DynamicLink *)CreateEntityByName( "info_node_link" ); pLink->m_nSrcID = i; pLink->m_nDestID = iLinkDest; pLink->m_nSrcEditID = g_pAINetworkManager->GetEditOps()->GetWCIdFromNodeId( pLink->m_nSrcID ); pLink->m_nDestEditID = g_pAINetworkManager->GetEditOps()->GetWCIdFromNodeId( pLink->m_nDestID ); pLink->m_nLinkState = m_nLinkState; pLink->m_strAllowUse = m_strAllowUse; pLink->m_bFixedUpIds = true; pLink->m_bNotSaved = true; pLink->Spawn(); m_ControlledLinks.AddToTail( pLink ); } } } } } } }
// IBSPTreeDataEnumerator bool FASTCALL CVradStaticPropMgr::EnumerateElement( int userId, int context ) { CStaticProp& prop = m_StaticProps[userId]; EnumContext_t* pCtx = (EnumContext_t*)context; // Don't test twice if (pCtx->m_pPropTested->m_pTested[ userId ] == pCtx->m_pPropTested->m_Enum ) return true; pCtx->m_pPropTested->m_pTested[ userId ] = pCtx->m_pPropTested->m_Enum; StaticPropDict_t& dict = m_StaticPropDict[prop.m_ModelIdx]; if ( !IsBoxIntersectingRay( prop.m_mins, prop.m_maxs, pCtx->m_pRay->m_Start, pCtx->m_pRay->m_Delta ) ) return true; // If there is an invalid model file, it has a null entry here. if( !dict.m_pModel ) return false; CGameTrace trace; pCtx->m_pPropTested->pThreadedCollision->TraceBox( *pCtx->m_pRay, dict.m_pModel, prop.m_Origin, prop.m_Angles, &trace ); // False means stop iterating. Return false if we hit! return (trace.fraction == 1.0); }
FORCEINLINE void Check( T *pEntity ) { // Hmmm.. everything in this list should be a trigger.... ICollideable *pTriggerCollideable = pEntity->GetCollideable(); if ( !m_pCollide->ShouldTouchTrigger(pTriggerCollideable->GetSolidFlags()) ) return; if ( pTriggerCollideable->GetSolidFlags() & FSOLID_USE_TRIGGER_BOUNDS ) { Vector vecTriggerMins, vecTriggerMaxs; pTriggerCollideable->WorldSpaceTriggerBounds( &vecTriggerMins, &vecTriggerMaxs ); if ( !IsBoxIntersectingRay( vecTriggerMins, vecTriggerMaxs, m_Ray ) ) { return; } } else { trace_t tr; enginetrace->ClipRayToCollideable( m_Ray, MASK_SOLID, pTriggerCollideable, &tr ); if ( !(tr.contents & MASK_SOLID) ) return; } trace_t tr; UTIL_ClearTrace( tr ); tr.endpos = (m_pEnt->GetAbsOrigin() + pEntity->GetAbsOrigin()) * 0.5; m_pEnt->PhysicsMarkEntitiesAsTouching( pEntity, tr ); }
bool CPhysicsCannister::TestCollision( const Ray_t &ray, unsigned int mask, trace_t& trace ) { Vector vecAbsMins, vecAbsMaxs; CollisionProp()->WorldSpaceAABB( &vecAbsMins, &vecAbsMaxs ); if ( !IsBoxIntersectingRay( vecAbsMins, vecAbsMaxs, ray.m_Start, ray.m_Delta ) ) return false; return BaseClass::TestCollision( ray, mask, trace ); }
bool CAI_ScriptConditions::EvalPlayerBlockingActor( const EvalArgs_t &args ) { if ( m_fPlayerBlockingActor == TRS_NONE ) return true; #if 0 CAI_BaseNPC *pNpc = args.pActor->MyNPCPointer(); const float testDist = 30.0; Vector origin = args.pActor->WorldSpaceCenter(); Vector delta = UTIL_YawToVector( args.pActor->GetAngles().y ) * testDist; Vector vecAbsMins, vecAbsMaxs; args.pActor->CollisionProp()->WorldSpaceAABB( &vecAbsMins, &vecAbsMaxs ); bool intersect = IsBoxIntersectingRay( vecAbsMins, vecAbsMaxs, origin, delta ); #endif if ( m_fPlayerBlockingActor == TRS_FALSE ) return true; return false; // for now, never say player is blocking }