Giter Site home page Giter Site logo

Inverse Scissoring about nanovg HOT 4 CLOSED

memononen avatar memononen commented on July 17, 2024
Inverse Scissoring

from nanovg.

Comments (4)

memononen avatar memononen commented on July 17, 2024

There's currently no way of doing it, but it should be possible to add. For reverse scissor, this line:
" sc = vec2(0.5,0.5) - sc * scissorScale;\n"
probably should become:
" sc = sc * scissorScale + vec2(0.5,0.5);\n"
I have to double check that. Making stuff properly AA is sometimes a bit tricky.

Out of curiosity how do you plan to use it?

from nanovg.

devnought avatar devnought commented on July 17, 2024

Instead of calculating where two lines intersect (line into the box in this example) and only drawing to the edge of the box, was thinking of cheaping out just drawing how it's being drawn here, except the interior of the box would be the scissored out area :)

untitled

from nanovg.

memononen avatar memononen commented on July 17, 2024

Maybe you can use raycasting instead of clipping? You'll get 2 intersection points and probably want to draw the line from lerp(sp, sq, tmax) to sq. Could this work? :)

int isectSegRect(const float* sp, const float* sq,
         const float* amin, const float* amax,
         float* tmin, float* tmax)
{
    static const float EPS = 1e-6f;
    float d[2];
    d[0] = sq[0] - sp[0];
    d[1] = sq[1] - sp[1];
    *tmin = -FLT_MAX;
    *tmax = FLT_MAX;

    // For all three slabs
    for (int i = 0; i < 2; i++)
    {
        if (fabsf(d[i]) < EPS)
        {
            // Ray is parallel to slab. No hit if origin not within slab
            if (sp[i] < amin[i] || sp[i] > amax[i])
                return 0;
        }
        else
        {
            // Compute intersection t value of ray with near and far plane of slab
            const float ood = 1.0f / d[i];
            float t1 = (amin[i] - sp[i]) * ood;
            float t2 = (amax[i] - sp[i]) * ood;
            // Make t1 be intersection with near plane, t2 with far plane
            if (t1 > t2) swap(t1, t2);
            // Compute the intersection of slab intersections intervals
            if (t1 > *tmin) *tmin = t1;
            if (t2 < *tmax) *tmax = t2;
            // Exit with no collision as soon as slab intersection becomes empty
            if (*tmin > *tmax) return 0;
        }
    }
    return 0;
}

from nanovg.

devnought avatar devnought commented on July 17, 2024

That does work! Thanks! :)

from nanovg.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.