cosmol-viewer 0.1.0__tar.gz → 0.1.1.dev1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of cosmol-viewer might be problematic. Click here for more details.

Files changed (25) hide show
  1. {cosmol_viewer-0.1.0 → cosmol_viewer-0.1.1.dev1}/Cargo.lock +143 -9
  2. cosmol_viewer-0.1.1.dev1/Cargo.toml +21 -0
  3. {cosmol_viewer-0.1.0 → cosmol_viewer-0.1.1.dev1}/PKG-INFO +1 -1
  4. {cosmol_viewer-0.1.0/cosmol_viewer_core → cosmol_viewer-0.1.1.dev1/crates/core}/Cargo.toml +4 -0
  5. cosmol_viewer-0.1.1.dev1/crates/core/src/lib.rs +74 -0
  6. cosmol_viewer-0.1.1.dev1/crates/core/src/scene.rs +57 -0
  7. cosmol_viewer-0.1.0/cosmol_viewer_core/src/shader/app.rs → cosmol_viewer-0.1.1.dev1/crates/core/src/shader/canvas.rs +63 -17
  8. cosmol_viewer-0.1.1.dev1/crates/core/src/shader/mod.rs +3 -0
  9. cosmol_viewer-0.1.1.dev1/crates/core/src/shapes/mod.rs +1 -0
  10. cosmol_viewer-0.1.0/cosmol_viewer_core/src/utils.rs → cosmol_viewer-0.1.1.dev1/crates/core/src/shapes/sphere.rs +31 -59
  11. cosmol_viewer-0.1.1.dev1/crates/core/src/utils.rs +73 -0
  12. {cosmol_viewer-0.1.0/cosmol_viewer_python → cosmol_viewer-0.1.1.dev1/crates/python}/Cargo.toml +5 -1
  13. cosmol_viewer-0.1.1.dev1/crates/python/build.rs +42 -0
  14. cosmol_viewer-0.1.1.dev1/crates/python/src/lib.rs +379 -0
  15. cosmol_viewer-0.1.1.dev1/pyproject.toml +14 -0
  16. cosmol_viewer-0.1.0/Cargo.toml +0 -15
  17. cosmol_viewer-0.1.0/cosmol_viewer_core/src/lib.rs +0 -113
  18. cosmol_viewer-0.1.0/cosmol_viewer_core/src/shader/mod.rs +0 -3
  19. cosmol_viewer-0.1.0/cosmol_viewer_python/build.rs +0 -22
  20. cosmol_viewer-0.1.0/cosmol_viewer_python/src/lib.rs +0 -150
  21. cosmol_viewer-0.1.0/pyproject.toml +0 -14
  22. {cosmol_viewer-0.1.0/cosmol_viewer_core → cosmol_viewer-0.1.1.dev1/crates/core}/src/shader/bg_fragment.glsl +0 -0
  23. {cosmol_viewer-0.1.0/cosmol_viewer_core → cosmol_viewer-0.1.1.dev1/crates/core}/src/shader/bg_vertex.glsl +0 -0
  24. {cosmol_viewer-0.1.0/cosmol_viewer_core → cosmol_viewer-0.1.1.dev1/crates/core}/src/shader/fragment.glsl +0 -0
  25. {cosmol_viewer-0.1.0/cosmol_viewer_core → cosmol_viewer-0.1.1.dev1/crates/core}/src/shader/vertex.glsl +0 -0
@@ -431,6 +431,15 @@ version = "0.22.1"
431
431
  source = "registry+https://github.com/rust-lang/crates.io-index"
432
432
  checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
433
433
 
434
+ [[package]]
435
+ name = "bincode"
436
+ version = "1.3.3"
437
+ source = "registry+https://github.com/rust-lang/crates.io-index"
438
+ checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
439
+ dependencies = [
440
+ "serde",
441
+ ]
442
+
434
443
  [[package]]
