mirror of
				https://github.com/stevenrobertson/cuburn.git
				synced 2025-11-03 18:00:55 -05:00 
			
		
		
		
	fixes related to interpolation of palettes; hsv interpolation now goes
the 'short way' around the hue circle, and the correct palette is now chosen when > 2 palettes are present in the knots.
This commit is contained in:
		@ -318,7 +318,7 @@ __global__
 | 
			
		||||
void interp_palette_hsv(uchar4 *outs, const float *times, const float4 *sources,
 | 
			
		||||
        float tstart, float tstep) {
 | 
			
		||||
    float time = tstart + blockIdx.x * tstep;
 | 
			
		||||
    int idx = fmaxf(bitwise_binsearch(times, time), 1);
 | 
			
		||||
    int idx = fmaxf(bitwise_binsearch(times, time) + 1, 1);
 | 
			
		||||
 | 
			
		||||
    float4 left  = sources[blockDim.x * (idx - 1) + threadIdx.x];
 | 
			
		||||
    float4 right = sources[blockDim.x * (idx)     + threadIdx.x];
 | 
			
		||||
@ -329,10 +329,22 @@ void interp_palette_hsv(uchar4 *outs, const float *times, const float4 *sources,
 | 
			
		||||
    float3 lhsv = rgb2hsv(make_float3(left.x, left.y, left.z));
 | 
			
		||||
    float3 rhsv = rgb2hsv(make_float3(right.x, right.y, right.z));
 | 
			
		||||
 | 
			
		||||
    if (fabs(lhsv.x - rhsv.x) > 3.0f)
 | 
			
		||||
        if (lhsv.x < rhsv.x)
 | 
			
		||||
            lhsv.x += 6.0f;
 | 
			
		||||
        else
 | 
			
		||||
            rhsv.x += 6.0f;
 | 
			
		||||
 | 
			
		||||
    float3 hsv;
 | 
			
		||||
    hsv.x = lhsv.x * lf + rhsv.x * rf;
 | 
			
		||||
    hsv.y = lhsv.y * lf + rhsv.y * rf;
 | 
			
		||||
    hsv.z = lhsv.z * lf + rhsv.z * rf;
 | 
			
		||||
    
 | 
			
		||||
    if (hsv.x > 6.0f)
 | 
			
		||||
        hsv.x -= 6.0f;
 | 
			
		||||
    if (hsv.x < 0.0f)
 | 
			
		||||
        hsv.x += 6.0f;
 | 
			
		||||
    
 | 
			
		||||
    float3 rgb = hsv2rgb(hsv);
 | 
			
		||||
 | 
			
		||||
    uchar4 out;
 | 
			
		||||
 | 
			
		||||
@ -154,7 +154,7 @@ float3 rgb2hsv(float3 rgb) {
 | 
			
		||||
 | 
			
		||||
    float s = M > 0.0f ? C / M : 0.0f;
 | 
			
		||||
 | 
			
		||||
    float h;
 | 
			
		||||
    float h = 0.0f;
 | 
			
		||||
    if (s != 0.0f) {
 | 
			
		||||
        C = 1.0f / C;
 | 
			
		||||
        float rc = (M - rgb.x) * C;
 | 
			
		||||
@ -164,8 +164,8 @@ float3 rgb2hsv(float3 rgb) {
 | 
			
		||||
        if      (rgb.x == M)  h = bc - gc;
 | 
			
		||||
        else if (rgb.y == M)  h = 2 + rc - bc;
 | 
			
		||||
        else                  h = 4 + gc - rc;
 | 
			
		||||
 | 
			
		||||
        if (h < 0) h += 6;
 | 
			
		||||
        
 | 
			
		||||
        if (h < 0) h += 6.0f;
 | 
			
		||||
    }
 | 
			
		||||
    return make_float3(h, s, M);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user