11import taichi as ti
22
33import genesis .utils .array_class as array_class
4- from genesis .engine .solvers .rigid .contact_island import INVALID_HIBERNATED_ISLAND_ID
5- from genesis .engine .solvers .rigid .rigid_debug import Debug
6- from genesis .engine .solvers .rigid .rigid_validate import validate_temp_island_contains_both_hibernated_and_awake_entities
74
5+ from genesis .engine .solvers .rigid .contact_island import INVALID_NEXT_HIBERNATED_ENTITY_IDX
6+ from genesis .engine .solvers .rigid .rigid_debug import Debug
7+ from genesis .engine .solvers .rigid .rigid_validate import (
8+ validate_temp_island_contains_both_hibernated_and_awake_entities ,
9+ validate_entity_hibernation_state_for_all_entities_in_temp_island ,
10+ validate_next_hibernated_entity_indices_in_entire_scene ,
11+ )
812
913
1014
@@ -23,51 +27,54 @@ def func_wakeup_entity_and_its_temp_island(
2327 # Note: Original function handled non-hibernated & fixed entities.
2428 # Now, we require a properly hibernated entity to be passed in.
2529 island_idx = contact_island .entity_island [i_e , i_b ]
26- is_entity_fixed = island_idx == - 1
27- Debug .assertf (0x0ad00007 , not is_entity_fixed ) # Fixed entities are excluded from hibernation logic
28- Debug .assertf (0x0ad0000b , entities_state .hibernated [i_e , i_b ])
30+ Debug .assertf (0x7ad00008 , not contact_island .island_hibernated [island_idx , i_b ]) # Island already expected to be marked as not hibernated
2931
30- # Note: temporarily, we have duplicated logic for hibernation: the entity_state.hibernated,
31- # and the new contact_island's arrays that are used to store persistent_hibernated_island_id.
32- hibernated_island_id = contact_island .hibernated_entity_idx_to_hibernated_island_id [i_e , i_b ]
33- is_entity_hibernated = hibernated_island_id != INVALID_HIBERNATED_ISLAND_ID
34- Debug .assertf (0x0ad0000c , is_entity_hibernated ) # Entityt must belong to a persistent hibernated island
32+ is_entity_fixed = island_idx == - 1
33+ Debug .assertf (0x7ad00007 , not is_entity_fixed ) # Fixed entities are excluded from hibernation logic
34+ Debug .assertf (0x7ad0000b , entities_state .hibernated [i_e , i_b ])
3535
3636 if ti .static (Debug .validate ):
3737 validate_temp_island_contains_both_hibernated_and_awake_entities (island_idx , i_b , entities_state , contact_island )
3838
39- n_entities = entities_info .n_links .shape [0 ]
40- for entity_idx in range (n_entities ):
41-
42-
43- if contact_island .hibernated_entity_idx_to_hibernated_island_id [entity_idx , i_b ] == hibernated_island_id :
44- Debug .assertf (0x0ad0000b , entities_state .hibernated [entity_idx , i_b ]) # Entity expected to be hibernated
45-
46- contact_island .hibernated_entity_idx_to_hibernated_island_id [entity_idx , i_b ] = INVALID_HIBERNATED_ISLAND_ID
47-
48- if entities_state .hibernated [entity_idx , i_b ]:
49- entities_state .hibernated [entity_idx , i_b ] = False
50- n_awake_entities = ti .atomic_add (rigid_global_info .n_awake_entities [i_b ], 1 )
51- rigid_global_info .awake_entities [n_awake_entities , i_b ] = entity_idx
52-
53- # todo: do single atomic add
54- for i_d in range (entities_info .dof_start [entity_idx ], entities_info .dof_end [entity_idx ]):
55- dofs_state .hibernated [i_d , i_b ] = False
56- n_awake_dofs = ti .atomic_add (rigid_global_info .n_awake_dofs [i_b ], 1 )
57- rigid_global_info .awake_dofs [n_awake_dofs , i_b ] = i_d
58-
59- # todo: do single atomic add
60- for i_l in range (entities_info .link_start [entity_idx ], entities_info .link_end [entity_idx ]):
61- links_state .hibernated [i_l , i_b ] = False
62- n_awake_links = ti .atomic_add (rigid_global_info .n_awake_links [i_b ], 1 )
63- rigid_global_info .awake_links [n_awake_links , i_b ] = i_l
64-
65- for i_g in range (entities_info .geom_start [entity_idx ], entities_info .geom_end [entity_idx ]):
66- geoms_state .hibernated [i_g , i_b ] = False
67-
68- # validation only: un-hibernate the island
69- non_persistent_hibernated_island_idx = contact_island .entity_island [entity_idx , i_b ]
70- Debug .assertf (0x0ad00008 , non_persistent_hibernated_island_idx != - 1 ) # Entity being hibernated has invalid temp island index
71- Debug .assertf (0x0ad00009 , non_persistent_hibernated_island_idx == island_idx ) # Not matching island indices
72-
73- contact_island .island_hibernated [non_persistent_hibernated_island_idx , i_b ] = False
39+ entity_ref_range = contact_island .island_entity [island_idx , i_b ]
40+ for ei in range (entity_ref_range .n ):
41+ entity_ref = entity_ref_range .start + ei
42+ entity_idx = contact_island .entity_id [entity_ref , i_b ]
43+ Debug .assertf (0x7ad0000d , contact_island .entity_island [entity_idx , i_b ] == island_idx ) # Unexpected entity from outside of island
44+
45+ is_entity_hibernated = entities_state .hibernated [entity_idx , i_b ]
46+ next_hibernated_entity_idx = contact_island .entity_idx_to_next_entity_idx_in_hibernated_island [entity_idx , i_b ]
47+ Debug .assertf (0x7ad0000e , is_entity_hibernated == (next_hibernated_entity_idx != INVALID_NEXT_HIBERNATED_ENTITY_IDX )) # Inconsistent entity state
48+
49+ if is_entity_hibernated :
50+ contact_island .entity_idx_to_next_entity_idx_in_hibernated_island [entity_idx , i_b ] = INVALID_NEXT_HIBERNATED_ENTITY_IDX
51+
52+ entities_state .hibernated [entity_idx , i_b ] = False
53+ n_awake_entities = ti .atomic_add (rigid_global_info .n_awake_entities [i_b ], 1 )
54+ rigid_global_info .awake_entities [n_awake_entities , i_b ] = entity_idx
55+
56+ n_dofs = entities_info .n_dofs [entity_idx ]
57+ base_entity_dof_idx = entities_info .dof_start [entity_idx ]
58+ base_awake_dof_idx = ti .atomic_add (rigid_global_info .n_awake_dofs [i_b ], n_dofs )
59+ for i in range (n_dofs ):
60+ i_d = base_entity_dof_idx + i
61+ dofs_state .hibernated [i_d , i_b ] = False
62+ rigid_global_info .awake_dofs [base_awake_dof_idx + i , i_b ] = i_d
63+
64+ n_links = entities_info .n_links [entity_idx ]
65+ base_entity_link_idx = entities_info .link_start [entity_idx ]
66+ base_awake_link_idx = ti .atomic_add (rigid_global_info .n_awake_links [i_b ], n_links )
67+ for i in range (n_links ):
68+ i_l = base_entity_link_idx + i
69+ links_state .hibernated [i_l , i_b ] = False
70+ rigid_global_info .awake_links [base_awake_link_idx + i , i_b ] = i_l
71+
72+ for i_g in range (entities_info .geom_start [entity_idx ], entities_info .geom_end [entity_idx ]):
73+ geoms_state .hibernated [i_g , i_b ] = False
74+
75+ # contact_island.island_hibernated[island_idx, i_b] = False
76+ if ti .static (Debug .validate ):
77+ validate_entity_hibernation_state_for_all_entities_in_temp_island ( \
78+ island_idx , i_b , entities_state , contact_island , expected_hibernation_state = False )
79+ validate_next_hibernated_entity_indices_in_entire_scene (i_b , entities_state , contact_island )
80+
0 commit comments