435
444
  name = "bit-set"
436
445
  version = "0.8.0"
@@ -688,35 +697,75 @@ dependencies = [
688
697
  "libc",
689
698
  ]
690
699
 
700
+ [[package]]
701
+ name = "cosmol_viewer"
702
+ version = "0.1.1-nightly.1"
703
+ dependencies = [
704
+ "bytemuck",
705
+ "cosmol_viewer_core",
706
+ "eframe",
707
+ "egui_extras",
708
+ "glam",
709
+ "hex",
710
+ "ipc-channel",
711
+ "serde",
712
+ "serde_json",
713
+ "sha2",
714
+ "wasm-bindgen-futures",
715
+ "web-sys",
716
+ ]
717
+
691
718
  [[package]]
692
719
  name = "cosmol_viewer_core"
693
- version = "0.1.0"
720
+ version = "0.1.1-nightly.1"
721
+ dependencies = [
722
+ "bytemuck",
723
+ "eframe",
724
+ "egui_extras",
725
+ "glam",
726
+ "serde",
727
+ "serde_json",
728
+ "wasm-bindgen-futures",
729
+ "web-sys",
730
+ ]
731
+
732
+ [[package]]
733
+ name = "cosmol_viewer_gui"
734
+ version = "0.1.1-nightly.1"
694
735
  dependencies = [
695
736
  "bytemuck",
737
+ "cosmol_viewer_core",
696
738
  "eframe",
697
739
  "egui_extras",
698
740
  "glam",
741
+ "ipc-channel",
699
742
  "serde",
743
+ "serde_json",
744
+ "wasm-bindgen-futures",
745
+ "web-sys",
700
746
  ]
701
747
 
702
748
  [[package]]
703
749
  name = "cosmol_viewer_python"
704
- version = "0.1.0"
750
+ version = "0.0.0"
705
751
  dependencies = [
706
752
  "base64 0.22.1",
707
753
  "cosmol_viewer_core",
708
754
  "eframe",
709
755
  "egui_extras",
710
756
  "glam",
757
+ "hex",
758
+ "ipc-channel",
711
759
  "pyo3",
712
760
  "serde_json",
761
+ "sha2",
713
762
  "uuid",
714
763
  "wasm-bindgen",
715
764
  ]
716
765
 
717
766
  [[package]]
718
767
  name = "cosmol_viewer_wasm"
