LYGIA Shader Library

mix (lygia/v1.1.4/math/mix)

expands mix to linearly mix more than two values

Use:

mix(<float|float2|float3|float4> a, <float|float2|float3|float4> b, <float|float2|float3|float4> c [, <float|float2|float3|float4> d], <float> pct)

Check it on Github


#ifndef FNC_MIX
#define FNC_MIX

float   mix(in float a, in float b, in float c) { return lerp(a, b, c); }
float2  mix(in float2 a, in float2 b, in float c) { return lerp(a, b, c); }
float2  mix(in float2 a, in float2 b, in float2 c) { return lerp(a, b, c); }
float3  mix(in float3 a, in float3 b, in float c) { return lerp(a, b, c); }
float3  mix(in float3 a, in float3 b, in float3 c) { return lerp(a, b, c); }
float4  mix(in float4 a, in float4 b, in float c) { return lerp(a, b, c); }
float4  mix(in float4 a, in float4 b, in float4 c) { return lerp(a, b, c); }

float mix(float a , float b, float c, float pct) {
    return lerp(
        lerp(a, b, 2. * pct),
        lerp(b, c, 2. * (max(pct, .5) - .5)),
        step(.5, pct)
    );
}

float2 mix(float2 a , float2 b, float2 c, float pct) {
    return lerp(
        lerp(a, b, 2. * pct),
        lerp(b, c, 2. * (max(pct, .5) - .5)),
        step(.5, pct)
    );
}

float2 mix(float2 a , float2 b, float2 c, float2 pct) {
    return lerp(
        lerp(a, b, 2. * pct),
        lerp(b, c, 2. * (max(pct, .5) - .5)),
        step(.5, pct)
    );
}

float3 mix(float3 a , float3 b, float3 c, float pct) {
    return lerp(
        lerp(a, b, 2. * pct),
        lerp(b, c, 2. * (max(pct, .5) - .5)),
        step(.5, pct)
    );
}

float3 mix(float3 a , float3 b, float3 c, float3 pct) {
    return lerp(
        lerp(a, b, 2. * pct),
        lerp(b, c, 2. * (max(pct, .5) - .5)),
        step(.5, pct)
    );
}

float4 mix(float4 a , float4 b, float4 c, float pct) {
    return lerp(
        lerp(a, b, 2. * pct),
        lerp(b, c, 2. * (max(pct, .5) - .5)),
        step(.5, pct)
    );
}

float4 mix(float4 a , float4 b, float4 c, float4 pct) {
    return lerp(
        lerp(a, b, 2. * pct),
        lerp(b, c, 2. * (max(pct, .5) - .5)),
        step(.5, pct)
    );
}

float mix(in float a , in float b, in float c, in float d, in float pct) {
    return lerp(
        lerp(a, b, 3. * pct),
        lerp(b,
            lerp(c,
                d,
                3. * (max(pct, .66) - .66)),
            3. * (clamp(pct, .33, .66) - .33)
        ),
        step(.33, pct)
    );
}

float2 mix(in float2 a , in float2 b, in float2 c, in float2 d, in float pct) {
    return lerp(
        lerp(a, b, 3. * pct),
        lerp(b,
            lerp(c,
                d,
                3. * (max(pct, .66) - .66)),
            3. * (clamp(pct, .33, .66) - .33)
        ),
        step(.33, pct)
    );
}

float2 mix(in float2 a , in float2 b, in float2 c, in float2 d, in float2 pct) {
    return lerp(
        lerp(a, b, 3. * pct),
        lerp(b,
            lerp(c,
                d,
                3. * (max(pct, .66) - .66)),
            3. * (clamp(pct, .33, .66) - .33)
        ),
        step(.33, pct)
    );
}

float3 mix(in float3 a , in float3 b, in float3 c, in float3 d, in float pct) {
    return lerp(
        lerp(a, b, 3. * pct),
        lerp(b,
            lerp(c,
                d,
                3. * (max(pct, .66) - .66)),
            3. * (clamp(pct, .33, .66) - .33)
        ),
        step(.33, pct)
    );
}

float3 mix(in float3 a , in float3 b, in float3 c, in float3 d, in float3 pct) {
    return lerp(
        lerp(a, b, 3. * pct),
        lerp(b,
            lerp(c,
                d,
                3. * (max(pct, .66) - .66)),
            3. * (clamp(pct, .33, .66) - .33)
        ),
        step(.33, pct)
    );
}

float4 mix(in float4 a , in float4 b, in float4 c, in float4 d, in float pct) {
    return lerp(
        lerp(a, b, 3. * pct),
        lerp(b,
            lerp(c,
                d,
                3. * (max(pct, .66) - .66)),
            3. * (clamp(pct, .33, .66) - .33)
        ),
        step(.33, pct)
    );
}

float4 mix(in float4 a , in float4 b, in float4 c, in float4 d, in float4 pct) {
    return lerp(
        lerp(a, b, 3. * pct),
        lerp(b,
            lerp(c,
                d,
                3. * (max(pct, .66) - .66)),
            3. * (clamp(pct, .33, .66) - .33)
        ),
        step(.33, pct)
    );
}
#endif

Dependencies:

Use:

mix(<float|float2|float3|float4> a, <float|float2|float3|float4> b, <float|float2|float3|float4> c [, <float|float2|float3|float4> d], <float> pct)

Check it on Github



#ifndef FNC_MIX
#define FNC_MIX

inline __device__ __host__ float mix(float a, float b, float t) { return a + t*(b - a); }

inline __device__ __host__ float2 mix(const float2& a, const float2& b, float t) { return a + t*(b - a); }
inline __device__ __host__ float3 mix(const float3& a, const float3& b, float t) { return a + t*(b - a); }
inline __device__ __host__ float4 mix(const float4& a, const float4& b, float t) { return a + t*(b - a); }

inline __device__ __host__ float2 mix(const float2& a, const float2& b, const float2& t) { return a + t*(b - a); }
inline __device__ __host__ float3 mix(const float3& a, const float3& b, const float3& t) { return a + t*(b - a); }
inline __device__ __host__ float4 mix(const float4& a, const float4& b, const float4& t) { return a + t*(b - a); }

#endif

LYGIA is dual-licensed under the Prosperity License and the Patron License for sponsors and contributors.

Sponsors and contributors are automatically added to the Patron License and they can ignore the any non-commercial rule of the Prosperity Licensed software (please take a look to the exception).

It's also possible to get a permanent comercial license hook to a single and specific version of LYGIA.

Get the latest news and releases

Sign up for the news letter bellow, joing the LYGIA's channel on Discord or follow the Github repository