View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0002385 | FSSCP | tables | public | 2011-01-24 05:00 | 2011-02-04 17:19 |
Reporter | FUBAR-BDHR | Assigned To | The_E | ||
Priority | normal | Severity | feature | Reproducibility | always |
Status | resolved | Resolution | fixed | ||
Product Version | 3.6.13 | ||||
Fixed in Version | 3.6.13 | ||||
Summary | 0002385: Animation code should be using subobject names not numbers | ||||
Description | This is kind of a feature and a bug so putting it here. The issue with using subobject numbers for the animation code is that they change. Something as simple as opening an older versions of a model in a newer version of pcs2 can result in different subobject numbers. Max constantly rearranges them. Even saving and reopening a model will often result in different subobject numbers on export. Of course we would need to keep the existing subobject number option for backward compatibility. Adding a +sub_name option would probably be the best. It would also allow for better error checking in the future as a deleted object would no longer be found. | ||||
Tags | No tags attached. | ||||
2011-01-24 17:04
|
2385.patch (2,267 bytes)
Index: model/modelanim.h =================================================================== --- model/modelanim.h (revision 6969) +++ model/modelanim.h (working copy) @@ -66,6 +66,8 @@ int loop_sound; int end_sound; float snd_rad; + + char sub_name[NAME_LENGTH]; }; /* Index: ship/ship.cpp =================================================================== --- ship/ship.cpp (revision 6969) +++ ship/ship.cpp (working copy) @@ -375,6 +375,8 @@ bool warning_too_many_ship_classes = false; +int ship_get_subobj_model_num(ship_info* sip, char* subobj_name); + // set the ship_obj struct fields to default values void ship_obj_list_reset_slot(int index) { @@ -3177,7 +3179,13 @@ current_trigger->subtype = ANIMATION_SUBTYPE_ALL; } + if(optional_string("+sub_name:")) { + stuff_string(current_trigger->sub_name, F_NAME, NAME_LENGTH); + } else { + strcpy_s(current_trigger->sub_name, "<none>"); + } + if(current_trigger->type == TRIGGER_TYPE_INITIAL){ //the only thing initial animation type needs is the angle, //so to save space lets just make everything optional in this case @@ -3340,7 +3348,21 @@ strcpy_s(parse_error_text, ""); + // Fix up animation code references + for (int i = 0; i < sip->n_subsystems; i++) { + for (int j = 0; j < sip->subsystems[i].n_triggers; j++) { + if (stricmp(sip->subsystems[i].triggers[j].sub_name, "<none>")) { + int idx = ship_get_subobj_model_num(sip, sip->subsystems[i].triggers[j].sub_name); + if (idx != -1) { + sip->subsystems[i].triggers[j].subtype = idx; + } else { + WarningEx(LOCATION, "Could not find subobject %s in ship class %s. Animation triggers will not work correctly.\n", sip->subsystems[i].triggers[j].sub_name, sip->name); + } + } + } + } + return rtn; //0 for success } @@ -16922,3 +16944,13 @@ Warning(LOCATION, "Unrecognized weapon '%s' found when setting weapon targeting priorities.\n", tempname); } } + +int ship_get_subobj_model_num(ship_info* sip, char* subobj_name) +{ + for (int i = 0; i < sip->n_subsystems; i++) { + if (!stricmp(sip->subsystems[i].name, subobj_name)) + return sip->subsystems[i].subobj_num; + } + + return -1; +} \ No newline at end of file |
|
Proposed patch is attached. Adds "+sub_name" to the animation code, to be placed after or instead of "+sub_type". |
|
Doesn't seem to work. I changed 5 turret doors to use +sub_name and while they do trigger to open they never stop rotating and never close. Left the rest on +sub_type and they still work. Found and fixed one bug. Line 71 in that patch should be if (!stricmp(sip->subsystems[i].subobj_name, subobj_name)) Even with that it seems that sip->subsystems[i].subobj_num is not defined yet as every single one has a value of 0xcccccccc |
|
Yeah, I was sort of afraid of that. Second patch uploaded, this one moves the fixing of animation references into ship_set, during mission load (which is where model data is mated with tbl data. Didn't want to slow down the init process by having to load the model during startup....) |
2011-01-25 18:11
|
2385-2.patch (2,377 bytes)
Index: model/modelanim.h =================================================================== --- model/modelanim.h (revision 6976) +++ model/modelanim.h (working copy) @@ -66,6 +66,8 @@ int loop_sound; int end_sound; float snd_rad; + + char sub_name[NAME_LENGTH]; }; /* Index: ship/ship.cpp =================================================================== --- ship/ship.cpp (revision 6976) +++ ship/ship.cpp (working copy) @@ -375,6 +375,8 @@ bool warning_too_many_ship_classes = false; +int ship_get_subobj_model_num(ship_info* sip, char* subobj_name); + // set the ship_obj struct fields to default values void ship_obj_list_reset_slot(int index) { @@ -3177,7 +3179,13 @@ current_trigger->subtype = ANIMATION_SUBTYPE_ALL; } + if(optional_string("+sub_name:")) { + stuff_string(current_trigger->sub_name, F_NAME, NAME_LENGTH); + } else { + strcpy_s(current_trigger->sub_name, "<none>"); + } + if(current_trigger->type == TRIGGER_TYPE_INITIAL){ //the only thing initial animation type needs is the angle, //so to save space lets just make everything optional in this case @@ -3340,7 +3348,6 @@ strcpy_s(parse_error_text, ""); - return rtn; //0 for success } @@ -5214,6 +5221,20 @@ ship_recalc_subsys_strength( shipp ); } + // Fix up animation code references + for (int i = 0; i < sinfo->n_subsystems; i++) { + for (int j = 0; j < sinfo->subsystems[i].n_triggers; j++) { + if (stricmp(sinfo->subsystems[i].triggers[j].sub_name, "<none>")) { + int idx = ship_get_subobj_model_num(sinfo, sinfo->subsystems[i].triggers[j].sub_name); + if (idx != -1) { + sinfo->subsystems[i].triggers[j].subtype = idx; + } else { + WarningEx(LOCATION, "Could not find subobject %s in ship class %s. Animation triggers will not work correctly.\n", sinfo->subsystems[i].triggers[j].sub_name, sinfo->name); + } + } + } + } + return 1; } @@ -16922,3 +16943,13 @@ Warning(LOCATION, "Unrecognized weapon '%s' found when setting weapon targeting priorities.\n", tempname); } } + +int ship_get_subobj_model_num(ship_info* sip, char* subobj_name) +{ + for (int i = 0; i < sip->n_subsystems; i++) { + if (!stricmp(sip->subsystems[i].subobj_name, subobj_name)) + return sip->subsystems[i].subobj_num; + } + + return -1; +} \ No newline at end of file |
|
Looks good. |
|
Committed to trunk in revision 7000 |
Date Modified | Username | Field | Change |
---|---|---|---|
2011-01-24 05:00 | FUBAR-BDHR | New Issue | |
2011-01-24 17:04 | The_E | File Added: 2385.patch | |
2011-01-24 17:05 | The_E | Note Added: 0012611 | |
2011-01-25 05:18 | FUBAR-BDHR | Note Added: 0012612 | |
2011-01-25 06:02 | FUBAR-BDHR | Note Edited: 0012612 | |
2011-01-25 18:04 | The_E | Note Added: 0012613 | |
2011-01-25 18:11 | The_E | File Added: 2385-2.patch | |
2011-01-25 18:11 | The_E | Status | new => assigned |
2011-01-25 18:11 | The_E | Assigned To | => The_E |
2011-01-25 23:50 | FUBAR-BDHR | Note Added: 0012614 | |
2011-02-04 17:19 | The_E | Note Added: 0012623 | |
2011-02-04 17:19 | The_E | Status | assigned => resolved |
2011-02-04 17:19 | The_E | Fixed in Version | => 3.6.13 |
2011-02-04 17:19 | The_E | Resolution | open => fixed |