chore: renamed the resources directory to res

This commit is contained in:
lisk77 2025-07-26 01:22:42 +02:00
parent 05a4679f38
commit 913f200a63
22 changed files with 1273 additions and 1105 deletions

2
.gitignore vendored
View file

@ -1,2 +1,4 @@
/Cargo.lock
/target /target
/build.rs /build.rs
/src/main.rs

View file

@ -20,7 +20,7 @@ project
│ build.rs │ build.rs
│ crates │ crates
│ └── comet │ └── comet
│ resources │ res
│ └── shaders │ └── shaders
│ └── textures │ └── textures
│ └── sounds │ └── sounds
@ -57,7 +57,7 @@ fn main() {
App::new() // Generate a basic 2D app App::new() // Generate a basic 2D app
.with_preset(App2D) // Pre-registers the `Transform2D` component in the scene .with_preset(App2D) // Pre-registers the `Transform2D` component in the scene
.with_title("Comet App") // Sets the window title .with_title("Comet App") // Sets the window title
.with_icon(r"resources/textures/comet_icon.png") // Sets the window icon .with_icon(r"res/textures/comet_icon.png") // Sets the window icon
.with_size(1920, 1080) // Sets the window size .with_size(1920, 1080) // Sets the window size
.with_game_state(GameState::new()) // Adds a custom game state struct .with_game_state(GameState::new()) // Adds a custom game state struct
.run::<Renderer2D>(setup, update) // Starts app with the given .run::<Renderer2D>(setup, update) // Starts app with the given
@ -75,19 +75,19 @@ use std::path::PathBuf;
fn main() -> Result<()> { fn main() -> Result<()> {
// Watch resource directories for changes // Watch resource directories for changes
println!("cargo:rerun-if-changed=resources/materials/*"); println!("cargo:rerun-if-changed=res/materials/*");
println!("cargo:rerun-if-changed=resources/objects/*"); println!("cargo:rerun-if-changed=res/objects/*");
println!("cargo:rerun-if-changed=resources/textures/*"); println!("cargo:rerun-if-changed=res/textures/*");
println!("cargo:rerun-if-changed=resources/shaders/*"); println!("cargo:rerun-if-changed=res/shaders/*");
println!("cargo:rerun-if-changed=resources/data/*"); println!("cargo:rerun-if-changed=res/data/*");
println!("cargo:rerun-if-changed=resources/sounds/*"); println!("cargo:rerun-if-changed=res/sounds/*");
println!("cargo:rerun-if-changed=resources/fonts/*"); println!("cargo:rerun-if-changed=res/fonts/*");
let profile = env::var("PROFILE")?; let profile = env::var("PROFILE")?;
let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR")?); let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR")?);
let target_dir = manifest_dir.join("target").join(&profile); let target_dir = manifest_dir.join("target").join(&profile);
let dest_resources_dir = target_dir.join("resources"); let dest_resources_dir = target_dir.join("res");
std::fs::create_dir_all(&dest_resources_dir)?; std::fs::create_dir_all(&dest_resources_dir)?;
@ -96,13 +96,13 @@ fn main() -> Result<()> {
copy_options.copy_inside = true; copy_options.copy_inside = true;
let resource_folders = vec![ let resource_folders = vec![
"resources/materials/", "res/materials/",
"resources/objects/", "res/objects/",
"resources/textures/", "res/textures/",
"resources/shaders/", "res/shaders/",
"resources/data/", "res/data/",
"resources/sounds/", "res/sounds/",
"resources/fonts/", "res/fonts/",
]; ];
let resource_paths: Vec<PathBuf> = resource_folders let resource_paths: Vec<PathBuf> = resource_folders

View file

@ -1,24 +1,24 @@
use crate::camera::{CameraUniform, RenderCamera};
use crate::draw_info::DrawInfo;
use crate::render_pass::{RenderPassInfo, RenderPassType};
use crate::renderer::Renderer;
use comet_colors::Color;
use comet_ecs::{Camera2D, Component, Position2D, Render, Render2D, Scene, Text, Transform2D};
use comet_log::*;
use comet_math::{p2, p3, v2, v3};
use comet_resources::texture_atlas::TextureRegion;
use comet_resources::{graphic_resource_manager::GraphicResourceManager, Texture, Vertex};
use comet_structs::ComponentSet;
use std::iter; use std::iter;
use std::path::PathBuf; use std::path::PathBuf;
use std::sync::Arc; use std::sync::Arc;
use std::time::Instant; use std::time::Instant;
use wgpu::BufferUsages;
use wgpu::core::command::DrawKind::Draw; use wgpu::core::command::DrawKind::Draw;
use wgpu::naga::ShaderStage; use wgpu::naga::ShaderStage;
use wgpu::util::DeviceExt; use wgpu::util::DeviceExt;
use wgpu::BufferUsages;
use winit::dpi::PhysicalSize; use winit::dpi::PhysicalSize;
use winit::window::Window; use winit::window::Window;
use comet_colors::Color;
use comet_ecs::{Camera2D, Component, Position2D, Render, Render2D, Transform2D, Scene, Text};
use comet_log::*;
use comet_math::{p2, p3, v2, v3};
use comet_resources::{graphic_resource_manager::GraphicResourceManager, Texture, Vertex};
use comet_resources::texture_atlas::TextureRegion;
use comet_structs::ComponentSet;
use crate::camera::{RenderCamera, CameraUniform};
use crate::draw_info::DrawInfo;
use crate::render_pass::{RenderPassInfo, RenderPassType};
use crate::renderer::Renderer;
pub struct Renderer2D<'a> { pub struct Renderer2D<'a> {
surface: wgpu::Surface<'a>, surface: wgpu::Surface<'a>,
@ -54,16 +54,14 @@ impl<'a> Renderer2D<'a> {
let surface = instance.create_surface(window).unwrap(); let surface = instance.create_surface(window).unwrap();
let adapter = pollster::block_on(instance let adapter = pollster::block_on(instance.request_adapter(&wgpu::RequestAdapterOptions {
.request_adapter(&wgpu::RequestAdapterOptions {
power_preference: wgpu::PowerPreference::default(), power_preference: wgpu::PowerPreference::default(),
compatible_surface: Some(&surface), compatible_surface: Some(&surface),
force_fallback_adapter: false, force_fallback_adapter: false,
})) }))
.unwrap(); .unwrap();
let (device, queue) = pollster::block_on(adapter let (device, queue) = pollster::block_on(adapter.request_device(
.request_device(
&wgpu::DeviceDescriptor { &wgpu::DeviceDescriptor {
label: None, label: None,
required_features: wgpu::Features::empty(), required_features: wgpu::Features::empty(),
@ -99,7 +97,7 @@ impl<'a> Renderer2D<'a> {
let graphic_resource_manager = GraphicResourceManager::new(); let graphic_resource_manager = GraphicResourceManager::new();
let diffuse_bytes = include_bytes!(r"../../../resources/textures/comet_icon.png"); let diffuse_bytes = include_bytes!(r"../../../res/textures/comet_icon.png");
let diffuse_texture = let diffuse_texture =
Texture::from_bytes(&device, &queue, diffuse_bytes, "comet_icon.png", false).unwrap(); Texture::from_bytes(&device, &queue, diffuse_bytes, "comet_icon.png", false).unwrap();
@ -164,14 +162,12 @@ impl<'a> Renderer2D<'a> {
let render_pipeline_layout = let render_pipeline_layout =
device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("Render Pipeline Layout"), label: Some("Render Pipeline Layout"),
bind_group_layouts: &[ bind_group_layouts: &[&texture_bind_group_layout, &camera_bind_group_layout],
&texture_bind_group_layout,
&camera_bind_group_layout,
],
push_constant_ranges: &[], push_constant_ranges: &[],
}); });
let universal_render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { let universal_render_pipeline =
device.create_render_pipeline(&wgpu::RenderPipelineDescriptor {
label: Some("Render Pipeline"), label: Some("Render Pipeline"),
layout: Some(&render_pipeline_layout), layout: Some(&render_pipeline_layout),
vertex: wgpu::VertexState { vertex: wgpu::VertexState {
@ -237,7 +233,7 @@ impl<'a> Renderer2D<'a> {
g: 0.0, g: 0.0,
b: 0.0, b: 0.0,
a: 1.0, a: 1.0,
} },
}; };
let texture_sampler = device.create_sampler(&wgpu::SamplerDescriptor { let texture_sampler = device.create_sampler(&wgpu::SamplerDescriptor {
@ -266,7 +262,9 @@ impl<'a> Renderer2D<'a> {
sample_count: 1, sample_count: 1,
dimension: wgpu::TextureDimension::D2, dimension: wgpu::TextureDimension::D2,
format: wgpu::TextureFormat::Bgra8UnormSrgb, format: wgpu::TextureFormat::Bgra8UnormSrgb,
usage: wgpu::TextureUsages::COPY_SRC | wgpu::TextureUsages::COPY_DST | wgpu::TextureUsages::TEXTURE_BINDING, usage: wgpu::TextureUsages::COPY_SRC
| wgpu::TextureUsages::COPY_DST
| wgpu::TextureUsages::TEXTURE_BINDING,
view_formats: &[wgpu::TextureFormat::Bgra8UnormSrgb], view_formats: &[wgpu::TextureFormat::Bgra8UnormSrgb],
}); });
@ -275,7 +273,9 @@ impl<'a> Renderer2D<'a> {
entries: &[ entries: &[
wgpu::BindGroupEntry { wgpu::BindGroupEntry {
binding: 0, binding: 0,
resource: wgpu::BindingResource::TextureView(&empty_texture.create_view(&wgpu::TextureViewDescriptor::default())), resource: wgpu::BindingResource::TextureView(
&empty_texture.create_view(&wgpu::TextureViewDescriptor::default()),
),
}, },
wgpu::BindGroupEntry { wgpu::BindGroupEntry {
binding: 1, binding: 1,

View file

@ -1,20 +1,24 @@
use crate::{
camera::{CameraUniform, RenderCamera},
draw_info::DrawInfo,
renderer::Renderer,
};
use comet_colors::Color;
use comet_ecs::{Camera2D, Component, Position2D, Render, Render2D, Scene, Text, Transform2D};
use comet_log::*;
use comet_math::{p2, v2, v3};
use comet_resources::texture_atlas::TextureRegion;
use comet_resources::{graphic_resource_manager::GraphicResourceManager, Texture, Vertex};
use comet_structs::ComponentSet;
use std::iter; use std::iter;
use std::path::PathBuf; use std::path::PathBuf;
use std::sync::Arc; use std::sync::Arc;
use std::time::Instant; use std::time::Instant;
use wgpu::BufferUsages;
use wgpu::naga::ShaderStage; use wgpu::naga::ShaderStage;
use wgpu::util::DeviceExt; use wgpu::util::DeviceExt;
use wgpu::BufferUsages;
use winit::dpi::PhysicalSize; use winit::dpi::PhysicalSize;
use winit::window::Window; use winit::window::Window;
use comet_colors::Color;
use comet_ecs::{Camera2D, Component, Position2D, Render, Render2D, Transform2D, Scene, Text};
use comet_log::*;
use comet_math::{p2, v2, v3};
use comet_resources::{graphic_resource_manager::GraphicResourceManager, Texture, Vertex};
use comet_resources::texture_atlas::TextureRegion;
use comet_structs::ComponentSet;
use crate::{renderer::Renderer, draw_info::DrawInfo, camera::{RenderCamera, CameraUniform}};
pub struct Renderer2D<'a> { pub struct Renderer2D<'a> {
surface: wgpu::Surface<'a>, surface: wgpu::Surface<'a>,
@ -47,16 +51,14 @@ impl<'a> Renderer2D<'a> {
let surface = instance.create_surface(window).unwrap(); let surface = instance.create_surface(window).unwrap();
let adapter = pollster::block_on(instance let adapter = pollster::block_on(instance.request_adapter(&wgpu::RequestAdapterOptions {
.request_adapter(&wgpu::RequestAdapterOptions {
power_preference: wgpu::PowerPreference::default(), power_preference: wgpu::PowerPreference::default(),
compatible_surface: Some(&surface), compatible_surface: Some(&surface),
force_fallback_adapter: false, force_fallback_adapter: false,
})) }))
.unwrap(); .unwrap();
let (device, queue) = pollster::block_on(adapter let (device, queue) = pollster::block_on(adapter.request_device(
.request_device(
&wgpu::DeviceDescriptor { &wgpu::DeviceDescriptor {
label: None, label: None,
required_features: wgpu::Features::empty(), required_features: wgpu::Features::empty(),
@ -153,14 +155,12 @@ impl<'a> Renderer2D<'a> {
let render_pipeline_layout = let render_pipeline_layout =
device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("Universal Render Pipeline Layout"), label: Some("Universal Render Pipeline Layout"),
bind_group_layouts: &[ bind_group_layouts: &[&texture_bind_group_layout, &camera_bind_group_layout],
&texture_bind_group_layout,
&camera_bind_group_layout,
],
push_constant_ranges: &[], push_constant_ranges: &[],
}); });
let universal_render_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { let universal_render_pipeline =
device.create_render_pipeline(&wgpu::RenderPipelineDescriptor {
label: Some("Universal Render Pipeline"), label: Some("Universal Render Pipeline"),
layout: Some(&render_pipeline_layout), layout: Some(&render_pipeline_layout),
vertex: wgpu::VertexState { vertex: wgpu::VertexState {
@ -216,7 +216,7 @@ impl<'a> Renderer2D<'a> {
g: 0.0, g: 0.0,
b: 0.0, b: 0.0,
a: 1.0, a: 1.0,
} },
}; };
let texture_sampler = device.create_sampler(&wgpu::SamplerDescriptor { let texture_sampler = device.create_sampler(&wgpu::SamplerDescriptor {
@ -235,17 +235,22 @@ impl<'a> Renderer2D<'a> {
}); });
let mut draw_info: Vec<DrawInfo> = Vec::new(); let mut draw_info: Vec<DrawInfo> = Vec::new();
draw_info.push( draw_info.push(DrawInfo::new(
DrawInfo::new(
"Universal Draw".to_string(), "Universal Draw".to_string(),
&device, &device,
&Texture::from_image(&device, &queue, &image::DynamicImage::new(1, 1, image::ColorType::Rgba8), None, false).unwrap(), &Texture::from_image(
&device,
&queue,
&image::DynamicImage::new(1, 1, image::ColorType::Rgba8),
None,
false,
)
.unwrap(),
&texture_bind_group_layout, &texture_bind_group_layout,
&texture_sampler, &texture_sampler,
vec![], vec![],
vec![], vec![],
) ));
);
Self { Self {
surface, surface,
@ -304,7 +309,23 @@ impl<'a> Renderer2D<'a> {
/// A function that loads a shader from the resources/shaders dir given the full name of the shader file. /// A function that loads a shader from the resources/shaders dir given the full name of the shader file.
pub fn load_shader(&mut self, file_name: &str, shader_stage: Option<ShaderStage>) { pub fn load_shader(&mut self, file_name: &str, shader_stage: Option<ShaderStage>) {
self.graphic_resource_manager.load_shader(shader_stage, ((Self::get_project_root().unwrap().as_os_str().to_str().unwrap().to_string() + "/resources/shaders/").as_str().to_string() + file_name).as_str(), &self.device).unwrap(); self.graphic_resource_manager
.load_shader(
shader_stage,
((Self::get_project_root()
.unwrap()
.as_os_str()
.to_str()
.unwrap()
.to_string()
+ "/res/shaders/")
.as_str()
.to_string()
+ file_name)
.as_str(),
&self.device,
)
.unwrap();
info!("Shader ({}) loaded successfully", file_name); info!("Shader ({}) loaded successfully", file_name);
} }
@ -335,7 +356,14 @@ impl<'a> Renderer2D<'a> {
/// A function to load a TTF font from the specified path /// A function to load a TTF font from the specified path
pub fn load_font(&mut self, path: &str, size: f32) { pub fn load_font(&mut self, path: &str, size: f32) {
self.graphic_resource_manager.load_font(path, size); self.graphic_resource_manager.load_font(path, size);
let atlas = self.graphic_resource_manager.fonts().iter().find(|f| f.name() == path).unwrap().glyphs().atlas(); let atlas = self
.graphic_resource_manager
.fonts()
.iter()
.find(|f| f.name() == path)
.unwrap()
.glyphs()
.atlas();
let font_info = DrawInfo::new( let font_info = DrawInfo::new(
format!("{}", path), format!("{}", path),
&self.device, &self.device,
@ -351,15 +379,28 @@ impl<'a> Renderer2D<'a> {
/// An interface for getting the location of the texture in the texture atlas. /// An interface for getting the location of the texture in the texture atlas.
pub fn get_texture_region(&self, texture_path: String) -> Option<&TextureRegion> { pub fn get_texture_region(&self, texture_path: String) -> Option<&TextureRegion> {
if !self.graphic_resource_manager.texture_atlas().textures().contains_key(&texture_path) { if !self
.graphic_resource_manager
.texture_atlas()
.textures()
.contains_key(&texture_path)
{
error!("Texture {} not found in atlas", &texture_path); error!("Texture {} not found in atlas", &texture_path);
} }
self.graphic_resource_manager.texture_atlas().textures().get(&texture_path) self.graphic_resource_manager
.texture_atlas()
.textures()
.get(&texture_path)
} }
/// A function to get the `TextureRegion` of a specified glyph /// A function to get the `TextureRegion` of a specified glyph
pub fn get_glyph_region(&self, glyph: char, font: String) -> &TextureRegion { pub fn get_glyph_region(&self, glyph: char, font: String) -> &TextureRegion {
let font_atlas = self.graphic_resource_manager.fonts().iter().find(|f| f.name() == font).unwrap(); let font_atlas = self
.graphic_resource_manager
.fonts()
.iter()
.find(|f| f.name() == font)
.unwrap();
font_atlas.get_glyph(glyph).unwrap() font_atlas.get_glyph(glyph).unwrap()
} }
@ -367,7 +408,18 @@ impl<'a> Renderer2D<'a> {
/// The old texture atlas will be replaced with the new one. /// The old texture atlas will be replaced with the new one.
pub fn set_texture_atlas_by_paths(&mut self, paths: Vec<String>) { pub fn set_texture_atlas_by_paths(&mut self, paths: Vec<String>) {
self.graphic_resource_manager.create_texture_atlas(paths); self.graphic_resource_manager.create_texture_atlas(paths);
self.draw_info[0].set_texture(&self.device, &self.texture_bind_group_layout, &Texture::from_image(&self.device, &self.queue, self.graphic_resource_manager.texture_atlas().atlas(), None, false).unwrap()); self.draw_info[0].set_texture(
&self.device,
&self.texture_bind_group_layout,
&Texture::from_image(
&self.device,
&self.queue,
self.graphic_resource_manager.texture_atlas().atlas(),
None,
false,
)
.unwrap(),
);
} }
fn set_texture_atlas(&mut self, texture_atlas: Texture) { fn set_texture_atlas(&mut self, texture_atlas: Texture) {
@ -383,23 +435,35 @@ impl<'a> Renderer2D<'a> {
let mut path_ancestors = path.as_path().ancestors(); let mut path_ancestors = path.as_path().ancestors();
while let Some(p) = path_ancestors.next() { while let Some(p) = path_ancestors.next() {
let has_cargo = let has_cargo = std::fs::read_dir(p)?
std::fs::read_dir(p)?
.into_iter() .into_iter()
.any(|p| p.unwrap().file_name() == std::ffi::OsString::from("Cargo.lock")); .any(|p| p.unwrap().file_name() == std::ffi::OsString::from("Cargo.lock"));
if has_cargo { if has_cargo {
return Ok(PathBuf::from(p)) return Ok(PathBuf::from(p));
} }
} }
Err(std::io::Error::new(std::io::ErrorKind::NotFound, "Ran out of places to find Cargo.toml")) Err(std::io::Error::new(
std::io::ErrorKind::NotFound,
"Ran out of places to find Cargo.toml",
))
} }
/// A function that takes all the textures inside the resources/textures folder and creates a texture atlas from them. /// A function that takes all the textures inside the resources/textures folder and creates a texture atlas from them.
pub fn initialize_atlas(&mut self) { pub fn initialize_atlas(&mut self) {
let texture_path = "resources/textures/".to_string(); let texture_path = "res/textures/".to_string();
let mut paths: Vec<String> = Vec::new(); let mut paths: Vec<String> = Vec::new();
for path in std::fs::read_dir(Self::get_project_root().unwrap().as_os_str().to_str().unwrap().to_string() + "/resources/textures").unwrap() { for path in std::fs::read_dir(
Self::get_project_root()
.unwrap()
.as_os_str()
.to_str()
.unwrap()
.to_string()
+ "/res/textures",
)
.unwrap()
{
paths.push(texture_path.clone() + path.unwrap().file_name().to_str().unwrap()); paths.push(texture_path.clone() + path.unwrap().file_name().to_str().unwrap());
} }
@ -412,24 +476,52 @@ impl<'a> Renderer2D<'a> {
self.draw_info[0].update_index_buffer(&self.device, &self.queue, new_index_buffer); self.draw_info[0].update_index_buffer(&self.device, &self.queue, new_index_buffer);
} }
fn add_text_to_buffers(&self, text: String, font: String, size: f32, position: p2, color: wgpu::Color) -> (Vec<Vertex>, Vec<u16>) { fn add_text_to_buffers(
let vert_color = [color.r as f32, color.g as f32, color.b as f32, color.a as f32]; &self,
text: String,
font: String,
size: f32,
position: p2,
color: wgpu::Color,
) -> (Vec<Vertex>, Vec<u16>) {
let vert_color = [
color.r as f32,
color.g as f32,
color.b as f32,
color.a as f32,
];
let screen_position = p2::new(position.x()/self.config.width as f32, position.y()/self.config.height as f32); let screen_position = p2::new(
let scale_factor = size / self.graphic_resource_manager.fonts().iter().find(|f| f.name() == font).unwrap().size(); position.x() / self.config.width as f32,
position.y() / self.config.height as f32,
);
let scale_factor = size
/ self
.graphic_resource_manager
.fonts()
.iter()
.find(|f| f.name() == font)
.unwrap()
.size();
let line_height = (self.graphic_resource_manager.fonts().iter().find(|f| f.name() == font).unwrap().line_height() / self.config.height as f32) * scale_factor; let line_height = (self
.graphic_resource_manager
.fonts()
.iter()
.find(|f| f.name() == font)
.unwrap()
.line_height()
/ self.config.height as f32)
* scale_factor;
let lines = text let lines = text
.split("\n") .split("\n")
.map(|s| { .map(|s| {
s.split("").map(|escape| { s.split("")
match escape { .map(|escape| match escape {
_ if escape == "\t" => { _ if escape == "\t" => " ",
" " _ => escape,
} })
_ => escape .collect::<String>()
}
}).collect::<String>()
}) })
.collect::<Vec<String>>(); .collect::<Vec<String>>();
@ -456,16 +548,36 @@ impl<'a> Renderer2D<'a> {
let glyph_bottom = glyph_top - h; let glyph_bottom = glyph_top - h;
let vertices: &mut Vec<Vertex> = &mut vec![ let vertices: &mut Vec<Vertex> = &mut vec![
Vertex::new([ glyph_left, glyph_top, 0.0 ], [region.u0(), region.v0()], vert_color), Vertex::new(
Vertex::new([ glyph_left, glyph_bottom, 0.0 ], [region.u0(), region.v1()], vert_color), [glyph_left, glyph_top, 0.0],
Vertex::new([ glyph_right, glyph_bottom, 0.0 ], [region.u1(), region.v1()], vert_color), [region.u0(), region.v0()],
Vertex::new([ glyph_right, glyph_top, 0.0 ], [region.u1(), region.v0()], vert_color), vert_color,
),
Vertex::new(
[glyph_left, glyph_bottom, 0.0],
[region.u0(), region.v1()],
vert_color,
),
Vertex::new(
[glyph_right, glyph_bottom, 0.0],
[region.u1(), region.v1()],
vert_color,
),
Vertex::new(
[glyph_right, glyph_top, 0.0],
[region.u1(), region.v0()],
vert_color,
),
]; ];
let buffer_size = vertex_data.len() as u16; let buffer_size = vertex_data.len() as u16;
let indices: &mut Vec<u16> = &mut vec![ let indices: &mut Vec<u16> = &mut vec![
buffer_size, buffer_size + 1, buffer_size + 3, buffer_size,
buffer_size + 1, buffer_size + 2, buffer_size + 3, buffer_size + 1,
buffer_size + 3,
buffer_size + 1,
buffer_size + 2,
buffer_size + 3,
]; ];
x_offset += (region.advance() / self.config.width as f32) * scale_factor; x_offset += (region.advance() / self.config.width as f32) * scale_factor;
@ -493,12 +605,21 @@ impl<'a> Renderer2D<'a> {
position position
} }
fn setup_camera<'b>(&mut self, cameras: Vec<usize>, scene: &'b Scene) -> (&'b Position2D, &'b Camera2D){ fn setup_camera<'b>(
let cam = cameras.get( &mut self,
cameras: Vec<usize>,
scene: &'b Scene,
) -> (&'b Position2D, &'b Camera2D) {
let cam = cameras
.get(
self.find_priority_camera( self.find_priority_camera(
cameras.iter().map(|e| *scene.get_component::<Camera2D>(*e).unwrap() cameras
).collect::<Vec<Camera2D>>()) .iter()
).unwrap(); .map(|e| *scene.get_component::<Camera2D>(*e).unwrap())
.collect::<Vec<Camera2D>>(),
),
)
.unwrap();
let camera_component = scene.get_component::<Camera2D>(*cam).unwrap(); let camera_component = scene.get_component::<Camera2D>(*cam).unwrap();
let camera_position = scene.get_component::<Transform2D>(*cam).unwrap().position(); let camera_position = scene.get_component::<Transform2D>(*cam).unwrap().position();
@ -506,20 +627,26 @@ impl<'a> Renderer2D<'a> {
let camera = RenderCamera::new( let camera = RenderCamera::new(
camera_component.zoom(), camera_component.zoom(),
camera_component.dimensions(), camera_component.dimensions(),
v3::new(camera_position.as_vec().x(), v3::new(
camera_position.as_vec().x(),
camera_position.as_vec().y(), camera_position.as_vec().y(),
0.0)); 0.0,
),
);
let mut camera_uniform = CameraUniform::new(); let mut camera_uniform = CameraUniform::new();
camera_uniform.update_view_proj(&camera); camera_uniform.update_view_proj(&camera);
let camera_buffer = self.device.create_buffer_init(&wgpu::util::BufferInitDescriptor { let camera_buffer = self
.device
.create_buffer_init(&wgpu::util::BufferInitDescriptor {
label: Some("Universal Camera Buffer"), label: Some("Universal Camera Buffer"),
contents: bytemuck::cast_slice(&[camera_uniform]), contents: bytemuck::cast_slice(&[camera_uniform]),
usage: BufferUsages::UNIFORM | BufferUsages::COPY_DST, usage: BufferUsages::UNIFORM | BufferUsages::COPY_DST,
}); });
let camera_bind_group_layout = let camera_bind_group_layout =
self.device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { self.device
.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
entries: &[wgpu::BindGroupLayoutEntry { entries: &[wgpu::BindGroupLayoutEntry {
binding: 0, binding: 0,
visibility: wgpu::ShaderStages::VERTEX, visibility: wgpu::ShaderStages::VERTEX,
@ -560,7 +687,8 @@ impl<'a> Renderer2D<'a> {
} }
let entities = scene.get_entities_with(vec![Transform2D::type_id(), Render2D::type_id()]); let entities = scene.get_entities_with(vec![Transform2D::type_id(), Render2D::type_id()]);
let texts = scene.get_entities_with(vec![Transform2D::type_id(), comet_ecs::Text::type_id()]); let texts =
scene.get_entities_with(vec![Transform2D::type_id(), comet_ecs::Text::type_id()]);
self.setup_camera(cameras, scene); self.setup_camera(cameras, scene);
@ -579,7 +707,7 @@ impl<'a> Renderer2D<'a> {
match self.get_texture_region(renderer_component.get_texture().to_string()) { match self.get_texture_region(renderer_component.get_texture().to_string()) {
Some(texture_region) => { Some(texture_region) => {
t_region = Some(texture_region); t_region = Some(texture_region);
}, }
None => continue, None => continue,
} }
let region = t_region.unwrap(); let region = t_region.unwrap();
@ -605,7 +733,7 @@ impl<'a> Renderer2D<'a> {
let (x, y) = world_corners[i]; let (x, y) = world_corners[i];
rotated_world_corners[i] = ( rotated_world_corners[i] = (
x * cos_angle - y * sin_angle + world_position.x(), x * cos_angle - y * sin_angle + world_position.x(),
x * sin_angle + y * cos_angle + world_position.y() x * sin_angle + y * cos_angle + world_position.y(),
); );
} }
@ -613,20 +741,40 @@ impl<'a> Renderer2D<'a> {
for i in 0..4 { for i in 0..4 {
screen_corners[i] = ( screen_corners[i] = (
rotated_world_corners[i].0 / self.config().width as f32, rotated_world_corners[i].0 / self.config().width as f32,
rotated_world_corners[i].1 / self.config().height as f32 rotated_world_corners[i].1 / self.config().height as f32,
); );
} }
vertex_buffer.append(&mut vec![ vertex_buffer.append(&mut vec![
Vertex :: new ( [screen_corners[0].0, screen_corners[0].1, 0.0], [region.u0(), region.v0()], [1.0, 1.0, 1.0, 1.0] ), Vertex::new(
Vertex :: new ( [screen_corners[1].0, screen_corners[1].1, 0.0], [region.u0(), region.v1()], [1.0, 1.0, 1.0, 1.0] ), [screen_corners[0].0, screen_corners[0].1, 0.0],
Vertex :: new ( [screen_corners[2].0, screen_corners[2].1, 0.0], [region.u1(), region.v1()], [1.0, 1.0, 1.0, 1.0] ) , [region.u0(), region.v0()],
Vertex :: new ( [screen_corners[3].0, screen_corners[3].1, 0.0], [region.u1(), region.v0()], [1.0, 1.0, 1.0, 1.0] ) [1.0, 1.0, 1.0, 1.0],
),
Vertex::new(
[screen_corners[1].0, screen_corners[1].1, 0.0],
[region.u0(), region.v1()],
[1.0, 1.0, 1.0, 1.0],
),
Vertex::new(
[screen_corners[2].0, screen_corners[2].1, 0.0],
[region.u1(), region.v1()],
[1.0, 1.0, 1.0, 1.0],
),
Vertex::new(
[screen_corners[3].0, screen_corners[3].1, 0.0],
[region.u1(), region.v0()],
[1.0, 1.0, 1.0, 1.0],
),
]); ]);
index_buffer.append(&mut vec![ index_buffer.append(&mut vec![
0 + buffer_size, 1 + buffer_size, 3 + buffer_size, 0 + buffer_size,
1 + buffer_size, 2 + buffer_size, 3 + buffer_size 1 + buffer_size,
3 + buffer_size,
1 + buffer_size,
2 + buffer_size,
3 + buffer_size,
]); ]);
} }
} }
@ -636,8 +784,18 @@ impl<'a> Renderer2D<'a> {
let transform = scene.get_component::<Transform2D>(text).unwrap(); let transform = scene.get_component::<Transform2D>(text).unwrap();
if component.is_visible() { if component.is_visible() {
let (vertices, indices) = self.add_text_to_buffers(component.content().to_string(), component.font().to_string(), component.font_size(), p2::from_vec(transform.position().as_vec()), component.color().to_wgpu()); let (vertices, indices) = self.add_text_to_buffers(
let draw = self.draw_info.iter_mut().find(|d| d.name() == &format!("{}", component.font())).unwrap(); component.content().to_string(),
component.font().to_string(),
component.font_size(),
p2::from_vec(transform.position().as_vec()),
component.color().to_wgpu(),
);
let draw = self
.draw_info
.iter_mut()
.find(|d| d.name() == &format!("{}", component.font()))
.unwrap();
draw.update_vertex_buffer(&self.device, &self.queue, vertices); draw.update_vertex_buffer(&self.device, &self.queue, vertices);
draw.update_index_buffer(&self.device, &self.queue, indices); draw.update_index_buffer(&self.device, &self.queue, indices);
} }
@ -668,7 +826,9 @@ impl<'a> Renderer2D<'a> {
pub fn render(&mut self) -> Result<(), wgpu::SurfaceError> { pub fn render(&mut self) -> Result<(), wgpu::SurfaceError> {
let output = self.surface.get_current_texture()?; let output = self.surface.get_current_texture()?;
let output_view = output.texture.create_view(&wgpu::TextureViewDescriptor::default()); let output_view = output
.texture
.create_view(&wgpu::TextureViewDescriptor::default());
let mut encoder = self let mut encoder = self
.device .device
@ -698,7 +858,10 @@ impl<'a> Renderer2D<'a> {
render_pass.set_bind_group(0, self.draw_info[i].texture(), &[]); render_pass.set_bind_group(0, self.draw_info[i].texture(), &[]);
render_pass.set_bind_group(1, &self.camera_bind_group, &[]); render_pass.set_bind_group(1, &self.camera_bind_group, &[]);
render_pass.set_vertex_buffer(0, self.draw_info[i].vertex_buffer().slice(..)); render_pass.set_vertex_buffer(0, self.draw_info[i].vertex_buffer().slice(..));
render_pass.set_index_buffer(self.draw_info[i].index_buffer().slice(..), wgpu::IndexFormat::Uint16); render_pass.set_index_buffer(
self.draw_info[i].index_buffer().slice(..),
wgpu::IndexFormat::Uint16,
);
render_pass.draw_indexed(0..self.draw_info[i].num_indices(), 0, 0..1); render_pass.draw_indexed(0..self.draw_info[i].num_indices(), 0, 0..1);
} }
} }

View file

@ -1,9 +1,9 @@
use comet::prelude::*; use comet::prelude::*;
use winit_input_helper::WinitInputHelper;
use comet_input::keyboard::Key; use comet_input::keyboard::Key;
use winit_input_helper::WinitInputHelper;
fn setup(app: &mut App, renderer: &mut Renderer2D) { fn setup(app: &mut App, renderer: &mut Renderer2D) {
// Takes all the textures from resources/textures and puts them into a texture atlas // Takes all the textures from res/textures and puts them into a texture atlas
renderer.initialize_atlas(); renderer.initialize_atlas();
let camera = app.new_entity(); let camera = app.new_entity();
@ -15,7 +15,7 @@ fn setup(app: &mut App, renderer: &mut Renderer2D) {
app.add_component(e1, Transform2D::new()); app.add_component(e1, Transform2D::new());
let mut renderer2d = Render2D::new(); let mut renderer2d = Render2D::new();
renderer2d.set_texture(r"resources/textures/comet_icon.png"); renderer2d.set_texture(r"res/textures/comet_icon.png");
renderer2d.set_visibility(true); renderer2d.set_visibility(true);
app.add_component(e1, renderer2d); app.add_component(e1, renderer2d);
@ -36,7 +36,7 @@ fn handle_input(app: &mut App, dt: f32) {
update_position( update_position(
app.input_manager().clone(), app.input_manager().clone(),
app.get_component_mut::<Transform2D>(1).unwrap(), app.get_component_mut::<Transform2D>(1).unwrap(),
dt dt,
); );
} }
} }

View file

@ -1,8 +1,8 @@
use comet::prelude::*; use comet::prelude::*;
fn setup(app: &mut App, renderer: &mut Renderer2D) { fn setup(app: &mut App, renderer: &mut Renderer2D) {
// Loading the font from the resources/fonts directory with a rendered size of 77px // Loading the font from the res/fonts directory with a rendered size of 77px
renderer.load_font("./resources/fonts/PressStart2P-Regular.ttf", 77.0); renderer.load_font("./res/fonts/PressStart2P-Regular.ttf", 77.0);
// Setting up camera // Setting up camera
let camera = app.new_entity(); let camera = app.new_entity();
@ -13,13 +13,16 @@ fn setup(app: &mut App, renderer: &mut Renderer2D) {
// Creating the text entity // Creating the text entity
let text = app.new_entity(); let text = app.new_entity();
app.add_component(text, Transform2D::new()); app.add_component(text, Transform2D::new());
app.add_component(text, Text::new( app.add_component(
text,
Text::new(
"comet", // The content of the text "comet", // The content of the text
"./resources/fonts/PressStart2P-Regular.ttf", // The used font (right now exact to the font path) "./res/fonts/PressStart2P-Regular.ttf", // The used font (right now exact to the font path)
77.0, // Pixel size at which the font will be drawn 77.0, // Pixel size at which the font will be drawn
true, // Should the text be visible true, // Should the text be visible
sRgba::<f32>::from_hex("#abb2bfff") // Color of the text sRgba::<f32>::from_hex("#abb2bfff"), // Color of the text
)); ),
);
} }
fn update(app: &mut App, renderer: &mut Renderer2D, dt: f32) { fn update(app: &mut App, renderer: &mut Renderer2D, dt: f32) {

View file

@ -2,7 +2,7 @@ use comet::prelude::*;
fn setup(app: &mut App, renderer: &mut Renderer2D) { fn setup(app: &mut App, renderer: &mut Renderer2D) {
// Creating a texture atlas from the provided textures in the vector // Creating a texture atlas from the provided textures in the vector
renderer.set_texture_atlas_by_paths(vec!["./resources/textures/comet_icon.png".to_string()]); renderer.set_texture_atlas_by_paths(vec!["./res/textures/comet_icon.png".to_string()]);
// Creating a camera entity // Creating a camera entity
let cam = app.new_entity(); let cam = app.new_entity();
@ -15,7 +15,7 @@ fn setup(app: &mut App, renderer: &mut Renderer2D) {
let mut render = Render2D::new(); let mut render = Render2D::new();
render.set_visibility(true); render.set_visibility(true);
render.set_texture("./resources/textures/comet_icon.png"); render.set_texture("./res/textures/comet_icon.png");
app.add_component(e0, render); app.add_component(e0, render);
} }

View file

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 320 B

After

Width:  |  Height:  |  Size: 320 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 5 KiB

After

Width:  |  Height:  |  Size: 5 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 425 B

After

Width:  |  Height:  |  Size: 425 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 736 B

After

Width:  |  Height:  |  Size: 736 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 788 B

After

Width:  |  Height:  |  Size: 788 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 878 B

After

Width:  |  Height:  |  Size: 878 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 5 KiB

After

Width:  |  Height:  |  Size: 5 KiB

Before After
Before After