66
77sphere_geom = gfx .sphere_geometry (radius = 0.5 )
88materials = {
9- "default" : gfx .MeshPhongMaterial (color = [1 , 1 , 1 ]),
10- "selected" : gfx .MeshPhongMaterial (color = [1 , 0 , 0 ]),
11- "hovered" : gfx .MeshPhongMaterial (color = [1 , 0.6 , 0 ]),
12- "other" : gfx .MeshPhongMaterial (color = [1 , 0 , 0.5 ]),
9+ "default" : gfx .MeshPhongMaterial (color = [1 , 1 , 1 ], pick_write = True ),
10+ "selected" : gfx .MeshPhongMaterial (color = [1 , 0 , 0 ], pick_write = True ),
11+ "hovered" : gfx .MeshPhongMaterial (color = [1 , 0.6 , 0 ], pick_write = True ),
12+ "other" : gfx .MeshPhongMaterial (color = [1 , 0 , 0.5 ], pick_write = True ),
1313}
1414
1515
16+ def rand_point ():
17+ return (
18+ random .randint (- 20 , 20 ),
19+ random .randint (- 20 , 20 ),
20+ random .randint (- 20 , 20 ),
21+ )
22+
23+
24+ def point (index , selected , hovered , set_selected , set_hovered ):
25+ material = (
26+ "selected"
27+ if index == selected
28+ else "hovered"
29+ if index == hovered
30+ else "default"
31+ )
32+ return h (
33+ "Mesh" ,
34+ {
35+ "geometry" : sphere_geom ,
36+ "material" : materials [material ],
37+ "local.position" : positions [index ],
38+ "key" : index ,
39+ "on_click" : lambda event : set_selected (index ),
40+ "on_pointer_move" : lambda event : set_hovered (index ),
41+ },
42+ )
43+
44+
45+ positions = []
46+
47+
1648def PointCloud (props ):
17- random . seed ( 0 )
49+ global positions
1850
1951 def set_hovered (index ):
2052 props ["hovered" ] = index
@@ -25,34 +57,23 @@ def set_selected(index):
2557 else :
2658 props ["selected" ] = index
2759
28- def random_point (index , selected , hovered ):
29- material = materials ["default" ]
30- if index == selected :
31- material = materials ["selected" ]
32- elif index == hovered :
33- material = materials ["hovered" ]
34- return h (
35- "Mesh" ,
36- {
37- "geometry" : sphere_geom ,
38- "material" : material ,
39- "local.position" : [
40- random .randint (- 10 , 10 ),
41- random .randint (- 10 , 10 ),
42- random .randint (- 10 , 10 ),
43- ],
44- "key" : index ,
45- "on_click" : lambda event : set_selected (index ),
46- "on_pointer_move" : lambda event : set_hovered (index ),
47- },
48- )
4960
5061 selected = props .get ("selected" , - 1 )
5162 hovered = props .get ("hovered" , - 1 )
5263 number_of_points = props .get ("count" , 50 )
5364
65+ if len (positions ) > number_of_points :
66+ positions = positions [:number_of_points ]
67+ elif len (positions ) < number_of_points :
68+ positions .extend (
69+ [rand_point () for _ in range (number_of_points - len (positions ))]
70+ )
71+
5472 return h (
5573 "Group" ,
5674 {},
57- * [random_point (i , selected , hovered ) for i in range (number_of_points )],
75+ * [
76+ point (i , selected , hovered , set_selected , set_hovered )
77+ for i in range (number_of_points )
78+ ],
5879 )
0 commit comments