From 3415795b002c71dcb300ed3601c416f44afb3710 Mon Sep 17 00:00:00 2001 From: Matthew Deville Date: Sun, 31 Aug 2025 01:53:21 +0200 Subject: [PATCH] wip --- .cargo/config.toml | 3 --- .gitignore | 1 + Cargo.toml | 2 +- flake.nix | 20 +++++++------- src/main.rs | 66 ++++++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 75 insertions(+), 17 deletions(-) delete mode 100644 .cargo/config.toml diff --git a/.cargo/config.toml b/.cargo/config.toml deleted file mode 100644 index bea921d..0000000 --- a/.cargo/config.toml +++ /dev/null @@ -1,3 +0,0 @@ -[target.'cfg(target_os = "linux")'] -linker = "clang" -rustflags = ["-C", "link-arg=-fuse-ld=/path/to/mold"] diff --git a/.gitignore b/.gitignore index ea8c4bf..07c12f2 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +result diff --git a/Cargo.toml b/Cargo.toml index 0d59283..598c628 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,4 +5,4 @@ edition = "2024" [dependencies] -bevy = "0.16.1" +bevy = { version = "0.16.1", features = ["shader_format_glsl"] } diff --git a/flake.nix b/flake.nix index 2fcd2c7..a8b56ed 100644 --- a/flake.nix +++ b/flake.nix @@ -19,11 +19,13 @@ let overlays = [ (import rust-overlay) ]; pkgs = import nixpkgs { inherit system overlays; }; + stdenv = pkgs.stdenvAdapters.useMoldLinker pkgs.clangStdenv; rustToolchain = pkgs.pkgsBuildHost.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml; nativeBuildInputs = with pkgs; [ rustToolchain mold pkg-config + clang ]; xorgBuildInputs = with pkgs; [ xorg.libX11 @@ -44,25 +46,21 @@ ++ xorgBuildInputs ++ waylandBuildInputs; - # Build target for the binary - default_package = pkgs.rustPlatform.buildRustPackage { + mkShell = pkgs.mkShell.override { + stdenv = stdenv; + }; + in + { + packages.default = pkgs.rustPlatform.buildRustPackage { + inherit stdenv buildInputs nativeBuildInputs; pname = (builtins.fromTOML (builtins.readFile ./Cargo.toml)).package.name; version = (builtins.fromTOML (builtins.readFile ./Cargo.toml)).package.version; src = ./.; cargoLock = { lockFile = ./Cargo.lock; }; - nativeBuildInputs = nativeBuildInputs; - buildInputs = buildInputs; }; - mkShell = pkgs.mkShell.override { - stdenv = pkgs.stdenvAdapters.useMoldLinker pkgs.clangStdenv; - }; - in - { - packages.default = default_package; - devShells.default = mkShell { inherit buildInputs nativeBuildInputs; diff --git a/src/main.rs b/src/main.rs index d216c17..d0ce2ce 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,69 @@ -use bevy::prelude::*; +//! A shader that uses the GLSL shading language. + +use bevy::{ + prelude::*, reflect::TypePath, render::render_resource::AsBindGroup, render::render_resource::ShaderRef, +}; + +/// This example uses shader source files from the assets subdirectory +const VERTEX_SHADER_ASSET_PATH: &str = "shaders/custom_material.vert"; +const FRAGMENT_SHADER_ASSET_PATH: &str = "shaders/custom_material.frag"; fn main() { App::new() - .add_plugins(DefaultPlugins) + .add_plugins((DefaultPlugins, MaterialPlugin::::default())) + .add_systems(Startup, setup) .run(); } + +/// set up a simple 3D scene +fn setup( + mut commands: Commands, + mut meshes: ResMut>, + mut materials: ResMut>, + asset_server: Res, +) { + // cube + commands.spawn(( + Mesh3d(meshes.add(Cuboid::default())), + MeshMaterial3d(materials.add(CustomMaterial { + color: LinearRgba::BLUE, + color_texture: None, + alpha_mode: AlphaMode::Blend, + })), + Transform::from_xyz(0.0, 0.5, 0.0), + )); + + // camera + commands.spawn(( + Camera3d::default(), + Transform::from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3::ZERO, Vec3::Y), + )); +} + +// This is the struct that will be passed to your shader +#[derive(Asset, TypePath, AsBindGroup, Clone)] +struct CustomMaterial { + #[uniform(0)] + color: LinearRgba, + #[texture(1)] + #[sampler(2)] + color_texture: Option>, + alpha_mode: AlphaMode, +} + +/// The Material trait is very configurable, but comes with sensible defaults for all methods. +/// You only need to implement functions for features that need non-default behavior. See the Material api docs for details! +/// When using the GLSL shading language for your shader, the specialize method must be overridden. +impl Material for CustomMaterial { + fn vertex_shader() -> ShaderRef { + VERTEX_SHADER_ASSET_PATH.into() + } + + fn fragment_shader() -> ShaderRef { + FRAGMENT_SHADER_ASSET_PATH.into() + } + + fn alpha_mode(&self) -> AlphaMode { + self.alpha_mode + } +}