cyborg/replicant/src/main.rs

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));
}