void CActor::camUpdateLadder(float dt) { if(!character_physics_support()->movement()->ElevatorState()) return; if(cameras[eacFirstEye]->bClampYaw) return; float yaw = (-XFORM().k.getH()); float & cam_yaw = cameras[eacFirstEye]->yaw; float delta = angle_difference_signed(yaw,cam_yaw); if(-0.05f<delta&&0.05f>delta) { yaw = cam_yaw+delta; float lo = (yaw-f_Ladder_cam_limit); float hi = (yaw+f_Ladder_cam_limit); cameras[eacFirstEye]->lim_yaw[0] = lo; cameras[eacFirstEye]->lim_yaw[1] = hi; cameras[eacFirstEye]->bClampYaw = true; }else{ cam_yaw += delta * _min(dt*10.f,1.f) ; } CElevatorState* es = character_physics_support()->movement()->ElevatorState(); if(es && es->State()==CElevatorState::clbClimbingDown) { float &cam_pitch = cameras[eacFirstEye]->pitch; const float ldown_pitch = cameras[eacFirstEye]->lim_pitch.y; float delta = angle_difference_signed(ldown_pitch,cam_pitch); if(delta>0.f) cam_pitch += delta* _min(dt*10.f,1.f) ; } }
void CActor::cam_SetLadder() { CCameraBase* C = cameras[eacFirstEye]; g_LadderOrient (); float yaw = (-XFORM().k.getH()); float &cam_yaw = C->yaw; float delta_yaw = angle_difference_signed(yaw,cam_yaw); if(-f_Ladder_cam_limit<delta_yaw&&f_Ladder_cam_limit>delta_yaw) { yaw = cam_yaw+delta_yaw; float lo = (yaw-f_Ladder_cam_limit); float hi = (yaw+f_Ladder_cam_limit); C->lim_yaw[0] = lo; C->lim_yaw[1] = hi; C->bClampYaw = true; } }
int read_member_objects_recursively(int member_index, int downlinks_from_core) { int i, j; int links = nshape[fstate.target_templ->member[member_index].shape].links; fstate.target_templ->member[member_index].downlinks_from_core = downlinks_from_core; // struct ctokenstruct ctoken; // Object looks like this: // {object_type, angle : class, class2} (plus possible comma) // link object can look like this: // {object_downlink, angle, {shape...}} //* remember to update d_code.c so it generates the process in the right format! //fpr("\n read_member_objects_recursively %i", member_index); for (i = 0; i < links; i ++) { int object_type = read_procdef(); //fpr("\n obj %i %i", i, object_type); #ifdef TEST_PROCDEF fpr("\nread object_type %i (%i)", object_type, fstate.procdef_pos); #endif if (object_type < 0 || object_type >= OBJECT_TYPES) return procdef_error("expected object type"); fstate.target_templ->member[member_index].object[i].type = object_type; int number_of_classes = read_procdef(); #ifdef TEST_PROCDEF fpr("\nread number of classes %i (%i)", number_of_classes, fstate.procdef_pos); #endif if (number_of_classes < 0 || number_of_classes >= CLASSES_PER_OBJECT) return procdef_error("wrong number of classes"); //fpr("\n number of classes %i: ", number_of_classes); j = 0; while (j < number_of_classes) { int class_index = read_procdef(); // fpr("(%i:%i), ", j, class_index); #ifdef TEST_PROCDEF fpr("\nread class_index %i (%i)", class_index, fstate.procdef_pos); #endif if (class_index < 0 || class_index >= OBJECT_CLASSES) return procdef_error("invalid class index"); fstate.target_templ->member[member_index].object[i].object_class[j] = class_index; j++; } int object_angle = read_procdef(); #ifdef TEST_PROCDEF fpr("\nread object_angle %i (%i)", object_angle, fstate.procdef_pos); #endif if (object_angle < -ANGLE_4 || object_angle > ANGLE_4) return procdef_error("invalid object angle"); if (otype[object_type].object_details.only_zero_angle_offset) { // fpr("\n Fixing angle %i to 0 (otype %i)", object_angle, object_type); object_angle = 0; // some object types can only have zero offset } fstate.target_templ->member[member_index].object[i].base_angle_offset_angle = object_angle; // fpr("\n read [%i] template %i member %i object %i angle_offset %i", fstate.procdef_pos, fstate.target_templ->template_index, member_index, i, fstate.target_templ->member[member_index].object[i].base_angle_offset_angle); fstate.target_templ->member[member_index].object[i].base_angle_offset = angle_difference_signed(0, int_angle_to_fixed(object_angle)); //fpr("\n fix oa %i base_angle %i base_angle_f %f", object_angle, fstate.target_templ->member[member_index].object[i].base_angle_offset_angle, al_fixtof(fstate.target_templ->member[member_index].object[i].base_angle_offset)); if (object_type == OBJECT_TYPE_DOWNLINK) { for (j = 1; j < GROUP_CONNECTIONS; j ++) { if (fstate.target_templ->member[member_index].connection[j].template_member_index == -1) { if (!read_member_recursively(member_index, i, j, downlinks_from_core + 1)) return 0; break; } } if (j >= GROUP_CONNECTIONS) return comp_error_text("too many connections", NULL); // not sure this is possible (there should always be enough space in the connections array) } if (cstate.error != CERR_NONE) return 0; } return 1; }