public void ClipGeometry() { GMesh temp_gm = null; // Save the light data before it gets lost during clipping var light_storage = new List <GLight>(); for (int i = 0, num_lights = this.m_light.Count; i < num_lights; ++i) { var light_copy = new GLight(this.m_light[i]); light_storage.Add(light_copy); } this.m_light.Clear(); for (int i = 0; i < (int)EdgeOrder.NUM; i++) { if (m_clip_plane[i].visible) { temp_gm = ClipGeometryToPlane(m_clip_plane[i]); Copy(temp_gm); } } // Restore the light data // TODO(Jeff): What if the light should be clipped away? for (int i = 0, num_lights = light_storage.Count; i < num_lights; ++i) { this.m_light.Add(light_storage[i]); } }
public void BuildGeneratedMesh(GMesh gm, int idx) { GL.End(); GL.Begin(PrimitiveType.Triangles); //GL.Color3(Color.White); for (int i = 0; i < gm.m_triangle.Count; i++) { // Don't draw no_render triangles if ((gm.m_triangle[i].flags & (int)FaceFlags.NO_RENDER) == (int)FaceFlags.NO_RENDER) { continue; } if (tex_id != gm.m_tex_gl_id[gm.m_triangle[i].tex_index]) { GL.End(); tex_id = gm.m_tex_gl_id[gm.m_triangle[i].tex_index]; GL.BindTexture(TextureTarget.Texture2D, tex_id); GL.Begin(PrimitiveType.Triangles); } CreateGMTriangle(gm.m_triangle[i], gm); } GL.End(); GL.Begin(PrimitiveType.Quads); }
public void CreateGMTriangle(DTriangle tri, GMesh mesh) { Vector3 normal = Utility.FindNormal(mesh.m_vertex[tri.vert[0]], mesh.m_vertex[tri.vert[1]], mesh.m_vertex[tri.vert[2]]); for (int i = 0; i < 3; i++) { GL.TexCoord2(tri.tex_uv[i]); //GL.Normal3(tri.normal[i]); GL.Normal3(normal); GL.Vertex3(mesh.m_vertex[tri.vert[i]]); } }
public GMesh ClipGeometryToPlane(GClipPlane gcp) { GMesh clip_gm = new GMesh(); // Add the textures first for (int i = 0; i < m_tex_name.Count; i++) { #if OVERLOAD_LEVEL_EDITOR clip_gm.AddTexture(m_tex_gl_id[i], m_tex_name[i]); #else clip_gm.m_tex_name.Add(m_tex_name[i]); #endif } // Copy the clip planes for (int i = 0; i < (int)EdgeOrder.NUM; i++) { clip_gm.m_clip_plane[i] = new GClipPlane(m_clip_plane[i]); } ClipPlane cp = ClipPlane.CreateFrom3Points(gcp.edge_pos1, gcp.edge_pos2, gcp.edge_pos2 + gcp.normal); for (int i = 0; i < m_triangle.Count; i++) { CTriangle ct = new CTriangle(m_triangle[i], m_vertex[m_triangle[i].vert[0]], m_vertex[m_triangle[i].vert[1]], m_vertex[m_triangle[i].vert[2]]); ct.ClipFacePlane(cp); if (ct.clipped_verts.Length < 3) { continue; } int num_triangles = ct.clipped_verts.Length - 2; for (int clipped_tri_idx = 0; clipped_tri_idx < num_triangles; ++clipped_tri_idx) { CTriangle extracted_ct = ct.ExtractClippedTriangle(clipped_tri_idx); if (extracted_ct.HasDegenerateTriangles(false)) { continue; } clip_gm.AddFaceFromCTriangle(extracted_ct); } } return(clip_gm); }
public void Copy(GMesh src) { m_vertex = new List <Vector3>(); m_triangle = new List <DTriangle>(); m_light = new List <GLight>(); m_color = new List <Vector3>(); #if OVERLOAD_LEVEL_EDITOR m_tex_gl_id = new List <int>(); #endif m_tex_name = new List <string>(); for (int i = 0; i < (int)EdgeOrder.NUM; i++) { m_clip_plane[i].Copy(src.m_clip_plane[i]); } for (int i = 0; i < (int)src.m_vertex.Count; i++) { m_vertex.Add(src.m_vertex[i]); } for (int i = 0; i < (int)src.m_triangle.Count; i++) { m_triangle.Add(src.m_triangle[i]); } for (int i = 0; i < (int)src.m_light.Count; i++) { m_light.Add(new GLight(src.m_light[i])); } for (int i = 0; i < (int)src.m_color.Count; i++) { var src_c = src.m_color[i]; m_color.Add(new Vector3(src_c.X, src_c.Y, src_c.Z)); } for (int i = 0; i < (int)src.m_tex_name.Count; i++) { #if OVERLOAD_LEVEL_EDITOR m_tex_gl_id.Add(src.m_tex_gl_id[i]); #endif m_tex_name.Add(src.m_tex_name[i]); } }
public void Copy(Decal src) { mesh_name = src.mesh_name; dmesh = src.dmesh; gmesh = src.gmesh; hidden = src.hidden; align = src.align; mirror = src.mirror; rotation = src.rotation; repeat_u = src.repeat_u; repeat_v = src.repeat_v; offset_u = src.offset_u; offset_v = src.offset_v; for (int i = 0; i < NUM_EDGES; i++) { clip[i] = src.clip[i]; cap[i] = src.cap[i]; } }
public void Reset() { mesh_name = ""; hidden = false; dmesh = null; gmesh = null; align = DecalAlign.CENTER; mirror = DecalMirror.OFF; rotation = 0; repeat_u = 1; repeat_v = 1; offset_u = 0; offset_v = 0; for (int i = 0; i < NUM_EDGES; i++) { clip[i] = DecalClip.NONE; cap[i] = DecalCap.NONE; } }
public void MaybeUpdateGMesh(bool report_mesh_issues, out string decal_issues) { if (string.IsNullOrEmpty(mesh_name) || hidden) { decal_issues = string.Empty; gmesh = null; //Clear out rendered mesh return; } dmesh = side.level.GetDMeshByName(mesh_name); System.Text.StringBuilder issues_text = new System.Text.StringBuilder(); const bool cleanup_bad_triangles = true; if (report_mesh_issues || cleanup_bad_triangles) { string issues; if (dmesh != null && dmesh.CheckAndCleanMeshIssues(cleanup_bad_triangles, out issues)) { if (report_mesh_issues) { issues_text.AppendFormat("Decal \"{0}\" has issues in its source geometry:\n{1}", mesh_name, issues); } } } if (dmesh == null) { decal_issues = string.Empty; gmesh = null; //Clear out rendered mesh return; } mesh_name = dmesh.name; gmesh = new GMesh(); gmesh.SetColors(dmesh.color); UpdateClipNormals(); // This must be done before GenerateNonClippedGeometry because gmesh.GenerateNonClippedGeometry(this, dmesh); #if OVERLOAD_LEVEL_EDITOR { // Note: We may not be in the UNITY_EDITOR here, but not // have valid TextureManager for decal and level textures. // This is the case when we are doing an export for user // levels. We don't need GL texture data anyway. var texman_decal = side.level.editor.tm_decal; var texman_level = side.level.editor.tm_level; if (texman_decal != null && texman_level != null) { gmesh.UpdateGLTextures(texman_decal, texman_level); } } #endif gmesh.ClipGeometry(); if (report_mesh_issues || cleanup_bad_triangles) { string issues; if (gmesh.CheckAndCleanMeshIssues(cleanup_bad_triangles, out issues)) { if (report_mesh_issues) { issues_text.AppendFormat("Decal \"{0}\" has issues after generation and clipping:\n{1}", mesh_name, issues); } } } gmesh.OptimizeMesh(); if (report_mesh_issues || cleanup_bad_triangles) { string issues; if (gmesh.CheckAndCleanMeshIssues(cleanup_bad_triangles, out issues)) { if (report_mesh_issues) { issues_text.AppendFormat("Decal \"{0}\" has issues after optimization:\n{1}", mesh_name, issues); } } } decal_issues = issues_text.ToString(); }