Example #1
0
bool 
CreatureCore::IsBluePrintBonesCollide(FVector test_point, float bone_size, FTransform base_transform)
{
	if (bone_size <= 0)
	{
		bone_size = 1.0f;
	}

	FTransform xform = base_transform;
	FVector local_test_point = xform.InverseTransformPosition(test_point);
	auto  render_composition = creature_manager->GetCreature()->GetRenderComposition();
	auto& bones_map = render_composition->getBonesMap();

	glm::vec4 real_test_pt(local_test_point.X, local_test_point.Y, local_test_point.Z, 1.0f);
	for (auto cur_data : bones_map)
	{
		auto cur_bone = cur_data.second;
		auto bone_start_pt = cur_bone->getWorldStartPt();
		auto bone_end_pt = cur_bone->getWorldEndPt();

		auto bone_vec = bone_end_pt - bone_start_pt;
		auto bone_length = glm::length(bone_vec);
		auto bone_unit_vec = bone_vec / bone_length;

		auto rel_vec = real_test_pt - bone_start_pt;
		float proj_length_u = glm::dot(rel_vec, bone_unit_vec);
		if (proj_length_u >= 0 && proj_length_u <= bone_length)
		{
			// quick rotation by 90 degrees
			auto bone_unit_normal_vec = bone_unit_vec;
			bone_unit_normal_vec.x = -bone_unit_vec.y;
			bone_unit_normal_vec.y = bone_unit_vec.x;

			float proj_length_v = fabs(glm::dot(rel_vec, bone_unit_normal_vec));
			if (proj_length_v <= bone_size)
			{
				return true;
			}
		}

	}

	return false;

}
void ACreatureActor::FillBoneData()
{
	auto  render_composition = creature_manager->GetCreature()->GetRenderComposition();
	auto& bones_map = render_composition->getBonesMap();

	if (bone_data.Num() == 0)
	{
		bone_data.SetNum(bones_map.size());
	}

	int i = 0;
	for (auto& cur_data : bones_map)
	{
		bone_data[i].name = FString(cur_data.first.c_str());

		auto pt1 = cur_data.second->getWorldStartPt();
		auto pt2 = cur_data.second->getWorldEndPt();

		bone_data[i].point1 = FVector(pt1.x, pt1.y, pt1.z);
		bone_data[i].point2 = FVector(pt2.x, pt2.y, pt2.z);

		i++;
	}
}
Example #3
0
void CreatureCore::FillBoneData()
{
	auto  render_composition = creature_manager->GetCreature()->GetRenderComposition();
	auto& bones_map = render_composition->getBonesMap();

	if (bone_data.Num() == 0)
	{
		bone_data.SetNum(bones_map.size());
	}

	int i = 0;
	for (auto& cur_data : bones_map)
	{
		bone_data[i].name = FString(cur_data.first.c_str());

		auto pt1 = cur_data.second->getWorldStartPt();
		auto pt2 = cur_data.second->getWorldEndPt();

		/* Id References
		const int x_id = 0;
		const int y_id = 2;
		const int z_id = 1;
		*/

		bone_data[i].point1 = FVector(pt1.x, pt1.y, pt1.z);
		bone_data[i].point2 = FVector(pt2.x, pt2.y, pt2.z);

		// figure out bone transform
		auto cur_bone = cur_data.second;
		auto bone_start_pt = pt1;
		auto bone_end_pt = pt2;

		auto bone_vec = bone_end_pt - bone_start_pt;
		auto bone_length = glm::length(bone_vec);
		auto bone_unit_vec = bone_vec / bone_length;

		// quick rotation by 90 degrees
		auto bone_unit_normal_vec = bone_unit_vec;
		bone_unit_normal_vec.x = -bone_unit_vec.y;
		bone_unit_normal_vec.y = bone_unit_vec.x;

		FVector bone_midpt = (bone_data[i].point1 + bone_data[i].point2) * 0.5f;
		FVector bone_axis_x(bone_unit_vec.x, bone_unit_vec.y, 0);
		FVector bone_axis_y(bone_unit_normal_vec.x, bone_unit_normal_vec.y, 0);
		FVector bone_axis_z(0, 0, 1);

		FTransform scaleXform(FVector(0, 0, 0));
		scaleXform.SetScale3D(FVector(bone_length * bone_data_length_factor, bone_data_size, bone_data_size));


		//std::swap(bone_midpt.Y, bone_midpt.Z);

		FTransform fixXform;
		fixXform.SetRotation(FQuat::MakeFromEuler(FVector(-90, 0, 0)));

		FTransform rotXform(bone_axis_x, bone_axis_y, bone_axis_z, FVector(0, 0, 0));

		FTransform posXform, posStartXform, posEndXform;
		posXform.SetTranslation(bone_midpt);
		posStartXform.SetTranslation(bone_data[i].point1);
		posEndXform.SetTranslation(bone_data[i].point2);

		//		bone_data[i].xform = scaleXform * FTransform(bone_axis_x, bone_axis_y, bone_axis_z, bone_midpt);
		bone_data[i].xform = scaleXform  * rotXform  * posXform * fixXform;

		bone_data[i].startXform = scaleXform  * rotXform  * posStartXform * fixXform;
		bone_data[i].endXform = scaleXform  * rotXform  * posEndXform * fixXform;

		i++;
	}

}