@@ -340,7 +340,7 @@ const uint F_BLEND_CURRENT_ALPHA_INVERSE = 10u;
340340const uint F_BLEND_NEXT_ALPHA = 11u;
341341const uint F_BLEND_NEXT_ALPHA_INVERSE = 12u;
342342
343- void chicago_stage(out vec4 dst, in vec4 i1, in vec4 i2, in uint flags)
343+ void chicago_stage(out vec4 dst, in vec4 i1, in vec4 last, in vec4 i2, in uint flags)
344344{
345345 uint cf = flags & 0xFu;
346346 uint af = (flags >> 4 ) & 0xFu;
@@ -353,61 +353,49 @@ void chicago_stage(out vec4 dst, in vec4 i1, in vec4 i2, in uint flags)
353353 dst.rgb = i1.rgb * i2.rgb;
354354 else if (cf == F_DOUBLE_MUL)
355355 dst.rgb = clamp (i1.rgb * i2.rgb * i2.rgb, 0.0 , 1.0 );
356- else if (cf == F_ADD)
356+ else if (cf == F_ADD || cf == F_ADD_SIGNED_CURRENT || cf == F_ADD_SIGNED_NEXT )
357357 dst.rgb = i1.rgb + i2.rgb;
358- else if (cf == F_ADD_SIGNED_CURRENT)
359- dst.rgb = i1.rgb + i2.rgb - 0.5 ;
360- else if (cf == F_ADD_SIGNED_NEXT)
361- dst.rgb = i1.rgb + i2.rgb - 0.5 ;
362- else if (cf == F_SUB_SIGNED_CURRENT)
363- dst.rgb = i1.rgb - i2.rgb;
364- else if (cf == F_SUB_SIGNED_NEXT)
358+ else if (cf == F_SUB_SIGNED_CURRENT || cf == F_SUB_SIGNED_NEXT)
365359 dst.rgb = i1.rgb - i2.rgb;
366360 else if (cf == F_BLEND_CURRENT_ALPHA)
367- dst.rgb = mix ( i1.rgb, i2.rgb, i1.a) ;
361+ dst.rgb = i1.rgb + i2.rgb * last.a ;
368362 else if (cf == F_BLEND_CURRENT_ALPHA_INVERSE)
369- dst.rgb = mix ( i1.rgb, i2.rgb, 1.0 - i1 .a);
363+ dst.rgb = i1.rgb + i2.rgb * ( 1 - last .a);
370364 else if (cf == F_BLEND_NEXT_ALPHA)
371- dst.rgb = mix ( i1.rgb, i2.rgb, i2.a) ;
365+ dst.rgb = i1.rgb + i2.rgb * i2.a;
372366 else if (cf == F_BLEND_NEXT_ALPHA_INVERSE)
373- dst.rgb = mix ( i1.rgb, i2.rgb, 1.0 - i2.a);
367+ dst.rgb = i1.rgb + i2.rgb * ( 1 - i2.a);
374368
375369 if (af == F_CURRENT)
376370 dst.a = i1.a;
377371 else if (af == F_NEXT)
378- dst.a = i2 .a;
372+ dst.a = i1 .a;
379373 else if (af == F_MUL)
380374 dst.a = i1.a * i2.a;
381375 else if (af == F_DOUBLE_MUL)
382376 dst.a = clamp (i1.a * i2.a * i2.a, 0.0 , 1.0 );
383- else if (af == F_ADD)
377+ else if (af == F_ADD || af == F_ADD_SIGNED_CURRENT || af == F_ADD_SIGNED_NEXT )
384378 dst.a = i1.a + i2.a;
385- else if (af == F_ADD_SIGNED_CURRENT)
386- dst.a = i1.a + i2.a - 0.5 ;
387- else if (af == F_ADD_SIGNED_NEXT)
388- dst.a = i1.a + i2.a - 0.5 ;
389- else if (af == F_SUB_SIGNED_CURRENT)
390- dst.a = i1.a - i2.a;
391- else if (af == F_SUB_SIGNED_NEXT)
379+ else if (af == F_SUB_SIGNED_CURRENT || af == F_SUB_SIGNED_NEXT)
392380 dst.a = i1.a - i2.a;
393381 else if (af == F_BLEND_CURRENT_ALPHA)
394- dst.a = mix ( i1.a, i2.a, i1.a) ;
382+ dst.a = i1.a * last.a ;
395383 else if (af == F_BLEND_CURRENT_ALPHA_INVERSE)
396- dst.a = mix ( i1.a, i2.a, 1.0 - i1 .a);
384+ dst.a = i1.a * ( 1 - last .a);
397385 else if (af == F_BLEND_NEXT_ALPHA)
398- dst.a = mix ( i1.a, i2.a, i2.a) ;
386+ dst.a = i1.a * i2.a;
399387 else if (af == F_BLEND_NEXT_ALPHA_INVERSE)
400- dst.a = mix ( i1.a, i2.a, 1.0 - i2.a);
388+ dst.a = i1.a * ( 1 - i2.a);
401389}
402390
403391vec4 chicago_blend(vec4 c1, vec4 c2, vec4 c3, vec4 c4, uint flags)
404392{
405393 vec4 out_color = vec4 (1.0 );
406- chicago_stage(out_color, c1, c2, flags & 0xFFu);
394+ chicago_stage(out_color, c1, c1, c2, flags & 0xFFu);
407395 if ((uint (mats.instance[frag.instanceId].maps[2 ].layer) >> 24 ) != 0u)
408- chicago_stage(out_color, out_color, c3, (flags >> 8 ) & 0xFFu);
396+ chicago_stage(out_color, out_color, c2, c3, (flags >> 8 ) & 0xFFu);
409397 if ((uint (mats.instance[frag.instanceId].maps[3 ].layer) >> 24 ) != 0u)
410- chicago_stage(out_color, out_color, c4, (flags >> 16 ) & 0xFFu);
398+ chicago_stage(out_color, out_color, c3, c4, (flags >> 16 ) & 0xFFu);
411399 return out_color;
412400}
413401
0 commit comments