add better (and significantly slower) new_translucency_map method
This commit is contained in:
parent
3265388d9d
commit
9cac8d2500
|
@ -1,6 +1,7 @@
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
use crate::graphics::*;
|
use crate::graphics::*;
|
||||||
|
use crate::math::*;
|
||||||
|
|
||||||
#[derive(Error, Debug)]
|
#[derive(Error, Debug)]
|
||||||
pub enum BlendMapError {
|
pub enum BlendMapError {
|
||||||
|
@ -75,6 +76,34 @@ impl BlendMap {
|
||||||
blend_map
|
blend_map
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Creates and returns a new [`BlendMap`] which can be used to blend all 256 colors together
|
||||||
|
/// with every other color, weighting the blending based on the ratios given where 0.0 will
|
||||||
|
/// result in that component being totally transparent and 1.0, totally opaque.
|
||||||
|
///
|
||||||
|
/// This method is SLOW! It is computing 65536 different blend colors by searching the given
|
||||||
|
/// palette for the closest RGB match between two colors.
|
||||||
|
///
|
||||||
|
/// Because simple palette searches are being used to build the blending table, results will
|
||||||
|
/// vary palette to palette. There will not always be a perfect blend color available.
|
||||||
|
pub fn new_translucency_map(blend_r: f32, blend_g: f32, blend_b: f32, palette: &Palette) -> Self {
|
||||||
|
let mut blend_map = BlendMap::new(0, 255);
|
||||||
|
for source in 0..=255 {
|
||||||
|
let (source_r, source_g, source_b) = from_rgb32(palette[source]);
|
||||||
|
let mapping = blend_map.get_mapping_mut(source).unwrap();
|
||||||
|
for dest in 0..=255 {
|
||||||
|
let (dest_r, dest_g, dest_b) = from_rgb32(palette[dest]);
|
||||||
|
|
||||||
|
let find_r = lerp(dest_r as f32, source_r as f32, blend_r) as u8;
|
||||||
|
let find_g = lerp(dest_g as f32, source_g as f32, blend_g) as u8;
|
||||||
|
let find_b = lerp(dest_b as f32, source_b as f32, blend_b) as u8;
|
||||||
|
|
||||||
|
let result_c = palette.find_color(find_r, find_g, find_b);
|
||||||
|
mapping[dest as usize] = result_c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
blend_map
|
||||||
|
}
|
||||||
|
|
||||||
/// The beginning source color that is mapped in this blend map.
|
/// The beginning source color that is mapped in this blend map.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn start_color(&self) -> u8 {
|
pub fn start_color(&self) -> u8 {
|
||||||
|
|
Loading…
Reference in a new issue