Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/sca.c
| Show First 20 Lines • Show All 66 Lines • ▼ Show 20 Lines | |||||
| { | { | ||||
| bSensor *sens; | bSensor *sens; | ||||
| while ((sens = BLI_pophead(lb))) { | while ((sens = BLI_pophead(lb))) { | ||||
| free_sensor(sens); | free_sensor(sens); | ||||
| } | } | ||||
| } | } | ||||
| bSensor *copy_sensor(bSensor *sens) | bSensor *copy_sensor(bSensor *sens, const int UNUSED(flag)) | ||||
| { | { | ||||
| bSensor *sensn; | bSensor *sensn; | ||||
| sensn= MEM_dupallocN(sens); | sensn= MEM_dupallocN(sens); | ||||
| sensn->flag |= SENS_NEW; | sensn->flag |= SENS_NEW; | ||||
| if (sens->data) { | if (sens->data) { | ||||
| sensn->data= MEM_dupallocN(sens->data); | sensn->data= MEM_dupallocN(sens->data); | ||||
| } | } | ||||
| if (sens->links) sensn->links= MEM_dupallocN(sens->links); | if (sens->links) sensn->links= MEM_dupallocN(sens->links); | ||||
| return sensn; | return sensn; | ||||
| } | } | ||||
| void copy_sensors(ListBase *lbn, const ListBase *lbo) | void copy_sensors(ListBase *lbn, const ListBase *lbo, const int flag) | ||||
| { | { | ||||
| bSensor *sens, *sensn; | bSensor *sens, *sensn; | ||||
| lbn->first= lbn->last= NULL; | lbn->first= lbn->last= NULL; | ||||
| sens= lbo->first; | sens= lbo->first; | ||||
| while (sens) { | while (sens) { | ||||
| sensn= copy_sensor(sens); | sensn= copy_sensor(sens, flag); | ||||
| BLI_addtail(lbn, sensn); | BLI_addtail(lbn, sensn); | ||||
| sens= sens->next; | sens= sens->next; | ||||
| } | } | ||||
| } | } | ||||
| void init_sensor(bSensor *sens) | void init_sensor(bSensor *sens) | ||||
| { | { | ||||
| /* also use when sensor changes type */ | /* also use when sensor changes type */ | ||||
| ▲ Show 20 Lines • Show All 123 Lines • ▼ Show 20 Lines | void free_controllers(ListBase *lb) | ||||
| while ((cont = BLI_pophead(lb))) { | while ((cont = BLI_pophead(lb))) { | ||||
| if (cont->slinks) | if (cont->slinks) | ||||
| MEM_freeN(cont->slinks); | MEM_freeN(cont->slinks); | ||||
| free_controller(cont); | free_controller(cont); | ||||
| } | } | ||||
| } | } | ||||
| bController *copy_controller(bController *cont) | bController *copy_controller(bController *cont, const int UNUSED(flag)) | ||||
| { | { | ||||
| bController *contn; | bController *contn; | ||||
| cont->mynew=contn= MEM_dupallocN(cont); | cont->mynew=contn= MEM_dupallocN(cont); | ||||
| contn->flag |= CONT_NEW; | contn->flag |= CONT_NEW; | ||||
| if (cont->data) { | if (cont->data) { | ||||
| contn->data= MEM_dupallocN(cont->data); | contn->data= MEM_dupallocN(cont->data); | ||||
| } | } | ||||
| if (cont->links) contn->links= MEM_dupallocN(cont->links); | if (cont->links) contn->links= MEM_dupallocN(cont->links); | ||||
| contn->slinks= NULL; | contn->slinks= NULL; | ||||
| contn->totslinks= 0; | contn->totslinks= 0; | ||||
| return contn; | return contn; | ||||
| } | } | ||||
| void copy_controllers(ListBase *lbn, const ListBase *lbo) | void copy_controllers(ListBase *lbn, const ListBase *lbo, const int flag) | ||||
| { | { | ||||
| bController *cont, *contn; | bController *cont, *contn; | ||||
| lbn->first= lbn->last= NULL; | lbn->first= lbn->last= NULL; | ||||
| cont= lbo->first; | cont= lbo->first; | ||||
| while (cont) { | while (cont) { | ||||
| contn= copy_controller(cont); | contn= copy_controller(cont, flag); | ||||
| BLI_addtail(lbn, contn); | BLI_addtail(lbn, contn); | ||||
| cont= cont->next; | cont= cont->next; | ||||
| } | } | ||||
| } | } | ||||
| void init_controller(bController *cont) | void init_controller(bController *cont) | ||||
| { | { | ||||
| /* also use when controller changes type, leave actuators... */ | /* also use when controller changes type, leave actuators... */ | ||||
| ▲ Show 20 Lines • Show All 84 Lines • ▼ Show 20 Lines | |||||
| { | { | ||||
| bActuator *act; | bActuator *act; | ||||
| while ((act = BLI_pophead(lb))) { | while ((act = BLI_pophead(lb))) { | ||||
| free_actuator(act); | free_actuator(act); | ||||
| } | } | ||||
| } | } | ||||
| bActuator *copy_actuator(bActuator *act) | bActuator *copy_actuator(bActuator *act, const int flag) | ||||
| { | { | ||||
| bActuator *actn; | bActuator *actn; | ||||
| act->mynew=actn= MEM_dupallocN(act); | act->mynew=actn= MEM_dupallocN(act); | ||||
| actn->flag |= ACT_NEW; | actn->flag |= ACT_NEW; | ||||
| if (act->data) { | if (act->data) { | ||||
| actn->data= MEM_dupallocN(act->data); | actn->data= MEM_dupallocN(act->data); | ||||
| } | } | ||||
| switch (act->type) { | switch (act->type) { | ||||
| case ACT_ACTION: | case ACT_ACTION: | ||||
| case ACT_SHAPEACTION: | case ACT_SHAPEACTION: | ||||
| { | { | ||||
| bActionActuator *aa = (bActionActuator *)act->data; | bActionActuator *aa = (bActionActuator *)act->data; | ||||
| if (aa->act) | if ((flag & LIB_ID_COPY_NO_USER_REFCOUNT) == 0) { | ||||
| id_us_plus((ID *)aa->act); | id_us_plus((ID *)aa->act); | ||||
| } | |||||
| break; | break; | ||||
| } | } | ||||
| case ACT_SOUND: | case ACT_SOUND: | ||||
| { | { | ||||
| bSoundActuator *sa = (bSoundActuator *)act->data; | bSoundActuator *sa = (bSoundActuator *)act->data; | ||||
| if (sa->sound) | if ((flag & LIB_ID_COPY_NO_USER_REFCOUNT) == 0) { | ||||
| id_us_plus((ID *)sa->sound); | id_us_plus((ID *)sa->sound); | ||||
| } | |||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| return actn; | return actn; | ||||
| } | } | ||||
| void copy_actuators(ListBase *lbn, const ListBase *lbo) | void copy_actuators(ListBase *lbn, const ListBase *lbo, const int flag) | ||||
| { | { | ||||
| bActuator *act, *actn; | bActuator *act, *actn; | ||||
| lbn->first= lbn->last= NULL; | lbn->first= lbn->last= NULL; | ||||
| act= lbo->first; | act= lbo->first; | ||||
| while (act) { | while (act) { | ||||
| actn= copy_actuator(act); | actn= copy_actuator(act, flag); | ||||
| BLI_addtail(lbn, actn); | BLI_addtail(lbn, actn); | ||||
| act= act->next; | act= act->next; | ||||
| } | } | ||||
| } | } | ||||
| void init_actuator(bActuator *act) | void init_actuator(bActuator *act) | ||||
| { | { | ||||
| /* also use when actuator changes type */ | /* also use when actuator changes type */ | ||||
| ▲ Show 20 Lines • Show All 370 Lines • ▼ Show 20 Lines | if (actuators_map) { | ||||
| BLI_ghash_free(actuators_map, NULL, NULL); | BLI_ghash_free(actuators_map, NULL, NULL); | ||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * Handle the copying of logic data into a new object, including internal logic links update. | * Handle the copying of logic data into a new object, including internal logic links update. | ||||
| * External links (links between logic bricks of different objects) must be handled separately. | * External links (links between logic bricks of different objects) must be handled separately. | ||||
| */ | */ | ||||
| void BKE_sca_logic_copy(Object *ob_new, const Object *ob) | void BKE_sca_logic_copy(Object *ob_new, const Object *ob, const int flag) | ||||
| { | { | ||||
| copy_sensors(&ob_new->sensors, &ob->sensors); | copy_sensors(&ob_new->sensors, &ob->sensors, flag); | ||||
| copy_controllers(&ob_new->controllers, &ob->controllers); | copy_controllers(&ob_new->controllers, &ob->controllers, flag); | ||||
| copy_actuators(&ob_new->actuators, &ob->actuators); | copy_actuators(&ob_new->actuators, &ob->actuators, flag); | ||||
| for (bSensor *sens = ob_new->sensors.first; sens; sens = sens->next) { | for (bSensor *sens = ob_new->sensors.first; sens; sens = sens->next) { | ||||
| if (sens->flag & SENS_NEW) { | if (sens->flag & SENS_NEW) { | ||||
| for (int a = 0; a < sens->totlinks; a++) { | for (int a = 0; a < sens->totlinks; a++) { | ||||
| if (sens->links[a] && sens->links[a]->mynew) { | if (sens->links[a] && sens->links[a]->mynew) { | ||||
| sens->links[a] = sens->links[a]->mynew; | sens->links[a] = sens->links[a]->mynew; | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 379 Lines • Show Last 20 Lines | |||||