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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
use glium;
use Screen;
impl<'a> Screen<'a> {
/// Change the way colors and alpha values are mixed to produce a final color
/// value for a pixel on the screen. Possible values are "REPLACE", "BLEND", "ADD",
/// "SUBTRACT", "LIGHTEST", "DARKEST", "EXCLUSION", "MULTIPLY", and "SCREEN". They
/// all follow the same conventions as Processing, so you should check the
/// Processing reference for more info.
pub fn blend_mode(&mut self, mode: &str) {
if mode == "REPLACE" {
// glBlendEquation(GL_FUNC_ADD);
// glBlendFunc(GL_ONE, GL_ZERO);
self.draw_params.blend = glium::Blend {
color: glium::BlendingFunction::AlwaysReplace,
alpha: glium::BlendingFunction::AlwaysReplace,
constant_value: (1.0, 1.0, 1.0, 1.0),
};
} else if mode == "BLEND" {
// glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD);
// glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE);
self.draw_params.blend = glium::Blend {
color: glium::BlendingFunction::Addition {
source: glium::LinearBlendingFactor::SourceAlpha,
destination: glium::LinearBlendingFactor::OneMinusSourceAlpha,
},
alpha: glium::BlendingFunction::Addition {
source: glium::LinearBlendingFactor::One,
destination: glium::LinearBlendingFactor::One,
},
constant_value: (1.0, 1.0, 1.0, 1.0),
};
} else if mode == "ADD" {
// glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD);
// glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_ONE, GL_ONE);
self.draw_params.blend = glium::Blend {
color: glium::BlendingFunction::Addition {
source: glium::LinearBlendingFactor::SourceAlpha,
destination: glium::LinearBlendingFactor::One,
},
alpha: glium::BlendingFunction::Addition {
source: glium::LinearBlendingFactor::One,
destination: glium::LinearBlendingFactor::One,
},
constant_value: (1.0, 1.0, 1.0, 1.0),
};
} else if mode == "SUBTRACT" {
// glBlendEquationSeparate(GL_FUNC_REVERSE_SUBTRACT, GL_FUNC_ADD);
// glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE, GL_ONE, GL_ONE);
self.draw_params.blend = glium::Blend {
color: glium::BlendingFunction::ReverseSubtraction {
source: glium::LinearBlendingFactor::SourceAlpha,
destination: glium::LinearBlendingFactor::One,
},
alpha: glium::BlendingFunction::Addition {
source: glium::LinearBlendingFactor::One,
destination: glium::LinearBlendingFactor::One,
},
constant_value: (1.0, 1.0, 1.0, 1.0),
};
} else if mode == "LIGHTEST" {
// glBlendEquationSeparate(GL_FUNC_MAX, GL_FUNC_ADD);
// glBlendFuncSeparate(GL_ONE, GL_ONE, GL_ONE, GL_ONE);
self.draw_params.blend = glium::Blend {
// color: glium::BlendingFunction::Addition {
// source: glium::LinearBlendingFactor::One,
// destination: glium::LinearBlendingFactor::One,
// },
color: glium::BlendingFunction::Max,
alpha: glium::BlendingFunction::Addition {
source: glium::LinearBlendingFactor::One,
destination: glium::LinearBlendingFactor::One,
},
constant_value: (1.0, 1.0, 1.0, 1.0),
};
} else if mode == "DARKEST" {
// glBlendEquationSeparate(GL_FUNC_MIN, GL_FUNC_ADD);
// glBlendFuncSeparate(GL_ONE, GL_ONE, GL_ONE, GL_ONE);
self.draw_params.blend = glium::Blend {
// color: glium::BlendingFunction::Addition {
// source: glium::LinearBlendingFactor::One,
// destination: glium::LinearBlendingFactor::One,
// },
color: glium::BlendingFunction::Min,
alpha: glium::BlendingFunction::Addition {
source: glium::LinearBlendingFactor::One,
destination: glium::LinearBlendingFactor::One,
},
constant_value: (1.0, 1.0, 1.0, 1.0),
};
} else if mode == "EXCLUSION" {
// glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD);
// glBlendFuncSeparate(GL_ONE_MINUS_DST_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_ONE, GL_ONE);
self.draw_params.blend = glium::Blend {
color: glium::BlendingFunction::Addition {
source: glium::LinearBlendingFactor::OneMinusDestinationColor,
destination: glium::LinearBlendingFactor::OneMinusSourceAlpha,
},
alpha: glium::BlendingFunction::Addition {
source: glium::LinearBlendingFactor::One,
destination: glium::LinearBlendingFactor::One,
},
constant_value: (1.0, 1.0, 1.0, 1.0),
};
} else if mode == "MULTIPLY" {
// glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD);
// glBlendFuncSeparate(GL_ZERO, GL_SRC_COLOR, GL_ONE, GL_ONE);
self.draw_params.blend = glium::Blend {
color: glium::BlendingFunction::Addition {
source: glium::LinearBlendingFactor::Zero,
destination: glium::LinearBlendingFactor::SourceColor,
},
alpha: glium::BlendingFunction::Addition {
source: glium::LinearBlendingFactor::One,
destination: glium::LinearBlendingFactor::One,
},
constant_value: (1.0, 1.0, 1.0, 1.0),
};
} else if mode == "SCREEN" {
// glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_ADD);
// glBlendFuncSeparate(GL_ONE_MINUS_DST_COLOR, GL_ONE, GL_ONE, GL_ONE);
self.draw_params.blend = glium::Blend {
color: glium::BlendingFunction::Addition {
source: glium::LinearBlendingFactor::OneMinusDestinationColor,
destination: glium::LinearBlendingFactor::One,
},
alpha: glium::BlendingFunction::Addition {
source: glium::LinearBlendingFactor::One,
destination: glium::LinearBlendingFactor::One,
},
constant_value: (1.0, 1.0, 1.0, 1.0),
};
}
}
}
// createGraphics