void
ACreatureSwitchItemActor:: InitSwitchRenderData()
{
	if (creature_actor)
	{
		auto creature_manager = creature_actor->GetCreatureManager();
		if (creature_manager)
		{
			auto cur_creature = creature_manager->GetCreature();
			auto& regions_map = cur_creature->GetRenderComposition()->getRegionsMap();
			std::string find_name = ConvertToString(creature_switch_region);

			for (auto& cur_region_pair : regions_map)
			{
				auto cur_region = cur_region_pair.second;
				if (cur_region->getName() == find_name)
				{
					// init render mesh
					real_switch_region = cur_region;
					InitRealSwitchRegion();

					switch_init_done = true;
					break;
				}
			}

		}
	}
}
void ACreatureActor::UpdateCreatureRender()
{
	auto cur_creature = creature_manager->GetCreature();
	int num_triangles = cur_creature->GetTotalNumIndices() / 3;
	glm::uint32 * cur_idx = cur_creature->GetGlobalIndices();
	glm::float32 * cur_pts = cur_creature->GetRenderPts();
	glm::float32 * cur_uvs = cur_creature->GetGlobalUvs();

	// Update depth per region
	std::vector<meshRenderRegion *>& cur_regions =
		cur_creature->GetRenderComposition()->getRegions();
	float region_z = 0.0f, delta_z = -0.01f;
	for (auto& single_region : cur_regions)
	{
		glm::float32 * region_pts = cur_pts + (single_region->getStartPtIndex() * 3);
		for (size_t i = 0; i < single_region->getNumPts(); i++)
		{
			region_pts[2] = region_z;
			region_pts += 3;
		}

		region_z += delta_z;
	}

	// Build render triangles
	TArray<FProceduralMeshTriangle>& write_triangles = mesh->GetProceduralTriangles();

	static const FColor White(255, 255, 255, 255);
	int cur_pt_idx = 0, cur_uv_idx = 0;

	for (int i = 0; i < num_triangles; i++)
	{
		int real_idx_1 = cur_idx[0];
		int real_idx_2 = cur_idx[1];
		int real_idx_3 = cur_idx[2];

		FProceduralMeshTriangle triangle;

		cur_pt_idx = real_idx_1 * 3;
		cur_uv_idx = real_idx_1 * 2;
		triangle.Vertex0.Position.Set(cur_pts[cur_pt_idx], cur_pts[cur_pt_idx + 1], cur_pts[cur_pt_idx + 2]);
		triangle.Vertex0.Color = White;
		triangle.Vertex0.U = cur_uvs[cur_uv_idx];
		triangle.Vertex0.V = cur_uvs[cur_uv_idx + 1];

		cur_pt_idx = real_idx_2 * 3;
		cur_uv_idx = real_idx_2 * 2;
		triangle.Vertex1.Position.Set(cur_pts[cur_pt_idx], cur_pts[cur_pt_idx + 1], cur_pts[cur_pt_idx + 2]);
		triangle.Vertex1.Color = White;
		triangle.Vertex1.U = cur_uvs[cur_uv_idx];
		triangle.Vertex1.V = cur_uvs[cur_uv_idx + 1];

		cur_pt_idx = real_idx_3 * 3;
		cur_uv_idx = real_idx_3 * 2;
		triangle.Vertex2.Position.Set(cur_pts[cur_pt_idx], cur_pts[cur_pt_idx + 1], cur_pts[cur_pt_idx + 2]);
		triangle.Vertex2.Color = White;
		triangle.Vertex2.U = cur_uvs[cur_uv_idx];
		triangle.Vertex2.V = cur_uvs[cur_uv_idx + 1];

		write_triangles[i] = triangle;

		cur_idx += 3;
	}

	//mesh->SetProceduralMeshTriangles(draw_triangles);
	mesh->ForceAnUpdate();
}
Ejemplo n.º 3
0
void CreatureCore::ProcessRenderRegions()
{
	auto cur_creature = creature_manager->GetCreature();
	auto& regions_map = cur_creature->GetRenderComposition()->getRegionsMap();
	int num_triangles = cur_creature->GetTotalNumIndices() / 3;

	// process alphas
	if (region_alphas.Num() != cur_creature->GetTotalNumPoints())
	{
		region_alphas.Init(255, cur_creature->GetTotalNumPoints());
	}

	// fill up animation alphas
	for (auto& cur_region_pair : regions_map)
	{
		auto cur_region = cur_region_pair.second;
		auto start_pt_index = cur_region->getStartPtIndex();
		auto end_pt_index = cur_region->getEndPtIndex();
		auto cur_alpha = FMath::Clamp(cur_region->getOpacity() / 100.0f, 0.0f, 1.0f) * 255.0f;


		for (auto i = start_pt_index; i <= end_pt_index; i++)
		{
			region_alphas[i] = (uint8)cur_alpha;
		}
	}

	// user overwrite alphas
	if (region_alpha_map.Num() > 0)
	{
		// fill up the alphas for specific regions with alpha overwrites
		for (auto cur_iter : region_alpha_map)
		{
			auto cur_name = ConvertToString(cur_iter.Key);
			auto cur_alpha = cur_iter.Value;

			if (regions_map.count(cur_name) > 0)
			{
				meshRenderRegion * cur_region = regions_map[cur_name];
				auto start_pt_index = cur_region->getStartPtIndex();
				auto end_pt_index = cur_region->getEndPtIndex();

				for (auto i = start_pt_index; i <= end_pt_index; i++)
				{
					region_alphas[i] = cur_alpha;
				}
			}
		}
	}

	// now write out alphas into render triangles
	/*
	glm::uint32 * cur_idx = cur_creature->GetGlobalIndices();
	for (int i = 0; i < num_triangles; i++)
	{
		int real_idx_1 = cur_idx[0];
		int real_idx_2 = cur_idx[1];
		int real_idx_3 = cur_idx[2];

		auto& cur_tri = draw_tris[i];
		auto set_alpha_1 = region_alphas[real_idx_1];
		auto set_alpha_2 = region_alphas[real_idx_2];
		auto set_alpha_3 = region_alphas[real_idx_3];

		cur_tri.Vertex0.Color = FColor(set_alpha_1, set_alpha_1, set_alpha_1, set_alpha_1);
		cur_tri.Vertex1.Color = FColor(set_alpha_2, set_alpha_2, set_alpha_1, set_alpha_2);
		cur_tri.Vertex2.Color = FColor(set_alpha_3, set_alpha_3, set_alpha_1, set_alpha_3);

		cur_idx += 3;
	}
	*/
}
Ejemplo n.º 4
0
void CreatureCore::UpdateCreatureRender()
{

	auto cur_creature = creature_manager->GetCreature();
	int num_triangles = cur_creature->GetTotalNumIndices() / 3;
	glm::uint32 * cur_idx = cur_creature->GetGlobalIndices();
	glm::float32 * cur_pts = cur_creature->GetRenderPts();
	glm::float32 * cur_uvs = cur_creature->GetGlobalUvs();

	// Update depth per region
	std::vector<meshRenderRegion *>& cur_regions =
		cur_creature->GetRenderComposition()->getRegions();
	float region_z = 0.0f, delta_z = region_overlap_z_delta;

	if (region_custom_order.Num() != cur_regions.size())
	{
		// Normal update in default order
		for (auto& single_region : cur_regions)
		{
			glm::float32 * region_pts = cur_pts + (single_region->getStartPtIndex() * 3);
			for (size_t i = 0; i < single_region->getNumPts(); i++)
			{
				region_pts[2] = region_z;
				region_pts += 3;
			}

			region_z += delta_z;
		}
	}
	else {
		// Custom order update
		auto& regions_map = cur_creature->GetRenderComposition()->getRegionsMap();
		for (auto& custom_region_name : region_custom_order)
		{
			auto real_name = ConvertToString(custom_region_name);
			if (regions_map.count(real_name) > 0)
			{
				auto single_region = regions_map[real_name];
				glm::float32 * region_pts = cur_pts + (single_region->getStartPtIndex() * 3);
				for (size_t i = 0; i < single_region->getNumPts(); i++)
				{
					region_pts[2] = region_z;
					region_pts += 3;
				}

				region_z += delta_z;
			}
		}
	}

	// Build render triangles
	/*
	TArray<FProceduralMeshTriangle>& write_triangles = draw_tris;

	static const FColor White(255, 255, 255, 255);
	int cur_pt_idx = 0, cur_uv_idx = 0;
	const int x_id = 0;
	const int y_id = 2;
	const int z_id = 1;

	for (int i = 0; i < num_triangles; i++)
	{
		int real_idx_1 = cur_idx[0];
		int real_idx_2 = cur_idx[1];
		int real_idx_3 = cur_idx[2];

		FProceduralMeshTriangle triangle;

		cur_pt_idx = real_idx_1 * 3;
		cur_uv_idx = real_idx_1 * 2;
		triangle.Vertex0.Position.Set(cur_pts[cur_pt_idx + x_id], cur_pts[cur_pt_idx + y_id], cur_pts[cur_pt_idx + z_id]);
		triangle.Vertex0.Color = White;
		triangle.Vertex0.U = cur_uvs[cur_uv_idx];
		triangle.Vertex0.V = cur_uvs[cur_uv_idx + 1];

		cur_pt_idx = real_idx_2 * 3;
		cur_uv_idx = real_idx_2 * 2;
		triangle.Vertex1.Position.Set(cur_pts[cur_pt_idx + x_id], cur_pts[cur_pt_idx + y_id], cur_pts[cur_pt_idx + z_id]);
		triangle.Vertex1.Color = White;
		triangle.Vertex1.U = cur_uvs[cur_uv_idx];
		triangle.Vertex1.V = cur_uvs[cur_uv_idx + 1];

		cur_pt_idx = real_idx_3 * 3;
		cur_uv_idx = real_idx_3 * 2;
		triangle.Vertex2.Position.Set(cur_pts[cur_pt_idx + x_id], cur_pts[cur_pt_idx + y_id], cur_pts[cur_pt_idx + z_id]);
		triangle.Vertex2.Color = White;
		triangle.Vertex2.U = cur_uvs[cur_uv_idx];
		triangle.Vertex2.V = cur_uvs[cur_uv_idx + 1];

		write_triangles[i] = triangle;

		cur_idx += 3;
	}
	*/

	// process the render regions
	ProcessRenderRegions();
}