Skip to content

Commit 4b71f47

Browse files
committed
fix: set local.position only when repeat_primitive is False
When repeat_primitive=True, vertices are already translated in the buffer by repeat_primitive(), so setting local.position would cause a double offset. When repeat_primitive=False, raw vertices are not translated, so we need local.position = centers[0] to place the object correctly. Added tests for both cases in test_core.py.
1 parent 926220d commit 4b71f47

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

fury/actor/core.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,8 @@ def actor_from_primitive(
437437
wireframe_thickness=wireframe_thickness,
438438
)
439439
obj = create_mesh(geometry=geo, material=mat)
440-
440+
if not repeat_primitive:
441+
obj.local.position = centers[0]
441442
obj.prim_count = prim_count
442443
return obj
443444

fury/actor/tests/conftest.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import rendercanvas.glfw
44

55
from fury import actor
6+
from fury.primitive import prim_sphere
67

78

89
def _do_nothing_patch(self):
@@ -17,3 +18,9 @@ def sphere_actor():
1718
centers = np.array([[0.0, 0.0, 0.0]], dtype=np.float32)
1819
colors = np.array([[1.0, 0.0, 0.0]], dtype=np.float32)
1920
return actor.sphere(centers=centers, colors=colors)
21+
22+
23+
@pytest.fixture
24+
def sphere_prim():
25+
vertices, faces = prim_sphere(phi=8, theta=8)
26+
return vertices, faces

fury/actor/tests/test_core.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from fury import actor, geometry, material, window
66
from fury.actor import Actor, Image as ActorImage, Text
7+
from fury.actor.core import actor_from_primitive
78
from fury.actor.tests._helpers import validate_actors
89

910

@@ -188,3 +189,33 @@ def test_axes():
188189
assert 0 < mean_b < 255
189190

190191
scene.remove(axes_actor)
192+
193+
194+
def test_actor_from_primitive_position_with_repeat(sphere_prim):
195+
vertices, faces = sphere_prim
196+
centers = np.array([[5, 10, 15]], dtype=np.float32)
197+
colors = np.array([[1, 0, 0]])
198+
199+
obj = actor_from_primitive(
200+
vertices, faces, centers, colors=colors, repeat_primitive=True
201+
)
202+
203+
np.testing.assert_array_equal(
204+
obj.local.position, np.array([0, 0, 0], dtype=np.float32)
205+
)
206+
mean_vertex = np.round(np.mean(obj.geometry.positions.data, axis=0))
207+
np.testing.assert_array_almost_equal(mean_vertex, centers[0])
208+
209+
210+
def test_actor_from_primitive_position_without_repeat(sphere_prim):
211+
vertices, faces = sphere_prim
212+
centers = np.array([[5, 10, 15]], dtype=np.float32)
213+
colors = np.array([[1, 0, 0]])
214+
215+
obj = actor_from_primitive(
216+
vertices, faces, centers, colors=colors, repeat_primitive=False
217+
)
218+
219+
np.testing.assert_array_equal(
220+
obj.local.position, np.array([5, 10, 15], dtype=np.float32)
221+
)

0 commit comments

Comments
 (0)