aboutsummaryrefslogtreecommitdiff
path: root/src/classes/cubemap.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/classes/cubemap.rs')
-rw-r--r--src/classes/cubemap.rs41
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())