719
- version = "0.1.0"
768
+ version = "0.1.1-nightly.1"
720
769
  dependencies = [
721
770
  "cosmol_viewer_core",
722
771
  "eframe",
@@ -747,6 +796,15 @@ dependencies = [
747
796
  "cfg-if",
748
797
  ]
749
798
 
799
+ [[package]]
800
+ name = "crossbeam-channel"
801
+ version = "0.5.15"
802
+ source = "registry+https://github.com/rust-lang/crates.io-index"
803
+ checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
804
+ dependencies = [
805
+ "crossbeam-utils",
806
+ ]
807
+
750
808
  [[package]]
751
809
  name = "crossbeam-utils"
752
810
  version = "0.8.21"
@@ -1132,6 +1190,12 @@ version = "0.9.0"
1132
1190
  source = "registry+https://github.com/rust-lang/crates.io-index"
1133
1191
  checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
1134
1192
 
1193
+ [[package]]
1194
+ name = "fnv"
1195
+ version = "1.0.7"
1196
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1197
+ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
1198
+
1135
1199
  [[package]]
1136
1200
  name = "foldhash"
1137
1201
  version = "0.1.5"
@@ -1603,6 +1667,24 @@ version = "2.0.6"
1603
1667
  source = "registry+https://github.com/rust-lang/crates.io-index"
1604
1668
  checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd"
1605
1669
 
1670
+ [[package]]
1671
+ name = "ipc-channel"
1672
+ version = "0.20.0"
1673
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1674
+ checksum = "5b1c98b70019c830a1fc39cecfe1f60ff99c4122f0a189697c810c90ec545c14"
1675
+ dependencies = [
1676
+ "bincode",
1677
+ "crossbeam-channel",
1678
+ "fnv",
1679
+ "libc",
1680
+ "mio",
1681
+ "rand 0.9.1",
1682
+ "serde",
1683
+ "tempfile",
1684
+ "uuid",
1685
+ "windows",
1686
+ ]
1687
+
1606
1688
  [[package]]
1607
1689
  name = "itoa"
1608
1690
  version = "1.0.15"
@@ -1826,6 +1908,17 @@ dependencies = [
1826
1908
  "simd-adler32",
1827
1909
  ]
1828
1910
 
1911
+ [[package]]
1912
+ name = "mio"
1913
+ version = "1.0.4"
1914
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1915
+ checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
1916
+ dependencies = [
1917
+ "libc",
1918
+ "wasi 0.11.1+wasi-snapshot-preview1",
1919
+ "windows-sys 0.59.0",
1920
+ ]
1921
+
1829
1922
  [[package]]
1830
1923
  name = "naga"
1831
1924
  version = "24.0.0"
@@ -2318,7 +2411,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
2318
2411
  checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d"
2319
2412
  dependencies = [
2320
2413
  "phf_shared",
2321
- "rand",
2414
+ "rand 0.8.5",
2322
2415
  ]
2323
2416
 
2324
2417
  [[package]]
@@ -2579,8 +2672,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
2579
2672
  checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
2580
2673
  dependencies = [
2581
2674
  "libc",
2582
- "rand_chacha",
2583
- "rand_core",
2675
+ "rand_chacha 0.3.1",
2676
+ "rand_core 0.6.4",
2677
+ ]
2678
+
2679
+ [[package]]
2680
+ name = "rand"
2681
+ version = "0.9.1"
2682
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2683
+ checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97"
2684
+ dependencies = [
2685
+ "rand_chacha 0.9.0",
2686
+ "rand_core 0.9.3",
2584
2687
  ]
2585
2688
 
2586
2689
  [[package]]
@@ -2590,7 +2693,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
2590
2693
  checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
2591
2694
  dependencies = [
2592
2695
  "ppv-lite86",
2593
- "rand_core",
2696
+ "rand_core 0.6.4",
2697
+ ]
2698
+
2699
+ [[package]]
2700
+ name = "rand_chacha"
2701
+ version = "0.9.0"
2702
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2703
+ checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
2704
+ dependencies = [
2705
+ "ppv-lite86",
2706
+ "rand_core 0.9.3",
2594
2707
  ]
2595
2708
 
2596
2709
  [[package]]
@@ -2602,6 +2715,15 @@ dependencies = [
2602
2715
  "getrandom 0.2.16",
2603
2716
  ]
2604
2717
 
2718
+ [[package]]
2719
+ name = "rand_core"
2720
+ version = "0.9.3"
2721
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2722
+ checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38"
2723
+ dependencies = [
2724
+ "getrandom 0.3.3",
2725
+ ]
2726
+
2605
2727
  [[package]]
2606
2728
  name = "raw-window-handle"
2607
2729
  version = "0.6.2"
@@ -2805,6 +2927,17 @@ dependencies = [
2805
2927
  "digest",
2806
2928
  ]
2807
2929
 
2930
+ [[package]]
2931
+ name = "sha2"
2932
+ version = "0.10.9"
2933
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2934
+ checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
2935
+ dependencies = [
2936
+ "cfg-if",
2937
+ "cpufeatures",
2938
+ "digest",
2939
+ ]
2940
+
2808
2941
  [[package]]
2809
2942
  name = "shlex"
2810
2943
  version = "1.3.0"
@@ -3027,8 +3160,9 @@ dependencies = [
3027
3160
 
3028
3161
  [[package]]
3029
3162
  name = "test"
3030
- version = "0.1.0"
3163
+ version = "0.1.1-nightly.1"
3031
3164
  dependencies = [
3165
+ "cosmol_viewer",
3032
3166
  "cosmol_viewer_core",
3033
3167
  "eframe",
3034
3168
  "egui_extras",
@@ -4242,7 +4376,7 @@ dependencies = [
4242
4376
  "hex",
4243
4377
  "nix",
4244
4378
  "ordered-stream",
4245
- "rand",
4379
+ "rand 0.8.5",
4246
4380
  "serde",
4247
4381
  "serde_repr",
4248
4382
  "sha1",
@@ -0,0 +1,21 @@
1
+ [workspace.package]
2
+ edition = "2024"
3
+ version = "0.1.1-nightly.1"
4
+ authors = ["9028 wjt@cosmol.org"]
5
+ repository = "https://github.com/COSMol-repl/COSMol-viewer"
6
+ homepage = "https://github.com/COSMol-repl/COSMol-viewer"
7
+ keywords = ["molecular", "visualization"]
8
+
9
+ [workspace]
10
+ resolver = "2"
11
+ members = ["crates/python"]
12
+
13
+ [workspace.dependencies]
14
+ cosmol_viewer = {path = "cosmol_viewer"}
15
+ cosmol_viewer_core = { path = "crates/core" }
16
+ eframe = { version = "0.31.1"}
17
+ egui_extras = { version = "0.31.1", features = ["svg"] }
18
+ glam = { version = "0.30.3" , features = ["serde"] }
19
+ serde_json = "1.0.140"
20
+ sha2 = "0.10.9"
21
+ hex = "0.4.3"
@@ -1,5 +1,5 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cosmol-viewer
3
- Version: 0.1.0
3
+ Version: 0.1.1.dev1
4
4
  Summary: Molecular visualization tools
5
5
  Author-email: 95028 <wjt@cosmol.org>
@@ -2,10 +2,14 @@
2
2
  name = "cosmol_viewer_core"
3
3
  version.workspace = true
4
4
  edition = "2024"
5
+ publish = false
5
6
 
6
7
  [dependencies]
7
8
  eframe.workspace = true
9
+ serde_json.workspace = true
8
10
  glam.workspace = true
9
11
  egui_extras.workspace = true
10
12
  serde = { version = "1.0.219" , features = ["derive"] }
11
13
  bytemuck = "1.23.1"
14
+ web-sys = "0.3.77"
15
+ wasm-bindgen-futures = "0.4.50"
@@ -0,0 +1,74 @@
1
+ mod shader;
2
+ use std::{
3
+ collections::HashMap,
4
+ sync::{Arc, Mutex},
5
+ };
6
+
7
+ pub mod utils;
8
+
9
+ use eframe::egui::{self, Color32, Stroke};
10
+
11
+
12
+ use serde::{Deserialize, Serialize};
13
+ use shader::Canvas;
14
+
15
+ pub use crate::utils::{Shape};
16
+ pub mod shapes;
17
+ use crate::{scene::Scene, shader::CameraState, utils::ToMesh};
18
+
19
+ pub mod scene;
20
+
21
+ pub struct AppWrapper(pub Arc<Mutex<Option<App>>>);
22
+
23
+ impl eframe::App for AppWrapper {
24
+ fn update(&mut self, ctx: &egui::Context, frame: &mut eframe::Frame) {
25
+ if let Some(app) = &mut *self.0.lock().unwrap() {
26
+ app.update(ctx, frame);
27
+ }
28
+ }
29
+ }
30
+
31
+ pub struct App {
32
+ canvas: Canvas,
33
+ gl: Option<Arc<eframe::glow::Context>>,
34
+ pub ctx: egui::Context,
35
+ }
36
+
37
+ impl App {
38
+ // #[cfg(not(target_arch = "wasm32"))]
39
+ pub fn new(cc: &eframe::CreationContext<'_>, scene: Scene) -> Self {
40
+ let gl = cc.gl.clone();
41
+ let canvas = Canvas::new(gl.as_ref().unwrap().clone(), scene).unwrap();
42
+ App {
43
+ gl,
44
+ canvas,
45
+ ctx: cc.egui_ctx.clone(),
46
+ }
47
+ }
48
+
49
+ pub fn update_scene(&mut self, scene: Scene) {
50
+ self.canvas.update_scene(scene);
51
+ }
52
+ }
53
+
54
+ impl eframe::App for App {
55
+ fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
56
+ egui_extras::install_image_loaders(ctx);
57
+ egui::CentralPanel::default()
58
+ .frame(
59
+ egui::Frame::default()
60
+ .fill(Color32::from_rgb(48, 48, 48))
61
+ .inner_margin(0.0)
62
+ .outer_margin(0.0)
63
+ .stroke(Stroke::new(0.0, Color32::from_rgb(30, 200, 30))),
64
+ )
65
+ .show(ctx, |ui| {
66
+ ui.set_width(ui.available_width());
67
+ ui.set_height(ui.available_height());
68
+
69
+ self.canvas.custom_painting(ui);
70
+ });
71
+ }
72
+ }
73
+
74
+
@@ -0,0 +1,57 @@
1
+ use std::collections::HashMap;
2
+
3
+ use serde::{Deserialize, Serialize};
4
+
5
+ use crate::{shader::CameraState, utils::{self, ToMesh}, Shape};
6
+
7
+
8
+ #[derive(Deserialize, Serialize, Clone)]
9
+ pub struct Scene {
10
+ pub background_color: [f32; 3],
11
+ pub camera_state: CameraState,
12
+ pub named_shapes: HashMap<String, Shape>,
13
+ pub unnamed_shapes: Vec<Shape>,
14
+ }
15
+
16
+ impl Scene {
17
+ pub fn _get_meshes(&self) -> Vec<utils::MeshData> {
18
+ self.named_shapes
19
+ .values()
20
+ .chain(self.unnamed_shapes.iter())
21
+ .map(|s| s.to_mesh())
22
+ .collect()
23
+ }
24
+
25
+ pub fn new() -> Self {
26
+ Scene {
27
+ background_color: [1.0, 1.0, 1.0],
28
+ camera_state: CameraState::new(1.0),
29
+ named_shapes: HashMap::new(),
30
+ unnamed_shapes: Vec::new(),
31
+ }
32
+ }
33
+
34
+ pub fn add_shape<S: Into<Shape>>(&mut self, shape: S, id: Option<&str>) {
35
+ let shape = shape.into();
36
+ if let Some(id) = id {
37
+ self.named_shapes.insert(id.into(), shape);
38
+ } else {
39
+ self.unnamed_shapes.push(shape);
40
+ }
41
+ }
42
+
43
+ pub fn delete_shape(&mut self, id: &str) {
44
+ if self.named_shapes.remove(id).is_none() {
45
+ panic!("Sphere with ID '{}' not found", id);
46
+ }
47
+ }
48
+
49
+ pub fn update_shape<S: Into<Shape>>(&mut self, shape: S, id: &str) {
50
+ let shape = shape.into();
51
+ if let Some(existing_shape) = self.named_shapes.get_mut(id) {
52
+ *existing_shape = shape;
53
+ } else {
54
+ panic!("Shape with ID '{}' not found", id);
55
+ }
56
+ }
57
+ }
@@ -13,21 +13,18 @@ use glam::{Quat, Vec3};
13
13
  use crate::Scene;
14
14
 
15
15
  pub struct Canvas {
16
- /// Behind an `Arc<Mutex<…>>` so we can pass it to [`egui::PaintCallback`] and paint later.
17
16
  shader: Arc<Mutex<Shader>>,
18
17
  camera_state: CameraState,
19
18
  }
20
19
 
21
20
  impl Canvas {
22
- pub fn new<'a>(gl: Arc<eframe::glow::Context>, scene: &Scene) -> Option<Self> {
21
+ pub fn new<'a>(gl: Arc<eframe::glow::Context>, scene: Scene) -> Option<Self> {
23
22
  Some(Self {
24
23
  shader: Arc::new(Mutex::new(Shader::new(&gl, scene)?)),
25
24
  camera_state: CameraState::new(1.0),
26
25
  })
27
26
  }
28
- }
29
27
 
30
- impl Canvas {
31
28
  pub fn custom_painting(&mut self, ui: &mut egui::Ui) {
32
29
  let (rect, response) = ui.allocate_exact_size(
33
30
  egui::Vec2 {
@@ -65,6 +62,11 @@ impl Canvas {
65
62
  };
66
63
  ui.painter().add(callback);
67
64
  }
65
+
66
+ pub fn update_scene(&mut self, scene: Scene) {
67
+ self.shader.lock().update_scene(scene);
68
+ println!("Scene updated in Canvas");
69
+ }
68
70
  }
69
71
 
70
72
  struct Shader {
@@ -74,11 +76,14 @@ struct Shader {
74
76
  vertex3d: Vec<Vertex3d>,
75
77
  indices: Vec<u32>,
76
78
  background_color: [f32; 3],
79
+ vbo: glow::Buffer,
80
+ element_array_buffer: glow::Buffer,
81
+ dirty: bool,
77
82
  }
78
83
 
79
84
  #[expect(unsafe_code)] // we need unsafe code to use glow
80
85
  impl Shader {
81
- fn new(gl: &glow::Context, scene: &Scene) -> Option<Self> {
86
+ fn new(gl: &glow::Context, scene: Scene) -> Option<Self> {
82
87
  use glow::HasContext as _;
83
88
 
84
89
  let shader_version = egui_glow::ShaderVersion::get(gl);
@@ -87,13 +92,13 @@ impl Shader {
87
92
 
88
93
  let default_color = [1.0, 1.0, 1.0, 1.0];
89
94
 
90
- let mut vertices: Vec<Vertex3d> = Vec::new();
95
+ let mut vertex3d: Vec<Vertex3d> = Vec::new();
91
96
  let mut indices: Vec<u32> = Vec::new();
92
97
 
93
98
  let mut vertex_offset = 0u32;
94
99
 
95
- for mesh in scene.get_meshes() {
96
- vertices.extend(mesh.vertices.iter().enumerate().map(|(i, pos)| {
100
+ for mesh in scene._get_meshes() {
101
+ vertex3d.extend(mesh.vertices.iter().enumerate().map(|(i, pos)| {
97
102
  Vertex3d {
98
103
  position: *pos,
99
104
  normal: mesh.normals[i],
@@ -180,7 +185,6 @@ impl Shader {
180
185
  gl.delete_shader(shader);
181
186
  }
182
187
 
183
-
184
188
  let shaders_bg: Vec<_> = shader_bg
185
189
  .iter()
186
190
  .map(|(shader_type, shader_source)| {
@@ -230,17 +234,17 @@ impl Shader {
230
234
  gl.bind_buffer(glow::ARRAY_BUFFER, Some(vertex_buffer));
231
235
  gl.buffer_data_u8_slice(
232
236
  glow::ARRAY_BUFFER,
233
- bytemuck::cast_slice(&vertices),
234
- glow::STATIC_DRAW,
237
+ bytemuck::cast_slice(&vertex3d),
238
+ glow::DYNAMIC_DRAW,
235
239
  );
236
240
 
237
241
  // EBO
238
- let ebo = gl.create_buffer().unwrap();
242
+ let ebo = gl.create_buffer().expect("Cannot create element buffer");
239
243
  gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, Some(ebo));
240
244
  gl.buffer_data_u8_slice(
241
245
  glow::ELEMENT_ARRAY_BUFFER,
242
246
  bytemuck::cast_slice(&indices),
243
- glow::STATIC_DRAW,
247
+ glow::DYNAMIC_DRAW,
244
248
  );
245
249
 
246
250
  let stride = std::mem::size_of::<Vertex3d>() as i32;
@@ -264,14 +268,49 @@ impl Shader {
264
268
  Some(Self {
265
269
  program,
266
270
  program_bg,
267
- vertex3d: vertices,
271
+ vertex3d,
268
272
  vertex_array,
269
273
  indices,
270
274
  background_color,
275
+ dirty: false,
276
+ vbo: vertex_buffer,
277
+ element_array_buffer: ebo,
271
278
  })
272
279
  }
273
280
  }
274
281
 
282
+ fn update_scene(&mut self, scene_data: Scene) {
283
+ self.background_color = scene_data.background_color;
284
+ self.vertex3d.clear();
285
+ self.indices.clear();
286
+
287
+ let mut vertex_offset = 0u32;
288
+
289
+ for mesh in scene_data._get_meshes() {
290
+ self.vertex3d
291
+ .extend(mesh.vertices.iter().enumerate().map(|(i, pos)| {
292
+ let mut j = i;
293
+ j = i % 50;
294
+ Vertex3d {
295
+ position: *pos,
296
+ normal: mesh.normals[i],
297
+ color: mesh
298
+ .colors
299
+ .as_ref()
300
+ .and_then(|colors| colors.get(j))
301
+ .unwrap_or(&[1.0, 1.0, 1.0, 1.0])
302
+ .clone(),
303
+ }
304
+ }));
305
+
306
+ self.indices
307
+ .extend(mesh.indices.iter().map(|&i| i + vertex_offset));
308
+ vertex_offset += mesh.vertices.len() as u32;
309
+ }
310
+
311
+ self.dirty = true;
312
+ }
313
+
275
314
  fn destroy(&self, gl: &glow::Context) {
276
315
  // use glow::HasContext as _;
277
316
  // unsafe {
@@ -280,7 +319,7 @@ impl Shader {
280
319
  // }
281
320
  }
282
321
 
283
- fn paint(&self, gl: &glow::Context, aspect_ratio: f32, camera_state: CameraState) {
322
+ fn paint(&mut self, gl: &glow::Context, aspect_ratio: f32, camera_state: CameraState) {
284
323
  use glow::HasContext as _;
285
324
 
286
325
  let proj = if aspect_ratio > 1.0 {
@@ -403,18 +442,25 @@ impl Shader {
403
442
  1.0,
404
443
  );
405
444
 
445
+ if self.dirty {
446
+ self.dirty = false;
447
+ }
448
+
406
449
  // 初始化时或每帧渲染前
407
450
  gl.bind_vertex_array(Some(self.vertex_array));
451
+ gl.bind_buffer(glow::ARRAY_BUFFER, Some(self.vbo));
408
452
  gl.buffer_data_u8_slice(
409
453
  glow::ARRAY_BUFFER,
410
454
  bytemuck::cast_slice(&self.vertex3d),
411
- glow::STATIC_DRAW,
455
+ glow::DYNAMIC_DRAW,
412
456
  );
413
457
 
458
+ gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, Some(self.element_array_buffer));
459
+
414
460
  gl.buffer_data_u8_slice(
415
461
  glow::ELEMENT_ARRAY_BUFFER,
416
462
  bytemuck::cast_slice(&self.indices),
417
- glow::STATIC_DRAW,
463
+ glow::DYNAMIC_DRAW,
418
464
  );
419
465
 
420
466
  gl.draw_elements(
@@ -0,0 +1,3 @@
1
+ mod canvas;
2
+
3
+ pub use canvas::*;
@@ -0,0 +1 @@
1
+ pub mod sphere;