//---------------------------------------------------------------------------- void Castle::AdjustVerticalDistance () { // Retain vertical distance above "ground". APoint pos = mCamera->GetPosition(); AVector dir = -AVector::UNIT_Z; mPicker.Execute(mScene, pos, dir, 0.0f, Mathf::MAX_REAL); if (mPicker.Records.size() > 0) { const PickRecord& record = mPicker.GetClosestNonnegative(); TriMesh* mesh = DynamicCast<TriMesh>(record.Intersected); APoint tri[3]; mesh->GetWorldTriangle(record.Triangle, tri); APoint closest = record.Bary[0]*tri[0] + record.Bary[1]*tri[1] + record.Bary[2]*tri[2]; closest[2] += mVerticalDistance; mCamera->SetPosition(closest); } }
//---------------------------------------------------------------------------- void FreeFormDeformation::OnMouseDown (int x, int y) { // Change to right-handed coordinates. y = GetHeight() - 1 - y; // The current selected control point is deactivated. if (mSelected) { mSelected->SetEffectInstance(mControlInactive); mSelected = 0; } // Determine which control point has been selected (if any). APoint origin; AVector direction; if (mRenderer->GetPickRay(x, y, origin, direction)) { mPicker.Execute(mControlRoot, origin, direction, 0.0f, Mathf::MAX_REAL); if (mPicker.Records.size() > 0) { const PickRecord& record = mPicker.GetClosestNonnegative(); TriMesh* box = DynamicCast<TriMesh>(record.Intersected); if (box) { APoint vertex[3]; box->GetWorldTriangle(record.Triangle, vertex); mOldWorldPos = vertex[0]*record.Bary[0] + vertex[1]*record.Bary[1] + vertex[2]*record.Bary[2]; mSelected = box; mSelected->SetEffectInstance(mControlActive); } } } }