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]);
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
        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]);
            }
        }
Пример #6
0
        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];
            }
        }
Пример #7
0
        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;
            }
        }
Пример #8
0
        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();
        }