engine/render: remove Resource enum
parent
0aefcdd347
commit
1169d7796e
|
@ -10,7 +10,7 @@ mod util;
|
||||||
mod physics;
|
mod physics;
|
||||||
|
|
||||||
use render::vulkan::data;
|
use render::vulkan::data;
|
||||||
use render::renderable::{Object, Renderable, Resource, ResourceManager, Material, Mesh, ImageRefOrColor};
|
use render::renderable::{Object, Renderable, ResourceManager, Material, Mesh, ImageRefOrColor};
|
||||||
use physics::color;
|
use physics::color;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
@ -63,13 +63,13 @@ fn main() {
|
||||||
20, 22, 21, 22, 20, 23,
|
20, 22, 21, 22, 20, 23,
|
||||||
|
|
||||||
]);
|
]);
|
||||||
rm.add(Resource::Mesh(Mesh::new(vertices, indices)))
|
rm.add_mesh(Mesh::new(vertices, indices))
|
||||||
};
|
};
|
||||||
|
|
||||||
let material_cube = rm.add(Resource::Material(Material::new(
|
let material_cube = rm.add_material(Material::new(
|
||||||
ImageRefOrColor::image(String::from("assets/test-128px.png")),
|
ImageRefOrColor::image(String::from("assets/test-128px.png")),
|
||||||
ImageRefOrColor::color(color::LinearF32::new(1.0)),
|
ImageRefOrColor::color(color::LinearF32::new(1.0)),
|
||||||
)));
|
));
|
||||||
|
|
||||||
let mut renderer = render::Renderer::initialize();
|
let mut renderer = render::Renderer::initialize();
|
||||||
|
|
||||||
|
|
|
@ -66,20 +66,17 @@ impl<'a> ResourceManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add(&mut self, r: Resource) -> ResourceID {
|
pub fn add_material(&mut self, t: Material) -> ResourceID {
|
||||||
match r {
|
|
||||||
Resource::Material(t) => {
|
|
||||||
let id = t.id;
|
let id = t.id;
|
||||||
self.materials.insert(id, t);
|
self.materials.insert(id, t);
|
||||||
ResourceID::Material(id)
|
ResourceID::Material(id)
|
||||||
}
|
}
|
||||||
Resource::Mesh(t) => {
|
|
||||||
|
pub fn add_mesh(&mut self, t: Mesh) -> ResourceID {
|
||||||
let id = t.id;
|
let id = t.id;
|
||||||
self.meshes.insert(id, t);
|
self.meshes.insert(id, t);
|
||||||
ResourceID::Mesh(id)
|
ResourceID::Mesh(id)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn material(&'a self, id: &ResourceID) -> Option<&'a Material> {
|
pub fn material(&'a self, id: &ResourceID) -> Option<&'a Material> {
|
||||||
if let ResourceID::Material(i) = id {
|
if let ResourceID::Material(i) = id {
|
||||||
|
@ -96,130 +93,6 @@ impl<'a> ResourceManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait ChannelLayout {
|
|
||||||
fn vulkan_from_image(
|
|
||||||
image: Arc<image::DynamicImage>,
|
|
||||||
graphics_queue: Arc<vd::Queue>,
|
|
||||||
) -> Arc<vm::ImmutableImage<vf::Format>>;
|
|
||||||
|
|
||||||
fn vulkan_from_value(
|
|
||||||
&self,
|
|
||||||
graphics_queue: Arc<vd::Queue>,
|
|
||||||
) -> Arc<vm::ImmutableImage<vf::Format>>;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ChannelLayout for color::XYZ {
|
|
||||||
fn vulkan_from_image(
|
|
||||||
image: Arc<image::DynamicImage>,
|
|
||||||
graphics_queue: Arc<vd::Queue>,
|
|
||||||
) -> Arc<vm::ImmutableImage<vf::Format>> {
|
|
||||||
let (width, height) = (image.width(), image.height());
|
|
||||||
let rgba = image.to_rgba();
|
|
||||||
// TODO(q3k): RGB -> CIE XYZ
|
|
||||||
let (image_view, future) = vm::ImmutableImage::from_iter(
|
|
||||||
rgba.into_raw().iter().cloned(),
|
|
||||||
vm::Dimensions::Dim2d{ width, height },
|
|
||||||
vf::Format::R8G8B8A8Unorm,
|
|
||||||
graphics_queue.clone(),
|
|
||||||
).unwrap();
|
|
||||||
|
|
||||||
future.flush().unwrap();
|
|
||||||
image_view
|
|
||||||
}
|
|
||||||
|
|
||||||
fn vulkan_from_value(
|
|
||||||
&self,
|
|
||||||
graphics_queue: Arc<vd::Queue>,
|
|
||||||
) -> Arc<vm::ImmutableImage<vf::Format>> {
|
|
||||||
let mut image = image::ImageBuffer::<image::Rgba<f32>, Vec<f32>>::new(1, 1);
|
|
||||||
image.put_pixel(0, 0, image::Rgba([self.x, self.y, self.z, 0.0]));
|
|
||||||
|
|
||||||
let (image_view, future) = vm::ImmutableImage::from_iter(
|
|
||||||
image.into_raw().iter().cloned(),
|
|
||||||
vm::Dimensions::Dim2d{ width: 1, height: 1 },
|
|
||||||
vf::Format::R32G32B32A32Sfloat,
|
|
||||||
graphics_queue.clone(),
|
|
||||||
).unwrap();
|
|
||||||
future.flush().unwrap();
|
|
||||||
image_view
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ChannelLayout for color::LinearF32 {
|
|
||||||
fn vulkan_from_image(
|
|
||||||
image: Arc<image::DynamicImage>,
|
|
||||||
graphics_queue: Arc<vd::Queue>,
|
|
||||||
) -> Arc<vm::ImmutableImage<vf::Format>> {
|
|
||||||
let (width, height) = (image.width(), image.height());
|
|
||||||
assert!(match image.color() {
|
|
||||||
image::ColorType::L8 => true,
|
|
||||||
image::ColorType::L16 => true,
|
|
||||||
_ => false,
|
|
||||||
}, "linearf32 texture must be 8-bit grayscale");
|
|
||||||
let gray = image.to_luma();
|
|
||||||
let (image_view, future) = vm::ImmutableImage::from_iter(
|
|
||||||
gray.into_raw().iter().cloned(),
|
|
||||||
vm::Dimensions::Dim2d{ width, height },
|
|
||||||
vf::Format::R8G8B8A8Unorm,
|
|
||||||
graphics_queue.clone(),
|
|
||||||
).unwrap();
|
|
||||||
|
|
||||||
future.flush().unwrap();
|
|
||||||
image_view
|
|
||||||
}
|
|
||||||
|
|
||||||
fn vulkan_from_value(
|
|
||||||
&self,
|
|
||||||
graphics_queue: Arc<vd::Queue>,
|
|
||||||
) -> Arc<vm::ImmutableImage<vf::Format>> {
|
|
||||||
let mut image = image::ImageBuffer::<image::Luma<f32>, Vec<f32>>::new(1, 1);
|
|
||||||
image.put_pixel(0, 0, image::Luma([self.d]));
|
|
||||||
|
|
||||||
let (image_view, future) = vm::ImmutableImage::from_iter(
|
|
||||||
image.into_raw().iter().cloned(),
|
|
||||||
vm::Dimensions::Dim2d{ width: 1, height: 1 },
|
|
||||||
vf::Format::R32Sfloat,
|
|
||||||
graphics_queue.clone(),
|
|
||||||
).unwrap();
|
|
||||||
|
|
||||||
future.flush().unwrap();
|
|
||||||
image_view
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub enum ImageRefOrColor<T: ChannelLayout> {
|
|
||||||
Color(T),
|
|
||||||
ImageRef(ImageRef),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T: ChannelLayout> ImageRefOrColor<T> {
|
|
||||||
fn vulkan_image(&self, graphics_queue: Arc<vd::Queue>) -> Arc<vm::ImmutableImage<vf::Format>> {
|
|
||||||
match self {
|
|
||||||
ImageRefOrColor::<T>::Color(c) => c.vulkan_from_value(graphics_queue),
|
|
||||||
ImageRefOrColor::<T>::ImageRef(r) => T::vulkan_from_image(r.load(), graphics_queue),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn color(color: T) -> Self {
|
|
||||||
ImageRefOrColor::<T>::Color(color)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn image(name: String) -> Self {
|
|
||||||
ImageRefOrColor::<T>::ImageRef(ImageRef{ name })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct ImageRef {
|
|
||||||
name: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ImageRef {
|
|
||||||
fn load (&self) -> Arc<image::DynamicImage> {
|
|
||||||
let path = &file::resource_path(self.name.clone());
|
|
||||||
Arc::new(image::open(path).unwrap())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct Material {
|
pub struct Material {
|
||||||
diffuse: ImageRefOrColor<color::XYZ>,
|
diffuse: ImageRefOrColor<color::XYZ>,
|
||||||
roughness: ImageRefOrColor<color::LinearF32>,
|
roughness: ImageRefOrColor<color::LinearF32>,
|
||||||
|
@ -359,3 +232,128 @@ impl Renderable for Object {
|
||||||
Some((self.mesh, self.material, &self.transform))
|
Some((self.mesh, self.material, &self.transform))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub trait ChannelLayout {
|
||||||
|
fn vulkan_from_image(
|
||||||
|
image: Arc<image::DynamicImage>,
|
||||||
|
graphics_queue: Arc<vd::Queue>,
|
||||||
|
) -> Arc<vm::ImmutableImage<vf::Format>>;
|
||||||
|
|
||||||
|
fn vulkan_from_value(
|
||||||
|
&self,
|
||||||
|
graphics_queue: Arc<vd::Queue>,
|
||||||
|
) -> Arc<vm::ImmutableImage<vf::Format>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ChannelLayout for color::XYZ {
|
||||||
|
fn vulkan_from_image(
|
||||||
|
image: Arc<image::DynamicImage>,
|
||||||
|
graphics_queue: Arc<vd::Queue>,
|
||||||
|
) -> Arc<vm::ImmutableImage<vf::Format>> {
|
||||||
|
let (width, height) = (image.width(), image.height());
|
||||||
|
let rgba = image.to_rgba();
|
||||||
|
// TODO(q3k): RGB -> CIE XYZ
|
||||||
|
let (image_view, future) = vm::ImmutableImage::from_iter(
|
||||||
|
rgba.into_raw().iter().cloned(),
|
||||||
|
vm::Dimensions::Dim2d{ width, height },
|
||||||
|
vf::Format::R8G8B8A8Unorm,
|
||||||
|
graphics_queue.clone(),
|
||||||
|
).unwrap();
|
||||||
|
|
||||||
|
future.flush().unwrap();
|
||||||
|
image_view
|
||||||
|
}
|
||||||
|
|
||||||
|
fn vulkan_from_value(
|
||||||
|
&self,
|
||||||
|
graphics_queue: Arc<vd::Queue>,
|
||||||
|
) -> Arc<vm::ImmutableImage<vf::Format>> {
|
||||||
|
let mut image = image::ImageBuffer::<image::Rgba<f32>, Vec<f32>>::new(1, 1);
|
||||||
|
image.put_pixel(0, 0, image::Rgba([self.x, self.y, self.z, 0.0]));
|
||||||
|
|
||||||
|
let (image_view, future) = vm::ImmutableImage::from_iter(
|
||||||
|
image.into_raw().iter().cloned(),
|
||||||
|
vm::Dimensions::Dim2d{ width: 1, height: 1 },
|
||||||
|
vf::Format::R32G32B32A32Sfloat,
|
||||||
|
graphics_queue.clone(),
|
||||||
|
).unwrap();
|
||||||
|
future.flush().unwrap();
|
||||||
|
image_view
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ChannelLayout for color::LinearF32 {
|
||||||
|
fn vulkan_from_image(
|
||||||
|
image: Arc<image::DynamicImage>,
|
||||||
|
graphics_queue: Arc<vd::Queue>,
|
||||||
|
) -> Arc<vm::ImmutableImage<vf::Format>> {
|
||||||
|
let (width, height) = (image.width(), image.height());
|
||||||
|
assert!(match image.color() {
|
||||||
|
image::ColorType::L8 => true,
|
||||||
|
image::ColorType::L16 => true,
|
||||||
|
_ => false,
|
||||||
|
}, "linearf32 texture must be 8-bit grayscale");
|
||||||
|
let gray = image.to_luma();
|
||||||
|
let (image_view, future) = vm::ImmutableImage::from_iter(
|
||||||
|
gray.into_raw().iter().cloned(),
|
||||||
|
vm::Dimensions::Dim2d{ width, height },
|
||||||
|
vf::Format::R8G8B8A8Unorm,
|
||||||
|
graphics_queue.clone(),
|
||||||
|
).unwrap();
|
||||||
|
|
||||||
|
future.flush().unwrap();
|
||||||
|
image_view
|
||||||
|
}
|
||||||
|
|
||||||
|
fn vulkan_from_value(
|
||||||
|
&self,
|
||||||
|
graphics_queue: Arc<vd::Queue>,
|
||||||
|
) -> Arc<vm::ImmutableImage<vf::Format>> {
|
||||||
|
let mut image = image::ImageBuffer::<image::Luma<f32>, Vec<f32>>::new(1, 1);
|
||||||
|
image.put_pixel(0, 0, image::Luma([self.d]));
|
||||||
|
|
||||||
|
let (image_view, future) = vm::ImmutableImage::from_iter(
|
||||||
|
image.into_raw().iter().cloned(),
|
||||||
|
vm::Dimensions::Dim2d{ width: 1, height: 1 },
|
||||||
|
vf::Format::R32Sfloat,
|
||||||
|
graphics_queue.clone(),
|
||||||
|
).unwrap();
|
||||||
|
|
||||||
|
future.flush().unwrap();
|
||||||
|
image_view
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub enum ImageRefOrColor<T: ChannelLayout> {
|
||||||
|
Color(T),
|
||||||
|
ImageRef(ImageRef),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: ChannelLayout> ImageRefOrColor<T> {
|
||||||
|
fn vulkan_image(&self, graphics_queue: Arc<vd::Queue>) -> Arc<vm::ImmutableImage<vf::Format>> {
|
||||||
|
match self {
|
||||||
|
ImageRefOrColor::<T>::Color(c) => c.vulkan_from_value(graphics_queue),
|
||||||
|
ImageRefOrColor::<T>::ImageRef(r) => T::vulkan_from_image(r.load(), graphics_queue),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn color(color: T) -> Self {
|
||||||
|
ImageRefOrColor::<T>::Color(color)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn image(name: String) -> Self {
|
||||||
|
ImageRefOrColor::<T>::ImageRef(ImageRef{ name })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct ImageRef {
|
||||||
|
name: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ImageRef {
|
||||||
|
fn load (&self) -> Arc<image::DynamicImage> {
|
||||||
|
let path = &file::resource_path(self.name.clone());
|
||||||
|
Arc::new(image::open(path).unwrap())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue