1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| Color3f * BlendByMode(Color3f * S, Color3f * D,int source , int destination){
Color3f *R,*Scr,*Dest,Result;
Scr = new Color3f;
Dest = new Color3f;
float f = min(S->alpha,1-D->alpha);
float Scr_Red,Scr_Green,Scr_Blue,Scr_Alpha;
float Dst_Red,Dst_Green,Dst_Blue,Dst_Alpha;
switch(source)
{
case COL_ZERO : Scr->red = 0; Scr->green = 0; Scr->blue = 0; Scr->alpha = 0;
case COL_ONE : Scr->red = 1; Scr->green = 1; Scr->blue = 1; Scr->alpha = 1;
case COL_DST_COLOR : Scr->red = S->red; Scr->green = S->green; Scr->blue = S->blue; Scr->alpha = S->alpha;
case COL_ONE_MINUS_DST_COLOR : Scr->red = 1-D->red; Scr->green = 1-D->green; Scr->blue = 1-D->blue; Scr->alpha = 1-D->alpha;
case COL_SRC_ALPHA : Scr->red = S->alpha; Scr->green = S->alpha; Scr->blue = S->alpha; Scr->alpha = S->alpha;
case COL_ONE_MINUS_SRC_ALPHA : Scr->red = 1-S->alpha; Scr->green = 1-S->alpha; Scr->blue = 1-S->alpha; Scr->alpha = 1-S->alpha;
case COL_DST_ALPHA : Scr->red = D->alpha; Scr->green = D->alpha; Scr->blue = D->alpha; Scr->alpha = D->alpha;
case COL_ONE_MINUS_DST_ALPHA : Scr->red = 1-S->alpha; Scr->green = 1-S->alpha; Scr->blue = 1-S->alpha; Scr->alpha = 1-S->alpha;
case COL_SRC_ALPHA_SATURATE : Scr->red = f; Scr->green = f; Scr->blue = f; Scr->alpha = 1;
default : break;
}
switch(destination)
{
case COL_ZERO : Dest->red = 0; Dest->green = 0; Dest->blue = 0; Dest->alpha = 0;
case COL_ONE : Dest->red = 1; Dest->green = 1; Dest->blue = 1; Dest->alpha = 1;
case COL_SRC_COLOR : Dest->red = S->red; Dest->green = S->green; Dest->blue = S->blue; Dest->alpha = S->alpha;
case COL_ONE_MINUS_SRC_COLOR : Dest->red = 1-S->red; Dest->green = 1-S->green; Dest->blue = 1-S->blue; Dest->alpha = 1-S->alpha;
case COL_SRC_ALPHA : Dest->red = S->alpha; Dest->green = S->alpha; Dest->blue = S->blue; Dest->alpha = S->alpha;
case COL_ONE_MINUS_SRC_ALPHA : Dest->red = 1-S->alpha; Dest->green = 1-S->alpha; Dest->blue = 1-S->blue; Dest->alpha = 1-S->alpha;
case COL_DST_ALPHA : Dest->red = D->alpha; Dest->green = D->alpha; Dest->blue = D->blue; Dest->alpha = D->alpha;
case COL_ONE_MINUS_DST_ALPHA : Dest->red = 1-D->alpha; Dest->green = 1-D->alpha; Dest->blue = 1-D->blue; Dest->alpha = 1-D->alpha;
default : break;
}
Result.red = S->red*Scr->red + D->red* Dest->red;
Result.green = S->green*Scr->green + D->green* Dest->green;
Result.blue = S->blue*Scr->blue + D->blue* Dest->blue;
Result.alpha = S->alpha*Scr->alpha + D->alpha* Dest->alpha;
R = RGBa(Result.red,Result.green,Result.blue,Result.alpha);
return R;
} |
Partager