Ejemplo n.º 1
0
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) ;
	}
}
Ejemplo n.º 2
0
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;
	}
}
Ejemplo n.º 3
0
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;

}