Skip to content

Commit 5fee718

Browse files
committed
WIP frames iterator
1 parent bd6e589 commit 5fee718

File tree

2 files changed

+99
-10
lines changed

2 files changed

+99
-10
lines changed

core/src/math/spline.rs

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ use alloc::vec::Vec;
33
use core::{array::from_fn, fmt::Debug, marker::PhantomData};
44

55
use super::{
6-
Affine, Lerp, Linear, Mat4, Parametric, Point, Vary, Vector, inv_lerp,
7-
space::Real,
6+
Affine, Lerp, Linear, Mat4, Parametric, Point, Point3, Vary, Vec3, Vector,
7+
inv_lerp, param, space::Real,
88
};
99
use crate::geom::{Polyline, Ray};
1010
use crate::mat;
@@ -497,6 +497,39 @@ where
497497
}
498498
}
499499

500+
impl<B> BezierSpline<Point3<B>> {
501+
pub fn frame_iter(&self, step: f32) -> impl Iterator<Item = Mat4<B>> {
502+
FrameIter {
503+
iter: self.iter(step),
504+
mat: Default::default(),
505+
}
506+
}
507+
}
508+
509+
struct FrameIter<'a, B> {
510+
iter: param::Iter<'a, Point3<B>, BezierSpline<Point3<B>>>,
511+
mat: Mat4<B>,
512+
}
513+
514+
impl<B> Iterator for FrameIter<'_, B> {
515+
type Item = Mat4<B>;
516+
517+
fn next(&mut self) -> Option<Mat4<B>> {
518+
let t = self.iter.t;
519+
let Some(pt) = self.iter.next() else {
520+
return None;
521+
};
522+
523+
let fwd = self.iter.param.velocity(t).normalize_or_zero();
524+
let up = 0.95 * self.mat.linear().col_vec(1) + 0.05 * Vec3::Y;
525+
let right = up.cross(&fwd).normalize_or_zero();
526+
let up = fwd.cross(&right);
527+
528+
self.mat = Mat4::from_affine(right, up, fwd, pt);
529+
Some(self.mat.clone())
530+
}
531+
}
532+
500533
impl<T> HermiteSpline<T>
501534
where
502535
T: Affine<Diff: Linear<Scalar = f32> + Clone> + Clone,

demos/src/bin/crates.rs

Lines changed: 64 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
use core::ops::ControlFlow::*;
2-
2+
use re::core::geom::Ray;
33
use re::prelude::*;
4+
use std::ops::Range;
45

56
use re::core::math::color::gray;
7+
use re::core::math::rand::{DEFAULT_RNG, DefaultRng, Distrib};
68
use re::core::render::{
7-
Model,
9+
Model, View, World,
810
cam::{FirstPerson, Fov},
911
clip::Status::*,
12+
debug,
1013
scene::Obj,
1114
shader,
1215
tex::SamplerClamp,
@@ -15,6 +18,7 @@ use re::core::render::{
1518
use re::core::util::{pixfmt::Rgba8888, pnm::read_pnm};
1619

1720
use re::front::sdl2::Window;
21+
use re::geom::solids;
1822
use re::geom::solids::{Build, Cube};
1923

2024
fn main() {
@@ -33,7 +37,7 @@ fn main() {
3337
|v: Vertex3<_>, mvp: &ProjMat3<_>| vertex(mvp.apply(&v.pos), v.attrib),
3438
|frag: Frag<Vec2>| {
3539
let even_odd = (frag.var.x() > 0.5) ^ (frag.var.y() > 0.5);
36-
gray(if even_odd { 0.8 } else { 0.1 }).to_color4()
40+
gray(if even_odd { 0.3 } else { 0.1 }).to_color4()
3741
},
3842
);
3943
let crate_shader = shader::new(
@@ -51,18 +55,32 @@ fn main() {
5155
let (w, h) = win.dims;
5256
let mut cam = Camera::new(win.dims)
5357
.transform(FirstPerson::default())
58+
//.transform(Mat4::identity())
5459
.viewport((10..w - 10, h - 10..10))
5560
.perspective(Fov::Diagonal(degs(90.0)), 0.1..1000.0);
5661

5762
let floor = floor();
5863
let crates = crates();
5964

65+
let rng = &mut DefaultRng::from_time();
66+
let pts: Range<Point3<World>> =
67+
pt3(-10.0, 3.0, -10.0)..pt3(10.0, 6.0, 10.0);
68+
let dirs = splat(-1.0)..splat(1.0);
69+
70+
let rays = (pts, dirs);
71+
let rays = rays
72+
.samples(rng)
73+
.map(|(p, d)| Ray(p, 20.0 * d))
74+
.take(10);
75+
let b = BezierSpline::from_rays(rays);
76+
let mut bf = b.frame_iter(0.0001);
77+
6078
win.run(|frame| {
6179
//
6280
// Camera
6381
//
6482

65-
let mut cam_vel = Vec3::zero();
83+
let mut cam_vel: Vec3 = Vec3::zero();
6684

6785
let ep = &frame.win.ev_pump;
6886

@@ -79,23 +97,61 @@ fn main() {
7997

8098
let ms = ep.relative_mouse_state();
8199
cam.transform.rotate(
82-
turns(ms.x() as f32) * -0.001,
100+
turns(ms.x() as f32) * 0.001,
83101
turns(ms.y() as f32) * -0.001,
84102
);
85-
cam.transform
86-
.translate(cam_vel.mul(frame.dt.as_secs_f32()));
103+
104+
let mat: Mat4<World> = bf.next().unwrap().to();
105+
106+
//cam.transform.pos = mat.origin() + 0.2 * Vec3::Y;
107+
// cam.transform
108+
// .look_at(cam.transform.pos + mat.linear().col_vec(2));
109+
110+
// .translate(cam_vel.mul(frame.dt.as_secs_f32()));
87111

88112
//
89113
// Render
90114
//
91115

92-
let world_to_project = &cam.world_to_project();
116+
//let world_to_project = &cam.world_to_project();
117+
118+
let world_to_project = mat
119+
.inverse()
120+
.then(&cam.world_to_view())
121+
.then(&cam.project);
93122

94123
let batch = Batch::new()
95124
.viewport(cam.viewport)
96125
.target(frame.buf)
97126
.context(frame.ctx);
98127

128+
// Spline
129+
for m2w in b.frame_iter(0.001) {
130+
let m2p: ProjMat3<World> = m2w.to().then(&world_to_project);
131+
132+
debug::circle::<Model>(Point3::origin(), 1.0)
133+
//debug::sphere(Point3::origin(), 0.1)
134+
//debug::basis(m2w)
135+
//debug::ray(Point3::origin(), Vec3::Z)
136+
.viewport(cam.viewport)
137+
.target(frame.buf)
138+
.context(frame.ctx)
139+
.uniform(&scale(0.1.into()).to().then(&m2p))
140+
.render();
141+
142+
// batch
143+
// .clone()
144+
// .mesh(&cb)
145+
// .shader(shader::new(
146+
// |v: Vertex3<_>, m2p: &ProjMat3<_>| {
147+
// vertex(m2p.apply(&v.pos), ())
148+
// },
149+
// |_| rgba(0xFF, 0, 0, 0),
150+
// ))
151+
// .uniform(&m2p)
152+
// .render();
153+
}
154+
99155
// Floor
100156
{
101157
let Obj { bbox, tf, geom } = &floor;

0 commit comments

Comments
 (0)