diff options
| -rw-r--r-- | engine/src/lib.rs | 2 | ||||
| -rw-r--r-- | engine/src/rendering.rs (renamed from engine/src/renderer.rs) | 8 | ||||
| -rw-r--r-- | engine/src/rendering/blending.rs (renamed from engine/src/renderer/blending.rs) | 0 | ||||
| -rw-r--r-- | engine/src/rendering/main_render_pass.rs (renamed from engine/src/renderer/main_render_pass.rs) | 128 | ||||
| -rw-r--r-- | engine/src/rendering/object.rs (renamed from engine/src/renderer/object.rs) | 8 | ||||
| -rw-r--r-- | engine/src/rendering/opengl.rs (renamed from engine/src/renderer/opengl.rs) | 111 | ||||
| -rw-r--r-- | engine/src/rendering/opengl/glutin_compat.rs (renamed from engine/src/renderer/opengl/glutin_compat.rs) | 0 | ||||
| -rw-r--r-- | engine/src/rendering/opengl/graphics_mesh.rs (renamed from engine/src/renderer/opengl/graphics_mesh.rs) | 2 | ||||
| -rw-r--r-- | engine/src/shader/default.rs | 2 |
9 files changed, 122 insertions, 139 deletions
diff --git a/engine/src/lib.rs b/engine/src/lib.rs index 4b06f5a..d6ca6df 100644 --- a/engine/src/lib.rs +++ b/engine/src/lib.rs @@ -33,7 +33,7 @@ pub mod mesh; pub mod model; pub mod projection; pub mod reflection; -pub mod renderer; +pub mod rendering; pub mod shader; pub mod texture; pub mod transform; diff --git a/engine/src/renderer.rs b/engine/src/rendering.rs index 1814391..d7d3007 100644 --- a/engine/src/renderer.rs +++ b/engine/src/rendering.rs @@ -20,8 +20,8 @@ use crate::ecs::system::observer::Observe; use crate::ecs::system::Into; use crate::ecs::{declare_entity, Component, Query, Sole}; use crate::mesh::Mesh; -use crate::renderer::blending::Config as BlendingConfig; -use crate::renderer::object::{Id as ObjectId, Store as ObjectStore}; +use crate::rendering::blending::Config as BlendingConfig; +use crate::rendering::object::{Id as ObjectId, Store as ObjectStore}; use crate::shader::cursor::{ BindingLocation as ShaderBindingLocation, BindingValue as ShaderBindingValue, @@ -369,9 +369,7 @@ bitflags! { } } -/// Renderer command FIFO queue. -/// -/// This component is present in renderer context entities. +/// Rendering command FIFO queue. #[derive(Debug, Sole)] pub struct CommandQueue { diff --git a/engine/src/renderer/blending.rs b/engine/src/rendering/blending.rs index 9ae2f82..9ae2f82 100644 --- a/engine/src/renderer/blending.rs +++ b/engine/src/rendering/blending.rs diff --git a/engine/src/renderer/main_render_pass.rs b/engine/src/rendering/main_render_pass.rs index 0926d85..a733482 100644 --- a/engine/src/renderer/main_render_pass.rs +++ b/engine/src/rendering/main_render_pass.rs @@ -4,17 +4,17 @@ use crate::ecs::query::term::{With, Without}; use crate::ecs::sole::Single; use crate::ecs::Query; use crate::model::{MaterialSearchResult, Model}; -use crate::renderer::object::{Id as RendererObjectId, Store as RendererObjectStore}; -use crate::renderer::{ - BufferClearMask as RendererBufferClearMask, - Command as RendererCommand, - DrawMeshOptions as RendererDrawMeshOptions, - DrawProperties as RendererDrawProperties, - DrawPropertiesUpdateFlags as RendererDrawPropertiesUpdateFlags, - MeshUsage as RendererMeshUsage, +use crate::rendering::object::{Id as ObjectId, Store as ObjectStore}; +use crate::rendering::{ + BufferClearMask, + Command, + DrawMeshOptions, + DrawProperties, + DrawPropertiesUpdateFlags, + MeshUsage, PendingShaderBindings, RenderPass, - RenderPasses as RendererRenderPasses, + RenderPasses, SurfaceSpec, }; use crate::shader::default::ASSET_LABEL as DEFAULT_SHADER_ASSET_LABEL; @@ -39,8 +39,8 @@ pub fn add_main_render_passes( window_surface_spec_query: Query<(&SurfaceSpec,), (With<Window>,)>, assets: Single<Assets>, shader_context: Single<ShaderContext>, - mut render_passes: Single<RendererRenderPasses>, - mut object_store: Single<RendererObjectStore>, + mut render_passes: Single<RenderPasses>, + mut object_store: Single<ObjectStore>, ) { let Some(default_shader_asset) = assets @@ -52,31 +52,30 @@ pub fn add_main_render_passes( let render_pass = render_passes.passes.push_front_mut(RenderPass { commands: Vec::with_capacity(30), - draw_properties: RendererDrawProperties::default(), + draw_properties: DrawProperties::default(), }); for (surface_spec,) in &window_surface_spec_query { render_pass .commands - .push(RendererCommand::MakeCurrent(surface_spec.id)); + .push(Command::MakeCurrent(surface_spec.id)); let default_texture_asset = assets .get_handle_to_loaded::<Texture>(TEXTURE_WHITE_1X1_ASSET_LABEL.clone()) .expect("Not possible"); - if !object_store.contains_maybe_pending_with_id(&RendererObjectId::Asset( - default_texture_asset.id(), - )) { - object_store - .insert_pending(RendererObjectId::Asset(default_texture_asset.id())); + if !object_store + .contains_maybe_pending_with_id(&ObjectId::Asset(default_texture_asset.id())) + { + object_store.insert_pending(ObjectId::Asset(default_texture_asset.id())); render_pass .commands - .push(RendererCommand::CreateTexture(default_texture_asset)); + .push(Command::CreateTexture(default_texture_asset)); } - render_pass.commands.push(RendererCommand::ClearBuffers( - RendererBufferClearMask::COLOR | RendererBufferClearMask::DEPTH, + render_pass.commands.push(Command::ClearBuffers( + BufferClearMask::COLOR | BufferClearMask::DEPTH, )); for (model, draw_flags, shader, mut pending_shader_bindings) in &renderable_query @@ -121,9 +120,9 @@ pub fn add_main_render_passes( } // MaterialSearchResult::NoMaterials => None, }; - if !object_store.contains_maybe_pending_with_id(&RendererObjectId::Asset( - shader_asset.id(), - )) { + if !object_store + .contains_maybe_pending_with_id(&ObjectId::Asset(shader_asset.id())) + { let Some(shader_program) = shader_context.get_program(&shader_asset.id()) else { tracing::error!( @@ -133,19 +132,17 @@ pub fn add_main_render_passes( continue; }; - object_store.insert_pending(RendererObjectId::Asset(shader_asset.id())); + object_store.insert_pending(ObjectId::Asset(shader_asset.id())); - render_pass - .commands - .push(RendererCommand::CreateShaderProgram( - RendererObjectId::Asset(shader_asset.id()), - shader_program.clone(), - )); + render_pass.commands.push(Command::CreateShaderProgram( + ObjectId::Asset(shader_asset.id()), + shader_program.clone(), + )); } - render_pass.commands.push(RendererCommand::ActivateShader( - RendererObjectId::Asset(shader_asset.id()), - )); + render_pass + .commands + .push(Command::ActivateShader(ObjectId::Asset(shader_asset.id()))); let Some(model_material) = assets.get(&model_material_asset) else { // TODO: Handle this case since it may occur @@ -160,22 +157,21 @@ pub fn add_main_render_passes( .into_iter() .flatten() { - if !object_store.contains_maybe_pending_with_id(&RendererObjectId::Asset( - texture_asset.id(), - )) { - object_store - .insert_pending(RendererObjectId::Asset(texture_asset.id())); + 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(RendererCommand::CreateTexture(texture_asset.clone())); + .push(Command::CreateTexture(texture_asset.clone())); } } for (shader_binding_loc, shader_binding_val) in &pending_shader_bindings.bindings { - render_pass.commands.push(RendererCommand::SetShaderBinding( + render_pass.commands.push(Command::SetShaderBinding( shader_binding_loc.clone(), shader_binding_val.clone(), )); @@ -188,7 +184,7 @@ pub fn add_main_render_passes( continue; } - render_pass.commands.push(RendererCommand::SetShaderBinding( + render_pass.commands.push(Command::SetShaderBinding( shader_binding_loc.clone(), shader_binding_val.clone(), )); @@ -201,46 +197,42 @@ pub fn add_main_render_passes( None } }) { - render_pass - .commands - .push(RendererCommand::UpdateDrawProperties( - RendererDrawProperties { - polygon_mode_config: draw_flags.polygon_mode_config.clone(), - ..Default::default() - }, - RendererDrawPropertiesUpdateFlags::POLYGON_MODE_CONFIG, - )); + render_pass.commands.push(Command::UpdateDrawProperties( + DrawProperties { + polygon_mode_config: draw_flags.polygon_mode_config.clone(), + ..Default::default() + }, + DrawPropertiesUpdateFlags::POLYGON_MODE_CONFIG, + )); } if !object_store - .contains_maybe_pending_with_id(&RendererObjectId::Asset(mesh_asset.id())) + .contains_maybe_pending_with_id(&ObjectId::Asset(mesh_asset.id())) { - object_store.insert_pending(RendererObjectId::Asset(mesh_asset.id())); + object_store.insert_pending(ObjectId::Asset(mesh_asset.id())); - render_pass.commands.push(RendererCommand::CreateMesh { - obj_id: RendererObjectId::Asset(mesh_asset.id()), + render_pass.commands.push(Command::CreateMesh { + obj_id: ObjectId::Asset(mesh_asset.id()), mesh: None, - usage: RendererMeshUsage::Static, + usage: MeshUsage::Static, }); } - render_pass.commands.push(RendererCommand::DrawMesh( - RendererObjectId::Asset(mesh_asset.id()), - RendererDrawMeshOptions::default(), + render_pass.commands.push(Command::DrawMesh( + ObjectId::Asset(mesh_asset.id()), + DrawMeshOptions::default(), )); if draw_flags.as_deref().is_some_and(|draw_flags| { draw_flags.polygon_mode_config != PolygonModeConfig::default() }) { - render_pass - .commands - .push(RendererCommand::UpdateDrawProperties( - RendererDrawProperties { - polygon_mode_config: PolygonModeConfig::default(), - ..Default::default() - }, - RendererDrawPropertiesUpdateFlags::POLYGON_MODE_CONFIG, - )); + render_pass.commands.push(Command::UpdateDrawProperties( + DrawProperties { + polygon_mode_config: PolygonModeConfig::default(), + ..Default::default() + }, + DrawPropertiesUpdateFlags::POLYGON_MODE_CONFIG, + )); } } } diff --git a/engine/src/renderer/object.rs b/engine/src/rendering/object.rs index e10011d..ead20e6 100644 --- a/engine/src/renderer/object.rs +++ b/engine/src/rendering/object.rs @@ -6,7 +6,7 @@ use crate::ecs::Sole; pub type RawValue = u32; -/// Renderer object ID. +/// Rendering object ID. #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] pub enum Id { @@ -37,7 +37,7 @@ impl Id #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct SequentialId(u64); -/// Renderer object store. +/// Rendering object store. #[derive(Debug, Default, Sole)] pub struct Store { @@ -99,7 +99,7 @@ impl Store } } -/// Renderer object. +/// Rendering object. #[derive(Debug, Clone)] pub struct Object { @@ -125,7 +125,7 @@ impl Object } } -/// Renderer object kind. +/// Rendering object kind. #[derive(Debug, Clone, Copy)] #[non_exhaustive] pub enum Kind diff --git a/engine/src/renderer/opengl.rs b/engine/src/rendering/opengl.rs index d77956e..2845464 100644 --- a/engine/src/renderer/opengl.rs +++ b/engine/src/rendering/opengl.rs @@ -74,23 +74,26 @@ use crate::ecs::{Component, Query, Sole}; use crate::image::{ColorType as ImageColorType, Image}; use crate::matrix::Matrix; use crate::reflection::EnumReflectionExt; -use crate::renderer::blending::{Equation as BlendingEquation, Factor as BlendingFactor}; -use crate::renderer::object::{ - Id as RendererObjectId, - Kind as RendererObjectKind, - Object as RendererObject, - RawValue as RendererObjectRawValue, - Store as RendererObjectStore, +use crate::rendering::blending::{ + Equation as BlendingEquation, + Factor as BlendingFactor, }; -use crate::renderer::opengl::glutin_compat::{ +use crate::rendering::object::{ + Id as ObjectId, + Kind as ObjectKind, + Object, + RawValue as ObjectRawValue, + Store as ObjectStore, +}; +use crate::rendering::opengl::glutin_compat::{ DisplayBuilder, Error as GlutinCompatError, }; -use crate::renderer::opengl::graphics_mesh::GraphicsMesh; -use crate::renderer::{ +use crate::rendering::opengl::graphics_mesh::GraphicsMesh; +use crate::rendering::{ BufferClearMask, - Command as RendererCommand, - CommandQueue as RendererCommandQueue, + Command, + CommandQueue, DrawMeshOptions, DrawPropertiesUpdateFlags, GraphicsProperties, @@ -137,9 +140,9 @@ struct GraphicsContext gl_context: Option<MaybeCurrentContextWithFns>, surfaces: HashMap<SurfaceId, GraphicsContextSurface>, shader_uniform_buffer_objs: - HashMap<RendererObjectId, HashMap<u32, opengl_bindings::buffer::Buffer<u8>>>, - objects: HashMap<RendererObjectRawValue, GraphicsContextObject>, - next_object_key: RendererObjectRawValue, + HashMap<ObjectId, HashMap<u32, opengl_bindings::buffer::Buffer<u8>>>, + objects: HashMap<ObjectRawValue, GraphicsContextObject>, + next_object_key: ObjectRawValue, } #[derive(Debug)] @@ -155,7 +158,7 @@ enum GraphicsContextObject Mesh { mesh: GraphicsMesh, - compatible_shader_program_obj_id: RendererObjectId, + compatible_shader_program_obj_id: ObjectId, }, } @@ -398,8 +401,8 @@ fn init_window_graphics( #[tracing::instrument(skip_all)] fn handle_commands( mut graphics_ctx: Single<GraphicsContext>, - mut object_store: Single<RendererObjectStore>, - mut command_queue: Single<RendererCommandQueue>, + mut object_store: Single<ObjectStore>, + mut command_queue: Single<CommandQueue>, assets: Single<Assets>, shader_context: Single<ShaderContext>, ) @@ -416,8 +419,7 @@ fn handle_commands( return; }; - let mut activated_gl_shader_program: Option<(RendererObjectId, GlShaderProgram)> = - None; + let mut activated_gl_shader_program: Option<(ObjectId, GlShaderProgram)> = None; for command in command_queue.drain() { let tracing_span = tracing::info_span!( @@ -427,7 +429,7 @@ fn handle_commands( let _tracing_span_enter = tracing_span.enter(); match command { - RendererCommand::RemoveSurface(surface_id) => { + Command::RemoveSurface(surface_id) => { let Some(surface) = surfaces.remove(&surface_id) else { tracing::error!(surface_id=?surface_id, "Surface does not exist"); continue; @@ -445,7 +447,7 @@ fn handle_commands( drop(surface); } - RendererCommand::MakeCurrent(surface_id) => { + Command::MakeCurrent(surface_id) => { let Some(surface) = surfaces.get(&surface_id) else { tracing::error!(surface_id=?surface_id, "Surface does not exist"); continue; @@ -464,7 +466,7 @@ fn handle_commands( tracing::error!("Failed to set viewport: {err}"); } } - RendererCommand::SetSurfaceSize(surface_id, new_surface_size) => { + Command::SetSurfaceSize(surface_id, new_surface_size) => { let Some(surface) = surfaces.get_mut(&surface_id) else { tracing::error!(surface_id=?surface_id, "Surface does not exist"); continue; @@ -484,7 +486,7 @@ fn handle_commands( tracing::error!("Failed to set viewport: {err}"); } } - RendererCommand::ClearBuffers(buffer_clear_mask) => { + Command::ClearBuffers(buffer_clear_mask) => { let mut clear_mask = GlBufferClearMask::empty(); clear_mask.set( @@ -504,7 +506,7 @@ fn handle_commands( clear_buffers(gl_context, clear_mask); } - RendererCommand::SwapBuffers(surface_id) => { + Command::SwapBuffers(surface_id) => { let Some(surface) = surfaces.get(&surface_id) else { tracing::error!(surface_id=?surface_id, "Surface does not exist"); continue; @@ -516,10 +518,7 @@ fn handle_commands( tracing::error!("Failed to swap buffers: {err}"); } } - RendererCommand::CreateShaderProgram( - shader_program_obj_id, - shader_program, - ) => { + Command::CreateShaderProgram(shader_program_obj_id, shader_program) => { if object_store.contains_non_pending_with_id(&shader_program_obj_id) { tracing::error!( shader_program_object_id=?shader_program_obj_id, @@ -542,13 +541,13 @@ fn handle_commands( object_store.insert( shader_program_obj_id, - RendererObject::from_raw( + Object::from_raw( gl_shader_program.into_raw(), - RendererObjectKind::ShaderProgram, + ObjectKind::ShaderProgram, ), ); } - RendererCommand::ActivateShader(shader_program_obj_id) => { + Command::ActivateShader(shader_program_obj_id) => { let Some(shader_program_obj) = object_store.get_shader_program_obj(&shader_program_obj_id) else { @@ -564,7 +563,7 @@ fn handle_commands( activated_gl_shader_program = Some((shader_program_obj_id, gl_shader_program)); } - RendererCommand::SetShaderBinding(binding_location, binding_value) => { + Command::SetShaderBinding(binding_location, binding_value) => { let Some((activated_gl_shader_program_obj_id, _)) = &activated_gl_shader_program else { @@ -574,10 +573,10 @@ fn handle_commands( if let ShaderBindingValue::Texture(texture_asset) = &binding_value { let Some(texture_obj) = object_store - .get_texture_obj(&RendererObjectId::Asset(texture_asset.id())) + .get_texture_obj(&ObjectId::Asset(texture_asset.id())) else { tracing::error!( - "Texture {:?} does not exist in renderer object store", + "Texture {:?} does not exist in rendering object store", assets.get_label(texture_asset) ); continue; @@ -654,7 +653,7 @@ fn handle_commands( ) .unwrap(); } - RendererCommand::CreateTexture(texture_asset) => { + Command::CreateTexture(texture_asset) => { if let Err(err) = create_texture_object( gl_context, &mut object_store, @@ -664,7 +663,7 @@ fn handle_commands( tracing::error!("Failed to create texture object: {err}"); } } - RendererCommand::CreateMesh { + Command::CreateMesh { obj_id: mesh_object_id, mesh, usage: mesh_usage, @@ -680,7 +679,7 @@ fn handle_commands( continue; } - let Some((RendererObjectId::Asset(curr_shader_program_asset_id), _)) = + let Some((ObjectId::Asset(curr_shader_program_asset_id), _)) = &activated_gl_shader_program else { tracing::error!("No shader program is activated"); @@ -701,7 +700,7 @@ fn handle_commands( let key = *next_graphics_ctx_object_key; let mesh = match mesh_object_id { - RendererObjectId::Asset(mesh_asset_id) => match mesh.as_ref() { + ObjectId::Asset(mesh_asset_id) => match mesh.as_ref() { Some(mesh) => mesh, None => { let Some(mesh) = @@ -717,7 +716,7 @@ fn handle_commands( mesh } }, - RendererObjectId::Sequential(_) => { + ObjectId::Sequential(_) => { let Some(mesh) = mesh.as_ref() else { tracing::error!( object_id=?mesh_object_id, @@ -747,7 +746,7 @@ fn handle_commands( key, GraphicsContextObject::Mesh { mesh: graphics_mesh, - compatible_shader_program_obj_id: RendererObjectId::Asset( + compatible_shader_program_obj_id: ObjectId::Asset( *curr_shader_program_asset_id, ), }, @@ -755,15 +754,12 @@ fn handle_commands( object_store.insert( mesh_object_id, - RendererObject::from_raw( - key, - RendererObjectKind::ImplementationSpecific, - ), + Object::from_raw(key, ObjectKind::ImplementationSpecific), ); *next_graphics_ctx_object_key += 1; } - RendererCommand::UpdateMesh { + Command::UpdateMesh { obj_id: mesh_object_id, mesh, usage: mesh_usage, @@ -808,7 +804,7 @@ fn handle_commands( tracing::error!("Failed to update mesh: {err}"); } } - RendererCommand::RemoveMesh(mesh_object_id) => { + Command::RemoveMesh(mesh_object_id) => { let Some(mesh_graphics_ctx_obj_key) = object_store .remove(&mesh_object_id) .flatten() @@ -846,7 +842,7 @@ fn handle_commands( graphics_mesh.destroy(gl_context); } - RendererCommand::DrawMesh(mesh_object_id, draw_mesh_opts) => { + Command::DrawMesh(mesh_object_id, draw_mesh_opts) => { let Some(mesh_graphics_ctx_obj_key) = object_store .get_obj(&mesh_object_id) .map(|obj| obj.as_raw()) @@ -901,10 +897,7 @@ fn handle_commands( tracing::error!("Failed to draw mesh: {err}"); }; } - RendererCommand::UpdateDrawProperties( - draw_props, - draw_props_update_flags, - ) => { + Command::UpdateDrawProperties(draw_props, draw_props_update_flags) => { if draw_props_update_flags .contains(DrawPropertiesUpdateFlags::POLYGON_MODE_CONFIG) { @@ -1040,18 +1033,18 @@ enum CreateGlContextError #[tracing::instrument(skip_all)] fn create_texture_object( curr_gl_ctx: &MaybeCurrentContextWithFns, - renderer_object_store: &mut RendererObjectStore, + object_store: &mut ObjectStore, assets: &Assets, texture_asset: &AssetHandle<Texture>, ) -> Result<(), GlTextureGenerateError> { - let object_id = RendererObjectId::Asset(texture_asset.id()); + let object_id = ObjectId::Asset(texture_asset.id()); - if renderer_object_store.contains_non_pending_with_id(&object_id) { + if object_store.contains_non_pending_with_id(&object_id) { tracing::error!( texture_object_id=?object_id, texture_asset_label=?assets.get_label(texture_asset), - "Renderer object store already contains object with this ID" + " object store already contains object with this ID" ); return Ok(()); } @@ -1088,12 +1081,12 @@ fn create_texture_object( _ => &texture.image, }; - renderer_object_store.insert( + object_store.insert( object_id, - RendererObject::from_raw( + Object::from_raw( create_gl_texture(curr_gl_ctx, texture_image, &texture.properties)? .into_raw(), - RendererObjectKind::Texture, + ObjectKind::Texture, ), ); diff --git a/engine/src/renderer/opengl/glutin_compat.rs b/engine/src/rendering/opengl/glutin_compat.rs index cfd6ea7..cfd6ea7 100644 --- a/engine/src/renderer/opengl/glutin_compat.rs +++ b/engine/src/rendering/opengl/glutin_compat.rs diff --git a/engine/src/renderer/opengl/graphics_mesh.rs b/engine/src/rendering/opengl/graphics_mesh.rs index 78de80c..4933197 100644 --- a/engine/src/renderer/opengl/graphics_mesh.rs +++ b/engine/src/rendering/opengl/graphics_mesh.rs @@ -9,7 +9,7 @@ use opengl_bindings::vertex_array::{ use opengl_bindings::MaybeCurrentContextWithFns as GlCurrentContextWithFns; use crate::mesh::{Mesh, VertexAttrType}; -use crate::renderer::MeshUsage; +use crate::rendering::MeshUsage; use crate::shader::VertexDescription as ShaderVertexDescription; #[derive(Debug)] diff --git a/engine/src/shader/default.rs b/engine/src/shader/default.rs index 8144fdf..1dc85fc 100644 --- a/engine/src/shader/default.rs +++ b/engine/src/shader/default.rs @@ -14,7 +14,7 @@ use crate::material::{Flags as MaterialFlags, Material}; use crate::matrix::Matrix; use crate::model::{MaterialSearchResult, Model}; use crate::projection::{ClipVolume as ProjectionClipVolume, Projection}; -use crate::renderer::{PendingShaderBindings, SurfaceSpec}; +use crate::rendering::{PendingShaderBindings, SurfaceSpec}; use crate::shader::cursor::{BindingValue as ShaderBindingValue, Cursor as ShaderCursor}; use crate::shader::{ Context as ShaderContext, |
