diff --git a/Cargo.lock b/Cargo.lock index cff7bb0..b3ea78f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "ab_glyph" @@ -484,23 +484,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" -[[package]] -name = "game_engine" -version = "0.1.0-alpha.1" -dependencies = [ - "cocoa", - "core-graphics 0.23.2", - "core-graphics-types 0.1.3", - "env_logger", - "glam", - "log", - "metal", - "num-traits", - "objc", - "raw-window-handle", - "winit", -] - [[package]] name = "gethostname" version = "0.4.3" @@ -934,6 +917,23 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +[[package]] +name = "render_engine" +version = "0.1.0-alpha.2" +dependencies = [ + "cocoa", + "core-graphics 0.23.2", + "core-graphics-types 0.1.3", + "env_logger", + "glam", + "log", + "metal", + "num-traits", + "objc", + "raw-window-handle", + "winit", +] + [[package]] name = "rustix" version = "0.38.34" diff --git a/Cargo.toml b/Cargo.toml index 14644ff..4e3ad58 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,20 @@ [package] -name = "game_engine" +name = "render_engine" version = "0.1.0-alpha.2" edition = "2021" +description = "A Metal-based 3D rendering engine for macOS" +license = "MIT" +repository = "https://github.com/gituser12981u2/3d-engine.git" +documentation = "https://docs.rs/render_engine" +readme = "README.md" +keywords = ["graphics", "rendering", "metal", "3d"] +categories = ["graphics", "rendering", "game-engines"] build = "build.rs" +[lib] +path = "src/lib.rs" +crate-type = ["rlib"] + [dependencies] cocoa = "0.26.0" core-graphics = "0.23.2" diff --git a/README.md b/README.md index 936ff6f..664bcd5 100644 --- a/README.md +++ b/README.md @@ -24,42 +24,15 @@ This project is not a typical game engine, but an ambitious attempt to create a ## Installation -1. Clone the repository: +Add this to the Cargo.toml: - ```bash - git clone https://github.com/gituser12981u2/3d-engine.git - cd 3D-engine - ``` - -2. Build the project: - - ```bash - cargo build - ``` - -## Usage - -Here is a basic example of how to use the engine: - -```rust -use 3D_engine::{Renderer, Color, RenderVector3}; - -fn main() -> Result<(), Box> { - let mut renderer = Renderer::new(800, 600, "My 3D Scene")?; +```bash +cargo add render_engine +``` - renderer.set_render_callback(|r| { - r.draw_triangle( - RenderVector3::new(-0.5, -0.5, 0.0), - RenderVector3::new(0.5, -0.5, 0.0), - RenderVector3::new(0.0, 0.5, 0.0), - Color::new(1.0, 0.0, 0.0, 1.0) - )?; - Ok(()) - }); +## API Documentation - renderer.run() -} -``` +Full documentation is available at [docs.rs/render_engine](https://docs.rs/render_engine) ## Contributing diff --git a/examples/multiple_shapes_scene.rs b/examples/multiple_shapes_scene.rs new file mode 100644 index 0000000..199d36b --- /dev/null +++ b/examples/multiple_shapes_scene.rs @@ -0,0 +1,47 @@ +use glam::{Mat4, Quat, Vec3}; +use render_engine::{Color, RendererSystem, ShapeBuilder}; + +fn main() -> Result<(), Box> { + let mut renderer_system = RendererSystem::new(800, 600, "Metal Renderer")?; + + renderer_system.set_render_callback(move |r| { + // 1. Create a triangle + r.create_triangle( + Vec3::new(-1.5, 0.5, 0.0), + Vec3::new(-2.0, -0.5, 0.0), + Vec3::new(-1.0, -0.5, 0.0), + Color::new(1.0, 0.0, 0.0, 1.0), + ) + .as_primitive() + .with_transform(Mat4::from_translation(Vec3::new(0.0, 0.0, 0.0))) + .draw(r); + + // 2. Custom shape using the create_shape method + let vertices = vec![ + // Create a square (position, color) + (Vec3::new(0.5, 0.5, 0.0), Color::new(0.0, 1.0, 0.0, 1.0)), + (Vec3::new(1.5, 0.5, 0.0), Color::new(0.0, 1.0, 0.0, 1.0)), + (Vec3::new(1.5, -0.5, 0.0), Color::new(0.0, 1.0, 0.0, 1.0)), + (Vec3::new(0.5, -0.5, 0.0), Color::new(0.0, 1.0, 0.0, 1.0)), + ]; + + let indices = vec![ + 0, 1, 2, // First triangle + 0, 2, 3, // Second triangle + ]; + + r.create_shape(vertices) + .as_mesh() + .with_indices(indices) + .with_transform(Mat4::from_rotation_translation( + Quat::from_rotation_y(0.5), + Vec3::new(0.0, 0.0, 0.0), + )) + .draw(r); + + r.render() + }); + + renderer_system.run()?; + Ok(()) +} diff --git a/src/main.rs b/examples/simple_scene.rs similarity index 79% rename from src/main.rs rename to examples/simple_scene.rs index efe6a14..60a4f03 100644 --- a/src/main.rs +++ b/examples/simple_scene.rs @@ -1,35 +1,15 @@ use env_logger::Builder; use glam::{Mat4, Quat, Vec3}; use log::LevelFilter; -use renderer::{shape_builders::shape_builder::ShapeBuilder, Color, RendererSystem}; +use render_engine::{Color, RendererSystem, ShapeBuilder}; use std::time::Instant; -mod physics; -mod renderer; - -#[cfg(debug_assertions)] -#[macro_export] -macro_rules! debug_trace { - ($($arg:tt)*) => ( log::trace!($($arg)*) ); -} - -#[cfg(not(debug_assertions))] -#[macro_export] -macro_rules! debug_trace { - ($($arg:tt)*) => {}; -} - fn main() -> Result<(), Box> { Builder::new().filter_level(LevelFilter::Debug).init(); let mut renderer_system = RendererSystem::new(800, 600, "Metal Renderer")?; let start_time = Instant::now(); - // Create the infinite ground - // let ground_size = 1000.0; - // let ground_divisions = 100; - // let ground_vertices = create_infinite_ground(ground_size, ground_divisions); - renderer_system.set_render_callback(move |r| { let elapsed = start_time.elapsed().as_secs_f32(); diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..dd27bd8 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,35 @@ +//! A Metal-based 3D rendering library with a focus on performance +//! +//! This library provides a comprehensive rendering system including camera controls, +//! primitive shape construction, mesh management, and an efficient rendering pipeline. + +#[cfg(debug_assertions)] +#[macro_export] +macro_rules! debug_trace { + ($($arg:tt)*) => ( log::trace!($($arg)*) ); +} + +#[cfg(not(debug_assertions))] +#[macro_export] +macro_rules! debug_trace { + ($($arg:tt)*) => {}; +} + +// Core components +pub use crate::renderer::{ + // Basic types + Camera, + Color, + // Error handling + RendererError, + // Core renderer system + RendererSystem, +}; + +// Shape builders +pub use crate::renderer::shape_builders::{ + shape_builder::{vec3_color_to_vertex, MeshBuilder, PrimitiveBuilder, ShapeBuilder, ShapeData}, + triangle_builder::TriangleBuilder, +}; + +pub mod renderer; diff --git a/src/renderer/shape_builders/shape_builder.rs b/src/renderer/shape_builders/shape_builder.rs index d1fc15a..24fe05f 100644 --- a/src/renderer/shape_builders/shape_builder.rs +++ b/src/renderer/shape_builders/shape_builder.rs @@ -44,25 +44,12 @@ impl ShapeData { } /// Adds indices to the primitive. - /// - /// # Example - /// - /// ``` - /// .with_indices(vec![0, 1, 2]) - /// ``` - /// fn with_indices(mut self, indices: Vec) -> Self { self.indices = Some(indices); self } /// Applies a transformation to the primitive. - /// - /// # Example - /// - /// ``` - /// .with_transform(Mat4::from_translation(Vec3::new(1.5, 0.0, 0.0))) - /// ``` fn with_transform(mut self, transform: Mat4) -> Self { self.transform = transform; self @@ -86,21 +73,6 @@ impl ShapeBuilder for ShapeData { } /// Builder for creating and customizing primitive shapes. -/// -/// # Example -/// -/// ``` -/// renderer.create_triangle( -/// Vec3::new(0.0, 0.5, 0.0), -/// Vec3::new(-0.5, -0.5, 0.0), -/// Vec3::new(0.5, -0.5, 0.0), -/// Color::new(1.0, 0.0, 0.0, 1.0) -/// ) -/// .as_primitive() -/// .with_indices(vec![0, 1, 2]) -/// .with_transform(Mat4::from_translation(Vec3::new(1.5, 0.0, 0.0))) -/// .draw(renderer); -/// ``` pub struct PrimitiveBuilder { data: ShapeData, } @@ -114,13 +86,6 @@ impl PrimitiveBuilder { } /// Adds indices to the primitive. - /// - /// # Example - /// - /// ``` - /// .with_indices(vec![0, 1, 2]) - /// ``` - /// #[allow(dead_code)] pub fn with_indices(mut self, indices: Vec) -> Self { self.data = self.data.with_indices(indices); @@ -128,12 +93,6 @@ impl PrimitiveBuilder { } /// Applies a transformation to the primitive. - /// - /// # Example - /// - /// ``` - /// .with_transform(Mat4::from_translation(Vec3::new(1.5, 0.0, 0.0))) - /// ``` #[allow(dead_code)] pub fn with_transform(mut self, transform: Mat4) -> Self { self.data = self.data.with_transform(transform); @@ -166,21 +125,6 @@ impl PrimitiveBuilder { } /// Builder for creating and customizing mesh shapes. -/// -/// # Example -/// -/// ``` -/// renderer.create_triangle( -/// Vec3::new(0.0, 0.5, 0.0), -/// Vec3::new(-0.5, -0.5, 0.0), -/// Vec3::new(0.5, -0.5, 0.0), -/// Color::new(1.0, 0.0, 0.0, 1.0) -/// ) -/// .as_mesh() -/// .with_indices(vec![0, 1, 2]) -/// .with_transform(Mat4::from_translation(Vec3::new(1.5, 0.0, 0.0))) -/// .draw(renderer); -/// ``` #[derive(Clone)] pub struct MeshBuilder { pub data: ShapeData, @@ -195,12 +139,6 @@ impl MeshBuilder { } /// Adds indices to the primitive. - /// - /// # Example - /// - /// ``` - /// .with_indices(vec![0, 1, 2]) - /// ``` #[allow(dead_code)] pub fn with_indices(mut self, indices: Vec) -> Self { self.data = self.data.with_indices(indices); @@ -208,12 +146,6 @@ impl MeshBuilder { } /// Applies a transformation to the primitive. - /// - /// # Example - /// - /// ``` - /// .with_transform(Mat4::from_translation(Vec3::new(1.5, 0.0, 0.0))) - /// ``` #[allow(dead_code)] pub fn with_transform(mut self, transform: Mat4) -> Self { self.data = self.data.with_transform(transform); diff --git a/src/renderer/shape_builders/triangle_builder.rs b/src/renderer/shape_builders/triangle_builder.rs index b7ce319..fdef31d 100644 --- a/src/renderer/shape_builders/triangle_builder.rs +++ b/src/renderer/shape_builders/triangle_builder.rs @@ -15,17 +15,6 @@ use crate::renderer::{ use glam::Vec3; /// Builder for creating a simple triangle primitive -/// -/// # Example -/// -/// ``` -/// let triangle = renderer.create_triangle( -/// Vec3::new(0.0, 0.5, 0.0), // Top vertex -/// Vec3::new(-0.5, -0.5, 0.0), // Bottom-left vertex -/// Vec3::new(0.5, -0.5, 0.0), // Bottom-right vertex -/// Color::new(1.0, 0.0, 0.0, 1.0) // Red color -/// ); -/// ``` pub struct TriangleBuilder { vertices: [Vertex; 3], } @@ -72,6 +61,5 @@ mod tests { assert_eq!(triangle.vertices[0].position, [0.0, 0.5, 0.0]); assert_eq!(triangle.vertices[1].position, [-0.5, -0.5, 0.0]); assert_eq!(triangle.vertices[2].position, [0.5, -0.5, 0.0]); - // assert_eq!(triangle.vertices[0].color, color.as_array()); } }