Skip to content

Commit

Permalink
Add cube render overlay
Browse files Browse the repository at this point in the history
  • Loading branch information
TibiNonEst committed Feb 14, 2022
1 parent c258efe commit 947df0c
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 8 deletions.
4 changes: 2 additions & 2 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ impl RenderType {
.resize(size, size, image::imageops::FilterType::Nearest),
RenderType::Helm => img.get_part(Layer::Both, BodyPart::Head, options.model)
.resize(size, size, image::imageops::FilterType::Nearest),
RenderType::Cube => img.render_cube(true, size),
RenderType::Cube => img.render_cube(size, options),
RenderType::Body => img.render_body(options)
.resize(size, size * 2, image::imageops::FilterType::Nearest),
RenderType::Cape => img.get_cape()
Expand Down Expand Up @@ -75,7 +75,7 @@ pub fn get_rendered_image(skin_image: Uint8Array, size: u32, what: String, armor
Ok(skin_img) => {
let skin = MinecraftSkin::new(skin_img);
let options = match slim {
true => RenderOptions { armored, model: SkinModel::Slim },
true => RenderOptions { armored, model: SkinModel::Slim },
false => RenderOptions { armored, model: SkinModel::Regular }
};
let rendered = render_type.unwrap().render(&skin, size, options);
Expand Down
25 changes: 20 additions & 5 deletions src/skin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -163,13 +163,10 @@ impl MinecraftSkin {
DynamicImage::ImageRgba8(image)
}

pub(crate) fn render_cube(&self, overlay: bool, width: u32) -> DynamicImage {
pub(crate) fn render_cube(&self, width: u32, options: RenderOptions) -> DynamicImage {
let scale = (width as f32) / 20.0 as f32;
let height = (18.5 * scale).ceil() as u32;
let layer_type = match overlay {
true => Layer::Both,
false => Layer::Bottom
};

let mut render = RgbaImage::new(width, height);

let z_offset = scale * 3.0;
Expand All @@ -179,6 +176,10 @@ impl MinecraftSkin {
let head_orig_right = self.0.crop_imm(0, 8, 8, 8);
let head_orig_front = self.0.crop_imm(8, 8, 8, 8);

let head_orig_top_overlay = self.0.crop_imm(40, 0, 8, 8);
let head_orig_right_overlay = self.0.crop_imm(32, 8, 8, 8);
let head_orig_front_overlay = self.0.crop_imm(40, 8, 8, 8);

// The warp_into function clears every part of the output image that is not part of the pre-image.
// As a workaround, we ask warp_into to draw into a scratch image, overlay the final image with the
// scratch image, and let the scratch be overwritten.
Expand Down Expand Up @@ -211,6 +212,20 @@ impl MinecraftSkin {
warp_into(&head_orig_right.into_rgba8(), &head_right_skew, Interpolation::Nearest, Rgba([0, 0, 0, 0]), &mut scratch);
imageops::overlay(&mut render, &scratch, 0, 0);

if options.armored {
// head top overlay
warp_into(&head_orig_top_overlay.into_rgba8(), &head_top_skew, Interpolation::Nearest, Rgba([0, 0, 0, 0]), &mut scratch);
imageops::overlay(&mut render, &scratch, 0, 0);

// head front overlay
warp_into(&head_orig_front_overlay.into_rgba8(), &head_front_skew, Interpolation::Nearest, Rgba([0, 0, 0, 0]), &mut scratch);
imageops::overlay(&mut render, &scratch, 0, 0);

// head right overlay
warp_into(&head_orig_right_overlay.into_rgba8(), &head_right_skew, Interpolation::Nearest, Rgba([0, 0, 0, 0]), &mut scratch);
imageops::overlay(&mut render, &scratch, 0, 0);
}

DynamicImage::ImageRgba8(render)
}
}
2 changes: 1 addition & 1 deletion worker/request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ export function interpretRequest(request: Request): CraftheadRequest | null {
let armored = false
let sliceAmt = 1

if (url.pathname.includes("armor/body")) {
if (url.pathname.includes("/armor/cube/") || url.pathname.includes("/armor/body/")) {
armored = true
sliceAmt = 2
}
Expand Down

0 comments on commit 947df0c

Please sign in to comment.