Exemple #1
0
csBox3 operator * (const csBox3 &box1, const csBox3 &box2)
{
    return csBox3 (
               MAX (box1.minbox.x, box2.minbox.x),
               MAX (box1.minbox.y, box2.minbox.y),
               MAX (box1.minbox.z, box2.minbox.z),
               MIN (box1.maxbox.x, box2.maxbox.x),
               MIN (box1.maxbox.y, box2.maxbox.y),
               MIN (box1.maxbox.z, box2.maxbox.z));
}
Exemple #2
0
csBox3 operator+ (const csBox3 &box, const csVector3 &point)
{
    return csBox3 (
               MIN (box.minbox.x, point.x),
               MIN (box.minbox.y, point.y),
               MIN (box.minbox.z, point.z),
               MAX (box.maxbox.x, point.x),
               MAX (box.maxbox.y, point.y),
               MAX (box.maxbox.z, point.z));
}
Exemple #3
0
csBox3 csReversibleTransform::This2Other (const csBox3 &box) const
{
  if (m_t2o.IsIdentity())
  {
    csBox3 newBox (box);
    newBox.SetCenter (This2Other (box.GetCenter()));
    return newBox;
  }
  else
  {
    const csVector3 minA = box.Min ();
    const csVector3 maxA = box.Max ();

    csVector3 minB (v_o2t);
    csVector3 maxB (v_o2t);

    for (size_t i = 0; i < 3; ++i)
    {
      const csVector3 row = m_t2o.Row (i);
      for (size_t j = 0; j < 3; ++j)
      {
        float a = row[j] * minA[j];
        float b = row[j] * maxA[j];
        if (a < b)
        {
          minB[i] += a;
          maxB[i] += b;
        }
        else
        {
          minB[i] += b;
          maxB[i] += a;
        }
      }
    }

    return csBox3 (minB, maxB);
  }
}
Exemple #4
0
bool BgLoader::LoadZones(iStringArray* regions, bool loadMeshes)
{
    // Firstly, get a list of all zones that should be loaded.
    csRefArray<Zone> newLoadedZones;
    for(size_t i=0; i<regions->GetSize(); ++i)
    {
        csRef<Zone> zone = zones.Get(zStringSet.Request(regions->Get(i)), csRef<Zone>());
        if(zone.IsValid())
        {
            newLoadedZones.Push(zone);
        }
        else
        {
            return false;
        }
    }

    // Next clean all sectors which shouldn't be loaded.
    for(size_t i=0; i<loadedZones.GetSize(); ++i)
    {
        bool found = false;
        for(size_t j=0; j<newLoadedZones.GetSize(); ++j)
        {
            if(loadedZones[i] == newLoadedZones[j])
            {
                found = true;
                break;
            }
        }

        if(!found)
        {
            for(size_t j=0; j<loadedZones[i]->sectors.GetSize(); ++j)
            {
                CleanSector(loadedZones[i]->sectors[j]);
            }

            loadedZones.DeleteIndex(i);
            --i;
        }
    }

    // Now load all sectors which should be loaded.
    for(size_t i=0; i<newLoadedZones.GetSize(); ++i)
    {
        bool found = false;
        for(size_t j=0; j<loadedZones.GetSize(); ++j)
        {
            if(newLoadedZones[i] == loadedZones[j])
            {
                found = true;
                break;
            }
        }

        if(!found)
        {
            loadedZones.Push(newLoadedZones[i]);
            for(size_t j=0; j<newLoadedZones[i]->sectors.GetSize(); ++j)
            {
                LoadSector(csBox3(), csBox3(), newLoadedZones[i]->sectors[j], (uint)-1, true, loadMeshes);
            }
        }
        else
        {
            for(size_t j=0; j<newLoadedZones[i]->sectors.GetSize(); ++j)
            {
                LoadSector(csBox3(), csBox3(), newLoadedZones[i]->sectors[j], (uint)-1, true, loadMeshes, true);
            }
        }
    }

    // Finally, clean up all sectors which were created but not checked for loading.
    for(size_t i=0; i<loadedZones.GetSize(); ++i)
    {
        for(size_t j=0; j<loadedZones[i]->sectors.GetSize(); ++j)
        {
            for(size_t k=0; k<loadedZones[i]->sectors[j]->activePortals.GetSize(); ++k)
            {
                if(!loadedZones[i]->sectors[j]->activePortals[k]->targetSector->checked)
                {
                    CleanSector(loadedZones[i]->sectors[j]->activePortals[k]->targetSector);
                    
                    // TODO: improve this, it's a bit hacky.
                    engine->GetMeshes()->Remove(loadedZones[i]->sectors[j]->activePortals[k]->mObject);
                    loadedZones[i]->sectors[j]->activePortals[k]->pObject = NULL;
                    loadedZones[i]->sectors[j]->activePortals[k]->mObject.Invalidate();
                    loadedZones[i]->sectors[j]->activePortals.Delete(loadedZones[i]->sectors[j]->activePortals[k]);
                    --(loadedZones[i]->sectors[j]->objectCount);
                }
            }
        }
    }

    return true;
}