示例#1
0
文件: range2d.cpp 项目: 400dama/USD
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])));
}
示例#2
0
文件: camera.cpp 项目: JT-a/USD
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);
}