[COLOR=#00ff00]static bool isMuzzlerBlocked(obj_Player* pl, const r3dPoint3D& HeadPos, const r3dPoint3D& muzzlePos)[/COLOR]
{
// check if muzzler is visible, and if not (inside of wall) then we do not shoot anything
bool muzzlerBlocked = false;
{
[COLOR=#00ff00] r3dVector temp = muzzlePos-HeadPos;[/COLOR]
float len = temp.Length();
temp.Normalize();
if(len > 0)
{
PxRaycastHit hit;
PxSceneQueryFilterData filter(PxFilterData(COLLIDABLE_STATIC_MASK,0,0,0), PxSceneQueryFilterFlags(PxSceneQueryFilterFlag::eDYNAMIC|PxSceneQueryFilterFlag::eSTATIC));
muzzlerBlocked = g_pPhysicsWorld->raycastSingle( PxVec3[COLOR=#00ff00](HeadPos.x,HeadPos.y,HeadPos.z[/COLOR]), PxVec3(temp.x, temp.y, temp.z), len, PxSceneQueryFlags(PxSceneQueryFlag::eIMPACT), hit, filter);
}
}
if(muzzlerBlocked)
return true;
const float MAX_CASTING_DISTANCE = 20000.f;
r3dPoint3D dir;
if(pl->m_isInScope || g_camera_mode->GetInt() != 1)
r3dScreenTo3D(r3dRenderer->ScreenW2, r3dRenderer->ScreenH2, &dir);
else
r3dScreenTo3D(r3dRenderer->ScreenW2, r3dRenderer->ScreenH*0.32f, &dir);
// check if camera->shoot_target position agains camera->muzzler (disable shooting when close to wall, but looking at step edge)
[COLOR=#00ff00]float distToMuzzler = (HeadPos-muzzlePos).Length();[/COLOR]
{
PxRaycastHit hit;
PxSceneQueryFilterData filter(PxFilterData(COLLIDABLE_STATIC_MASK,0,0,0), PxSceneQueryFilterFlags(PxSceneQueryFilterFlag::eDYNAMIC|PxSceneQueryFilterFlag::eSTATIC));
if(g_pPhysicsWorld->raycastSingle(PxVec3([COLOR=#00ff00]HeadPos.x, HeadPos.y, HeadPos.z[/COLOR]), PxVec3(dir.x, dir.y, dir.z), MAX_CASTING_DISTANCE, PxSceneQueryFlags(PxSceneQueryFlag::eDISTANCE), hit, filter))
{
if(hit.distance < distToMuzzler)
{
// shooting blocked before muzzler
return true;
}
}
}
return false;
}