GfRange2d GfRange2d::GetQuadrant(size_t i) const { if (i > 3) { TF_CODING_ERROR("Invalid quadrant %zu > 3.", i); return GfRange2d(); } GfVec2d a = GetCorner(i); GfVec2d b = .5 * (_min + _max); return GfRange2d( GfVec2d(GfMin(a[0], b[0]), GfMin(a[1], b[1])), GfVec2d(GfMax(a[0], b[0]), GfMax(a[1], b[1]))); }
GfFrustum GfCamera::GetFrustum() const { const GfVec2d max(_horizontalAperture / 2, _verticalAperture / 2); GfRange2d window(-max, max); // Apply the aperture offset const GfVec2d offsetVec( _horizontalApertureOffset, _verticalApertureOffset); window += GfRange2d(offsetVec, offsetVec); // Up to now, all computations were done in mm, convert to cm. window *= GfCamera::APERTURE_UNIT; if (_projection != Orthographic && _focalLength != 0) { window /= _focalLength * GfCamera::FOCAL_LENGTH_UNIT; } const GfRange1d clippingRange(_clippingRange.GetMin(), _clippingRange.GetMax()); const GfFrustum::ProjectionType projection = _projection == Orthographic ? GfFrustum::Orthographic : GfFrustum::Perspective; return GfFrustum(_transform, window, clippingRange, projection); }
void Picker::Pick(GfVec2i const& startPos, GfVec2i const& endPos) { if (!_intersector) return; // for readability GfVec2i const& pickRadius = _pParams.pickRadius; float const& width = _pParams.screenWidth; float const& height = _pParams.screenHeight; GfFrustum const& frustum = _pParams.viewFrustum; GfMatrix4d const& viewMatrix = _pParams.viewMatrix; int fwidth = std::max(pickRadius[0], std::abs(startPos[0] - endPos[0])); int fheight = std::max(pickRadius[1], std::abs(startPos[1] - endPos[1])); _intersector->SetResolution(GfVec2i(fwidth, fheight)); GfVec2d min(2*startPos[0]/width-1, 1-2*startPos[1]/height); GfVec2d max(2*(endPos[0]+1)/width-1, 1-2*(endPos[1]+1)/height); // scale window GfVec2d origin = frustum.GetWindow().GetMin(); GfVec2d scale = frustum.GetWindow().GetMax() - frustum.GetWindow().GetMin(); min = origin + GfCompMult(scale, 0.5 * (GfVec2d(1.0, 1.0) + min)); max = origin + GfCompMult(scale, 0.5 * (GfVec2d(1.0, 1.0) + max)); GfFrustum pickFrustum(frustum); pickFrustum.SetWindow(GfRange2d(min, max)); HdxIntersector::Params iParams; iParams.pickTarget = _pParams.pickTarget; iParams.doUnpickablesOcclude = _pParams.doUnpickablesOcclude; iParams.hitMode = HdxIntersector::HitFirst; iParams.projectionMatrix = pickFrustum.ComputeProjectionMatrix(); iParams.viewMatrix = viewMatrix; std::cout << "Pick " << startPos << " - " << endPos << "\n"; HdxIntersector::Result result; _intersector->Query(iParams, *_pParams.pickablesCol, _pParams.engine, &result); HdxIntersector::HitSet hits; HdSelectionSharedPtr selection(new HdSelection); if (result.ResolveUnique(&hits)) { AggregatedHits aggrHits = _AggregateHits(hits); for(const auto& pair : aggrHits) { _ProcessHit(pair.second, _pParams.pickTarget, _pParams.highlightMode, selection); } } _selectionTracker->SetSelection(selection); }