62 lines
1.6 KiB
Rust
62 lines
1.6 KiB
Rust
use glam::{Vec3A};
|
|
use replicant::fields::{Field, FieldOp, FieldNode};
|
|
use FieldOp::*;
|
|
|
|
#[derive(Debug)]
|
|
struct Sphere {
|
|
origin: Vec3A,
|
|
radius: f32,
|
|
}
|
|
|
|
impl Field for Sphere {
|
|
fn sample(&self, pos: Vec3A) -> f32 {
|
|
self.origin.distance(pos) - self.radius
|
|
}
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
struct Rect {
|
|
origin: Vec3A,
|
|
extent: Vec3A,
|
|
}
|
|
|
|
impl Field for Rect {
|
|
fn sample(&self, pos: Vec3A) -> f32 {
|
|
let q: Vec3A = pos.abs() - self.extent;
|
|
Vec3A::length(Vec3A::max(q, Vec3A::ZERO)) + f32::min(f32::max(q.x, f32::max(q.y, q.z)), 0.0)
|
|
}
|
|
}
|
|
|
|
/*
|
|
float sdPlane( vec3 p, vec3 n, float h )
|
|
{
|
|
// n must be normalized
|
|
return dot(p,n) + h;
|
|
}
|
|
*/
|
|
|
|
#[derive(Debug)]
|
|
struct Plane {
|
|
height: f32,
|
|
normal: Vec3A,
|
|
}
|
|
|
|
impl Field for Plane {
|
|
fn sample(&self, pos: Vec3A) -> f32 {
|
|
Vec3A::dot(pos, self.normal) + self.height
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
let mut float_nodes: FieldNode = FieldNode { field: Box::new(Sphere { origin: Vec3A::new(0.0, 0.0, 10.0), radius: 10.0 }), op: Add, children: vec![
|
|
FieldNode { field: Box::new(Rect { origin: Vec3A::new(0.0, 0.0, 0.0), extent: Vec3A::new(5.0, 5.0, 5.0) }), op: Add, children: Vec::new() },
|
|
FieldNode { field: Box::new(Plane { height: 0.0, normal: Vec3A::new(0.0, 0.0, 1.0) }), op: Sub, children: Vec::new() },
|
|
] };
|
|
|
|
println!("Node tree:\n{}", float_nodes);
|
|
|
|
let field = Rect { origin: Vec3A::ZERO, extent: Vec3A::new(10.0, 10.0, 10.0) };
|
|
let sample_pos = Vec3A::new(11.0, 11.0, 11.0);
|
|
println!("{:?}", field);
|
|
println!("Distance at {:?} is {}", sample_pos, field.sample(sample_pos));
|
|
} |