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); } }
float csHazeMeshObject::GetScreenBoundingBox (long cameranr, long movablenr, float fov, float sx, float sy, const csReversibleTransform& trans, csBox2& sbox, csBox3& cbox) { csVector2 oneCorner; GetTransformedBoundingBox (cameranr, movablenr, trans, cbox); // if the entire bounding box is behind the camera, we're done if ((cbox.MinZ () < 0) && (cbox.MaxZ () < 0)) { return -1; } // Transform from camera to screen space. if (cbox.MinZ () <= 0) { // Sprite is very close to camera. // Just return a maximum bounding box. sbox.Set (-10000, -10000, 10000, 10000); } else { Perspective (cbox.Max (), oneCorner, fov, sx, sy); sbox.StartBoundingBox (oneCorner); csVector3 v (cbox.MinX (), cbox.MinY (), cbox.MaxZ ()); Perspective (v, oneCorner, fov, sx, sy); sbox.AddBoundingVertexSmart (oneCorner); Perspective (cbox.Min (), oneCorner, fov, sx, sy); sbox.AddBoundingVertexSmart (oneCorner); v.Set (cbox.MaxX (), cbox.MaxY (), cbox.MinZ ()); Perspective (v, oneCorner, fov, sx, sy); sbox.AddBoundingVertexSmart (oneCorner); } return cbox.MaxZ (); }