Skip to content

Commit bd8da5c

Browse files
authored
Raster reorg (#410)
This PR is a big reorganiaztion of `fidget::raster`; this is a step towards merging the WebGPU backend, which wants a similar module organization for the WebGPU backend. - `render2d` and `render3d` modules are renamed to `pixel` and `voxel`, respectively - Types from `fidget::raster::config` are moved to either `pixel` or `voxel` modules - `ImageRenderConfig` and `VoxelRenderConfig` are both renamed to `RenderConfig` (in different namespaces) - Similarly, each namespace contains an `Image` and `RenderSize` type definition. `voxel::Image` replaces `GeometryBuffer`; `pixel::Image` is equivalent to `fidget::raster::Image<DistancePixel>`. - Renamed `DistancePixel` to `RawDistancePixel`; added an unpacked `enum DistancePixel` (instead of using `Result<f32, PixelFill>` as a weird `Either` type - The tile sizes member of `RenderConfig` is now optional and will fall back to the evaluator's tile size if not populated - This adds a `F: RenderHints` trait bound for many functions in `fidget::raster`
1 parent e3bf603 commit bd8da5c

15 files changed

Lines changed: 509 additions & 472 deletions

File tree

CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,20 @@
11
# 0.4.4 (unpublished)
2+
- Big reorganization of `fidget::raster`
3+
- `render2d` and `render3d` modules are renamed to `pixel` and `voxel`,
4+
respectively
5+
- `ImageRenderConfig` and `VoxelRenderConfig` are both renamed to
6+
`RenderConfig` (in different namespaces)
7+
- Similarly, each namespace contains an `Image` and `RenderSize` type
8+
definition. `voxel::Image` replaces `GeometryBuffer`; `pixel::Image` is
9+
equivalent to `fidget::raster::Image<DistancePixel>` in the previous code
10+
(but see the next point about renaming!)
11+
- Renamed `DistancePixel` to `RawDistancePixel`; added an unpacked `enum
12+
DistancePixel` (instead of using `Result<f32, PixelFill>` as a weird
13+
`Either` type
14+
- The tile sizes member of `RenderConfig` is now optional and will fall back
15+
to the evaluator's tile size if not populated
16+
- This adds a `F: RenderHints` trait bound for many functions in
17+
`fidget::raster`
218
- Add `Image::build` function to build an image from a `Vec<T>` and
319
`ImageSizeLike`, returning an error if the data size is incorrect.
420
- Revamping `fidget-bytecode`

demos/cli/src/main.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -279,9 +279,8 @@ fn run3d<F: fidget::eval::Function + fidget::render::RenderHints>(
279279
None => Some(fidget::render::ThreadPool::Global),
280280
};
281281
let threads = threads.as_ref();
282-
let cfg = fidget::raster::VoxelRenderConfig {
282+
let cfg = fidget::raster::voxel::RenderConfig {
283283
image_size: fidget::render::VoxelSize::from(settings.size),
284-
tile_sizes: F::tile_sizes_3d(),
285284
threads,
286285
world_to_model,
287286
..Default::default()
@@ -446,9 +445,8 @@ fn run2d<F: fidget::eval::Function + fidget::render::RenderHints>(
446445
)),
447446
None => Some(fidget::render::ThreadPool::Global),
448447
};
449-
let cfg = fidget::raster::ImageRenderConfig {
448+
let cfg = fidget::raster::pixel::RenderConfig {
450449
image_size: fidget::render::ImageSize::from(settings.size),
451-
tile_sizes: F::tile_sizes_2d(),
452450
threads: threads.as_ref(),
453451
pixel_perfect: matches!(mode, RenderMode2D::Sdf),
454452
world_to_model,

demos/viewer/src/draw3d.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use eframe::{
33
egui,
44
egui_wgpu::{self, wgpu},
55
};
6-
use fidget::raster::GeometryPixel;
6+
use fidget::raster::voxel::GeometryPixel;
77
use zerocopy::{Immutable, IntoBytes};
88

99
/// Configuration for 3D rendering with geometry data

demos/viewer/src/main.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ use notify::{Event, EventKind, Watcher};
1212

1313
use fidget::{
1414
gui::{Canvas2, Canvas3, CursorState, DragMode, View2, View3},
15-
raster::{GeometryPixel, ImageRenderConfig, VoxelRenderConfig},
15+
raster::{
16+
pixel::RenderConfig as ImageRenderConfig,
17+
voxel::{GeometryPixel, RenderConfig as VoxelRenderConfig},
18+
},
1619
};
1720

1821
use std::{error::Error, path::Path};
@@ -174,7 +177,6 @@ fn render_2d<F: fidget::eval::Function + fidget::render::RenderHints>(
174177
) -> Vec<[u8; 4]> {
175178
let config = ImageRenderConfig {
176179
image_size,
177-
tile_sizes: F::tile_sizes_2d(),
178180
world_to_model: view.world_to_model(),
179181
pixel_perfect: matches!(mode, Mode2D::Sdf),
180182
..Default::default()
@@ -208,7 +210,6 @@ fn render_3d<F: fidget::eval::Function + fidget::render::RenderHints>(
208210
) -> Vec<GeometryPixel> {
209211
let config = VoxelRenderConfig {
210212
image_size,
211-
tile_sizes: F::tile_sizes_3d(),
212213
world_to_model: view.world_to_model(),
213214
..Default::default()
214215
};

demos/web-editor/crate/src/lib.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use fidget::{
22
context::{Context, Tree},
33
gui::{Canvas2, Canvas3, DragMode, View2, View3},
4-
raster::{GeometryBuffer, ImageRenderConfig, VoxelRenderConfig},
4+
raster::{pixel, voxel},
55
render::{CancelToken, ImageSize, ThreadPool, TileSizes, VoxelSize},
66
var::Var,
77
vm::{VmData, VmShape},
@@ -59,10 +59,10 @@ pub fn render_2d(
5959
view: View2,
6060
cancel: CancelToken,
6161
) -> Option<Vec<u8>> {
62-
let cfg = ImageRenderConfig {
62+
let cfg = pixel::RenderConfig {
6363
image_size: ImageSize::from(image_size as u32),
6464
threads: Some(&ThreadPool::Global),
65-
tile_sizes: TileSizes::new(&[64, 16, 8]).unwrap(),
65+
tile_sizes: Some(TileSizes::new(&[64, 16, 8]).unwrap()),
6666
pixel_perfect: false,
6767
world_to_model: view.world_to_model(),
6868
cancel,
@@ -124,11 +124,11 @@ fn render_3d_inner(
124124
image_size: usize,
125125
view: View3,
126126
cancel: CancelToken,
127-
) -> Option<GeometryBuffer> {
128-
let cfg = VoxelRenderConfig {
127+
) -> Option<voxel::Image> {
128+
let cfg = voxel::RenderConfig {
129129
image_size: VoxelSize::from(image_size as u32),
130130
threads: Some(&ThreadPool::Global),
131-
tile_sizes: TileSizes::new(&[128, 64, 32, 16, 8]).unwrap(),
131+
tile_sizes: Some(TileSizes::new(&[128, 64, 32, 16, 8]).unwrap()),
132132
world_to_model: view.world_to_model(),
133133
cancel,
134134
};
@@ -251,6 +251,7 @@ pub struct JsCancelToken(CancelToken);
251251

252252
#[wasm_bindgen]
253253
impl JsCancelToken {
254+
#[expect(clippy::new_without_default)]
254255
#[wasm_bindgen(constructor)]
255256
pub fn new() -> Self {
256257
Self(CancelToken::new())
@@ -266,6 +267,9 @@ impl JsCancelToken {
266267
self.0.clone().into_raw()
267268
}
268269

270+
/// # Safety
271+
/// The pointer must have been released by [`get_ptr`](Self::get_ptr), and
272+
/// may only be claimed once.
269273
#[wasm_bindgen]
270274
pub unsafe fn from_ptr(ptr: *const std::sync::atomic::AtomicBool) -> Self {
271275
let token = unsafe { CancelToken::from_raw(ptr) };

fidget-core/src/render/config.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ impl CancelToken {
7171
///
7272
/// # Safety
7373
/// The pointer must have been previously returned by a call to
74-
/// [`CancelToken::into_raw`].
74+
/// [`CancelToken::into_raw`], and may only be reclaimed once.
7575
#[doc(hidden)]
7676
pub unsafe fn from_raw(ptr: *const AtomicBool) -> Self {
7777
let a = unsafe { Arc::from_raw(ptr) };

0 commit comments

Comments
 (0)