/*! * Free a node and all of its resources. * * \param node Lib3dsNode object to be freed. * * \ingroup node */ void lib3ds_node_free(Lib3dsNode *node) { ASSERT(node); free_node_and_childs(node); }
/*! * Free a node and all of its resources. * * \param node Lib3dsNode object to be freed. */ void lib3ds_node_free(Lib3dsNode *node) { assert(node); free_node_and_childs(node); }
static void free_node_and_childs(Lib3dsNode *node) { ASSERT(node); switch (node->type) { case LIB3DS_UNKNOWN_NODE: break; case LIB3DS_AMBIENT_NODE: { Lib3dsAmbientData *n=&node->data.ambient; lib3ds_lin3_track_free_keys(&n->col_track); } break; case LIB3DS_OBJECT_NODE: { Lib3dsObjectData *n=&node->data.object; lib3ds_lin3_track_free_keys(&n->pos_track); lib3ds_quat_track_free_keys(&n->rot_track); lib3ds_lin3_track_free_keys(&n->scl_track); lib3ds_bool_track_free_keys(&n->hide_track); lib3ds_morph_track_free_keys(&n->morph_track); } break; case LIB3DS_CAMERA_NODE: { Lib3dsCameraData *n=&node->data.camera; lib3ds_lin3_track_free_keys(&n->pos_track); lib3ds_lin1_track_free_keys(&n->fov_track); lib3ds_lin1_track_free_keys(&n->roll_track); } break; case LIB3DS_TARGET_NODE: { Lib3dsTargetData *n=&node->data.target; lib3ds_lin3_track_free_keys(&n->pos_track); } break; case LIB3DS_LIGHT_NODE: { Lib3dsLightData *n=&node->data.light; lib3ds_lin3_track_free_keys(&n->pos_track); lib3ds_lin3_track_free_keys(&n->col_track); lib3ds_lin1_track_free_keys(&n->hotspot_track); lib3ds_lin1_track_free_keys(&n->falloff_track); lib3ds_lin1_track_free_keys(&n->roll_track); } break; case LIB3DS_SPOT_NODE: { Lib3dsSpotData *n=&node->data.spot; lib3ds_lin3_track_free_keys(&n->pos_track); } break; } { Lib3dsNode *p,*q; for (p=node->childs; p; p=q) { q=p->next; free_node_and_childs(p); } } node->type=LIB3DS_UNKNOWN_NODE; free(node); }
static void free_node_and_childs(Lib3dsNode *node) { assert(node); switch (node->type) { case LIB3DS_NODE_AMBIENT_COLOR: { Lib3dsAmbientColorNode *n = (Lib3dsAmbientColorNode*)node; lib3ds_track_resize(&n->color_track, 0); break; } case LIB3DS_NODE_MESH_INSTANCE: { Lib3dsMeshInstanceNode *n = (Lib3dsMeshInstanceNode*)node; lib3ds_track_resize(&n->pos_track, 0); lib3ds_track_resize(&n->rot_track, 0); lib3ds_track_resize(&n->scl_track, 0); lib3ds_track_resize(&n->hide_track, 0); break; } case LIB3DS_NODE_CAMERA: { Lib3dsCameraNode *n = (Lib3dsCameraNode*)node; lib3ds_track_resize(&n->pos_track, 0); lib3ds_track_resize(&n->fov_track, 0); lib3ds_track_resize(&n->roll_track, 0); break; } case LIB3DS_NODE_CAMERA_TARGET: { Lib3dsTargetNode *n = (Lib3dsTargetNode*)node; lib3ds_track_resize(&n->pos_track, 0); break; } case LIB3DS_NODE_OMNILIGHT: { Lib3dsOmnilightNode *n = (Lib3dsOmnilightNode*)node; lib3ds_track_resize(&n->pos_track, 0); lib3ds_track_resize(&n->color_track, 0); break; } case LIB3DS_NODE_SPOTLIGHT: { Lib3dsSpotlightNode *n = (Lib3dsSpotlightNode*)node; lib3ds_track_resize(&n->pos_track, 0); lib3ds_track_resize(&n->color_track, 0); lib3ds_track_resize(&n->hotspot_track, 0); lib3ds_track_resize(&n->falloff_track, 0); lib3ds_track_resize(&n->roll_track, 0); break; } case LIB3DS_NODE_SPOTLIGHT_TARGET: { Lib3dsTargetNode *n = (Lib3dsTargetNode*)node; lib3ds_track_resize(&n->pos_track, 0); break; } } { Lib3dsNode *p, *q; for (p = node->childs; p; p = q) { q = p->next; free_node_and_childs(p); } } free(node); }