2 // mplist.c - Multiped motion list management.
8 extern mps_motion_state_callback mp_motion_start_callback
;
9 extern mps_motion_state_callback mp_motion_end_callback
;
13 void mp_list_init(mps_motion_list
* list
)
23 void mp_list_free(mps_motion_list
* list
)
25 mps_stack_node
* node
= list
->head
, * temp
;
30 if (node
->type
== MN_MOTION
)
32 mps_motion_node
* m
= (mps_motion_node
*) node
;
38 if(mp_motion_end_callback
)
40 int mnum
=MP_MOTNUM_FROM_NODE_HANDLE(m
->handle
);
42 // check motion is not a pose
43 if(mnum
!=MP_MOTNUM_FROM_NODE_HANDLE(-1))
44 mp_motion_end_callback(mnum
);
59 void mp_list_add(mps_motion_list
* list
, mps_stack_node
* node
)
61 if(node
->type
==MN_MOTION
&& mp_motion_start_callback
)
63 mps_motion_node
*m
=(mps_motion_node
*)node
;
64 int mnum
=MP_MOTNUM_FROM_NODE_HANDLE(m
->handle
);
66 // check motion is not a pose
67 if(mnum
!=MP_MOTNUM_FROM_NODE_HANDLE(-1))
68 mp_motion_start_callback(mnum
);
72 list
->tail
->next
= node
;
73 node
->prev
= list
->tail
;
91 void mp_list_remove(mps_motion_list
* list
, mps_stack_node
* node
)
93 mps_stack_node
* p
= node
->prev
;
94 mps_stack_node
* n
= node
->next
;
96 if(node
->type
==MN_MOTION
&& mp_motion_end_callback
)
98 mps_motion_node
*m
=(mps_motion_node
*)node
;
99 int mnum
=MP_MOTNUM_FROM_NODE_HANDLE(m
->handle
);
101 // check motion is not a pose
102 if(mnum
!=MP_MOTNUM_FROM_NODE_HANDLE(-1))
103 mp_motion_end_callback(mnum
);
111 // Node is head of list.
121 // Node is tail of list.
125 if (node
->type
== MN_MOTION
)
127 mps_motion_node
* m
= (mps_motion_node
*) node
;
142 mps_stack_node
* mp_list_traverse(mps_motion_list
* list
, mps_stack_node
* node
)
144 mps_stack_node
* result
;
158 BOOL
mp_list_clone(mps_motion_list
*dst
, mps_motion_list
*src
)
160 mps_stack_node
*node
=NULL
,*newnode
;
164 while(node
=mp_list_traverse(src
,node
))
166 if(node
->type
==MN_MOTION
)
168 if(!(newnode
=mp_alloc(sizeof(mps_motion_node
),__FILE__
, __LINE__
)))
173 memcpy(newnode
,node
,sizeof(mps_motion_node
));
174 if(((mps_motion_node
*)node
)->targets
)
176 ((mps_motion_node
*)newnode
)->targets
=Malloc(MSize(((mps_motion_node
*)node
)->targets
)); // XXX this may copy more than necessary
177 memcpy(((mps_motion_node
*)newnode
)->targets
,((mps_motion_node
*)node
)->targets
,MSize(((mps_motion_node
*)node
)->targets
));
181 if(!(newnode
=mp_alloc(sizeof(mps_transition_node
),__FILE__
, __LINE__
)))
186 memcpy(newnode
,node
,sizeof(mps_transition_node
));
188 mp_list_add(dst
,newnode
);