45 lines
1.0 KiB
Rust
45 lines
1.0 KiB
Rust
struct color_s {
|
|
char b;
|
|
char g;
|
|
char r;
|
|
char a;
|
|
};
|
|
|
|
void filter(struct color_s *in, struct color_s *out, struct vec3_s *luminanceVector) {
|
|
struct vec3_s pixel;
|
|
pixel.x = (in->r & 0xFF) / 255.0f;
|
|
pixel.y = (in->g & 0xFF) / 255.0f;
|
|
pixel.z = (in->b & 0xFF) / 255.0f;
|
|
|
|
float luminance = vec3Dot(luminanceVector, &pixel);
|
|
luminance = maxf(0.0f, luminance - Params->threshold);
|
|
vec3Scale(&pixel, signf(luminance));
|
|
|
|
out->a = in->a;
|
|
out->r = pixel.x * 255.0f;
|
|
out->g = pixel.y * 255.0f;
|
|
out->b = pixel.z * 255.0f;
|
|
}
|
|
|
|
void main() {
|
|
struct color_s *in = (struct color_s *) InPixel;
|
|
struct color_s *out = (struct color_s *) OutPixel;
|
|
|
|
struct vec3_s luminanceVector;
|
|
luminanceVector.x = 0.2125f;
|
|
luminanceVector.y = 0.7154f;
|
|
luminanceVector.z = 0.0721f;
|
|
|
|
int count = Params->inWidth * Params->inHeight;
|
|
int i;
|
|
|
|
for (i = 0; i < count; i++) {
|
|
filter(in, out, &luminanceVector);
|
|
|
|
in++;
|
|
out++;
|
|
}
|
|
|
|
sendToClient(&count, 1, 4, 0);
|
|
}
|