예제 #1
0
        public void CombineTwoPolys()
        {
            UpdateMarkedCounts();
            if (num_marked_polys == 2)
            {
                List <DPoly> polys = GetMarkedPolys();

                if (DPoly.HasTwoOrMoreSharedVerts(polys[0], polys[1]))
                {
                    if (Vector3.Dot(DPoly.CalculatePolyNormal(polys[0], this), DPoly.CalculatePolyNormal(polys[1], this)) > 0.8f)
                    {
                        // Align the UVs
                        polys[1].UVAlignToPoly(polys[0], this);

                        // Add verts from c_polys[1] to c_polys[0]
                        for (int i = 0; i < polys[1].num_verts; i++)
                        {
                            if (!polys[0].vert.Contains(polys[1].vert[i]))
                            {
                                polys[0].AddVert(polys[1].vert[i], polys[1].normal[i], polys[1].tex_uv[i]);
                            }
                        }

                        // Sort the verts in c_polys[0]
                        polys[0].ReSortVerts(this);

                        // Delete c_polys[1]
                        polygon.Remove(polys[1]);
                    }
                    else
                    {
                        editor.AddOutputText("Polys aren't planar enough, cannot combine");
                    }
                }
                else
                {
                    editor.AddOutputText("Polys don't share two verts, cannot combine");
                }
            }
            else
            {
                editor.AddOutputText("Must mark exactly two polys to combine");
            }
        }
예제 #2
0
        public void ExtrudeSelectedPoly(float dist)
        {
            if (selected_poly > -1 && selected_poly < polygon.Count)
            {
                ClearAllMarkedPoly();
                DPoly dp = polygon[selected_poly];
                dp.marked = true;
                // EXTRUDE!
                Vector3 extrude_vec = DPoly.CalculatePolyNormal(dp, this) * dist;

                // Add extra verts and assign polygon verts
                int first_vert = vertex.Count;
                for (int i = 0; i < dp.num_verts; i++)
                {
                    AddVertexEditor(vertex[dp.vert[i]] + extrude_vec);
                }

                // Create new polygons around the rim
                List <int> v_list = new List <int>();
                for (int i = 0; i < dp.num_verts; i++)
                {
                    v_list.Clear();
                    v_list.Add(dp.vert[i]);
                    v_list.Add(dp.vert[(i + 1) % dp.num_verts]);
                    v_list.Add(first_vert + (i + 1) % dp.num_verts);
                    v_list.Add(first_vert + i);
                    DPoly new_poly = new DPoly(v_list, dp.tex_index, this);
                    polygon.Add(new_poly);
                }

                // Assign original polygon verts
                for (int i = 0; i < dp.num_verts; i++)
                {
                    dp.vert[i] = first_vert + i;
                }
            }
            else
            {
                editor.AddOutputText("No polygon selected for extrude");
            }
        }
예제 #3
0
        public void TagCoplanarConnectedPolys(DPoly p, float angle_tol, bool recursive = false)
        {
            float angle;

            for (int i = 0; i < polygon.Count; i++)
            {
                if (!polygon[i].tag)
                {
                    if (DPoly.HasTwoOrMoreSharedVerts(polygon[i], p))
                    {
                        angle = Vector3.CalculateAngle(DPoly.CalculatePolyNormal(polygon[i], this), DPoly.CalculatePolyNormal(p, this));
                        if (angle <= angle_tol)
                        {
                            polygon[i].tag = true;
                            if (recursive)
                            {
                                TagCoplanarConnectedPolys(polygon[i], angle_tol, true);
                            }
                        }
                    }
                }
            }
        }
예제 #4
0
        public void InsetExtrudeMarkedPolys(float inset_amt, float dist)
        {
            if (selected_poly > -1 && selected_poly < polygon.Count)
            {
                DPoly selected_dp = polygon[selected_poly];
                if (selected_dp.marked)
                {
                    // EXTRUDE!
                    Vector3 extrude_vec = DPoly.CalculatePolyNormal(selected_dp, this) * dist;

                    Vector3 center_vec = AverageMarkedPolyVertPosition();

                    // Extrude all the marked polygons
                    TagAllPolys(false);
                    foreach (DPoly dp in GetMarkedPolys(false))
                    {
                        // Add extra verts and assign polygon verts
                        int first_vert = vertex.Count;
                        for (int i = 0; i < dp.num_verts; i++)
                        {
                            AddVertexEditor(vertex[dp.vert[i]] * (1f - inset_amt) + center_vec * inset_amt + extrude_vec);
                        }

                        // Create new polygons around the rim
                        List <int> v_list = new List <int>();
                        for (int i = 0; i < dp.num_verts; i++)
                        {
                            v_list.Clear();
                            v_list.Add(dp.vert[i]);
                            v_list.Add(dp.vert[(i + 1) % dp.num_verts]);
                            v_list.Add(first_vert + (i + 1) % dp.num_verts);
                            v_list.Add(first_vert + i);
                            DPoly new_poly = new DPoly(v_list, dp.tex_index, this);
                            new_poly.tag = true;
                            polygon.Add(new_poly);
                        }

                        // Assign original polygon verts
                        for (int i = 0; i < dp.num_verts; i++)
                        {
                            dp.vert[i] = first_vert + i;
                        }
                    }

                    // Merge overlapping verts
                    MergeOverlappingVerts();

                    // Remove all tagged polygons that share all verts
                    List <DPoly> polys_to_remove = new List <DPoly>();
                    foreach (DPoly dp1 in polygon)
                    {
                        if (dp1.tag)
                        {
                            dp1.tag = false;
                            foreach (DPoly dp2 in polygon)
                            {
                                if (dp2.tag)
                                {
                                    if (dp1.SharesAllVerts(dp2))
                                    {
                                        polys_to_remove.Add(dp1);
                                        polys_to_remove.Add(dp2);
                                        dp2.tag = false;
                                    }
                                }
                            }
                        }
                    }

                    foreach (DPoly dp in polys_to_remove)
                    {
                        polygon.Remove(dp);
                    }
                }
                else
                {
                    editor.AddOutputText("Selected polygon must be marked for inset/bevel");
                }
            }
            else
            {
                editor.AddOutputText("Must select polygon for inset/bevel");
            }
        }