summaryrefslogtreecommitdiff
path: root/engine
diff options
context:
space:
mode:
Diffstat (limited to 'engine')
-rw-r--r--engine/src/rendering.rs33
-rw-r--r--engine/src/rendering/backend/opengl.rs295
-rw-r--r--engine/src/rendering/main_render_pass.rs170
-rw-r--r--engine/src/texture.rs18
-rw-r--r--engine/src/ui/dear_imgui.rs39
5 files changed, 199 insertions, 356 deletions
diff --git a/engine/src/rendering.rs b/engine/src/rendering.rs
index 5219d0a..cb6ec08 100644
--- a/engine/src/rendering.rs
+++ b/engine/src/rendering.rs
@@ -25,7 +25,7 @@ use crate::rendering::blending::Config as BlendingConfig;
use crate::rendering::object::{Id as ObjectId, Store as ObjectStore};
use crate::rendering::shader::cursor::Binding as ShaderBinding;
use crate::rendering::shader::Program as ShaderProgram;
-use crate::texture::{CubeMapFace, Texture};
+use crate::texture::{CubeMapFace, Properties as TextureProperties};
use crate::vector::Vec2;
use crate::windowing::dpi::PhysicalSize;
use crate::windowing::window::Window;
@@ -77,7 +77,12 @@ impl crate::ecs::extension::Extension for Extension
let _ = collector.add_sole(self.graphics_props);
- collector.add_system(*PRE_RENDER_PHASE, main_render_pass::add_main_render_pass);
+ collector.add_system(
+ *PRE_RENDER_PHASE,
+ main_render_pass::add_main_render_pass
+ .into_system()
+ .initialize(Default::default()),
+ );
collector.add_system(
*RENDER_PHASE,
@@ -215,7 +220,13 @@ pub enum Command
CreateShaderProgram(ObjectId, ShaderProgram),
ActivateShader(ObjectId),
SetShaderBinding(ShaderBinding),
- CreateTexture(ObjectId, AssetOrValue<Texture>),
+ CreateTexture
+ {
+ obj_id: ObjectId,
+ pixel_data_format: TexturePixelDataFormat,
+ creation: TextureCreation,
+ properties: TextureProperties,
+ },
UpdateTexture
{
obj_id: ObjectId,
@@ -401,6 +412,22 @@ bitflags! {
#[derive(Debug, Clone)]
#[non_exhaustive]
+pub enum TextureCreation
+{
+ Texture2D
+ {
+ size: Dimens<u32>,
+ image: Option<Box<[u8]>>,
+ },
+ CubeMap
+ {
+ size: Dimens<u32>,
+ images: Option<[(CubeMapFace, Box<[u8]>); 6]>,
+ },
+}
+
+#[derive(Debug, Clone)]
+#[non_exhaustive]
pub enum TextureUpdate
{
Texture2D
diff --git a/engine/src/rendering/backend/opengl.rs b/engine/src/rendering/backend/opengl.rs
index 755388c..4d2a74f 100644
--- a/engine/src/rendering/backend/opengl.rs
+++ b/engine/src/rendering/backend/opengl.rs
@@ -6,7 +6,6 @@ use std::hint::cold_path;
use std::num::NonZero;
use ecs::query::term::With;
-use ecs::util::BorrowedOrOwned;
use glutin::config::Config as GlutinConfig;
use glutin::display::GetGlDisplay;
use glutin::error::Error as GlutinError;
@@ -77,7 +76,6 @@ use crate::ecs::actions::Actions;
use crate::ecs::query::term::Without;
use crate::ecs::sole::Single;
use crate::ecs::{Component, Query, Sole};
-use crate::image::{ColorType as ImageColorType, Image};
use crate::reflection::EnumReflectionExt;
use crate::rendering::backend::opengl::glutin_compat::{
DisplayBuilder,
@@ -117,6 +115,7 @@ use crate::rendering::{
Surface,
SurfaceId,
TargetWindow,
+ TextureCreation,
TexturePixelDataFormat,
TextureUpdate,
POST_RENDER_PHASE,
@@ -126,8 +125,6 @@ use crate::texture::{
CubeMapFace as CubeMapTextureFace,
Filtering as TextureFiltering,
Properties as TextureProperties,
- TexCubeMap,
- Texture,
Wrapping as TextureWrapping,
};
use crate::util::{MapVec, OptionExt};
@@ -364,7 +361,7 @@ enum BackendResource
{
texture: GlTexture,
pixel_data_format: TexturePixelDataFormat,
- metadata: TextureKind,
+ kind: TextureKind,
},
}
@@ -953,22 +950,39 @@ fn handle_commands(
)
.unwrap();
}
- Command::CreateTexture(object_id, texture) => {
- let _ = backend_resources.try_create_resource::<()>(
- object_store,
- object_id,
- || {
- let (gl_texture, texture_pixel_data_format, texture_kind) =
- create_texture_object(gl_context, assets, texture)
- .map_err(|_| ())?;
-
- Ok(BackendResource::Texture {
- texture: gl_texture,
- pixel_data_format: texture_pixel_data_format,
- metadata: texture_kind,
- })
- },
- );
+ Command::CreateTexture {
+ obj_id,
+ pixel_data_format,
+ creation,
+ properties,
+ } => {
+ let kind = match &creation {
+ TextureCreation::Texture2D { .. } => TextureKind::Texture2D,
+ TextureCreation::CubeMap { .. } => TextureKind::CubeMap,
+ };
+
+ if let Err(err) = backend_resources
+ .try_create_resource::<opengl_bindings::texture::Error>(
+ object_store,
+ obj_id,
+ || {
+ let gl_texture = create_gl_texture(
+ gl_context,
+ creation,
+ pixel_data_format,
+ &properties,
+ )?;
+
+ Ok(BackendResource::Texture {
+ texture: gl_texture,
+ pixel_data_format,
+ kind,
+ })
+ },
+ )
+ {
+ tracing::error!("Failed to create texture: {err}");
+ }
}
Command::UpdateTexture {
obj_id,
@@ -987,7 +1001,7 @@ fn handle_commands(
let BackendResource::Texture {
texture: gl_texture,
pixel_data_format: tex_pixel_data_format,
- metadata: tex_metadata,
+ kind: tex_metadata,
} = texture_resource
else {
unreachable!();
@@ -1298,176 +1312,6 @@ enum CreateGlContextError
MakeContextCurrent(#[source] GlMakeContextCurrentError),
}
-enum TextureCreationData<'a>
-{
- Texture2D
- {
- image: BorrowedOrOwned<'a, Image>
- },
- CubeMap
- {
- images: [(CubeMapTextureFace, BorrowedOrOwned<'a, Image>); 6],
- color_type: ImageColorType,
- is_srgb: bool,
- size: Dimens<u32>,
- },
-}
-
-fn validate_cube_map_texture(texture: &TexCubeMap) -> bool
-{
- let first_image_color_type = texture.images[0].1.color_type();
-
- if !texture.images[1..]
- .into_iter()
- .all(|(_, image)| image.color_type() == first_image_color_type)
- {
- tracing::error!("All texture images must have same color type");
- return false;
- }
-
- let first_image_size = texture.images[0].1.dimensions();
-
- if !texture.images[1..]
- .into_iter()
- .all(|(_, image)| image.dimensions() == first_image_size)
- {
- tracing::error!("All texture images must have same dimensions");
- return false;
- }
-
- let first_image_is_srgb = texture.images[0].1.color_space_is_srgb();
-
- if !texture.images[1..]
- .into_iter()
- .all(|(_, image)| image.color_space_is_srgb() == first_image_is_srgb)
- {
- tracing::error!("All texture images must have same color space");
- return false;
- }
-
- true
-}
-
-fn convert_textures_if_unaligned<const IMAGE_CNT: usize, Extra>(
- images: [(Extra, &Image); IMAGE_CNT],
- color_type: ImageColorType,
- size: Dimens<u32>,
-) -> [(Extra, BorrowedOrOwned<'_, Image>); IMAGE_CNT]
-{
- match color_type {
- ImageColorType::Rgb8 if (size.width * 3) % 4 != 0 => {
- // The texture will be corrupted if the alignment of each horizontal line of
- // the texture pixel array is not multiple of 4.
- //
- // Read more about this at
- // wikis.khronos.org/opengl/Common_Mistakes#Texture_upload_and_pixel_reads
- //
- // To prevent this, the image is converted to RGBA8. RGBA8 images have a pixel
- // size of 4 bytes so they cannot have any alignment problems
-
- // TODO: Make it clearer in warning log which texture is being talked about
- tracing::warn!(concat!(
- "Converting texture image from RGB8 to RGBA8 to prevent alignment ",
- "problems. This conversion may be slow. Consider changing the ",
- "texture image's pixel format to RGBA8"
- ));
-
- images.map(|(extra, image)| (extra, BorrowedOrOwned::Owned(image.to_rgba8())))
- }
- _ => images.map(|(extra, image)| (extra, BorrowedOrOwned::Borrowned(image))),
- }
-}
-
-#[tracing::instrument(skip_all)]
-fn create_texture_object(
- curr_gl_ctx: &MaybeCurrentContextWithFns,
- assets: &Assets,
- texture: AssetOrValue<Texture>,
-) -> Result<(GlTexture, TexturePixelDataFormat, TextureKind), ()>
-{
- let texture = match &texture {
- AssetOrValue::Asset(texture_asset) => {
- let Some(texture) = assets.get(&texture_asset) else {
- tracing::error!(
- texture_asset_id=?texture_asset.id(),
- "Texture asset does not exist"
- );
- return Err(());
- };
-
- texture
- }
- AssetOrValue::Value(texture) => texture,
- };
-
- let (texture_things, texture_properties, texture_pixel_data_format, texture_kind) =
- match texture {
- Texture::Texture2D(texture) => {
- let [(_, image)] = convert_textures_if_unaligned(
- [((), &texture.image)],
- texture.image.color_type(),
- texture.image.dimensions(),
- );
-
- let tex_pixel_data_format = TexturePixelDataFormat::for_image(&image)
- .expect("No pixel data format is available for image");
-
- (
- TextureCreationData::Texture2D { image },
- &texture.properties,
- tex_pixel_data_format,
- TextureKind::Texture2D,
- )
- }
- Texture::CubeMap(texture) => {
- if !validate_cube_map_texture(texture) {
- return Err(());
- }
-
- let first_image_color_type = texture.images[0].1.color_type();
- let first_image_size = texture.images[0].1.dimensions();
- let first_image_is_srgb = texture.images[0].1.color_space_is_srgb();
-
- let images = convert_textures_if_unaligned(
- std::array::from_fn::<_, 6, _>(|index| {
- let (face, image) = &texture.images[index];
-
- (*face, image)
- }),
- first_image_color_type,
- first_image_size,
- );
-
- let tex_pixel_data_format =
- TexturePixelDataFormat::for_image(&images[0].1)
- .expect("No pixel data format is available for image");
-
- (
- TextureCreationData::CubeMap {
- images,
- color_type: first_image_color_type,
- is_srgb: first_image_is_srgb,
- size: first_image_size,
- },
- &texture.properties,
- tex_pixel_data_format,
- TextureKind::CubeMap,
- )
- }
- };
-
- let gl_texture =
- match create_gl_texture(curr_gl_ctx, texture_things, texture_properties) {
- Ok(gl_texture) => gl_texture,
- Err(err) => {
- tracing::error!("Failed to create texture object: {err}");
- return Err(());
- }
- };
-
- Ok((gl_texture, texture_pixel_data_format, texture_kind))
-}
-
#[tracing::instrument(skip_all)]
fn update_texture_object(
curr_gl_ctx: &MaybeCurrentContextWithFns,
@@ -1540,12 +1384,6 @@ fn draw_mesh(
Ok(())
}
-struct ImageDataProperties
-{
- color_type: ImageColorType,
- is_srgb: bool,
-}
-
fn tex_pixel_data_format_into_gl(
tex_pixel_data_format: TexturePixelDataFormat,
) -> GlTexturePixelDataFormat
@@ -1582,59 +1420,30 @@ fn tex_pixel_data_format_into_gl(
}
}
-fn create_pixel_data_format(
- image_data_props: ImageDataProperties,
-) -> GlTexturePixelDataFormat
-{
- match image_data_props.color_type {
- ImageColorType::Rgb8 if image_data_props.is_srgb => {
- GlTexturePixelDataFormat::Srgb(
- opengl_bindings::texture::SrgbDataType::UnsignedByte,
- )
- }
- ImageColorType::Rgb8 => GlTexturePixelDataFormat::Rgb(
- opengl_bindings::texture::RgbDataType::UnsignedByte,
- ),
- ImageColorType::Rgba8 if image_data_props.is_srgb => {
- GlTexturePixelDataFormat::Srgba(
- opengl_bindings::texture::SrgbaDataType::UnsignedByte,
- )
- }
- ImageColorType::Rgba8 => GlTexturePixelDataFormat::Rgba(
- opengl_bindings::texture::RgbaDataType::UnsignedByte,
- ),
- _ => {
- unimplemented!();
- }
- }
-}
-
fn create_gl_texture(
curr_gl_context: &MaybeCurrentContextWithFns,
- texture_things: TextureCreationData<'_>,
+ texture_creation: TextureCreation,
+ texture_pixel_data_format: TexturePixelDataFormat,
texture_properties: &TextureProperties,
) -> Result<GlTexture, GlTextureError>
{
- let gl_texture = match texture_things {
- TextureCreationData::Texture2D { image } => GlTexture::builder()
- .size(image.dimensions().into())
- .create_2d(
+ let gl_texture = match texture_creation {
+ TextureCreation::Texture2D { size, image } => {
+ GlTexture::builder().size(size.into()).create_2d(
curr_gl_context,
- Some(image.as_bytes()),
- create_pixel_data_format(ImageDataProperties {
- color_type: image.color_type(),
- is_srgb: image.color_space_is_srgb(),
- }),
- ),
- TextureCreationData::CubeMap { images, color_type, is_srgb, size } => {
+ image.as_deref(),
+ tex_pixel_data_format_into_gl(texture_pixel_data_format),
+ )
+ }
+ TextureCreation::CubeMap { size, images } => {
GlTexture::builder().size(size.into()).create_cube_map(
curr_gl_context,
- Some(std::array::from_fn::<_, 6, _>(|index| {
- let (face, image) = &images[index];
-
- (cube_map_texture_face_to_gl(*face), image.as_bytes())
- })),
- create_pixel_data_format(ImageDataProperties { color_type, is_srgb }),
+ images.as_ref().map(|images| {
+ images.each_ref().map(|(face, image)| {
+ (cube_map_texture_face_to_gl(*face), &**image)
+ })
+ }),
+ tex_pixel_data_format_into_gl(texture_pixel_data_format),
)
}
}?;
diff --git a/engine/src/rendering/main_render_pass.rs b/engine/src/rendering/main_render_pass.rs
index 21c0745..895517b 100644
--- a/engine/src/rendering/main_render_pass.rs
+++ b/engine/src/rendering/main_render_pass.rs
@@ -2,6 +2,7 @@ use std::path::Path;
use std::sync::LazyLock;
use ecs::actions::Actions;
+use ecs::component::local::Local;
use ecs::pair::ChildOf;
use ecs::query::term::{Traverse, TraverseUp};
use ecs::uid::Uid;
@@ -9,11 +10,13 @@ use ecs::Component;
use crate::asset::{Assets, Id as AssetId, Label as AssetLabel};
use crate::camera::{Active as ActiveCamera, Camera};
-use crate::data_types::dimens::Dimens3;
+use crate::color::Rgba;
+use crate::data_types::dimens::{Dimens, Dimens3};
use crate::draw_flags::{DrawFlags, NoDraw, PolygonModeConfig};
use crate::ecs::query::term::{With, Without};
use crate::ecs::sole::Single;
use crate::ecs::Query;
+use crate::image::Image;
use crate::lighting::{
DirectionalLight,
Environmental as EnvironmentalLighting,
@@ -46,18 +49,19 @@ use crate::rendering::{
MeshUsage,
RenderPass,
RenderPasses,
+ RgbaTextureDataType,
Surface,
TargetWindow,
+ TextureCreation,
+ TexturePixelDataFormat,
};
use crate::scene::{Active as ActiveScene, Scene};
use crate::sky_box::SkyBox;
use crate::texture::{
Filtering as TextureFiltering,
Properties as TextureProperties,
- TexCubeMap,
Texture,
Wrapping as TextureWrapping,
- WHITE_1X1_ASSET_LABEL as TEXTURE_WHITE_1X1_ASSET_LABEL,
};
use crate::transform::Transform;
use crate::vector::Vec3;
@@ -92,6 +96,12 @@ struct SkyBoxIds
shader_asset: AssetId,
}
+#[derive(Debug, Default, Component)]
+pub struct MiscObjectIds
+{
+ white_1x1_tex_obj_id: Option<ObjectId>,
+}
+
#[tracing::instrument(skip_all)]
pub fn add_main_render_pass(
renderable_query: Query<RenderableEntity<'_>>,
@@ -123,6 +133,7 @@ pub fn add_main_render_pass(
mut render_passes: Single<RenderPasses>,
mut object_store: Single<ObjectStore>,
mut actions: Actions,
+ mut misc_object_ids: Local<MiscObjectIds>,
) -> Result<(), crate::Error>
{
let assets = assets.get_mut()?;
@@ -170,20 +181,33 @@ pub fn add_main_render_pass(
.commands
.push(Command::MakeCurrent(window_surface.id));
- let default_texture_asset = assets
- .get_handle_to_loaded::<Texture>(TEXTURE_WHITE_1X1_ASSET_LABEL.clone())
- .expect("Not possible");
+ let white_1x1_tex_obj_id =
+ *misc_object_ids.white_1x1_tex_obj_id.get_or_insert_with(|| {
+ let white_1x1_tex_obj_id = ObjectId::new_sequential();
- if !object_store
- .contains_maybe_pending_with_id(&ObjectId::Asset(default_texture_asset.id()))
- {
- object_store.insert_pending(ObjectId::Asset(default_texture_asset.id()));
+ object_store.insert_pending(white_1x1_tex_obj_id);
- render_pass.commands.push(Command::CreateTexture(
- ObjectId::Asset(default_texture_asset.id()),
- AssetOrValue::Asset(default_texture_asset),
- ));
- }
+ render_pass.commands.push(Command::CreateTexture {
+ obj_id: white_1x1_tex_obj_id,
+ pixel_data_format: TexturePixelDataFormat::Rgba(
+ RgbaTextureDataType::UnsignedByte,
+ ),
+ creation: TextureCreation::Texture2D {
+ size: Dimens { width: 1, height: 1 },
+ image: Some(
+ Image::from_color(
+ Rgba::<u8>::white(),
+ Dimens { width: 1, height: 1 },
+ )
+ .into_bytes()
+ .into_boxed_slice(),
+ ),
+ },
+ properties: TextureProperties::default(),
+ });
+
+ white_1x1_tex_obj_id
+ });
let sky_box_ids = if let Some(scene_skybox) = &scene_skybox {
load_sky_box(
@@ -279,16 +303,45 @@ pub fn add_main_render_pass(
.into_iter()
.flatten()
{
- if !object_store
- .contains_maybe_pending_with_id(&ObjectId::Asset(texture_asset.id()))
- {
- object_store.insert_pending(ObjectId::Asset(texture_asset.id()));
-
- render_pass.commands.push(Command::CreateTexture(
- ObjectId::Asset(texture_asset.id()),
- AssetOrValue::Asset(texture_asset.clone()),
- ));
+ let Some(texture) = assets.get(texture_asset) else {
+ continue;
+ };
+
+ let Texture::Texture2D(texture) = texture else {
+ tracing::error!(
+ texture_asset_id = ?texture_asset.id(),
+ texture_asset_label = ?assets.get_label(texture_asset),
+ "Material texture map is not 2D"
+ );
+ continue;
+ };
+
+ let texture_object_id = ObjectId::Asset(texture_asset.id());
+
+ if object_store.contains_maybe_pending_with_id(&texture_object_id) {
+ continue;
}
+
+ let Some(tex_pixel_data_format) =
+ TexturePixelDataFormat::for_image(&texture.image)
+ else {
+ tracing::error!(
+ "No texture pixel data format is available for image"
+ );
+ continue;
+ };
+
+ object_store.insert_pending(texture_object_id);
+
+ render_pass.commands.push(Command::CreateTexture {
+ obj_id: texture_object_id,
+ pixel_data_format: tex_pixel_data_format,
+ creation: TextureCreation::Texture2D {
+ size: texture.image.dimensions(),
+ image: Some(texture.image.as_bytes().to_vec().into_boxed_slice()),
+ },
+ properties: texture.properties.clone(),
+ });
}
add_set_3d_shader_bindings(
@@ -303,8 +356,8 @@ pub fn add_main_render_pass(
&window,
&point_light_query,
&directional_light_query,
- assets,
shader_program,
+ white_1x1_tex_obj_id,
)?;
if let Some(draw_flags) = draw_flags.as_deref().and_then(|draw_flags| {
@@ -448,8 +501,8 @@ fn add_set_3d_shader_bindings(
&DirectionalLight,
Traverse<(With<Scene>, With<ActiveScene>), TraverseUp, ChildOf>,
)>,
- assets: &Assets,
shader_program: &ShaderProgram,
+ white_1x1_tex_obj_id: ObjectId,
) -> Result<(), crate::Error>
{
let (material, material_flags, transform) = renderable;
@@ -524,16 +577,8 @@ fn add_set_3d_shader_bindings(
material
.ambient_map
.as_ref()
- .map(|ambient_map| ambient_map.clone())
- .unwrap_or_else(|| {
- assets
- .get_handle_to_loaded(
- TEXTURE_WHITE_1X1_ASSET_LABEL.clone(),
- )
- .expect("Not possible")
- })
- .id()
- .into(),
+ .map(|ambient_map| ObjectId::Asset(ambient_map.id()))
+ .unwrap_or(white_1x1_tex_obj_id),
ShaderBindingTextureKind::Texture2D,
))?,
shader_cursor
@@ -542,16 +587,8 @@ fn add_set_3d_shader_bindings(
material
.diffuse_map
.as_ref()
- .map(|diffuse_map| diffuse_map.clone())
- .unwrap_or_else(|| {
- assets
- .get_handle_to_loaded(
- TEXTURE_WHITE_1X1_ASSET_LABEL.clone(),
- )
- .expect("Not possible")
- })
- .id()
- .into(),
+ .map(|diffuse_map| ObjectId::Asset(diffuse_map.id()))
+ .unwrap_or(white_1x1_tex_obj_id),
ShaderBindingTextureKind::Texture2D,
))?,
shader_cursor
@@ -560,16 +597,8 @@ fn add_set_3d_shader_bindings(
material
.specular_map
.as_ref()
- .map(|specular_map| specular_map.clone())
- .unwrap_or_else(|| {
- assets
- .get_handle_to_loaded(
- TEXTURE_WHITE_1X1_ASSET_LABEL.clone(),
- )
- .expect("Not possible")
- })
- .id()
- .into(),
+ .map(|specular_map| ObjectId::Asset(specular_map.id()))
+ .unwrap_or(white_1x1_tex_obj_id),
ShaderBindingTextureKind::Texture2D,
))?,
material_shader_cursor
@@ -769,17 +798,24 @@ fn load_sky_box(
object_store.insert_pending(texture_object_id);
- render_pass.commands.push(Command::CreateTexture(
- texture_object_id,
- AssetOrValue::Value(Texture::CubeMap(TexCubeMap {
- images: part_images.map(|(face, image)| (face, image.clone())),
- properties: TextureProperties::builder()
- .minifying_filter(TextureFiltering::Linear)
- .magnifying_filter(TextureFiltering::Linear)
- .wrap(TextureWrapping::ClampToEdge)
- .build(),
- })),
- ));
+ render_pass.commands.push(Command::CreateTexture {
+ obj_id: texture_object_id,
+ pixel_data_format: TexturePixelDataFormat::for_image(
+ part_images[0].1,
+ )
+ .expect("No texture pixel data format is available for image"),
+ creation: TextureCreation::CubeMap {
+ size: part_images[0].1.dimensions(),
+ images: Some(part_images.map(|(face, image)| {
+ (face, image.as_bytes().to_vec().into_boxed_slice())
+ })),
+ },
+ properties: TextureProperties::builder()
+ .minifying_filter(TextureFiltering::Linear)
+ .magnifying_filter(TextureFiltering::Linear)
+ .wrap(TextureWrapping::ClampToEdge)
+ .build(),
+ });
texture_object_id
}
diff --git a/engine/src/texture.rs b/engine/src/texture.rs
index 3bfe171..0c3e884 100644
--- a/engine/src/texture.rs
+++ b/engine/src/texture.rs
@@ -1,17 +1,9 @@
use std::path::Path;
-use std::sync::LazyLock;
-use crate::asset::{Assets, Label as AssetLabel, Submitter as AssetSubmitter};
+use crate::asset::{Assets, Submitter as AssetSubmitter};
use crate::builder;
-use crate::color::Rgba;
-use crate::data_types::dimens::Dimens;
use crate::image::{Error as ImageError, Image};
-pub static WHITE_1X1_ASSET_LABEL: LazyLock<AssetLabel> = LazyLock::new(|| AssetLabel {
- path: Path::new("").into(),
- name: Some("white_1x1_texture".into()),
-});
-
#[derive(Debug, Clone)]
pub enum Texture
{
@@ -132,14 +124,6 @@ impl Default for ImportSettingsBuilder
pub(crate) fn initialize(assets: &mut Assets)
{
assets.set_importer::<_, _>(["png", "jpg"], import);
-
- assets.store_with_label(
- WHITE_1X1_ASSET_LABEL.clone(),
- Texture::Texture2D(Tex2D {
- image: Image::from_color(Rgba::<u8>::white(), Dimens { width: 1, height: 1 }),
- properties: Properties::default(),
- }),
- );
}
fn import(
diff --git a/engine/src/ui/dear_imgui.rs b/engine/src/ui/dear_imgui.rs
index b9214d8..d3ca4dc 100644
--- a/engine/src/ui/dear_imgui.rs
+++ b/engine/src/ui/dear_imgui.rs
@@ -22,13 +22,7 @@ use ecs::time::Time;
use ecs::{Component, Query, Sole};
use crate::asset::{Assets, Handle as AssetHandle, Label as AssetLabel};
-use crate::data_types::color::Rgba;
use crate::data_types::dimens::Dimens;
-use crate::image::{
- Image,
- PixelBuffer as ImagePixelBuffer,
- PixelBufferLenIncorrectForSize as ImagePixelBufferLenIncorrectForSize,
-};
use crate::input::keyboard::{Key, Keyboard};
use crate::input::mouse::{Button as MouseButton, Buttons as MouseButtons, Mouse};
use crate::mesh::vertex_buffer::{
@@ -72,11 +66,12 @@ use crate::rendering::{
SrgbaTextureDataType,
Surface,
SurfaceId,
+ TextureCreation,
TexturePixelDataFormat,
TextureUpdate,
PRE_RENDER_PHASE,
};
-use crate::texture::{Properties as TextureProperties, Tex2D, Texture};
+use crate::texture::Properties as TextureProperties;
use crate::util::MapVec;
use crate::vector::Vec2;
use crate::windowing::dpi::PhysicalSize;
@@ -546,27 +541,19 @@ fn add_drawing_render_pass(
"Performing texture operation: Create"
);
- let image =
- match Image::from_pixels(ImagePixelBuffer::<Rgba<u8>, _>::new(
- pixels.as_slice(),
- Dimens { width: *width, height: *height },
- )) {
- Ok(image) => image,
- Err(ImagePixelBufferLenIncorrectForSize) => {
- tracing::error!("Not enough texture pixels for texture size");
- continue;
- }
- };
-
let texture_object_id = RenderingObjectId::new_sequential();
- render_pass.commands.push(RenderingCommand::CreateTexture(
- texture_object_id,
- AssetOrValue::Value(Texture::Texture2D(Tex2D {
- image,
- properties: TextureProperties::default(),
- })),
- ));
+ render_pass.commands.push(RenderingCommand::CreateTexture {
+ obj_id: texture_object_id,
+ pixel_data_format: TexturePixelDataFormat::Srgba(
+ SrgbaTextureDataType::UnsignedByte,
+ ),
+ creation: TextureCreation::Texture2D {
+ size: Dimens { width: *width, height: *height },
+ image: Some(pixels.clone().into_boxed_slice()),
+ },
+ properties: TextureProperties::default(),
+ });
texture_lookup.insert(texture_lookup_id, texture_object_id);