diff --git a/.run/decomp (web).run.xml b/.run/decomp (web).run.xml
deleted file mode 100644
index bfb6d7b59..000000000
--- a/.run/decomp (web).run.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.run/decomp.run.xml b/.run/decomp.run.xml
deleted file mode 100644
index 9b3134b42..000000000
--- a/.run/decomp.run.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/.run/event.run.xml b/.run/event.run.xml
index d75eb057e..351bdedb4 100644
--- a/.run/event.run.xml
+++ b/.run/event.run.xml
@@ -1,7 +1,9 @@
+
+
@@ -9,11 +11,10 @@
-
-
+
\ No newline at end of file
diff --git a/.run/instancing3d (web).run.xml b/.run/instancing3d (web).run.xml
index 9639a9a01..c8be1eac7 100644
--- a/.run/instancing3d (web).run.xml
+++ b/.run/instancing3d (web).run.xml
@@ -1,7 +1,9 @@
+
+
@@ -9,11 +11,10 @@
-
-
+
\ No newline at end of file
diff --git a/.run/multi_windows.run.xml b/.run/multi_windows.run.xml
index 4e13ced08..cbd818504 100644
--- a/.run/multi_windows.run.xml
+++ b/.run/multi_windows.run.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/.run/test.run.xml b/.run/test.run.xml
index a52390b4c..3596f66c1 100644
--- a/.run/test.run.xml
+++ b/.run/test.run.xml
@@ -1,7 +1,7 @@
-
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 10552ecc7..bee006824 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,14 +1,24 @@
-# Unreleased
+# v0.41.0
## Breaking Changes
-- `CanvasSetup` no longer implements `Copy` (now contains a `String` field).
-- `CanvasSetup` has a new required field `canvas_id: String`. Use `..Default::default()` to fill it in.
+- Removed the `parry` feature flag and `parry3d` dependency to avoid circular dependencies when publishing.
+ `SceneNode3d::trimesh`/`add_trimesh` and `MeshManager3d::add_trimesh` now take `(Vec, Vec<[u32; 3]>, ...)` instead of a `parry3d::shape::TriMesh`. The `From for RenderMesh` conversion and the `parry3d` re-export are removed.
+- `CanvasSetup` no longer implements `Copy` (now contains a `String` field) and has a new required field `canvas_id: String`. Use `..Default::default()` to fill it in. ([#372](https://github.com/dimforge/kiss3d/pull/372))
+- `FixedView2d::new()` now takes `(CoordinateSystem2d, bool)` parameters instead of no arguments. Use `FixedView2d::default()` for the previous behavior. ([#354](https://github.com/dimforge/kiss3d/pull/354))
+- Removed the `decomp` example (depended on `parry`).
+- Bumped dependencies: `wgpu` 27 → 29, `glamx` 0.1 → 0.2, `egui`/`egui-wgpu` 0.33 → 0.34, `getrandom` 0.3 → 0.4, `oneshot` 0.1 → 0.2, `rand` (dev) 0.9 → 0.10.
## New Features
-- Added `canvas_id` field to `CanvasSetup` to allow configuring the HTML canvas element ID used on WASM targets (defaults to `"canvas"`).
-- Implemented `Default` for `CanvasSetup`.
+- `FixedView2d`: added `CoordinateSystem2d` enum with `CenterUp` (default, unchanged) and `TopLeftDown` (top-left origin, Y-down) coordinate systems, and a configurable `apply_hidpi` flag. ([#354](https://github.com/dimforge/kiss3d/pull/354))
+- Added new `dda_raycast2d` example demonstrating 2D ray casting with the top-left coordinate system. ([#354](https://github.com/dimforge/kiss3d/pull/354))
+- `Window::new_with_window_attributes()`: create a window from a `winit::window::WindowAttributes` for fine-grained control. ([#364](https://github.com/dimforge/kiss3d/pull/364))
+- `Window::new_hidden_with_size()`: create a hidden window with custom dimensions. ([#365](https://github.com/dimforge/kiss3d/pull/365))
+- `Window::rebind_close_key()` / `rebind_close_modifiers()`: customize or disable the window-close keybinding (default: Escape). ([#367](https://github.com/dimforge/kiss3d/pull/367))
+- `PanZoomCamera2d`: added `zoom_step()` / `set_zoom_step()` ([#362](https://github.com/dimforge/kiss3d/pull/362)), and `rebind_drag_modifier()` / `rebind_zoom_modifier()` for modifier-gated drag and zoom. ([#360](https://github.com/dimforge/kiss3d/pull/360))
+- `OrbitCamera3d`: added `fov()` / `set_fov()`. ([#361](https://github.com/dimforge/kiss3d/pull/361))
+- Implemented `Default` for `CanvasSetup`. ([#372](https://github.com/dimforge/kiss3d/pull/372))
# v0.40.0
diff --git a/Cargo.toml b/Cargo.toml
index b4e3c00a4..7f035ba1e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,7 +1,7 @@
[package]
authors = ["Sébastien Crozet "]
name = "kiss3d"
-version = "0.40.0"
+version = "0.41.0"
autoexamples = true
description = "Keep it simple, stupid, 2D and 3D graphics engine for Rust."
@@ -31,27 +31,23 @@ path = "src/lib.rs"
[features]
egui = ["dep:egui", "dep:egui-wgpu"]
recording = ["dep:ffmpeg-the-third"]
-parry = ["dep:parry3d"]
serde = ["dep:serde", "glamx/serde", "bitflags/serde", "rgb/serde"]
[dependencies]
bitflags = "2"
bytemuck = { version = "1", features = ["derive"] }
-egui = { version = "0.33", optional = true, default-features = true }
-egui-wgpu = { version = "0.33", optional = true }
-either = "1"
-image = "0.25"
+egui = { version = "0.34", optional = true, default-features = true }
+egui-wgpu = { version = "0.34", optional = true }
+image = { version = "0.25", default-features = false, features = ["default-formats"] }
web-time = "1"
kiss3d-macro = { version = "0.36.0", path = "kiss3d-macro" }
-log = "0.4"
-glamx = { version = "0.1", features = ["bytemuck"] }
+glamx = { version = "0.2", features = ["bytemuck"] }
ffmpeg-the-third = { version = "4", optional = true }
num-traits = "0.2"
-parry3d = { version = "0.26", optional = true }
rgb = "0.8"
rusttype = { version = "0.9", features = ["gpu_cache"] }
serde = { version = "1", features = ["derive"], optional = true }
-wgpu = "27"
+wgpu = "29"
winit = "0.30"
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
@@ -59,7 +55,10 @@ pollster = "0.4"
[target.wasm32-unknown-unknown.dependencies]
oneshot = { version = "0.2.0", features = ["async"] }
-getrandom = { version = "0.3", features = ["wasm_js"] }
+# We depend on getrandom 0.3 only to enable its wasm_js feature.
+# And this is needed only because some dependencies still depend on 0.3.
+getrandom_03 = { package = "getrandom", version = "0.3", features = ["wasm_js"] }
+getrandom = { version = "0.4", features = ["wasm_js"] }
wasm-bindgen = "0.2"
wasm-bindgen-futures = "0.4.54"
web-sys = { version = "0.3", features = [
@@ -83,18 +82,7 @@ web-sys = { version = "0.3", features = [
[dev-dependencies]
env_logger = "0.11"
-parry2d = "0.26"
-rand = "0.9"
-
-[[example]]
-name = "decomp"
-required-features = ["parry"]
-
-[[example]]
-name = "procedural"
-required-features = ["parry"]
+rand = "0.10"
[patch.crates-io]
-#glamx = { path = "../glamx" }
-#parry3d = { path = "../parry/crates/parry3d" }
-#parry2d = { path = "../parry/crates/parry2d" }
\ No newline at end of file
+#glamx = { path = "../glamx" }
\ No newline at end of file
diff --git a/examples/custom_material.rs b/examples/custom_material.rs
index db81a7e95..a08cfee87 100644
--- a/examples/custom_material.rs
+++ b/examples/custom_material.rs
@@ -135,8 +135,11 @@ impl NormalMaterial {
let pipeline_layout = ctxt.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("custom_material_pipeline_layout"),
- bind_group_layouts: &[&frame_bind_group_layout, &object_bind_group_layout],
- push_constant_ranges: &[],
+ bind_group_layouts: &[
+ Some(&frame_bind_group_layout),
+ Some(&object_bind_group_layout),
+ ],
+ immediate_size: 0,
});
// Create shader module from WGSL source
@@ -196,8 +199,8 @@ impl NormalMaterial {
},
depth_stencil: Some(wgpu::DepthStencilState {
format: Context::depth_format(),
- depth_write_enabled: true,
- depth_compare: wgpu::CompareFunction::Less,
+ depth_write_enabled: Some(true),
+ depth_compare: Some(wgpu::CompareFunction::Less),
stencil: wgpu::StencilState::default(),
bias: wgpu::DepthBiasState::default(),
}),
@@ -206,7 +209,7 @@ impl NormalMaterial {
mask: !0,
alpha_to_coverage_enabled: false,
},
- multiview: None,
+ multiview_mask: None,
cache: None,
});
diff --git a/examples/decomp.rs b/examples/decomp.rs
deleted file mode 100644
index b44dce625..000000000
--- a/examples/decomp.rs
+++ /dev/null
@@ -1,106 +0,0 @@
-use kiss3d::parry3d::shape::TriMesh;
-use kiss3d::parry3d::transformation;
-use kiss3d::parry3d::transformation::vhacd::VHACDParameters;
-use kiss3d::prelude::*;
-use rand::random;
-use std::env;
-use std::path::Path;
-use std::str::FromStr;
-use web_time::Instant;
-
-fn usage(exe_name: &str) {
- println!("Usage: {} obj_file scale clusters concavity", exe_name);
- println!();
- println!("Options:");
- println!(" obj_file - the obj file to decompose.");
- println!(" scale - the scale to apply to the displayed model.");
- println!(" concavity - the maximum concavity accepted by the decomposition.");
-}
-
-#[kiss3d::main]
-async fn main() {
- /*
- * Parse arguments.
- */
- let mut args = env::args();
- let exname = args.next().unwrap();
-
- if args.len() != 3 {
- usage(&exname[..]);
- return;
- }
-
- let path = &args.next().unwrap()[..];
- let scale: f32 = FromStr::from_str(&args.next().unwrap()[..]).unwrap();
- let concavity: f32 = FromStr::from_str(&args.next().unwrap()[..]).unwrap();
-
- let scale = Vec3::splat(scale);
-
- /*
- * Create the window.
- */
- let mut window = Window::new("Kiss3d: convex decomposition").await;
- let mut camera = OrbitCamera3d::new(Vec3::new(0.0, 0.0, 5.0), Vec3::ZERO);
- let mut scene = SceneNode3d::empty();
- scene
- .add_light(Light::point(100.0))
- .set_position(Vec3::new(0.0, 10.0, 10.0));
-
- /*
- * Convex decomposition.
- */
- let obj_path = Path::new(path);
- let mtl_path = Path::new("none");
- let teapot = obj::parse_file(obj_path, mtl_path, "none").unwrap();
-
- scene
- .add_obj(obj_path, mtl_path, scale)
- .set_surface_rendering_activation(false);
-
- let mut total_time = 0.0f64;
- for &(_, ref mesh, _) in teapot.iter() {
- match mesh.to_render_mesh() {
- Some(mut trimesh) => {
- trimesh.split_index_buffer(true);
- let idx: Vec<[u32; 3]> = trimesh
- .indices
- .as_split()
- .iter()
- .map(|idx| [idx[0][0], idx[1][0], idx[2][0]])
- .collect();
- let coords = trimesh.coords.clone();
- let begin = Instant::now();
- let params = VHACDParameters {
- concavity,
- ..VHACDParameters::default()
- };
- let decomp = transformation::vhacd::VHACD::decompose(¶ms, &coords, &idx, true);
- let elapsed = begin.elapsed();
- total_time =
- elapsed.as_secs() as f64 + elapsed.subsec_nanos() as f64 / 1000000000.0;
-
- for (vtx, idx) in decomp.compute_exact_convex_hulls(&coords, &idx) {
- let r = random();
- let g = random();
- let b = random();
-
- if let Ok(trimesh) = TriMesh::new(vtx, idx) {
- scene
- .add_trimesh(trimesh, scale, true)
- .set_color(Color::new(r, g, b, 1.0));
- }
- }
- }
- None => {}
- }
- }
-
- println!("Decomposition time: {}", total_time);
-
- /*
- *
- * Rendering.
- *
- */
- while window.render_3d(&mut scene, &mut camera).await {}
-}
diff --git a/examples/procedural.rs b/examples/procedural.rs
index a2c42449d..8235018ce 100644
--- a/examples/procedural.rs
+++ b/examples/procedural.rs
@@ -2,7 +2,6 @@ use kiss3d::prelude::*;
use kiss3d::procedural::path::StrokePattern;
use kiss3d::procedural::path::{ArrowheadCap, PolylinePath, PolylinePattern};
use kiss3d::procedural::RenderMesh;
-use parry3d::shape::TriMesh;
use std::path::Path;
#[kiss3d::main]
@@ -153,18 +152,6 @@ async fn main() {
));
}
- let chull = parry3d::transformation::convex_hull(&points);
- scene
- .add_trimesh(
- TriMesh::new(chull.0, chull.1).unwrap(),
- Vec3::splat(1.0),
- false,
- )
- .set_position(Vec3::new(0.0, 2.0, -1.0))
- .set_color(GREEN)
- .set_lines_width(2.0, false)
- .set_surface_rendering_activation(false)
- .set_points_size(10.0, false);
scene
.add_render_mesh(RenderMesh::new(points, None, None, None), Vec3::splat(1.0))
.set_color(BLUE)
@@ -181,43 +168,10 @@ async fn main() {
points2d.push(origin + Vec2::new(rand::random::() * 2.0, rand::random::() * 2.0));
}
- let polyline = parry2d::transformation::convex_hull(&points2d);
-
/*
*
* Rendering.
*
*/
- while window.render_3d(&mut scene, &mut camera).await {
- draw_polyline(&mut window, &polyline, &points2d);
- }
-}
-
-fn draw_polyline(window: &mut Window, polyline: &[Vec2], points: &[Vec2]) {
- for pt in polyline.windows(2) {
- window.draw_line(
- Vec3::new(pt[0].x, pt[0].y, 0.0),
- Vec3::new(pt[1].x, pt[1].y, 0.0),
- GREEN,
- 10.0,
- false,
- );
- }
-
- let last = polyline.len() - 1;
- window.draw_line(
- Vec3::new(polyline[0].x, polyline[0].y, 0.0),
- Vec3::new(polyline[last].x, polyline[last].y, 0.0),
- GREEN,
- 6.0,
- false,
- );
-
- for pt in points.iter() {
- window.draw_point(Vec3::new(pt.x, pt.y, 0.0), BLUE, 1.0);
- }
-
- for pt in polyline.iter() {
- window.draw_point(Vec3::new(pt.x, pt.y, 0.0), RED, 8.0);
- }
+ while window.render_3d(&mut scene, &mut camera).await {}
}
diff --git a/run_all_examples.sh b/run_all_examples.sh
index 02670382a..1ee5728ff 100755
--- a/run_all_examples.sh
+++ b/run_all_examples.sh
@@ -34,7 +34,6 @@ EXAMPLES=(
obj
texturing
texturing_mipmaps
- decomp
stereo
post_processing
instancing2d
@@ -55,7 +54,7 @@ echo ""
for example in "${EXAMPLES[@]}"; do
echo "=== Running: $example ==="
- cargo run --release --example "$example" --features egui,parry
+ cargo run --release --example "$example" --features egui
echo ""
done
diff --git a/src/builtin/normals_material.rs b/src/builtin/normals_material.rs
index dc2dcb5da..e1aa80482 100644
--- a/src/builtin/normals_material.rs
+++ b/src/builtin/normals_material.rs
@@ -130,8 +130,11 @@ impl NormalsMaterial {
let pipeline_layout = ctxt.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("normals_material_pipeline_layout"),
- bind_group_layouts: &[&frame_bind_group_layout, &object_bind_group_layout],
- push_constant_ranges: &[],
+ bind_group_layouts: &[
+ Some(&frame_bind_group_layout),
+ Some(&object_bind_group_layout),
+ ],
+ immediate_size: 0,
});
// Load shader
@@ -196,8 +199,8 @@ impl NormalsMaterial {
},
depth_stencil: Some(wgpu::DepthStencilState {
format: Context::depth_format(),
- depth_write_enabled: true,
- depth_compare: wgpu::CompareFunction::Less,
+ depth_write_enabled: Some(true),
+ depth_compare: Some(wgpu::CompareFunction::Less),
stencil: wgpu::StencilState::default(),
bias: wgpu::DepthBiasState::default(),
}),
@@ -206,7 +209,7 @@ impl NormalsMaterial {
mask: !0,
alpha_to_coverage_enabled: false,
},
- multiview: None,
+ multiview_mask: None,
cache: None,
})
};
diff --git a/src/builtin/object_material.rs b/src/builtin/object_material.rs
index 59733e06b..fc5e706ad 100644
--- a/src/builtin/object_material.rs
+++ b/src/builtin/object_material.rs
@@ -524,12 +524,12 @@ impl ObjectMaterial {
let pipeline_layout = ctxt.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("object_material_pipeline_layout"),
bind_group_layouts: &[
- &frame_bind_group_layout,
- &object_bind_group_layout,
- &texture_bind_group_layout,
- &pbr_texture_bind_group_layout,
+ Some(&frame_bind_group_layout),
+ Some(&object_bind_group_layout),
+ Some(&texture_bind_group_layout),
+ Some(&pbr_texture_bind_group_layout),
],
- push_constant_ranges: &[],
+ immediate_size: 0,
});
// Load shader
@@ -650,8 +650,8 @@ impl ObjectMaterial {
},
depth_stencil: Some(wgpu::DepthStencilState {
format: Context::depth_format(),
- depth_write_enabled: true,
- depth_compare: wgpu::CompareFunction::Less,
+ depth_write_enabled: Some(true),
+ depth_compare: Some(wgpu::CompareFunction::Less),
stencil: wgpu::StencilState::default(),
bias: wgpu::DepthBiasState::default(),
}),
@@ -660,7 +660,7 @@ impl ObjectMaterial {
mask: !0,
alpha_to_coverage_enabled: false,
},
- multiview: None,
+ multiview_mask: None,
cache: None,
})
};
@@ -680,8 +680,11 @@ impl ObjectMaterial {
let _wireframe_pipeline_layout =
ctxt.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("wireframe_pipeline_layout"),
- bind_group_layouts: &[&frame_bind_group_layout, &object_bind_group_layout],
- push_constant_ranges: &[],
+ bind_group_layouts: &[
+ Some(&frame_bind_group_layout),
+ Some(&object_bind_group_layout),
+ ],
+ immediate_size: 0,
});
// Vertex buffer layouts for wireframe (position only + instance data)
@@ -792,10 +795,10 @@ impl ObjectMaterial {
ctxt.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("wireframe_polyline_pipeline_layout"),
bind_group_layouts: &[
- &wireframe_view_bind_group_layout,
- &wireframe_model_bind_group_layout,
+ Some(&wireframe_view_bind_group_layout),
+ Some(&wireframe_model_bind_group_layout),
],
- push_constant_ranges: &[],
+ immediate_size: 0,
});
// Load wireframe polyline shader
@@ -904,8 +907,8 @@ impl ObjectMaterial {
},
depth_stencil: Some(wgpu::DepthStencilState {
format: Context::depth_format(),
- depth_write_enabled: true,
- depth_compare: wgpu::CompareFunction::LessEqual,
+ depth_write_enabled: Some(true),
+ depth_compare: Some(wgpu::CompareFunction::LessEqual),
stencil: wgpu::StencilState::default(),
bias: wgpu::DepthBiasState::default(),
}),
@@ -914,7 +917,7 @@ impl ObjectMaterial {
mask: !0,
alpha_to_coverage_enabled: false,
},
- multiview: None,
+ multiview_mask: None,
cache: None,
});
@@ -966,10 +969,10 @@ impl ObjectMaterial {
let points_pipeline_layout = ctxt.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("points_pipeline_layout"),
bind_group_layouts: &[
- &points_view_bind_group_layout,
- &points_model_bind_group_layout,
+ Some(&points_view_bind_group_layout),
+ Some(&points_model_bind_group_layout),
],
- push_constant_ranges: &[],
+ immediate_size: 0,
});
// Load points shader
@@ -1074,8 +1077,8 @@ impl ObjectMaterial {
},
depth_stencil: Some(wgpu::DepthStencilState {
format: Context::depth_format(),
- depth_write_enabled: true,
- depth_compare: wgpu::CompareFunction::LessEqual,
+ depth_write_enabled: Some(true),
+ depth_compare: Some(wgpu::CompareFunction::LessEqual),
stencil: wgpu::StencilState::default(),
bias: wgpu::DepthBiasState::default(),
}),
@@ -1084,7 +1087,7 @@ impl ObjectMaterial {
mask: !0,
alpha_to_coverage_enabled: false,
},
- multiview: None,
+ multiview_mask: None,
cache: None,
});
diff --git a/src/builtin/object_material2d.rs b/src/builtin/object_material2d.rs
index 1f51cd0a6..c05be4634 100644
--- a/src/builtin/object_material2d.rs
+++ b/src/builtin/object_material2d.rs
@@ -393,11 +393,11 @@ impl ObjectMaterial2d {
let pipeline_layout = ctxt.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("planar_material_pipeline_layout"),
bind_group_layouts: &[
- &frame_bind_group_layout,
- &object_bind_group_layout,
- &texture_bind_group_layout,
+ Some(&frame_bind_group_layout),
+ Some(&object_bind_group_layout),
+ Some(&texture_bind_group_layout),
],
- push_constant_ranges: &[],
+ immediate_size: 0,
});
// Load shader
@@ -505,7 +505,7 @@ impl ObjectMaterial2d {
mask: !0,
alpha_to_coverage_enabled: false,
},
- multiview: None,
+ multiview_mask: None,
cache: None,
});
@@ -558,10 +558,10 @@ impl ObjectMaterial2d {
ctxt.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("planar_wireframe_pipeline_layout"),
bind_group_layouts: &[
- &wireframe_view_bind_group_layout,
- &wireframe_model_bind_group_layout,
+ Some(&wireframe_view_bind_group_layout),
+ Some(&wireframe_model_bind_group_layout),
],
- push_constant_ranges: &[],
+ immediate_size: 0,
});
// Load wireframe shader
@@ -667,7 +667,7 @@ impl ObjectMaterial2d {
mask: !0,
alpha_to_coverage_enabled: false,
},
- multiview: None,
+ multiview_mask: None,
cache: None,
});
@@ -719,10 +719,10 @@ impl ObjectMaterial2d {
let points_pipeline_layout = ctxt.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("planar_points_pipeline_layout"),
bind_group_layouts: &[
- &points_view_bind_group_layout,
- &points_model_bind_group_layout,
+ Some(&points_view_bind_group_layout),
+ Some(&points_model_bind_group_layout),
],
- push_constant_ranges: &[],
+ immediate_size: 0,
});
// Load points shader
@@ -828,7 +828,7 @@ impl ObjectMaterial2d {
mask: !0,
alpha_to_coverage_enabled: false,
},
- multiview: None,
+ multiview_mask: None,
cache: None,
});
diff --git a/src/builtin/uvs_material.rs b/src/builtin/uvs_material.rs
index 1cffd9a07..418fbe873 100644
--- a/src/builtin/uvs_material.rs
+++ b/src/builtin/uvs_material.rs
@@ -130,8 +130,11 @@ impl UvsMaterial {
let pipeline_layout = ctxt.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("uvs_material_pipeline_layout"),
- bind_group_layouts: &[&frame_bind_group_layout, &object_bind_group_layout],
- push_constant_ranges: &[],
+ bind_group_layouts: &[
+ Some(&frame_bind_group_layout),
+ Some(&object_bind_group_layout),
+ ],
+ immediate_size: 0,
});
// Load shader
@@ -194,8 +197,8 @@ impl UvsMaterial {
},
depth_stencil: Some(wgpu::DepthStencilState {
format: Context::depth_format(),
- depth_write_enabled: true,
- depth_compare: wgpu::CompareFunction::Less,
+ depth_write_enabled: Some(true),
+ depth_compare: Some(wgpu::CompareFunction::Less),
stencil: wgpu::StencilState::default(),
bias: wgpu::DepthBiasState::default(),
}),
@@ -204,7 +207,7 @@ impl UvsMaterial {
mask: !0,
alpha_to_coverage_enabled: false,
},
- multiview: None,
+ multiview_mask: None,
cache: None,
})
};
diff --git a/src/lib.rs b/src/lib.rs
index 105997bbb..d26ecfd1b 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -106,8 +106,6 @@ extern crate serde;
pub extern crate egui;
pub use glamx;
-#[cfg(feature = "parry")]
-pub use parry3d;
// Re-export the procedural macro and its runtime dependencies
pub use kiss3d_macro::main;
diff --git a/src/post_processing/grayscales.rs b/src/post_processing/grayscales.rs
index 7894d487b..4c515c5c8 100644
--- a/src/post_processing/grayscales.rs
+++ b/src/post_processing/grayscales.rs
@@ -55,8 +55,8 @@ impl Grayscales {
let pipeline_layout = ctxt.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("grayscales_pipeline_layout"),
- bind_group_layouts: &[&bind_group_layout],
- push_constant_ranges: &[],
+ bind_group_layouts: &[Some(&bind_group_layout)],
+ immediate_size: 0,
});
// Load shader
@@ -110,7 +110,7 @@ impl Grayscales {
mask: !0,
alpha_to_coverage_enabled: false,
},
- multiview: None,
+ multiview_mask: None,
cache: None,
});
@@ -190,6 +190,7 @@ impl PostProcessingEffect for Grayscales {
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
+ multiview_mask: None,
});
render_pass.set_pipeline(&self.pipeline);
diff --git a/src/post_processing/oculus_stereo.rs b/src/post_processing/oculus_stereo.rs
index c95c41e2b..0c48ca5be 100644
--- a/src/post_processing/oculus_stereo.rs
+++ b/src/post_processing/oculus_stereo.rs
@@ -90,8 +90,11 @@ impl OculusStereo {
let pipeline_layout = ctxt.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("oculus_pipeline_layout"),
- bind_group_layouts: &[&texture_bind_group_layout, &uniform_bind_group_layout],
- push_constant_ranges: &[],
+ bind_group_layouts: &[
+ Some(&texture_bind_group_layout),
+ Some(&uniform_bind_group_layout),
+ ],
+ immediate_size: 0,
});
// Load shader
@@ -145,7 +148,7 @@ impl OculusStereo {
mask: !0,
alpha_to_coverage_enabled: false,
},
- multiview: None,
+ multiview_mask: None,
cache: None,
});
@@ -267,6 +270,7 @@ impl PostProcessingEffect for OculusStereo {
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
+ multiview_mask: None,
});
render_pass.set_pipeline(&self.pipeline);
diff --git a/src/post_processing/sobel_edge_highlight.rs b/src/post_processing/sobel_edge_highlight.rs
index 333d1d0f2..7979ee111 100644
--- a/src/post_processing/sobel_edge_highlight.rs
+++ b/src/post_processing/sobel_edge_highlight.rs
@@ -114,11 +114,11 @@ impl SobelEdgeHighlight {
let pipeline_layout = ctxt.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("sobel_pipeline_layout"),
bind_group_layouts: &[
- &color_bind_group_layout,
- &depth_bind_group_layout,
- &uniform_bind_group_layout,
+ Some(&color_bind_group_layout),
+ Some(&depth_bind_group_layout),
+ Some(&uniform_bind_group_layout),
],
- push_constant_ranges: &[],
+ immediate_size: 0,
});
// Load shader
@@ -170,7 +170,7 @@ impl SobelEdgeHighlight {
mask: !0,
alpha_to_coverage_enabled: false,
},
- multiview: None,
+ multiview_mask: None,
cache: None,
});
@@ -221,7 +221,7 @@ impl SobelEdgeHighlight {
address_mode_w: wgpu::AddressMode::ClampToEdge,
mag_filter: wgpu::FilterMode::Nearest,
min_filter: wgpu::FilterMode::Nearest,
- mipmap_filter: wgpu::FilterMode::Nearest,
+ mipmap_filter: wgpu::MipmapFilterMode::Nearest,
compare: None,
..Default::default()
});
@@ -322,6 +322,7 @@ impl PostProcessingEffect for SobelEdgeHighlight {
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
+ multiview_mask: None,
});
render_pass.set_pipeline(&self.pipeline);
diff --git a/src/post_processing/waves.rs b/src/post_processing/waves.rs
index d4fca0e64..abcf57b63 100644
--- a/src/post_processing/waves.rs
+++ b/src/post_processing/waves.rs
@@ -93,8 +93,11 @@ impl Waves {
let pipeline_layout = ctxt.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("waves_pipeline_layout"),
- bind_group_layouts: &[&texture_bind_group_layout, &uniform_bind_group_layout],
- push_constant_ranges: &[],
+ bind_group_layouts: &[
+ Some(&texture_bind_group_layout),
+ Some(&uniform_bind_group_layout),
+ ],
+ immediate_size: 0,
});
// Load shader
@@ -146,7 +149,7 @@ impl Waves {
mask: !0,
alpha_to_coverage_enabled: false,
},
- multiview: None,
+ multiview_mask: None,
cache: None,
});
@@ -257,6 +260,7 @@ impl PostProcessingEffect for Waves {
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
+ multiview_mask: None,
});
render_pass.set_pipeline(&self.pipeline);
diff --git a/src/procedural/render_mesh.rs b/src/procedural/render_mesh.rs
index 5dc21b9d6..631b8261a 100644
--- a/src/procedural/render_mesh.rs
+++ b/src/procedural/render_mesh.rs
@@ -1,7 +1,5 @@
use super::utils;
use glamx::{Pose3, Vec2, Vec3};
-#[cfg(feature = "parry")]
-use parry3d::shape::TriMesh;
use std::collections::HashMap;
/// Different representations of the index buffer.
@@ -68,21 +66,6 @@ pub struct RenderMesh {
pub indices: IndexBuffer,
}
-#[cfg(feature = "parry")]
-impl From for RenderMesh {
- fn from(trimesh: TriMesh) -> RenderMesh {
- let vertices: Vec = trimesh.vertices().to_vec();
- let indices: Vec<[u32; 3]> = trimesh.indices().to_vec();
-
- RenderMesh::new(
- vertices,
- None, // Normals will be computed if needed
- None, // UVs will be set to default values
- Some(IndexBuffer::Unified(indices)),
- )
- }
-}
-
impl RenderMesh {
/// Creates a new `TriMesh`.
///
diff --git a/src/renderer/egui_renderer.rs b/src/renderer/egui_renderer.rs
index 0e77f1550..e84b5a0d1 100644
--- a/src/renderer/egui_renderer.rs
+++ b/src/renderer/egui_renderer.rs
@@ -98,17 +98,20 @@ impl EguiRenderer {
pub fn end_frame(&mut self) {
let output = self.egui_ctx.end_pass();
self.shapes = output.shapes;
- self.textures_delta = output.textures_delta;
+ // Append rather than replace: if a previous frame's render was skipped
+ // (e.g. failed to acquire surface texture), we must not lose its texture
+ // deltas (such as the font atlas glyph upload).
+ self.textures_delta.append(output.textures_delta);
}
/// Returns true if egui wants to capture the mouse (e.g., hovering over a widget).
pub fn wants_pointer_input(&self) -> bool {
- self.egui_ctx.wants_pointer_input()
+ self.egui_ctx.egui_wants_pointer_input()
}
/// Returns true if egui wants to capture keyboard input (e.g., text input focused).
pub fn wants_keyboard_input(&self) -> bool {
- self.egui_ctx.wants_keyboard_input()
+ self.egui_ctx.egui_wants_keyboard_input()
}
/// Actually renders the UI.
@@ -163,6 +166,7 @@ impl EguiRenderer {
},
depth_slice: None,
})],
+ multiview_mask: None,
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
diff --git a/src/renderer/point_renderer2d.rs b/src/renderer/point_renderer2d.rs
index e59e7e2fe..2b9d5e8b5 100644
--- a/src/renderer/point_renderer2d.rs
+++ b/src/renderer/point_renderer2d.rs
@@ -81,8 +81,8 @@ impl PointRenderer2d {
let pipeline_layout = ctxt.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("planar_point_renderer_pipeline_layout"),
- bind_group_layouts: &[&bind_group_layout],
- push_constant_ranges: &[],
+ bind_group_layouts: &[Some(&bind_group_layout)],
+ immediate_size: 0,
});
// Load shader
@@ -126,7 +126,7 @@ impl PointRenderer2d {
mask: !0,
alpha_to_coverage_enabled: false,
},
- multiview: None,
+ multiview_mask: None,
cache: None,
});
@@ -273,6 +273,7 @@ impl PointRenderer2d {
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
+ multiview_mask: None,
});
render_pass.set_pipeline(&self.pipeline);
diff --git a/src/renderer/point_renderer3d.rs b/src/renderer/point_renderer3d.rs
index 737250728..ce8f5af8c 100644
--- a/src/renderer/point_renderer3d.rs
+++ b/src/renderer/point_renderer3d.rs
@@ -80,8 +80,8 @@ impl PointRenderer3d {
let pipeline_layout = ctxt.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("point_renderer_pipeline_layout"),
- bind_group_layouts: &[&bind_group_layout],
- push_constant_ranges: &[],
+ bind_group_layouts: &[Some(&bind_group_layout)],
+ immediate_size: 0,
});
// Load shader
@@ -121,8 +121,8 @@ impl PointRenderer3d {
},
depth_stencil: Some(wgpu::DepthStencilState {
format: Context::depth_format(),
- depth_write_enabled: true,
- depth_compare: wgpu::CompareFunction::Less,
+ depth_write_enabled: Some(true),
+ depth_compare: Some(wgpu::CompareFunction::Less),
stencil: wgpu::StencilState::default(),
bias: wgpu::DepthBiasState::default(),
}),
@@ -131,7 +131,7 @@ impl PointRenderer3d {
mask: !0,
alpha_to_coverage_enabled: false,
},
- multiview: None,
+ multiview_mask: None,
cache: None,
});
diff --git a/src/renderer/polyline_renderer2d.rs b/src/renderer/polyline_renderer2d.rs
index eceb223b5..2e630d74d 100644
--- a/src/renderer/polyline_renderer2d.rs
+++ b/src/renderer/polyline_renderer2d.rs
@@ -123,8 +123,8 @@ impl PolylineRenderer2d {
let pipeline_layout = ctxt.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("planar_polyline_pipeline_layout"),
- bind_group_layouts: &[&view_bind_group_layout],
- push_constant_ranges: &[],
+ bind_group_layouts: &[Some(&view_bind_group_layout)],
+ immediate_size: 0,
});
// Load shader
@@ -199,7 +199,7 @@ impl PolylineRenderer2d {
mask: !0,
alpha_to_coverage_enabled: false,
},
- multiview: None,
+ multiview_mask: None,
cache: None,
});
@@ -337,6 +337,7 @@ impl PolylineRenderer2d {
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
+ multiview_mask: None,
});
render_pass.set_pipeline(&self.pipeline);
diff --git a/src/renderer/polyline_renderer3d.rs b/src/renderer/polyline_renderer3d.rs
index d06f3cd27..4eaea70c0 100644
--- a/src/renderer/polyline_renderer3d.rs
+++ b/src/renderer/polyline_renderer3d.rs
@@ -145,8 +145,8 @@ impl PolylineRenderer3d {
let pipeline_layout = ctxt.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("polyline_pipeline_layout"),
- bind_group_layouts: &[&view_bind_group_layout],
- push_constant_ranges: &[],
+ bind_group_layouts: &[Some(&view_bind_group_layout)],
+ immediate_size: 0,
});
// Load shader
@@ -229,8 +229,8 @@ impl PolylineRenderer3d {
},
depth_stencil: Some(wgpu::DepthStencilState {
format: Context::depth_format(),
- depth_write_enabled: true,
- depth_compare: wgpu::CompareFunction::LessEqual,
+ depth_write_enabled: Some(true),
+ depth_compare: Some(wgpu::CompareFunction::LessEqual),
stencil: wgpu::StencilState::default(),
bias: wgpu::DepthBiasState::default(),
}),
@@ -239,7 +239,7 @@ impl PolylineRenderer3d {
mask: !0,
alpha_to_coverage_enabled: false,
},
- multiview: None,
+ multiview_mask: None,
cache: None,
});
diff --git a/src/resource/framebuffer_manager.rs b/src/resource/framebuffer_manager.rs
index 93be47cc4..b2a6bf9c4 100644
--- a/src/resource/framebuffer_manager.rs
+++ b/src/resource/framebuffer_manager.rs
@@ -148,7 +148,7 @@ impl OffscreenBuffers {
address_mode_w: wgpu::AddressMode::ClampToEdge,
mag_filter: wgpu::FilterMode::Linear,
min_filter: wgpu::FilterMode::Linear,
- mipmap_filter: wgpu::FilterMode::Nearest,
+ mipmap_filter: wgpu::MipmapFilterMode::Nearest,
..Default::default()
});
diff --git a/src/resource/mesh_manager3d.rs b/src/resource/mesh_manager3d.rs
index d9f87008e..f5f56547e 100644
--- a/src/resource/mesh_manager3d.rs
+++ b/src/resource/mesh_manager3d.rs
@@ -3,10 +3,9 @@
use crate::loader::mtl::MtlMaterial;
use crate::loader::obj;
use crate::procedural;
-use crate::procedural::RenderMesh;
+use crate::procedural::{IndexBuffer, RenderMesh};
use crate::resource::GpuMesh3d;
-#[cfg(feature = "parry")]
-use parry3d::shape::TriMesh;
+use glamx::Vec3;
use std::cell::RefCell;
use std::collections::HashMap;
use std::io::Result as IoResult;
@@ -75,21 +74,19 @@ impl MeshManager3d {
mesh
}
- /// Adds a mesh with the specified parry3d TriMesh and name.
- ///
- /// Requires the `parry` feature.
- #[cfg(feature = "parry")]
+ /// Convenience function to register a new mesh defined by its vertex and index buffers.
pub fn add_trimesh(
&mut self,
- descr: TriMesh,
+ vertices: Vec,
+ indices: Vec<[u32; 3]>,
dynamic_draw: bool,
name: &str,
) -> Rc> {
- let mesh = GpuMesh3d::from_render_mesh(descr.into(), dynamic_draw);
+ let render_mesh =
+ RenderMesh::new(vertices, None, None, Some(IndexBuffer::Unified(indices)));
+ let mesh = GpuMesh3d::from_render_mesh(render_mesh, dynamic_draw);
let mesh = Rc::new(RefCell::new(mesh));
-
self.add(mesh.clone(), name);
-
mesh
}
diff --git a/src/resource/texture_manager.rs b/src/resource/texture_manager.rs
index 726b867d7..93637303d 100644
--- a/src/resource/texture_manager.rs
+++ b/src/resource/texture_manager.rs
@@ -150,9 +150,9 @@ impl Texture {
mag_filter: wgpu::FilterMode::Linear,
min_filter: wgpu::FilterMode::Linear,
mipmap_filter: if generate_mipmaps {
- wgpu::FilterMode::Linear
+ wgpu::MipmapFilterMode::Linear
} else {
- wgpu::FilterMode::Nearest
+ wgpu::MipmapFilterMode::Nearest
},
..Default::default()
});
diff --git a/src/scene/scene_node3d.rs b/src/scene/scene_node3d.rs
index 261188520..26b69f3d5 100644
--- a/src/scene/scene_node3d.rs
+++ b/src/scene/scene_node3d.rs
@@ -2,15 +2,13 @@ use crate::camera::Camera3d;
use crate::color::Color;
use crate::light::{CollectedLight, Light, LightCollection, LightType, MAX_LIGHTS};
use crate::procedural;
-use crate::procedural::RenderMesh;
+use crate::procedural::{IndexBuffer, RenderMesh};
use crate::resource::vertex_index::VertexIndex;
use crate::resource::{
GpuMesh3d, Material3d, MaterialManager3d, MeshManager3d, RenderContext, Texture, TextureManager,
};
use crate::scene::{InstanceData3d, Object3d};
use glamx::{Pose3, Quat, Vec2, Vec3};
-#[cfg(feature = "parry")]
-use parry3d::shape::TriMesh;
use std::cell::{Ref, RefCell, RefMut};
use std::path::{Path, PathBuf};
use std::rc::Rc;
@@ -511,12 +509,15 @@ impl SceneNode3d {
)
}
- /// Creates a new scene node using a parry3d TriMesh.
- ///
- /// Requires the `parry` feature.
- #[cfg(feature = "parry")]
- pub fn trimesh(mesh: TriMesh, scale: Vec3, flat_normals: bool) -> SceneNode3d {
- let mut render_mesh = RenderMesh::from(mesh);
+ /// Convenience function to add a new scene node using a mesh defined by its vertex and index buffers.
+ pub fn trimesh(
+ vertices: Vec,
+ indices: Vec<[u32; 3]>,
+ scale: Vec3,
+ flat_normals: bool,
+ ) -> SceneNode3d {
+ let mut render_mesh =
+ RenderMesh::new(vertices, None, None, Some(IndexBuffer::Unified(indices)));
if flat_normals {
render_mesh.replicate_vertices();
render_mesh.recompute_normals();
@@ -856,12 +857,15 @@ impl SceneNode3d {
node
}
- /// Creates and adds a new object using a parry3d TriMesh.
- ///
- /// Requires the `parry` feature.
- #[cfg(feature = "parry")]
- pub fn add_trimesh(&mut self, mesh: TriMesh, scale: Vec3, flat_normals: bool) -> SceneNode3d {
- let node = Self::trimesh(mesh, scale, flat_normals);
+ /// Convenience function to add a new object using a mesh defined by its vertex and index buffers.
+ pub fn add_trimesh(
+ &mut self,
+ vertices: Vec,
+ indices: Vec<[u32; 3]>,
+ scale: Vec3,
+ flat_normals: bool,
+ ) -> SceneNode3d {
+ let node = Self::trimesh(vertices, indices, scale, flat_normals);
self.add_child(node.clone());
node
}
diff --git a/src/text/renderer.rs b/src/text/renderer.rs
index 8b96510be..c9d61562e 100644
--- a/src/text/renderer.rs
+++ b/src/text/renderer.rs
@@ -105,7 +105,7 @@ impl TextRenderer {
address_mode_w: wgpu::AddressMode::ClampToEdge,
mag_filter: wgpu::FilterMode::Linear,
min_filter: wgpu::FilterMode::Linear,
- mipmap_filter: wgpu::FilterMode::Nearest,
+ mipmap_filter: wgpu::MipmapFilterMode::Nearest,
..Default::default()
});
@@ -152,8 +152,11 @@ impl TextRenderer {
let pipeline_layout = ctxt.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
label: Some("text_renderer_pipeline_layout"),
- bind_group_layouts: &[&uniform_bind_group_layout, &texture_bind_group_layout],
- push_constant_ranges: &[],
+ bind_group_layouts: &[
+ Some(&uniform_bind_group_layout),
+ Some(&texture_bind_group_layout),
+ ],
+ immediate_size: 0,
});
//
@@ -221,7 +224,7 @@ impl TextRenderer {
mask: !0,
alpha_to_coverage_enabled: false,
},
- multiview: None,
+ multiview_mask: None,
cache: None,
});
@@ -470,6 +473,7 @@ impl TextRenderer {
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
+ multiview_mask: None,
});
render_pass.set_pipeline(&self.pipeline);
diff --git a/src/window/canvas.rs b/src/window/canvas.rs
index df99674fd..14087f88c 100644
--- a/src/window/canvas.rs
+++ b/src/window/canvas.rs
@@ -96,7 +96,7 @@ impl Canvas {
}
/// Gets the current surface texture for rendering.
- pub fn get_current_texture(&self) -> Result {
+ pub fn get_current_texture(&self) -> Option {
self.canvas.get_current_texture()
}
diff --git a/src/window/egui_integration.rs b/src/window/egui_integration.rs
index e31b50f5a..b4af3db6e 100644
--- a/src/window/egui_integration.rs
+++ b/src/window/egui_integration.rs
@@ -129,6 +129,7 @@ impl Window {
.push(egui::Event::MouseWheel {
unit: egui::MouseWheelUnit::Point,
delta: egui::Vec2::new(x as f32, y as f32),
+ phase: egui::TouchPhase::Move,
modifiers: self.get_egui_modifiers(),
});
}
diff --git a/src/window/rendering.rs b/src/window/rendering.rs
index e9d6e75ed..2102febbb 100644
--- a/src/window/rendering.rs
+++ b/src/window/rendering.rs
@@ -107,9 +107,9 @@ impl Window {
// Get the surface texture
let frame = match self.canvas.get_current_texture() {
- Ok(frame) => frame,
- Err(e) => {
- eprintln!("Failed to acquire surface texture: {:?}", e);
+ Some(frame) => frame,
+ None => {
+ eprintln!("Failed to acquire surface texture");
return !self.should_close();
}
};
@@ -168,6 +168,7 @@ impl Window {
}),
timestamp_writes: None,
occlusion_query_set: None,
+ multiview_mask: None,
});
// Render pass is dropped here, ending the clear pass
}
@@ -221,6 +222,7 @@ impl Window {
}),
timestamp_writes: None,
occlusion_query_set: None,
+ multiview_mask: None,
});
if let Some(scene) = scene.as_deref_mut() {
@@ -263,6 +265,7 @@ impl Window {
),
timestamp_writes: None,
occlusion_query_set: None,
+ multiview_mask: None,
});
renderer.render(pass, camera, &mut custom_render_pass, &render_context);
}
@@ -307,6 +310,7 @@ impl Window {
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
+ multiview_mask: None,
});
if let Some(scene_2d) = scene_2d {
diff --git a/src/window/wgpu_canvas.rs b/src/window/wgpu_canvas.rs
index 69b276112..eb1f9142a 100644
--- a/src/window/wgpu_canvas.rs
+++ b/src/window/wgpu_canvas.rs
@@ -207,9 +207,9 @@ impl WgpuCanvas {
(surface, surface_format)
} else {
// First window - create the full wgpu context
- let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor {
+ let instance = wgpu::Instance::new(wgpu::InstanceDescriptor {
backends: wgpu::Backends::all(),
- ..Default::default()
+ ..wgpu::InstanceDescriptor::new_without_display_handle()
});
// Create surface
@@ -962,8 +962,22 @@ impl WgpuCanvas {
}
/// Gets the current surface texture for rendering.
- pub fn get_current_texture(&self) -> Result {
- self.surface.get_current_texture()
+ pub fn get_current_texture(&self) -> Option {
+ match self.surface.get_current_texture() {
+ wgpu::CurrentSurfaceTexture::Success(texture)
+ | wgpu::CurrentSurfaceTexture::Suboptimal(texture) => Some(texture),
+ wgpu::CurrentSurfaceTexture::Outdated | wgpu::CurrentSurfaceTexture::Lost => {
+ // Reconfigure and retry once
+ let ctxt = Context::get();
+ self.surface.configure(&ctxt.device, &self.surface_config);
+ match self.surface.get_current_texture() {
+ wgpu::CurrentSurfaceTexture::Success(texture)
+ | wgpu::CurrentSurfaceTexture::Suboptimal(texture) => Some(texture),
+ _ => None,
+ }
+ }
+ _ => None,
+ }
}
/// Copies the frame texture to the readback texture for later reading.
diff --git a/website/scripts/build-demos.sh b/website/scripts/build-demos.sh
index 765ca6164..00bf200b7 100755
--- a/website/scripts/build-demos.sh
+++ b/website/scripts/build-demos.sh
@@ -87,7 +87,7 @@ build_example() {
--manifest-path "$KISS3D_DIR/Cargo.toml" \
--example "$example" \
--target wasm32-unknown-unknown \
- --features parry,egui \
+ --features egui \
--release 2>&1; then
echo -e "${RED}✗${NC} $example (cargo build failed)"
return 1