### Input Handling Setup Example Source: https://docs.rs/macroquad/0.4.5/macroquad/window/fn.screen_width Provides an initial setup for handling user input within a macroquad application. This snippet sets up variables for position, likely to be controlled by keyboard or mouse input in a full application. ```rust async fn main() { let mut x = screen_width() / 2.0; let mut y = screen_height() / 2.0; ``` -------------------------------- ### Macroquad 3D Scene Setup Source: https://docs.rs/macroquad/0.4.5/macroquad/ui/widgets/struct.Window An example demonstrating the initialization and rendering loop of a macroquad application. It includes loading textures, setting up a 3D camera, drawing a grid, applying materials with shaders, and rendering basic 3D primitives like spheres and planes. ```Rust async fn main() { let ferris = load_texture("examples/rust.png").await.unwrap(); let (color_picker_texture, color_picker_image) = color_picker_texture(200, 200); let mut fragment_shader = DEFAULT_FRAGMENT_SHADER.to_string(); let mut vertex_shader = DEFAULT_VERTEX_SHADER.to_string(); let pipeline_params = PipelineParams { depth_write: true, depth_test: Comparison::LessOrEqual, ..Default::default() }; let mut material = load_material( ShaderSource::Glsl { vertex: &vertex_shader, fragment: &fragment_shader, }, MaterialParams { pipeline_params, ..Default::default() }, ) .unwrap(); let mut error: Option = None; enum Mesh { Sphere, Cube, Plane, } let mut mesh = Mesh::Sphere; let mut camera = Camera3D { position: vec3(-15., 15., -5.), up: vec3(0., 1., 0.), target: vec3(0., 5., -5.), ..Default::default() }; let mut colorpicker_window = false; let mut color_picking_uniform = None; let mut new_uniform_window = false; let mut new_uniform_name = String::new(); let mut uniforms: Vec<(String, Uniform)> = vec![]; loop { clear_background(WHITE); set_camera(&camera); draw_grid( 20, 1., Color::new(0.55, 0.55, 0.55, 0.75), Color::new(0.75, 0.75, 0.75, 0.75), ); gl_use_material(&material); match mesh { Mesh::Plane => draw_plane(vec3(0., 2., 0.), vec2(5., 5.), Some(&ferris), WHITE), Mesh::Sphere => draw_sphere(vec3(0., 6., 0.), 5., Some(&ferris), WHITE), } // UI elements and other logic would follow here // ... next_frame().await; } } ``` -------------------------------- ### Window Configuration Example Source: https://docs.rs/macroquad/0.4.5/macroquad/window/fn.next_frame Demonstrates basic window setup and an infinite loop for rendering. It clears the background to white and waits for the next frame. ```rust async fn main() { loop { clear_background(WHITE); next_frame().await } } ``` -------------------------------- ### Macroquad 3D Rendering Setup and Main Loop Source: https://docs.rs/macroquad/0.4.5/macroquad/ui/widgets/struct.Window Provides a foundational example of setting up a 3D rendering environment in Macroquad. It covers loading textures, defining shaders and materials, configuring a 3D camera, and initiating the main application loop with basic scene elements like grids and meshes. ```rust async fn main() { let ferris = load_texture("examples/rust.png").await.unwrap(); let (color_picker_texture, color_picker_image) = color_picker_texture(200, 200); let mut fragment_shader = DEFAULT_FRAGMENT_SHADER.to_string(); let mut vertex_shader = DEFAULT_VERTEX_SHADER.to_string(); let pipeline_params = PipelineParams { depth_write: true, depth_test: Comparison::LessOrEqual, ..Default::default() }; let mut material = load_material( ShaderSource::Glsl { vertex: &vertex_shader, fragment: &fragment_shader, }, MaterialParams { pipeline_params, ..Default::default() }, ) .unwrap(); let mut error: Option = None; enum Mesh { Sphere, Cube, Plane, } let mut mesh = Mesh::Sphere; let mut camera = Camera3D { position: vec3(-15., 15., -5.), up: vec3(0., 1., 0.), target: vec3(0., 5., -5.), ..Default::default() }; let mut colorpicker_window = false; let mut color_picking_uniform = None; let mut new_uniform_window = false; let mut new_uniform_name = String::new(); let mut uniforms: Vec<(String, Uniform)> = vec![]; loop { clear_background(WHITE); set_camera(&camera); draw_grid( 20, 1., Color::new(0.55, 0.55, 0.55, 0.75), Color::new(0.75, 0.75, 0.75, 0.75), ); gl_use_material(&material); match mesh { Mesh::Plane => draw_plane(vec3(0., 2., 0.), vec2(5., 5.), Some(&ferris), WHITE), Mesh::Sphere => draw_sphere(vec3(0., 6., 0.), 5., Some(&ferris), WHITE), } } } ``` -------------------------------- ### Macroquad 3D Rendering Example Source: https://docs.rs/macroquad/0.4.5/macroquad/models/fn.draw_grid Demonstrates basic 3D scene setup in Macroquad, including loading textures, drawing cubes, planes, and spheres, and switching between 3D and screen space cameras. Requires texture files like 'examples/rust.png' and 'examples/ferris.png'. ```rust async fn main() { let rust_logo = load_texture("examples/rust.png").await.unwrap(); let ferris = load_texture("examples/ferris.png").await.unwrap(); loop { clear_background(LIGHTGRAY); // Going 3d! set_camera(&Camera3D { position: vec3(-20., 15., 0.), up: vec3(0., 1., 0.), target: vec3(0., 0., 0.), ..Default::default() }); draw_grid(20, 1., BLACK, GRAY); draw_cube_wires(vec3(0., 1., -6.), vec3(2., 2., 2.), DARKGREEN); draw_cube_wires(vec3(0., 1., 6.), vec3(2., 2., 2.), DARKBLUE); draw_cube_wires(vec3(2., 1., 2.), vec3(2., 2., 2.), YELLOW); draw_plane(vec3(-8., 0., -8.), vec2(5., 5.), Some(&ferris), WHITE); draw_cube( vec3(-5., 1., -2.), vec3(2., 2., 2.), Some(&rust_logo), WHITE, ); draw_cube(vec3(-5., 1., 2.), vec3(2., 2., 2.), Some(&ferris), WHITE); draw_cube(vec3(2., 0., -2.), vec3(0.4, 0.4, 0.4), None, BLACK); draw_sphere(vec3(-8., 0., 0.), 1., None, BLUE); // Back to screen space, render some text set_default_camera(); draw_text("WELCOME TO 3D WORLD", 10.0, 20.0, 30.0, BLACK); next_frame().await } } ``` -------------------------------- ### Macroquad 3D Scene Example Source: https://docs.rs/macroquad/0.4.5/macroquad/ui/fn.root_ui Demonstrates a basic 3D scene setup in Macroquad. It covers loading textures, creating materials with GLSL shaders, defining camera parameters, drawing primitive shapes (Sphere, Cube, Plane), and interacting with UI elements to modify shader uniforms. This example showcases core Macroquad functionalities for 3D rendering and interactive applications. ```rust async fn main() { let ferris = load_texture("examples/rust.png").await.unwrap(); let (color_picker_texture, color_picker_image) = color_picker_texture(200, 200); let mut fragment_shader = DEFAULT_FRAGMENT_SHADER.to_string(); let mut vertex_shader = DEFAULT_VERTEX_SHADER.to_string(); let pipeline_params = PipelineParams { depth_write: true, depth_test: Comparison::LessOrEqual, ..Default::default() }; let mut material = load_material( ShaderSource::Glsl { vertex: &vertex_shader, fragment: &fragment_shader, }, MaterialParams { pipeline_params, ..Default::default() }, ) .unwrap(); let mut error: Option = None; enum Mesh { Sphere, Cube, Plane, } let mut mesh = Mesh::Sphere; let mut camera = Camera3D { position: vec3(-15., 15., -5.), up: vec3(0., 1., 0.), target: vec3(0., 5., -5.), ..Default::default() }; let mut colorpicker_window = false; let mut color_picking_uniform = None; let mut new_uniform_window = false; let mut new_uniform_name = String::new(); let mut uniforms: Vec<(String, Uniform)> = vec![]; loop { clear_background(WHITE); set_camera(&camera); draw_grid( 20, 1., Color::new(0.55, 0.55, 0.55, 0.75), Color::new(0.75, 0.75, 0.75, 0.75), ); gl_use_material(&material); match mesh { Mesh::Plane => draw_plane(vec3(0., 2., 0.), vec2(5., 5.), Some(&ferris), WHITE), Mesh::Sphere => draw_sphere(vec3(0., 6., 0.), 5., Some(&ferris), WHITE), Mesh::Cube => draw_cube(vec3(0., 5., 0.), vec3(10., 10., 10.), Some(&ferris), WHITE), } gl_use_default_material(); set_default_camera(); let mut need_update = false; widgets::Window::new(hash!(), vec2(20., 20.), vec2(470., 650.)) .label("Shader") .ui(&mut *root_ui(), |ui| { ui.label(None, "Camera: "); ui.same_line(0.0); if ui.button(None, "Ortho") { camera.projection = Projection::Orthographics; } ui.same_line(0.0); if ui.button(None, "Perspective") { camera.projection = Projection::Perspective; } ui.label(None, "Mesh: "); ui.same_line(0.0); if ui.button(None, "Sphere") { mesh = Mesh::Sphere; } ui.same_line(0.0); if ui.button(None, "Cube") { mesh = Mesh::Cube; } ui.same_line(0.0); if ui.button(None, "Plane") { mesh = Mesh::Plane; } ui.label(None, "Uniforms:"); ui.separator(); for (i, (name, uniform)) in uniforms.iter_mut().enumerate() { ui.label(None, &format!("{}", name)); ui.same_line(120.0); match uniform { Uniform::Float1(x) => { widgets::InputText::new(hash!(hash!(), i)) .size(vec2(200.0, 19.0)) .filter_numbers() .ui(ui, x); if let Ok(x) = x.parse::() { material.set_uniform(name, x); } } Uniform::Float2(x, y) => { widgets::InputText::new(hash!(hash!(), i)) .size(vec2(99.0, 19.0)) .filter_numbers() .ui(ui, x); ui.same_line(0.0); widgets::InputText::new(hash!(hash!(), i)) .size(vec2(99.0, 19.0)) ``` -------------------------------- ### Rust Macroquad 3D Rendering Example Source: https://docs.rs/macroquad/0.4.5/macroquad/material/fn.gl_use_material This snippet demonstrates a complete 3D scene setup in Macroquad. It includes loading textures, defining a 3D camera, drawing basic meshes (Sphere, Cube, Plane) with a custom GLSL shader material, and implementing a UI for controlling camera projection, mesh type, and shader uniforms. It requires the Macroquad library and an 'examples/rust.png' texture file. ```Rust use macroquad::prelude::* #[macroquad::main("Hello Triangle")] async fn main() { let ferris = load_texture("examples/rust.png").await.unwrap(); let (color_picker_texture, color_picker_image) = color_picker_texture(200, 200); let mut fragment_shader = DEFAULT_FRAGMENT_SHADER.to_string(); let mut vertex_shader = DEFAULT_VERTEX_SHADER.to_string(); let pipeline_params = PipelineParams { depth_write: true, depth_test: Comparison::LessOrEqual, ..Default::default() }; let mut material = load_material( ShaderSource::Glsl { vertex: &vertex_shader, fragment: &fragment_shader, }, MaterialParams { pipeline_params, ..Default::default() }, ) .unwrap(); let mut error: Option = None; enum Mesh { Sphere, Cube, Plane, } let mut mesh = Mesh::Sphere; let mut camera = Camera3D { position: vec3(-15., 15., -5.), up: vec3(0., 1., 0.), target: vec3(0., 5., -5.), ..Default::default() }; let mut colorpicker_window = false; let mut color_picking_uniform = None; let mut new_uniform_window = false; let mut new_uniform_name = String::new(); let mut uniforms: Vec<(String, Uniform)> = vec![]; loop { clear_background(WHITE); set_camera(&camera); draw_grid( 20, 1., Color::new(0.55, 0.55, 0.55, 0.75), Color::new(0.75, 0.75, 0.75, 0.75), ); gl_use_material(&material); match mesh { Mesh::Plane => draw_plane(vec3(0., 2., 0.), vec2(5., 5.), Some(&ferris), WHITE), Mesh::Sphere => draw_sphere(vec3(0., 6., 0.), 5., Some(&ferris), WHITE), Mesh::Cube => draw_cube(vec3(0., 5., 0.), vec3(10., 10., 10.), Some(&ferris), WHITE), } gl_use_default_material(); set_default_camera(); let mut need_update = false; widgets::Window::new(hash!(), vec2(20., 20.), vec2(470., 650.)) .label("Shader") .ui(&mut *root_ui(), |ui| { ui.label(None, "Camera: "); ui.same_line(0.0); if ui.button(None, "Ortho") { camera.projection = Projection::Orthographics; } ui.same_line(0.0); if ui.button(None, "Perspective") { camera.projection = Projection::Perspective; } ui.label(None, "Mesh: "); ui.same_line(0.0); if ui.button(None, "Sphere") { mesh = Mesh::Sphere; } ui.same_line(0.0); if ui.button(None, "Cube") { mesh = Mesh::Cube; } ui.same_line(0.0); if ui.button(None, "Plane") { mesh = Mesh::Plane; } ui.label(None, "Uniforms:"); ui.separator(); for (i, (name, uniform)) in uniforms.iter_mut().enumerate() { ui.label(None, &format!("{}", name)); ui.same_line(120.0); match uniform { Uniform::Float1(x) => { widgets::InputText::new(hash!(hash!(), i)) .size(vec2(200.0, 19.0)) .filter_numbers() .ui(ui, x); if let Ok(x) = x.parse::() { material.set_uniform(name, x); } } Uniform::Float2(x, y) => { widgets::InputText::new(hash!(hash!(), i)) .size(vec2(99.0, 19.0)) .filter_numbers() .ui(ui, x); ui.same_line(0.0); widgets::InputText::new(hash!(hash!(), i)) .size(vec2(99.0, 19.0)) .filter_numbers() .ui(ui, y); } // ... other uniform types would be handled here } } if ui.button(None, "Add Uniform") { new_uniform_window = true; } if new_uniform_window { widgets::Window::new(hash!(), vec2(500., 20.), vec2(300., 150.)) .label("Add New Uniform") .ui(&mut *root_ui(), |ui| { ui.label(None, "Uniform Name:"); widgets::InputText::new(hash!("uniform_name")) .size(vec2(280.0, 19.0)) .ui(ui, &mut new_uniform_name); if ui.button(None, "Add Float1") { uniforms.push((new_uniform_name.clone(), Uniform::Float1(0.0))); new_uniform_window = false; new_uniform_name.clear(); } if ui.button(None, "Add Float2") { uniforms.push((new_uniform_name.clone(), Uniform::Float2(0.0, 0.0))); new_uniform_window = false; new_uniform_name.clear(); } if ui.button(None, "Close") { new_uniform_window = false; new_uniform_name.clear(); } }); } }); next_frame().await } } // Placeholder for color_picker_texture and Uniform enum if not defined elsewhere #[derive(Clone)] enum Uniform { Float1(f32), Float2(f32, f32), // Add other types as needed } fn color_picker_texture(width: u32, height: u32) -> (Texture2D, Image) { // Dummy implementation for demonstration let img = Image::gen_image_color(width, height, WHITE); let tex = Texture2D::from_image(&img); (tex, img) } // Dummy definitions for DEFAULT_FRAGMENT_SHADER and DEFAULT_VERTEX_SHADER const DEFAULT_FRAGMENT_SHADER: &str = "#version 100\nprecision mediump float;\nvary vec2 v_uv;\nvoid main() { gl_FragColor = vec4(v_uv.x, v_uv.y, 0.0, 1.0); }\n"; const DEFAULT_VERTEX_SHADER: &str = "#version 100\nattribute vec4 position;\nattribute vec2 texcoord;\nuniform mat4 Model;\nuniform mat4 View;\nuniform mat4 Projection;\nvary vec2 v_uv;\nvoid main() { v_uv = texcoord; gl_Position = Projection * View * Model * position; }\n"; ``` -------------------------------- ### Macroquad UI Elements Example Source: https://docs.rs/macroquad/0.4.5/macroquad/ui/struct.StyleBuilder Demonstrates creating interactive UI elements such as draggable items and buttons within the Macroquad framework. It shows basic UI setup and widget usage. ```rust ui.drag(hash!(), "Drag", None, &mut number); widgets::Button::new("Apply") .position(vec2(80.0, 150.0)) .ui(ui); widgets::Button::new("Cancel") .position(vec2(280.0, 150.0)) .ui(ui); }); root_ui().pop_skin(); next_frame().await; } } ``` -------------------------------- ### 3D Rendering Example in Rust Source: https://docs.rs/macroquad/0.4.5/macroquad/models/fn.draw_cube Demonstrates basic 3D scene setup and rendering using macroquad. It covers loading textures, setting up a 3D camera, drawing geometric primitives like cubes and spheres, and managing the rendering loop. The example switches between 3D and 2D rendering contexts. ```Rust async fn main() { let rust_logo = load_texture("examples/rust.png").await.unwrap(); let ferris = load_texture("examples/ferris.png").await.unwrap(); loop { clear_background(LIGHTGRAY); // Going 3d! set_camera(&Camera3D { position: vec3(-20., 15., 0.), up: vec3(0., 1., 0.), target: vec3(0., 0., 0.), ..Default::default() }); draw_grid(20, 1., BLACK, GRAY); draw_cube_wires(vec3(0., 1., -6.), vec3(2., 2., 2.), DARKGREEN); draw_cube_wires(vec3(0., 1., 6.), vec3(2., 2., 2.), DARKBLUE); draw_cube_wires(vec3(2., 1., 2.), vec3(2., 2., 2.), YELLOW); draw_plane(vec3(-8., 0., -8.), vec2(5., 5.), Some(&ferris), WHITE); draw_cube( vec3(-5., 1., -2.), vec3(2., 2., 2.), Some(&rust_logo), WHITE, ); draw_cube(vec3(-5., 1., 2.), vec3(2., 2., 2.), Some(&ferris), WHITE); draw_cube(vec3(2., 0., -2.), vec3(0.4, 0.4, 0.4), None, BLACK); draw_sphere(vec3(-8., 0., 0.), 1., None, BLUE); // Back to screen space, render some text set_default_camera(); draw_text("WELCOME TO 3D WORLD", 10.0, 20.0, 30.0, BLACK); next_frame().await } } ``` -------------------------------- ### Macroquad 3D Scene Rendering Example Source: https://docs.rs/macroquad/0.4.5/macroquad/models/fn.draw_cube_wires Demonstrates basic 3D scene setup and drawing using macroquad. It includes loading textures, setting up a 3D camera, drawing geometric shapes like cubes and spheres, and rendering text in both 3D and screen space. Requires texture files like 'examples/rust.png' and 'examples/ferris.png'. ```rust async fn main() { let rust_logo = load_texture("examples/rust.png").await.unwrap(); let ferris = load_texture("examples/ferris.png").await.unwrap(); loop { clear_background(LIGHTGRAY); // Going 3d! set_camera(&Camera3D { position: vec3(-20., 15., 0.), up: vec3(0., 1., 0.), target: vec3(0., 0., 0.), ..Default::default() }); draw_grid(20, 1., BLACK, GRAY); draw_cube_wires(vec3(0., 1., -6.), vec3(2., 2., 2.), DARKGREEN); draw_cube_wires(vec3(0., 1., 6.), vec3(2., 2., 2.), DARKBLUE); draw_cube_wires(vec3(2., 1., 2.), vec3(2., 2., 2.), YELLOW); draw_plane(vec3(-8., 0., -8.), vec2(5., 5.), Some(&ferris), WHITE); draw_cube( vec3(-5., 1., -2.), vec3(2., 2., 2.), Some(&rust_logo), WHITE, ); draw_cube(vec3(-5., 1., 2.), vec3(2., 2., 2.), Some(&ferris), WHITE); draw_cube(vec3(2., 0., -2.), vec3(0.4, 0.4, 0.4), None, BLACK); draw_sphere(vec3(-8., 0., 0.), 1., None, BLUE); // Back to screen space, render some text set_default_camera(); draw_text("WELCOME TO 3D WORLD", 10.0, 20.0, 30.0, BLACK); next_frame().await } } ``` -------------------------------- ### Macroquad 3D Rendering Example Source: https://docs.rs/macroquad/0.4.5/macroquad/models/fn.draw_sphere Demonstrates basic 3D scene setup and rendering in Macroquad. It includes setting up a 3D camera, drawing geometric shapes like cubes, planes, and spheres, and using textures. The example also shows how to switch between 3D and 2D rendering contexts. ```rust async fn main() { let rust_logo = load_texture("examples/rust.png").await.unwrap(); let ferris = load_texture("examples/ferris.png").await.unwrap(); loop { clear_background(LIGHTGRAY); // Going 3d! set_camera(&Camera3D { position: vec3(-20., 15., 0.), up: vec3(0., 1., 0.), target: vec3(0., 0., 0.), ..Default::default() }); draw_grid(20, 1., BLACK, GRAY); draw_cube_wires(vec3(0., 1., -6.), vec3(2., 2., 2.), DARKGREEN); draw_cube_wires(vec3(0., 1., 6.), vec3(2., 2., 2.), DARKBLUE); draw_cube_wires(vec3(2., 1., 2.), vec3(2., 2., 2.), YELLOW); draw_plane(vec3(-8., 0., -8.), vec2(5., 5.), Some(&ferris), WHITE); draw_cube( vec3(-5., 1., -2.), vec3(2., 2., 2.), Some(&rust_logo), WHITE, ); draw_cube(vec3(-5., 1., 2.), vec3(2., 2., 2.), Some(&ferris), WHITE); draw_cube(vec3(2., 0., -2.), vec3(0.4, 0.4, 0.4), None, BLACK); draw_sphere(vec3(-8., 0., 0.), 1., None, BLUE); // Back to screen space, render some text set_default_camera(); draw_text("WELCOME TO 3D WORLD", 10.0, 20.0, 30.0, BLACK); next_frame().await } } ``` -------------------------------- ### Rust Macroquad Tree Example Source: https://docs.rs/macroquad/0.4.5/macroquad/window/fn.get_internal_gl Demonstrates basic Macroquad usage including camera setup, clearing the screen, drawing a circle, and calling a custom tree rendering function. It utilizes the game loop and asynchronous operations with `next_frame().await`. ```rust async fn main() { let camera = Camera2D { zoom: vec2(1., 1.), target: vec2(0.0, 0.5), ..Default::default() }; set_camera(&camera); loop { clear_background(LIGHTGRAY); draw_circle(0., 0., 0.03, DARKGRAY); tree(unsafe { get_internal_gl().quad_gl }, get_time(), 0, 1., 0.3); next_frame().await } } ``` -------------------------------- ### 3D Rendering Example - macroquad Source: https://docs.rs/macroquad/0.4.5/macroquad/camera/fn.set_default_camera Illustrates 3D rendering capabilities in macroquad. This example shows setting up a 3D camera, drawing 3D shapes like cubes and planes, loading textures for objects, and rendering text in screen space. ```rust async fn main() { let rust_logo = load_texture("examples/rust.png").await.unwrap(); let ferris = load_texture("examples/ferris.png").await.unwrap(); loop { clear_background(LIGHTGRAY); // Going 3d! set_camera(&Camera3D { position: vec3(-20., 15., 0.), up: vec3(0., 1., 0.), target: vec3(0., 0., 0.), ..Default::default() }); draw_grid(20, 1., BLACK, GRAY); draw_cube_wires(vec3(0., 1., -6.), vec3(2., 2., 2.), DARKGREEN); draw_cube_wires(vec3(0., 1., 6.), vec3(2., 2., 2.), DARKBLUE); draw_cube_wires(vec3(2., 1., 2.), vec3(2., 2., 2.), YELLOW); draw_plane(vec3(-8., 0., -8.), vec2(5., 5.), Some(&ferris), WHITE); draw_cube( vec3(-5., 1., -2.), vec3(2., 2., 2.), Some(&rust_logo), WHITE, ); draw_cube(vec3(-5., 1., 2.), vec3(2., 2., 2.), Some(&ferris), WHITE); draw_cube(vec3(2., 0., -2.), vec3(0.4, 0.4, 0.4), None, BLACK); draw_sphere(vec3(-8., 0., 0.), 1., None, BLUE); // Back to screen space, render some text set_default_camera(); draw_text("WELCOME TO 3D WORLD", 10.0, 20.0, 30.0, BLACK); next_frame().await } } ``` -------------------------------- ### Rust 3D Shader Example with UI Source: https://docs.rs/macroquad/0.4.5/macroquad/ui/widgets/struct.InputText This example demonstrates how to set up a 3D scene using macroquad, load textures, apply custom GLSL shaders, and create interactive UI elements for controlling the scene. It includes mesh selection, camera projection toggling, and uniform manipulation. ```Rust async fn main() { let ferris = load_texture("examples/rust.png").await.unwrap(); let (color_picker_texture, color_picker_image) = color_picker_texture(200, 200); let mut fragment_shader = DEFAULT_FRAGMENT_SHADER.to_string(); let mut vertex_shader = DEFAULT_VERTEX_SHADER.to_string(); let pipeline_params = PipelineParams { depth_write: true, depth_test: Comparison::LessOrEqual, ..Default::default() }; let mut material = load_material( ShaderSource::Glsl { vertex: &vertex_shader, fragment: &fragment_shader, }, MaterialParams { pipeline_params, ..Default::default() }, ) .unwrap(); let mut error: Option = None; enum Mesh { Sphere, Cube, Plane, } let mut mesh = Mesh::Sphere; let mut camera = Camera3D { position: vec3(-15., 15., -5.), up: vec3(0., 1., 0.), target: vec3(0., 5., -5.), ..Default::default() }; let mut colorpicker_window = false; let mut color_picking_uniform = None; let mut new_uniform_window = false; let mut new_uniform_name = String::new(); let mut uniforms: Vec<(String, Uniform)> = vec![]; loop { clear_background(WHITE); set_camera(&camera); draw_grid( 20, 1., Color::new(0.55, 0.55, 0.55, 0.75), Color::new(0.75, 0.75, 0.75, 0.75), ); gl_use_material(&material); match mesh { Mesh::Plane => draw_plane(vec3(0., 2., 0.), vec2(5., 5.), Some(&ferris), WHITE), Mesh::Sphere => draw_sphere(vec3(0., 6., 0.), 5., Some(&ferris), WHITE), Mesh::Cube => draw_cube(vec3(0., 5., 0.), vec3(10., 10., 10.), Some(&ferris), WHITE), } gl_use_default_material(); set_default_camera(); let mut need_update = false; widgets::Window::new(hash!(), vec2(20., 20.), vec2(470., 650.)) .label("Shader") .ui(&mut *root_ui(), |ui| { ui.label(None, "Camera: "); ui.same_line(0.0); if ui.button(None, "Ortho") { camera.projection = Projection::Orthographics; } ui.same_line(0.0); if ui.button(None, "Perspective") { camera.projection = Projection::Perspective; } ui.label(None, "Mesh: "); ui.same_line(0.0); if ui.button(None, "Sphere") { mesh = Mesh::Sphere; } ui.same_line(0.0); if ui.button(None, "Cube") { mesh = Mesh::Cube; } ui.same_line(0.0); if ui.button(None, "Plane") { mesh = Mesh::Plane; } ui.label(None, "Uniforms:"); ui.separator(); for (i, (name, uniform)) in uniforms.iter_mut().enumerate() { ui.label(None, &format!("{}", name)); ui.same_line(120.0); match uniform { Uniform::Float1(x) => { widgets::InputText::new(hash!(hash!(), i)) .size(vec2(200.0, 19.0)) .filter_numbers() .ui(ui, x); if let Ok(x) = x.parse::() { ``` -------------------------------- ### Example: Audio Playback with set_pc_assets_folder Source: https://docs.rs/macroquad/0.4.5/macroquad/file/fn.set_pc_assets_folder Demonstrates how to use `set_pc_assets_folder` to set the asset directory before loading audio files. This example shows a simple interactive loop where users can play two different sound effects, ensuring that asset paths are correctly resolved on PC. ```rust async fn main() { set_pc_assets_folder("examples"); let sound1 = audio::load_sound("sound.wav").await.unwrap(); let sound2 = audio::load_sound("sound2.wav").await.unwrap(); loop { clear_background(LIGHTGRAY); if ui::root_ui().button(None, "Play sound 1") { warn!("play 1!"); audio::play_sound_once(&sound1); } if ui::root_ui().button(None, "Play sound 2") { warn!("play 2!"); audio::play_sound_once(&sound2); } next_frame().await } } ``` -------------------------------- ### Rust Arkanoid Game Setup with Macroquad Source: https://docs.rs/macroquad/0.4.5/macroquad/time/fn.get_frame_time Shows the initialization for an Arkanoid-style game using Rust and macroquad. Defines game constants, ball and platform positions, and sets up a 2D camera. This snippet is part of the game's initial setup. ```rust async fn main() { const BLOCKS_W: usize = 10; const BLOCKS_H: usize = 10; const SCR_W: f32 = 20.0; const SCR_H: f32 = 20.0; let mut blocks: [[bool; BLOCKS_W]; BLOCKS_H] = [[true; BLOCKS_W]; BLOCKS_H]; let mut ball_x = 12.; let mut ball_y = 7.; let mut dx = 3.5; let mut dy = -3.5; let mut platform_x = 10.; let mut stick = true; let platform_width = 5.; let platform_height = 0.2; // build camera with following coordinate system: // (0., 0) .... (SCR_W, 0.) // (0., SCR_H) .... (SCR_W, SCR_H) set_camera(&Camera2D { zoom: vec2(1. / SCR_W * 2., 1. / SCR_H * 2.), target: vec2(SCR_W / 2., SCR_H / 2.), ..Default::default() }); } ``` -------------------------------- ### Rust Macroquad Example: Shader and UI Interaction Source: https://docs.rs/macroquad/0.4.5/macroquad/ui/widgets/struct.InputText This Rust code demonstrates a basic 3D scene setup using the macroquad library. It includes loading textures, defining a 3D camera, drawing primitive shapes (Sphere, Cube, Plane) with a custom shader material, and implementing a simple UI for controlling camera projection and mesh selection. It also shows how to manage custom shader uniforms. ```Rust async fn main() { let ferris = load_texture("examples/rust.png").await.unwrap(); let (color_picker_texture, color_picker_image) = color_picker_texture(200, 200); let mut fragment_shader = DEFAULT_FRAGMENT_SHADER.to_string(); let mut vertex_shader = DEFAULT_VERTEX_SHADER.to_string(); let pipeline_params = PipelineParams { depth_write: true, depth_test: Comparison::LessOrEqual, ..Default::default() }; let mut material = load_material( ShaderSource::Glsl { vertex: &vertex_shader, fragment: &fragment_shader, }, MaterialParams { pipeline_params, ..Default::default() }, ) .unwrap(); let mut error: Option = None; enum Mesh { Sphere, Cube, Plane, } let mut mesh = Mesh::Sphere; let mut camera = Camera3D { position: vec3(-15., 15., -5.), up: vec3(0., 1., 0.), target: vec3(0., 5., -5.), ..Default::default() }; let mut colorpicker_window = false; let mut color_picking_uniform = None; let mut new_uniform_window = false; let mut new_uniform_name = String::new(); let mut uniforms: Vec<(String, Uniform)> = vec![]; loop { clear_background(WHITE); set_camera(&camera); draw_grid( 20, 1., Color::new(0.55, 0.55, 0.55, 0.75), Color::new(0.75, 0.75, 0.75, 0.75), ); gl_use_material(&material); match mesh { Mesh::Plane => draw_plane(vec3(0., 2., 0.), vec2(5., 5.), Some(&ferris), WHITE), Mesh::Sphere => draw_sphere(vec3(0., 6., 0.), 5., Some(&ferris), WHITE), Mesh::Cube => draw_cube(vec3(0., 5., 0.), vec3(10., 10., 10.), Some(&ferris), WHITE), } gl_use_default_material(); set_default_camera(); let mut need_update = false; widgets::Window::new(hash!(), vec2(20., 20.), vec2(470., 650.)) .label("Shader") .ui(&mut *root_ui(), |ui| { ui.label(None, "Camera: "); ui.same_line(0.0); if ui.button(None, "Ortho") { camera.projection = Projection::Orthographics; } ui.same_line(0.0); if ui.button(None, "Perspective") { camera.projection = Projection::Perspective; } ui.label(None, "Mesh: "); ui.same_line(0.0); if ui.button(None, "Sphere") { mesh = Mesh::Sphere; } ui.same_line(0.0); if ui.button(None, "Cube") { mesh = Mesh::Cube; } ui.same_line(0.0); if ui.button(None, "Plane") { mesh = Mesh::Plane; } ui.label(None, "Uniforms:"); ui.separator(); for (i, (name, uniform)) in uniforms.iter_mut().enumerate() { ui.label(None, &format!("{}", name)); ui.same_line(120.0); match uniform { Uniform::Float1(x) => { widgets::InputText::new(hash!(hash!(), i)) .size(vec2(200.0, 19.0)) .filter_numbers() .ui(ui, x); if let Ok(x) = x.parse::() { ``` -------------------------------- ### Macroquad 3D Rendering Example Source: https://docs.rs/macroquad/0.4.5/macroquad/text/fn.draw_text Provides a comprehensive example of 3D rendering in Macroquad. It demonstrates loading textures, setting up a `Camera3D`, drawing various 3D primitives like cubes and spheres, using wireframes, drawing planes with textures, and rendering text in screen space after returning to the default camera. ```rust async fn main() { let rust_logo = load_texture("examples/rust.png").await.unwrap(); let ferris = load_texture("examples/ferris.png").await.unwrap(); loop { clear_background(LIGHTGRAY); // Going 3d! set_camera(&Camera3D { position: vec3(-20., 15., 0.), up: vec3(0., 1., 0.), target: vec3(0., 0., 0.), ..Default::default() }); draw_grid(20, 1., BLACK, GRAY); draw_cube_wires(vec3(0., 1., -6.), vec3(2., 2., 2.), DARKGREEN); draw_cube_wires(vec3(0., 1., 6.), vec3(2., 2., 2.), DARKBLUE); draw_cube_wires(vec3(2., 1., 2.), vec3(2., 2., 2.), YELLOW); draw_plane(vec3(-8., 0., -8.), vec2(5., 5.), Some(&ferris), WHITE); draw_cube( vec3(-5., 1., -2.), vec3(2., 2., 2.), Some(&rust_logo), WHITE, ); draw_cube(vec3(-5., 1., 2.), vec3(2., 2., 2.), Some(&ferris), WHITE); draw_cube(vec3(2., 0., -2.), vec3(0.4, 0.4, 0.4), None, BLACK); draw_sphere(vec3(-8., 0., 0.), 1., None, BLUE); // Back to screen space, render some text set_default_camera(); draw_text("WELCOME TO 3D WORLD", 10.0, 20.0, 30.0, BLACK); next_frame().await } } ```