static csVector3 FindBiggestHorizontalMovement ( const csBox3& box1, const csReversibleTransform& trans1, const csBox3& box2, const csReversibleTransform& trans2) { // The origin of the second box in the 3D space of the first box. csVector3 o2Tr = trans1.Other2This (trans2.GetOrigin ()); // Transformed bounding box. csBox3 box2Tr; box2Tr.StartBoundingBox (trans1.Other2ThisRelative (trans2.This2OtherRelative (box2.GetCorner (0)))); box2Tr.AddBoundingVertexSmart (trans1.Other2ThisRelative (trans2.This2OtherRelative (box2.GetCorner (1)))); box2Tr.AddBoundingVertexSmart (trans1.Other2ThisRelative (trans2.This2OtherRelative (box2.GetCorner (2)))); box2Tr.AddBoundingVertexSmart (trans1.Other2ThisRelative (trans2.This2OtherRelative (box2.GetCorner (3)))); box2Tr.AddBoundingVertexSmart (trans1.Other2ThisRelative (trans2.This2OtherRelative (box2.GetCorner (4)))); box2Tr.AddBoundingVertexSmart (trans1.Other2ThisRelative (trans2.This2OtherRelative (box2.GetCorner (5)))); box2Tr.AddBoundingVertexSmart (trans1.Other2ThisRelative (trans2.This2OtherRelative (box2.GetCorner (6)))); box2Tr.AddBoundingVertexSmart (trans1.Other2ThisRelative (trans2.This2OtherRelative (box2.GetCorner (7)))); float xr = o2Tr.x - box1.MaxX () + box2Tr.MinX (); float xl = box1.MinX () - o2Tr.x - box2Tr.MaxX (); float zr = o2Tr.z - box1.MaxZ () + box2Tr.MinZ (); float zl = box1.MinZ () - o2Tr.z - box2Tr.MaxZ (); csVector3 newpos = trans2.GetOrigin (); if (xr >= xl && xr >= zr && xr >= zl) newpos = trans1.This2Other (o2Tr + csVector3 (-xr, 0, -o2Tr.z)); else if (xl >= xr && xl >= zr && xl >= zl) newpos = trans1.This2Other (o2Tr + csVector3 (xl, 0, -o2Tr.z)); else if (zr >= xl && zr >= xr && zr >= zl) newpos = trans1.This2Other (o2Tr + csVector3 (-o2Tr.x, 0, -zr)); else if (zl >= xl && zl >= xr && zl >= zr) newpos = trans1.This2Other (o2Tr + csVector3 (-o2Tr.x, 0, zl)); return newpos; }
void csMeshWrapper::GetFullBBox (csBox3& box) { box = GetObjectModel ()->GetObjectBoundingBox (); csMovable* mov = &movable; while (mov) { if (!mov->IsTransformIdentity ()) { const csReversibleTransform& trans = mov->GetTransform (); csBox3 b (trans.This2Other (box.GetCorner (0))); b.AddBoundingVertexSmart (trans.This2Other (box.GetCorner (1))); b.AddBoundingVertexSmart (trans.This2Other (box.GetCorner (2))); b.AddBoundingVertexSmart (trans.This2Other (box.GetCorner (3))); b.AddBoundingVertexSmart (trans.This2Other (box.GetCorner (4))); b.AddBoundingVertexSmart (trans.This2Other (box.GetCorner (5))); b.AddBoundingVertexSmart (trans.This2Other (box.GetCorner (6))); b.AddBoundingVertexSmart (trans.This2Other (box.GetCorner (7))); box = b; } mov = ((csMovable*)mov)->GetParent (); } }
void csMeshOnTexture::ScaleCamera (iMeshWrapper* mesh, int txtw, int txth) { UpdateView (txtw, txth); const csBox3 mesh_box = mesh->GetWorldBoundingBox (); const csVector3 mesh_center = mesh_box.GetCenter (); const iPerspectiveCamera* camera = view->GetPerspectiveCamera (); const float aspect = camera->GetFOV (); const float shift_x = camera->GetShiftX (); const float shift_y = camera->GetShiftY (); int i; float maxz = -100000000.0f; for (i = 0 ; i < 8 ; i++) { csVector3 corner = mesh_box.GetCorner (i) - mesh_center; float z = (corner.x * aspect) / (1.0f - shift_x); if (z < 0) z = (corner.x * aspect) / (float (txtw) - shift_x); z += corner.z; if (z > maxz) maxz = z; z = (corner.y * aspect) / (1.0f - shift_y); if (z < 0) z = (corner.y * aspect) / (float (txth) - shift_y); z += corner.z; if (z > maxz) maxz = z; } csVector3 cam_pos = mesh_center; cam_pos.z -= maxz; for (i = 0 ; i < 8 ; i++) { csVector3 corner = mesh_box.GetCorner (i) - cam_pos; csVector2 p = view->GetCamera()->Perspective (corner); } view->GetCamera()->GetTransform ().Identity (); view->GetCamera()->GetTransform ().SetOrigin (cam_pos); }