Added chunk based rendering system for all the demos

This commit is contained in:
Ishan Jain 2020-02-16 17:49:42 +05:30
parent fbf41fae22
commit cae95b0bf0
12 changed files with 305 additions and 110 deletions

140
Cargo.lock generated
View File

@ -1,5 +1,11 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "autocfg"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2"
[[package]]
name = "bitflags"
version = "1.2.1"
@ -21,6 +27,57 @@ version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
[[package]]
name = "crossbeam-deque"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3aa945d63861bfe624b55d153a39684da1e8c0bc8fba932f7ee3a3c16cea3ca"
dependencies = [
"crossbeam-epoch",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-epoch"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5064ebdbf05ce3cb95e45c8b086f72263f4166b29b97f6baff7ef7fe047b55ac"
dependencies = [
"autocfg",
"cfg-if",
"crossbeam-utils",
"lazy_static",
"memoffset",
"scopeguard",
]
[[package]]
name = "crossbeam-queue"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db"
dependencies = [
"cfg-if",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce446db02cdc3165b94ae73111e570793400d0794e46125cc4056c81cbb039f4"
dependencies = [
"autocfg",
"cfg-if",
"lazy_static",
]
[[package]]
name = "either"
version = "1.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
[[package]]
name = "getrandom"
version = "0.1.14"
@ -32,6 +89,15 @@ dependencies = [
"wasi",
]
[[package]]
name = "hermit-abi"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eff2656d88f158ce120947499e971d743c05dbcbed62e5bd2f38f1698bbc3772"
dependencies = [
"libc",
]
[[package]]
name = "lazy_static"
version = "1.4.0"
@ -44,6 +110,25 @@ version = "0.2.66"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558"
[[package]]
name = "memoffset"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9"
dependencies = [
"rustc_version",
]
[[package]]
name = "num_cpus"
version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6"
dependencies = [
"hermit-abi",
"libc",
]
[[package]]
name = "ppv-lite86"
version = "0.2.6"
@ -91,14 +176,54 @@ dependencies = [
"rand_core",
]
[[package]]
name = "rayon"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098"
dependencies = [
"crossbeam-deque",
"either",
"rayon-core",
]
[[package]]
name = "rayon-core"
version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9"
dependencies = [
"crossbeam-deque",
"crossbeam-queue",
"crossbeam-utils",
"lazy_static",
"num_cpus",
]
[[package]]
name = "ria-weekend"
version = "0.1.0"
dependencies = [
"rand",
"rayon",
"sdl2",
]
[[package]]
name = "rustc_version"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
dependencies = [
"semver",
]
[[package]]
name = "scopeguard"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d"
[[package]]
name = "sdl2"
version = "0.33.0"
@ -121,6 +246,21 @@ dependencies = [
"libc",
]
[[package]]
name = "semver"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
dependencies = [
"semver-parser",
]
[[package]]
name = "semver-parser"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
[[package]]
name = "wasi"
version = "0.9.0+wasi-snapshot-preview1"

View File

@ -7,3 +7,4 @@ edition = "2018"
[dependencies]
sdl2 = "0.33.0"
rand = "0.7.3"
rayon = "1.3.0"

View File

@ -1,6 +1,6 @@
use {
crate::{
demos::Demo,
demos::{Chunk, Demo},
types::{Hitable, HitableList, Ray, Sphere, Vec3},
Camera,
},
@ -14,7 +14,16 @@ impl Demo for DiffuseMaterials {
"Diffuse Materials"
}
fn render(&self, buf: &mut [u8], width: usize, height: usize, samples: u8) {
fn render_chunk(&self, buf: &mut [u8], meta: Chunk, samples: u8) {
let Chunk {
x,
y,
nx,
ny,
start_x,
start_y,
} = meta;
let world = HitableList {
list: vec![
Box::new(Sphere::new(Vec3::new(0.0, 0.0, -1.0), 0.5)),
@ -24,21 +33,22 @@ impl Demo for DiffuseMaterials {
let camera: Camera = Default::default();
let mut rng = rand::thread_rng();
let mut offset = 0;
for j in (0..height).rev() {
for i in 0..width {
for j in start_y..start_y + ny {
for i in start_x..start_x + nx {
let mut color = Vec3::new(0.0, 0.0, 0.0);
for _s in 0..samples {
let u = (i as f64 + rng.gen::<f64>()) / width as f64;
let v = (j as f64 + rng.gen::<f64>()) / height as f64;
let u = (i as f64 + rng.gen::<f64>()) / x as f64;
let v = (j as f64 + rng.gen::<f64>()) / y as f64;
let r = camera.get_ray(u, v);
color += calc_color(r, &world, &mut rng);
}
color /= samples as f64;
let offset = ((y - j - 1) * x + i) * 4;
// Without taking square root of each color, we get a picture that
// is quite dark
// Spheres in this case are absorbing 50% of the light casted on them
@ -48,7 +58,6 @@ impl Demo for DiffuseMaterials {
buf[offset] = (255.99 * color.r().sqrt()) as u8;
buf[offset + 1] = (255.99 * color.g().sqrt()) as u8;
buf[offset + 2] = (255.99 * color.b().sqrt()) as u8;
offset += 4;
}
}
}

View File

@ -1,5 +1,5 @@
use crate::{
demos::Demo,
demos::{Chunk, Demo},
types::{Hitable, HitableList, Ray, Sphere, Vec3},
};
pub struct HitableSphere;
@ -9,7 +9,16 @@ impl Demo for HitableSphere {
"Sphere using Hit table"
}
fn render(&self, buf: &mut [u8], width: usize, height: usize, _samples: u8) {
fn render_chunk(&self, buf: &mut [u8], meta: Chunk, _samples: u8) {
let Chunk {
x,
y,
nx,
ny,
start_x,
start_y,
} = meta;
let lower_left_corner = Vec3::new(-2.0, -1.0, -1.0);
let horizontal = Vec3::new(4.0, 0.0, 0.0);
let vertical = Vec3::new(0.0, 2.0, 0.0);
@ -22,18 +31,17 @@ impl Demo for HitableSphere {
],
};
let mut offset = 0;
for j in (0..height).rev() {
for i in 0..width {
let u = i as f64 / width as f64;
let v = j as f64 / height as f64;
for j in start_y..start_y + ny {
for i in start_x..start_x + nx {
let u = i as f64 / x as f64;
let v = j as f64 / y as f64;
let ray = Ray::new(origin, lower_left_corner + horizontal * u + vertical * v);
let color = calc_color(ray, &world);
let offset = ((y - j - 1) * x + i) * 4;
buf[offset] = (255.99 * color.r()) as u8;
buf[offset + 1] = (255.99 * color.g()) as u8;
buf[offset + 2] = (255.99 * color.b()) as u8;
offset += 4;
}
}
}

View File

@ -2,7 +2,6 @@ pub struct LinearGradientRectangle;
use crate::{
types::{Ray, Vec3},
HORIZONTAL_PARTITION, VERTICAL_PARTITION,
{demos::Chunk, Demo},
};
@ -11,28 +10,7 @@ impl Demo for LinearGradientRectangle {
"Linear Gradient Rectangle"
}
fn render(&self, buf: &mut [u8], width: usize, height: usize, _samples: u8) {
let nx = width / VERTICAL_PARTITION;
let ny = height / HORIZONTAL_PARTITION;
for j in 0..VERTICAL_PARTITION {
for i in 0..HORIZONTAL_PARTITION {
let start_y = j * ny;
let start_x = i * nx;
let chunk = Chunk {
x: width,
y: height,
nx,
ny,
start_x,
start_y,
};
self.render_chunk(buf, chunk);
}
}
}
fn render_chunk(&self, buf: &mut [u8], meta: Chunk) {
fn render_chunk(&self, buf: &mut [u8], meta: Chunk, _samples: u8) {
let Chunk {
x,
y,
@ -55,8 +33,7 @@ impl Demo for LinearGradientRectangle {
let ray = Ray::new(origin, lower_left_corner + horizontal * u + vertical * v);
let c = color(ray);
let offset = (j * x + i) * 4;
let offset = ((y - j - 1) * x + i) * 4;
buf[offset] = (255.99 * c.r()) as u8;
buf[offset + 1] = (255.99 * c.g()) as u8;
buf[offset + 2] = (255.99 * c.b()) as u8;

View File

@ -1,6 +1,6 @@
use {
crate::{
demos::Demo,
demos::{Chunk, Demo},
types::{material, Hitable, HitableList, Ray, Sphere, Vec3},
Camera,
},
@ -14,7 +14,16 @@ impl Demo for Materials {
"Metal Material"
}
fn render(&self, buf: &mut [u8], width: usize, height: usize, samples: u8) {
fn render_chunk(&self, buf: &mut [u8], meta: Chunk, samples: u8) {
let Chunk {
x,
y,
nx,
ny,
start_x,
start_y,
} = meta;
let world = HitableList {
list: vec![
Box::new(Sphere::with_material(
@ -42,25 +51,25 @@ impl Demo for Materials {
let camera: Camera = Default::default();
let mut rng = rand::thread_rng();
let mut offset = 0;
for j in (0..height).rev() {
for i in 0..width {
for j in start_y..start_y + ny {
for i in start_x..start_x + nx {
let mut color = Vec3::new(0.0, 0.0, 0.0);
for _s in 0..samples {
let u = (i as f64 + rng.gen::<f64>()) / width as f64;
let v = (j as f64 + rng.gen::<f64>()) / height as f64;
let u = (i as f64 + rng.gen::<f64>()) / x as f64;
let v = (j as f64 + rng.gen::<f64>()) / y as f64;
let ray = camera.get_ray(u, v);
color += calc_color(ray, &world, 0);
}
color /= samples as f64;
let offset = ((y - j - 1) * x + i) * 4;
// gamma 2 corrected
buf[offset] = (255.99 * color.r().sqrt()) as u8;
buf[offset + 1] = (255.99 * color.g().sqrt()) as u8;
buf[offset + 2] = (255.99 * color.b().sqrt()) as u8;
offset += 4;
}
}
}

View File

@ -1,22 +1,26 @@
//mod diffuse_materials;
//mod hitable_sphere;
mod diffuse_materials;
mod hitable_sphere;
mod linear_gradient_rectangle;
//mod materials;
//mod simple_antialiasing;
mod materials;
mod simple_antialiasing;
mod simple_rectangle;
//mod simple_sphere;
//mod surface_normal_sphere;
mod simple_sphere;
mod surface_normal_sphere;
//pub use diffuse_materials::DiffuseMaterials;
//pub use hitable_sphere::HitableSphere;
pub use diffuse_materials::DiffuseMaterials;
pub use hitable_sphere::HitableSphere;
pub use linear_gradient_rectangle::LinearGradientRectangle;
//pub use materials::Materials;
//pub use simple_antialiasing::SimpleAntialiasing;
pub use materials::Materials;
pub use simple_antialiasing::SimpleAntialiasing;
pub use simple_rectangle::SimpleRectangle;
//pub use simple_sphere::SimpleSphere;
//pub use surface_normal_sphere::SurfaceNormalSphere;
pub use simple_sphere::SimpleSphere;
pub use surface_normal_sphere::SurfaceNormalSphere;
use std::{fs::File, io::Write};
use {
crate::{HORIZONTAL_PARTITION, VERTICAL_PARTITION},
rayon::prelude::*,
std::{fs::File, io::Write},
};
#[derive(Debug)]
pub struct Chunk {
@ -29,9 +33,31 @@ pub struct Chunk {
}
pub trait Demo {
fn render(&self, buf: &mut [u8], width: usize, height: usize, samples: u8);
fn render(&self, buf: &mut [u8], width: usize, height: usize, samples: u8) {
let nx = width / VERTICAL_PARTITION;
let ny = height / HORIZONTAL_PARTITION;
fn render_chunk(&self, buf: &mut [u8], meta: Chunk);
let v = (0..VERTICAL_PARTITION).collect::<Vec<usize>>();
for j in v {
for i in 0..HORIZONTAL_PARTITION {
let start_y = j * ny;
let start_x = i * nx;
let chunk = Chunk {
x: width,
y: height,
nx,
ny,
start_x,
start_y,
};
self.render_chunk(buf, chunk, samples);
}
}
}
fn render_chunk(&self, buf: &mut [u8], meta: Chunk, samples: u8);
fn name(&self) -> &'static str;

View File

@ -1,6 +1,6 @@
use {
crate::{
demos::Demo,
demos::{Chunk, Demo},
types::{Hitable, HitableList, Ray, Sphere, Vec3},
Camera,
},
@ -12,8 +12,16 @@ impl Demo for SimpleAntialiasing {
fn name(&self) -> &'static str {
"A simple antialiasing implementation"
}
fn render_chunk(&self, buf: &mut [u8], meta: Chunk, samples: u8) {
let Chunk {
x,
y,
nx,
ny,
start_x,
start_y,
} = meta;
fn render(&self, buf: &mut [u8], width: usize, height: usize, samples: u8) {
let world = HitableList {
list: vec![
Box::new(Sphere::new(Vec3::new(0.0, 0.0, -1.0), 0.5)),
@ -23,22 +31,22 @@ impl Demo for SimpleAntialiasing {
let camera: Camera = Default::default();
let mut rng = rand::thread_rng();
let mut offset = 0;
for j in (0..height).rev() {
for i in 0..width {
for j in start_y..start_y + ny {
for i in start_x..start_x + nx {
let mut color = Vec3::new(0.0, 0.0, 0.0);
for _s in 0..samples {
let u = (i as f64 + rng.gen::<f64>()) / width as f64;
let v = (j as f64 + rng.gen::<f64>()) / height as f64;
let u = (i as f64 + rng.gen::<f64>()) / x as f64;
let v = (j as f64 + rng.gen::<f64>()) / y as f64;
let r = camera.get_ray(u, v);
color += calc_color(r, &world);
}
color /= samples as f64;
let offset = ((y - j - 1) * x + i) * 4;
buf[offset] = (255.99 * color.r()) as u8;
buf[offset + 1] = (255.99 * color.g()) as u8;
buf[offset + 2] = (255.99 * color.b()) as u8;
offset += 4;
}
}
}

View File

@ -1,6 +1,5 @@
use crate::{
demos::{Chunk, Demo},
types::Vec3,
HORIZONTAL_PARTITION, VERTICAL_PARTITION,
};
@ -11,7 +10,7 @@ impl Demo for SimpleRectangle {
"simple_rectangle"
}
fn render(&self, buf: &mut [u8], width: usize, height: usize, _samples: u8) {
fn render(&self, buf: &mut [u8], width: usize, height: usize, samples: u8) {
let nx = width / VERTICAL_PARTITION;
let ny = height / HORIZONTAL_PARTITION;
@ -28,12 +27,12 @@ impl Demo for SimpleRectangle {
start_y,
};
self.render_chunk(buf, chunk);
self.render_chunk(buf, chunk, samples);
}
}
}
fn render_chunk(&self, buf: &mut [u8], meta: Chunk) {
fn render_chunk(&self, buf: &mut [u8], meta: Chunk, _samples: u8) {
let Chunk {
x,
y,
@ -46,7 +45,7 @@ impl Demo for SimpleRectangle {
for j in start_y..start_y + ny {
for i in start_x..start_x + nx {
let color = [i as f64 / x as f64, j as f64 / y as f64, 0.2];
let offset = (j * x + i) * 4;
let offset = ((y - j - 1) * x + i) * 4;
buf[offset] = (255.99 * color[0]) as u8;
buf[offset + 1] = (255.99 * color[1]) as u8;

View File

@ -1,6 +1,6 @@
use crate::{
demos::{Chunk, Demo},
types::{Ray, Vec3},
Demo,
};
const RADIUS: f64 = 0.5;
@ -12,7 +12,7 @@ impl Demo for SimpleSphere {
"simple_sphere"
}
fn render(&self, buf: &mut [u8], w: usize, h: usize, _ns: u8) {
fn render_chunk(&self, buf: &mut [u8], meta: Chunk, _ns: u8) {
// Usually, lower_left_corner should've been -1.0,-1.0,-1.0 and
// horizontal should've been 2.0,0.0,0.0
// but we are working with a canvas that is 2:1 in size.
@ -23,27 +23,34 @@ impl Demo for SimpleSphere {
// stretched horizontally.
// To prevent this from happening, Since our dimensions are in 2:1 ratio,
// We adjust the lower_left_corner and horizontal values to scale
let Chunk {
x,
y,
nx,
ny,
start_x,
start_y,
} = meta;
let lower_left_corner = Vec3::new(-2.0, -1.0, -1.0);
let horizontal = Vec3::new(4.0, 0.0, 0.0);
let vertical = Vec3::new(0.0, 2.0, 0.0);
// Observer's position
let origin = Vec3::new(0.0, 0.0, 0.0);
let mut offset = 0;
for j in (0..h).rev() {
for i in 0..w {
for j in start_y..start_y + ny {
for i in start_x..start_x + nx {
// relative offsets
// current position to total width/length
let u = i as f64 / w as f64;
let v = j as f64 / h as f64;
let u = i as f64 / x as f64;
let v = j as f64 / y as f64;
let ray = Ray::new(origin, lower_left_corner + horizontal * u + vertical * v);
let color = calc_color(ray);
let offset = ((y - j - 1) * x + i) * 4;
buf[offset] = (255.99 * color.r()) as u8;
buf[offset + 1] = (255.99 * color.g()) as u8;
buf[offset + 2] = (255.99 * color.b()) as u8;
offset += 4;
}
}
}

View File

@ -1,14 +1,17 @@
use crate::types::{Ray, Vec3};
use crate::{
demos::{Chunk, Demo},
types::{Ray, Vec3},
};
const RADIUS: f64 = 0.5;
pub struct SurfaceNormalSphere;
impl crate::Demo for SurfaceNormalSphere {
impl Demo for SurfaceNormalSphere {
fn name(&self) -> &'static str {
"surface_normal_sphere"
}
fn render(&self, buf: &mut [u8], w: usize, h: usize, _ns: u8) {
fn render_chunk(&self, buf: &mut [u8], meta: Chunk, _samples: u8) {
// Usually, lower_left_corner should've been -1.0,-1.0,-1.0 and
// horizontal should've been 2.0,0.0,0.0
// but we are working with a canvas that is 2:1 in size.
@ -19,17 +22,25 @@ impl crate::Demo for SurfaceNormalSphere {
// stretched horizontally.
// To prevent this from happening, Since our dimensions are in 2:1 ratio,
// We adjust the lower_left_corner and horizontal values to scale
let Chunk {
x,
y,
nx,
ny,
start_x,
start_y,
} = meta;
let lower_left_corner = Vec3::new(-2.0, -1.0, -1.0);
let horizontal = Vec3::new(4.0, 0.0, 0.0);
let vertical = Vec3::new(0.0, 2.0, 0.0);
// Observer position
let origin = Vec3::new(0.0, 0.0, 0.0);
let mut offset = 0;
for j in (0..h).rev() {
for i in 0..w {
let u = i as f64 / w as f64;
let v = j as f64 / h as f64;
for j in start_y..start_y + ny {
for i in start_x..start_x + nx {
let u = i as f64 / x as f64;
let v = j as f64 / y as f64;
let ray = Ray::new(origin, lower_left_corner + horizontal * u + vertical * v);
let color = calculate_color(ray);
@ -37,10 +48,10 @@ impl crate::Demo for SurfaceNormalSphere {
let ig = (255.99 * color.g()) as u8;
let ib = (255.99 * color.b()) as u8;
let offset = ((y - j - 1) * x + i) * 4;
buf[offset] = ir;
buf[offset + 1] = ig;
buf[offset + 2] = ib;
offset += 4;
}
}
}

View File

@ -24,7 +24,7 @@ fn main() -> Result<(), String> {
let sdl_ctx = sdl2::init()?;
let video_subsys = sdl_ctx.video()?;
let (width, height) = (1280usize, 640usize);
let (mut width, mut height) = (1280usize, 640usize);
let window = video_subsys
.window("Ray tracing in a weekend", width as u32, height as u32)
@ -72,12 +72,12 @@ fn main() -> Result<(), String> {
Some(Keycode::Num2) => {
active_demo = Box::new(demos::LinearGradientRectangle)
}
//Some(Keycode::Num3) => active_demo = Box::new(demos::SimpleSphere),
//Some(Keycode::Num4) => active_demo = Box::new(demos::SurfaceNormalSphere),
//Some(Keycode::Num5) => active_demo = Box::new(demos::HitableSphere),
//Some(Keycode::Num6) => active_demo = Box::new(demos::SimpleAntialiasing),
//Some(Keycode::Num7) => active_demo = Box::new(demos::DiffuseMaterials),
//Some(Keycode::Num8) => active_demo = Box::new(demos::Materials),
Some(Keycode::Num3) => active_demo = Box::new(demos::SimpleSphere),
Some(Keycode::Num4) => active_demo = Box::new(demos::SurfaceNormalSphere),
Some(Keycode::Num5) => active_demo = Box::new(demos::HitableSphere),
Some(Keycode::Num6) => active_demo = Box::new(demos::SimpleAntialiasing),
Some(Keycode::Num7) => active_demo = Box::new(demos::DiffuseMaterials),
Some(Keycode::Num8) => active_demo = Box::new(demos::Materials),
None => unreachable!(),
_ => (),
};
@ -87,13 +87,13 @@ fn main() -> Result<(), String> {
win_event: WindowEvent::Resized(w, h),
..
} => {
//width = w as usize;
//height = h as usize;
//buffer.resize(width * height * 4, 0);
//texture = texture_creator
// .create_texture_static(PixelFormatEnum::BGR888, width as u32, height as u32)
// .expect("error in resizing texture");
//should_update = true;
width = w as usize;
height = h as usize;
buffer.resize(width * height * 4, 0);
texture = texture_creator
.create_texture_static(PixelFormatEnum::BGR888, width as u32, height as u32)
.expect("error in resizing texture");
should_update = true;
}
_ => {}
};