miniRT/src/rendering/color2.c
2026-02-05 17:45:41 +00:00

56 lines
2.3 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* color2.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: vvobis <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/11/26 18:58:11 by vvobis #+# #+# */
/* Updated: 2025/05/31 13:31:42 by victor ### ########.fr */
/* */
/* ************************************************************************** */
#include "../../minirt.h"
uint color_to_uint(Color c) {
return (c.r << 16 | c.g << 8 | c.b );
}
Color uint_to_color(uint c) {
return (Color){(c >> 16) & 0xff, (c >> 8) & 0xff, c & 0xff, 0xff};
}
Color set_color(uint r, uint g, uint b) {
return (Color){r & 0xff, g & 0xff, b & 0xff, 0xff};
}
void color_print(uint color, int fd)
{
ft_fprintf(fd, " %u,%u,%u\n", (color >> 16) & 0xff, \
(color >> 8) & 0xff, color & 0xff);
}
uint mix_colors(uint base_color, uint reflected_color, double reflectivity)
{
int final_color;
final_color = ((uint)((1.0 - reflectivity) * ((base_color >> 16) & 0xFF) \
+ reflectivity * ((reflected_color >> 16) & 0xFF)) << 16) \
| ((uint)((1.0 - reflectivity) * ((base_color >> 8) & 0xFF) \
+ reflectivity * ((reflected_color >> 8) & 0xFF)) << 8) \
| (uint)((1.0 - reflectivity) * (base_color & 0xFF) \
+ reflectivity * (reflected_color & 0xFF));
if (final_color > 0xffffff)
final_color = 0xffffff;
else if (final_color < 0)
final_color = 0;
return (final_color);
}
uint parse_body_color(char *params[], int *error)
{
return (color_to_uint(set_color(set_signed_int(params[0], 0, UCHAR_MAX, error), \
set_signed_int(params[1], 0, UCHAR_MAX, error), \
set_signed_int(params[2], 0, UCHAR_MAX, error))));
}