mirror of
https://github.com/bevyengine/bevy
synced 2024-11-22 04:33:37 +00:00
Add no_std
support to bevy_mikktspace
(#15528)
# Objective - Contributes to #15460 - Allows `bevy_mikktspace` to be used in `no_std` contexts. ## Solution - Added `std` (default) and `libm` features which control the inclusion of the standard library. To use `bevy_mikktspace` in `no_std` environments, enable the `libm` feature. ## Testing - CI - `cargo clippy -p bevy_mikktspace --target "x86_64-unknown-none" --no-default-features --features libm`
This commit is contained in:
parent
0d2eb3df88
commit
cedd0c5028
3 changed files with 76 additions and 5 deletions
|
@ -15,8 +15,15 @@ license = "Zlib AND (MIT OR Apache-2.0)"
|
||||||
keywords = ["bevy", "3D", "graphics", "algorithm", "tangent"]
|
keywords = ["bevy", "3D", "graphics", "algorithm", "tangent"]
|
||||||
rust-version = "1.76.0"
|
rust-version = "1.76.0"
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default = ["std"]
|
||||||
|
|
||||||
|
std = ["glam/std"]
|
||||||
|
libm = ["glam/libm", "dep:libm"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
glam = "0.29"
|
glam = { version = "0.29.0", default-features = false }
|
||||||
|
libm = { version = "0.2", default-features = false, optional = true }
|
||||||
|
|
||||||
[[example]]
|
[[example]]
|
||||||
name = "generate"
|
name = "generate"
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
unsafe_code
|
unsafe_code
|
||||||
)]
|
)]
|
||||||
|
|
||||||
|
use alloc::{vec, vec::Vec};
|
||||||
use core::ptr::{self, null_mut};
|
use core::ptr::{self, null_mut};
|
||||||
|
|
||||||
use glam::Vec3;
|
use glam::Vec3;
|
||||||
|
@ -211,7 +212,7 @@ pub unsafe fn genTangSpace<I: Geometry>(geometry: &mut I, fAngularThreshold: f32
|
||||||
let mut index = 0;
|
let mut index = 0;
|
||||||
let iNrFaces = geometry.num_faces();
|
let iNrFaces = geometry.num_faces();
|
||||||
let mut bRes: bool = false;
|
let mut bRes: bool = false;
|
||||||
let fThresCos = fAngularThreshold.to_radians().cos();
|
let fThresCos = cos(fAngularThreshold.to_radians());
|
||||||
f = 0;
|
f = 0;
|
||||||
while f < iNrFaces {
|
while f < iNrFaces {
|
||||||
let verts = geometry.num_vertices_of_face(f);
|
let verts = geometry.num_vertices_of_face(f);
|
||||||
|
@ -630,7 +631,7 @@ unsafe fn VNotZero(v: Vec3) -> bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn NotZero(fX: f32) -> bool {
|
unsafe fn NotZero(fX: f32) -> bool {
|
||||||
fX.abs() > 1.17549435e-38f32
|
abs(fX) > 1.17549435e-38f32
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn EvalTspace<I: Geometry>(
|
unsafe fn EvalTspace<I: Geometry>(
|
||||||
|
@ -724,7 +725,7 @@ unsafe fn EvalTspace<I: Geometry>(
|
||||||
} else {
|
} else {
|
||||||
fCos
|
fCos
|
||||||
};
|
};
|
||||||
fAngle = (fCos as f64).acos() as f32;
|
fAngle = acosf64(fCos as f64) as f32;
|
||||||
fMagS = (*pTriInfos.offset(f as isize)).fMagS;
|
fMagS = (*pTriInfos.offset(f as isize)).fMagS;
|
||||||
fMagT = (*pTriInfos.offset(f as isize)).fMagT;
|
fMagT = (*pTriInfos.offset(f as isize)).fMagT;
|
||||||
res.vOs = res.vOs + (fAngle * vOs);
|
res.vOs = res.vOs + (fAngle * vOs);
|
||||||
|
@ -1010,7 +1011,7 @@ unsafe fn InitTriInfo<I: Geometry>(
|
||||||
0i32
|
0i32
|
||||||
};
|
};
|
||||||
if NotZero(fSignedAreaSTx2) {
|
if NotZero(fSignedAreaSTx2) {
|
||||||
let fAbsArea: f32 = fSignedAreaSTx2.abs();
|
let fAbsArea: f32 = abs(fSignedAreaSTx2);
|
||||||
let fLenOs: f32 = vOs.length();
|
let fLenOs: f32 = vOs.length();
|
||||||
let fLenOt: f32 = vOt.length();
|
let fLenOt: f32 = vOt.length();
|
||||||
let fS: f32 = if (*pTriInfos.offset(f as isize)).iFlag & 8i32 == 0i32 {
|
let fS: f32 = if (*pTriInfos.offset(f as isize)).iFlag & 8i32 == 0i32 {
|
||||||
|
@ -1808,3 +1809,63 @@ unsafe fn GenerateInitialVerticesIndexList<I: Geometry>(
|
||||||
}
|
}
|
||||||
return iTSpacesOffs;
|
return iTSpacesOffs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn cos(value: f32) -> f32 {
|
||||||
|
#[cfg(feature = "std")]
|
||||||
|
{
|
||||||
|
value.cos()
|
||||||
|
}
|
||||||
|
#[cfg(all(not(feature = "std"), feature = "libm"))]
|
||||||
|
{
|
||||||
|
libm::cosf(value)
|
||||||
|
}
|
||||||
|
#[cfg(all(not(feature = "std"), not(feature = "libm")))]
|
||||||
|
{
|
||||||
|
compile_error!("Require either 'libm' or 'std' for `cos`")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn acos(value: f32) -> f32 {
|
||||||
|
#[cfg(feature = "std")]
|
||||||
|
{
|
||||||
|
value.acos()
|
||||||
|
}
|
||||||
|
#[cfg(all(not(feature = "std"), feature = "libm"))]
|
||||||
|
{
|
||||||
|
libm::acosf(value)
|
||||||
|
}
|
||||||
|
#[cfg(all(not(feature = "std"), not(feature = "libm")))]
|
||||||
|
{
|
||||||
|
compile_error!("Require either 'libm' or 'std' for `acos`")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn abs(value: f32) -> f32 {
|
||||||
|
#[cfg(feature = "std")]
|
||||||
|
{
|
||||||
|
value.abs()
|
||||||
|
}
|
||||||
|
#[cfg(all(not(feature = "std"), feature = "libm"))]
|
||||||
|
{
|
||||||
|
libm::fabsf(value)
|
||||||
|
}
|
||||||
|
#[cfg(all(not(feature = "std"), not(feature = "libm")))]
|
||||||
|
{
|
||||||
|
compile_error!("Require either 'libm' or 'std' for `abs`")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn acosf64(value: f64) -> f64 {
|
||||||
|
#[cfg(feature = "std")]
|
||||||
|
{
|
||||||
|
value.acos()
|
||||||
|
}
|
||||||
|
#[cfg(all(not(feature = "std"), feature = "libm"))]
|
||||||
|
{
|
||||||
|
libm::acos(value)
|
||||||
|
}
|
||||||
|
#[cfg(all(not(feature = "std"), not(feature = "libm")))]
|
||||||
|
{
|
||||||
|
compile_error!("Require either 'libm' or 'std' for `acos`")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -11,6 +11,9 @@
|
||||||
html_logo_url = "https://bevyengine.org/assets/icon.png",
|
html_logo_url = "https://bevyengine.org/assets/icon.png",
|
||||||
html_favicon_url = "https://bevyengine.org/assets/icon.png"
|
html_favicon_url = "https://bevyengine.org/assets/icon.png"
|
||||||
)]
|
)]
|
||||||
|
#![cfg_attr(not(feature = "std"), no_std)]
|
||||||
|
|
||||||
|
extern crate alloc;
|
||||||
|
|
||||||
use glam::{Vec2, Vec3};
|
use glam::{Vec2, Vec3};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue