diff options
Diffstat (limited to 'src/classes/cubemap.rs')
-rw-r--r-- | src/classes/cubemap.rs | 41 |
1 files changed, 17 insertions, 24 deletions
diff --git a/src/classes/cubemap.rs b/src/classes/cubemap.rs index 653ec38..0355a05 100644 --- a/src/classes/cubemap.rs +++ b/src/classes/cubemap.rs @@ -1,39 +1,30 @@ -use super::{streaming_info::StreamingInfo, texture2d::TextureFormat}; +use super::texture2d::Texture2D; use crate::object::{Value, parser::FromValue}; use anyhow::Result; use glam::{UVec2, Vec3Swizzles, uvec2, vec2, vec3}; -use image::{ImageBuffer, Rgba}; +use image::{DynamicImage, ImageBuffer, Rgba}; +use log::info; use serde::Serialize; use std::f32::consts::PI; #[derive(Debug, Serialize)] pub struct Cubemap { - pub width: i32, - pub height: i32, - pub mip_count: i32, - pub name: String, - #[serde(skip)] - pub image_data: Vec<u8>, - pub format: TextureFormat, - pub texture_dimension: i32, - pub stream_data: StreamingInfo, + pub texture: Texture2D, } impl FromValue for Cubemap { fn from_value(v: Value) -> Result<Self> { - let mut fields = v.as_class("Cubemap")?; + let fields = v.as_class("Cubemap")?; Ok(Cubemap { - width: fields.field("m_Width")?, - height: fields.field("m_Height")?, - mip_count: fields.field("m_MipCount")?, - texture_dimension: fields.field("m_TextureDimension")?, - format: fields.field("m_TextureFormat")?, - name: fields.field("m_Name")?, - stream_data: fields.field("m_StreamData")?, - image_data: fields.remove("image data").unwrap().as_typeless().unwrap(), + texture: Texture2D::from_fields(fields)?, }) } } +impl Cubemap { + pub fn to_image(&self) -> Result<DynamicImage> { + self.texture.to_image() + } +} /// Face ordering is Left, Right, Back, Front, Down, Up pub fn cubemap_to_equirectangular( @@ -41,6 +32,11 @@ pub fn cubemap_to_equirectangular( output_width: u32, output_height: u32, ) -> ImageBuffer<Rgba<f32>, Vec<f32>> { + info!( + "reprojecting {}x{} cubemap faces to {output_width}x{output_height} equirectangular", + faces[0].width(), + faces[0].height() + ); let mut output_image = ImageBuffer::<Rgba<f32>, Vec<f32>>::new(output_width, output_height); for (er_x, er_y, out) in output_image.enumerate_pixels_mut() { let xy_angle = er_x as f32 / output_width as f32 * PI * 2.; @@ -60,12 +56,9 @@ pub fn cubemap_to_equirectangular( }; let face = axis as usize * 2 + if max_comp < 0. { 1 } else { 0 }; - let flip_face = [1., 1., -1., -1., 1., 1.]; - let rotate_face = if face == 5 { -1. } else { 1. }; let face_texture = &faces[face]; let face_size = uvec2(face_texture.width(), face_texture.height()); - let face_uv = - rotate_face * (other_comps / max_comp * vec2(flip_face[face], -max_comp.signum())); + let face_uv = other_comps / max_comp * vec2(1., -max_comp.signum()); let face_uv = face_uv / 2. + 0.5; let face_xy = (face_uv * face_size.as_vec2()) |