Skip to content

Commit 367ccd5

Browse files
committed
add include UVs flag
1 parent 5129c25 commit 367ccd5

File tree

3 files changed

+49
-45
lines changed

3 files changed

+49
-45
lines changed

genesis/engine/entities/particle_entity.py

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,6 @@ def _add_to_solver(self):
184184
self._add_particles_to_solver()
185185
if self._need_skinning:
186186
self._add_vverts_to_solver()
187-
self._add_uvs_and_faces_to_solver()
188187

189188
def _add_particles_to_solver(self):
190189
raise NotImplementedError
@@ -230,47 +229,6 @@ def _kernel_add_vverts_to_solver(
230229
for j in range(self.solver._n_vvert_supports):
231230
self.solver.vverts_info.support_idxs[i_vv][j] = support_idxs_local[i_vv_, j] + self._particle_start
232231

233-
def _add_uvs_and_faces_to_solver(self):
234-
"""Add UV coordinates and face indices to the solver's global buffers."""
235-
# Get UVs from vmesh (may be None if no texture)
236-
uvs = self._vmesh.uvs if self._vmesh is not None else None
237-
if uvs is not None and len(uvs) == self.n_vverts:
238-
uvs_np = np.asarray(uvs, dtype=gs.np_float)
239-
else:
240-
# No UVs available, use zeros
241-
uvs_np = np.zeros((self.n_vverts, 2), dtype=gs.np_float)
242-
243-
# Get face indices and offset them by vvert_start for global indexing
244-
faces_np = np.asarray(self._vfaces, dtype=gs.np_int)
245-
246-
self._kernel_add_uvs_and_faces_to_solver(
247-
uvs=uvs_np,
248-
faces=faces_np,
249-
)
250-
251-
@ti.kernel
252-
def _kernel_add_uvs_and_faces_to_solver(
253-
self,
254-
uvs: ti.types.ndarray(element_dim=1),
255-
faces: ti.types.ndarray(element_dim=1),
256-
):
257-
# Copy UVs to solver's global UV buffer
258-
for i_vv_ in range(self.n_vverts):
259-
i_vv = i_vv_ + self._vvert_start
260-
self.solver.vverts_uvs[i_vv] = uvs[i_vv_]
261-
262-
# Copy faces to solver's global face buffer (with global vertex indices)
263-
for i_vf_ in range(self.n_vfaces):
264-
i_vf = i_vf_ + self._vface_start
265-
# Offset face indices by vvert_start for global vertex indexing
266-
self.solver.vfaces_indices[i_vf] = ti.Vector(
267-
[
268-
ti.cast(faces[i_vf_][0], gs.ti_int) + self._vvert_start,
269-
ti.cast(faces[i_vf_][1], gs.ti_int) + self._vvert_start,
270-
ti.cast(faces[i_vf_][2], gs.ti_int) + self._vvert_start,
271-
]
272-
)
273-
274232
def sample(self):
275233
"""
276234
Sample particles from the morph based on its type and the specified sampler.

genesis/engine/entities/pbd_entity.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,50 @@ class PBDBaseEntity(ParticleEntity):
1313
Base class for PBD entity.
1414
"""
1515

16+
def _add_to_solver(self):
17+
super()._add_to_solver()
18+
self._add_uvs_and_faces_to_solver()
19+
20+
def _add_uvs_and_faces_to_solver(self):
21+
"""Add UV coordinates and face indices to the solver's global buffers."""
22+
# Get UVs from vmesh (may be None if no texture)
23+
uvs = self._vmesh.uvs if self._vmesh is not None else None
24+
if uvs is not None and len(uvs) == self.n_vverts:
25+
uvs_np = np.asarray(uvs, dtype=gs.np_float)
26+
else:
27+
# No UVs available, use zeros
28+
uvs_np = np.zeros((self.n_vverts, 2), dtype=gs.np_float)
29+
30+
# Get face indices
31+
faces_np = np.asarray(self._vfaces, dtype=gs.np_int)
32+
33+
self._kernel_add_uvs_and_faces_to_solver(
34+
uvs=uvs_np,
35+
faces=faces_np,
36+
)
37+
38+
@ti.kernel
39+
def _kernel_add_uvs_and_faces_to_solver(
40+
self,
41+
uvs: ti.types.ndarray(element_dim=1),
42+
faces: ti.types.ndarray(element_dim=1),
43+
):
44+
# Copy UVs to solver's global UV buffer
45+
for i_vv_ in range(self.n_vverts):
46+
i_vv = i_vv_ + self._vvert_start
47+
self.solver.vverts_uvs[i_vv] = uvs[i_vv_]
48+
49+
# Copy faces to solver's global face buffer (with global vertex indices)
50+
for i_vf_ in range(self.n_vfaces):
51+
i_vf = i_vf_ + self._vface_start
52+
self.solver.vfaces_indices[i_vf] = ti.Vector(
53+
[
54+
ti.cast(faces[i_vf_][0], gs.ti_int) + self._vvert_start,
55+
ti.cast(faces[i_vf_][1], gs.ti_int) + self._vvert_start,
56+
ti.cast(faces[i_vf_][2], gs.ti_int) + self._vvert_start,
57+
]
58+
)
59+
1660
@gs.assert_built
1761
def set_particles_pos(self, poss, particles_idx_local=None, envs_idx=None):
1862
envs_idx = self._scene._sanitize_envs_idx(envs_idx)

genesis/engine/solvers/fem_solver.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,13 +1099,15 @@ def get_state(self, f):
10991099
state = None
11001100
return state
11011101

1102-
def get_state_render(self, f):
1102+
def get_state_render(self, f, include_uvs=False):
11031103
self.get_state_render_kernel(f)
11041104
vertices = self.surface_render_v.vertices
11051105
indices = self.surface_render_f.indices
1106-
uvs = self.surface_render_uvs
11071106

1108-
return vertices, indices, uvs
1107+
if include_uvs:
1108+
uvs = self.surface_render_uvs
1109+
return vertices, indices, uvs
1110+
return vertices, indices
11091111

11101112
def get_forces(self):
11111113
"""

0 commit comments

Comments
 (0)