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(); }
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; } */ }
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(); }