mirror of
https://github.com/bevyengine/bevy
synced 2025-01-12 05:09:00 +00:00
79d36e7c28
# Objective - Our crevice is still called "crevice", which we can't use for a release - Users would need to use our "crevice" directly to be able to use the derive macro ## Solution - Rename crevice to bevy_crevice, and crevice-derive to bevy-crevice-derive - Re-export it from bevy_render, and use it from bevy_render everywhere - Fix derive macro to work either from bevy_render, from bevy_crevice, or from bevy ## Remaining - It is currently re-exported as `bevy::render::bevy_crevice`, is it the path we want? - After a brief suggestion to Cart, I changed the version to follow Bevy version instead of crevice, do we want that? - Crevice README.md need to be updated - in the `Cargo.toml`, there are a few things to change. How do we want to change them? How do we keep attributions to original Crevice? ``` authors = ["Lucien Greathouse <me@lpghatguy.com>"] documentation = "https://docs.rs/crevice" homepage = "https://github.com/LPGhatguy/crevice" repository = "https://github.com/LPGhatguy/crevice" ``` Co-authored-by: François <8672791+mockersf@users.noreply.github.com> Co-authored-by: Carter Anderson <mcanders1@gmail.com>
93 lines
2.6 KiB
Rust
93 lines
2.6 KiB
Rust
//! Defines traits and types for generating GLSL code from Rust definitions.
|
|
|
|
pub use bevy_crevice_derive::GlslStruct;
|
|
use std::marker::PhantomData;
|
|
|
|
/// Type-level linked list of array dimensions
|
|
pub struct Dimension<A, const N: usize> {
|
|
_marker: PhantomData<A>,
|
|
}
|
|
|
|
/// Type-level linked list terminator for array dimensions.
|
|
pub struct DimensionNil;
|
|
|
|
/// Trait for type-level array dimensions. Probably shouldn't be implemented outside this crate.
|
|
pub unsafe trait DimensionList {
|
|
/// Write dimensions in square brackets to a string, list tail to list head.
|
|
fn push_to_string(s: &mut String);
|
|
}
|
|
|
|
unsafe impl DimensionList for DimensionNil {
|
|
fn push_to_string(_: &mut String) {}
|
|
}
|
|
|
|
unsafe impl<A: DimensionList, const N: usize> DimensionList for Dimension<A, N> {
|
|
fn push_to_string(s: &mut String) {
|
|
use std::fmt::Write;
|
|
A::push_to_string(s);
|
|
write!(s, "[{}]", N).unwrap();
|
|
}
|
|
}
|
|
|
|
/// Trait for types that have a GLSL equivalent. Useful for generating GLSL code
|
|
/// from Rust structs.
|
|
pub unsafe trait Glsl {
|
|
/// The name of this type in GLSL, like `vec2` or `mat4`.
|
|
const NAME: &'static str;
|
|
}
|
|
|
|
/// Trait for types that can be represented as a struct in GLSL.
|
|
///
|
|
/// This trait should not generally be implemented by hand, but can be derived.
|
|
pub unsafe trait GlslStruct: Glsl {
|
|
/// The fields contained in this struct.
|
|
fn enumerate_fields(s: &mut String);
|
|
|
|
/// Generates GLSL code that represents this struct and its fields.
|
|
fn glsl_definition() -> String {
|
|
let mut output = String::new();
|
|
output.push_str("struct ");
|
|
output.push_str(Self::NAME);
|
|
output.push_str(" {\n");
|
|
|
|
Self::enumerate_fields(&mut output);
|
|
|
|
output.push_str("};");
|
|
output
|
|
}
|
|
}
|
|
|
|
/// Trait for types that are expressible as a GLSL type with (possibly zero) array dimensions.
|
|
pub unsafe trait GlslArray {
|
|
/// Base type name.
|
|
const NAME: &'static str;
|
|
/// Type-level linked list of array dimensions, ordered outer to inner.
|
|
type ArraySize: DimensionList;
|
|
}
|
|
|
|
unsafe impl<T: Glsl> GlslArray for T {
|
|
const NAME: &'static str = <T as Glsl>::NAME;
|
|
type ArraySize = DimensionNil;
|
|
}
|
|
|
|
unsafe impl Glsl for f32 {
|
|
const NAME: &'static str = "float";
|
|
}
|
|
|
|
unsafe impl Glsl for f64 {
|
|
const NAME: &'static str = "double";
|
|
}
|
|
|
|
unsafe impl Glsl for i32 {
|
|
const NAME: &'static str = "int";
|
|
}
|
|
|
|
unsafe impl Glsl for u32 {
|
|
const NAME: &'static str = "uint";
|
|
}
|
|
|
|
unsafe impl<T: GlslArray, const N: usize> GlslArray for [T; N] {
|
|
const NAME: &'static str = T::NAME;
|
|
|
|
type ArraySize = Dimension<T::ArraySize, N>;
|
|
}
|