コード例 #1
0
void
FlatTriangleFanTree::FillReach(const AFlatGeoPoint &origin, const int index_low,
                               const int index_high, ReachFanParms &parms)
{
  const AGeoPoint ao(parms.task_proj.Unproject(origin), origin.altitude);
  height = origin.altitude;

  // fill vector
  if (depth) {
    const int index_mid = (index_high + index_low) / 2;
    const FlatGeoPoint x_mid = parms.reach_intercept(index_mid, ao);
    if (TooClose(x_mid, origin))
      return;
  }

  assert(vs.empty());
  vs.reserve(index_high - index_low + 1);
  AddPoint(origin);
  for (int index = index_low; index < index_high; ++index) {
    const FlatGeoPoint x = parms.reach_intercept(index, ao);
    /* hao: if reach_intercept() did not find anything reasonable it returns
     *      a FlatGeoPoint that is almost the same as origin, but differs
     *      +/- 1 due to conversion errors. The resulting polygon can have
     *      overlapping edges causing triangulation failures.
     */
    if (AlmostTheSame(origin, x))
      AddPoint(origin);
    else
      AddPoint(x);
  }
}
コード例 #2
0
ファイル: tr.cpp プロジェクト: fw1121/paper-zhang2014
static bool IsEdge(const GLIX &HitGlix, const HitData &Hit, int i, int j)
{
    if (i == j)
        return false;

    assert(i >= 0 && i < CandCount);
    assert(j >= 0 && j < CandCount);

    const HitData &Hit_i = Cands[i];
    const HitData &Hit_j = Cands[j];

    const int HitLength = GetHitLength(Hit);
    const int HitLength_i = GetHitLength(Hit_i);
    const int HitLength_j = GetHitLength(Hit_j);

    if (Ratio(HitLength, HitLength_i) < MIN_HIT_LENGTH_RATIO ||
            Ratio(HitLength, HitLength_j) < MIN_HIT_LENGTH_RATIO ||
            Ratio(HitLength_i, HitLength_j) < MIN_HIT_LENGTH_RATIO)
        return false;

    const int LINELength_i = GetLINELength(Hit_i);
    const int LINELength_j = GetLINELength(Hit_j);

    if (Ratio(LINELength_i, LINELength_j) < MIN_LINE_RATIO)
        return false;

    if (TooClose(HitGlix, Hit_i, Hit_j))
        return false;

    return true;
}
コード例 #3
0
ファイル: CParasite.cpp プロジェクト: AxioDL/urde
bool CParasite::ShouldAttack(CStateManager& mgr, float arg) {
  bool shouldAttack = false;
  if (x742_24_receivedTelegraph && x608_telegraphRemTime > 0.1f)
    shouldAttack = true;
  if (!TooClose(mgr, arg) && InMaxRange(mgr, arg))
    return shouldAttack || InDetectionRange(mgr, 0.f);
  return false;
}
コード例 #4
0
ファイル: CBloodFlower.cpp プロジェクト: AxioDL/urde
bool CBloodFlower::ShouldAttack(CStateManager& mgr, float arg) {
  if (TooClose(mgr, 0.f))
    return false;

  if (x584_curAttackTime <= x304_averageAttackTime)
    return false;

  return (mgr.GetPlayer().GetTranslation().z() + mgr.GetPlayer().GetEyeHeight() <
          x588_projectileOffset + x614_ + GetTranslation().z());
}
コード例 #5
0
ファイル: CBloodFlower.cpp プロジェクト: AxioDL/urde
bool CBloodFlower::ShouldTurn(CStateManager& mgr, float) {
  if (TooClose(mgr, 0.f))
    return false;

  zeus::CVector3f frontVec = GetTransform().basis[1];
  frontVec.z() = 0.f;
  frontVec.normalize();
  zeus::CVector3f posDiff = mgr.GetPlayer().GetTranslation() - GetTranslation();
  posDiff.z() = 0.f;
  posDiff.normalize();

  return posDiff.dot(frontVec) < 0.99599999f;
}
コード例 #6
0
void
FlatTriangleFanTree::FillGaps(const AFlatGeoPoint &origin, ReachFanParms &parms)
{
  // worth checking for gaps?
  if (vs.size() > 2 && parms.rpolars.IsTurningReachEnabled()) {

    // now check gaps
    const RoutePoint o(origin, RoughAltitude(0));
    RouteLink e_last(RoutePoint(*vs.begin(), RoughAltitude(0)),
                     o, parms.task_proj);
    for (auto x_last = vs.cbegin(), end = vs.cend(),
         x = x_last + 1; x != end; x_last = x++) {
      if (TooClose(*x, origin) || TooClose(*x_last, origin))
        continue;

      const RouteLink e(RoutePoint(*x, RoughAltitude(0)), o, parms.task_proj);
      // check if children need to be added
      CheckGap(origin, e_last, e, parms);

      e_last = e;
    }
  }
}
コード例 #7
0
ファイル: CBloodFlower.cpp プロジェクト: AxioDL/urde
void CBloodFlower::PodAttack(CStateManager& mgr, EStateMsg msg, float arg) {
  if (msg == EStateMsg::Activate) {
    x450_bodyController->GetCommandMgr().DeliverCmd(CBCMeleeAttackCmd(pas::ESeverity::Zero));
    x574_podEffect->SetParticleEmission(true);
    ActivateTriggers(mgr, true);
  } else if (msg == EStateMsg::Update) {
    if (TooClose(mgr, 0.f))
      return;

    mgr.ApplyDamage(GetUniqueId(), mgr.GetPlayer().GetUniqueId(), GetUniqueId(), x5f8_podDamage,
                    CMaterialFilter::MakeIncludeExclude({EMaterialTypes::Solid}, {}), {});
  } else if (msg == EStateMsg::Deactivate) {
    x574_podEffect->SetParticleEmission(false);
    ActivateTriggers(mgr, false);
    x450_bodyController->GetCommandMgr().DeliverCmd(CBCKnockBackCmd({}, pas::ESeverity::One));
  }
}