Esempio n. 1
0
    /**
     *	\brief Creates a new pb_Object with passed vertex array and pb_Face array.  Allows for a great deal of control when constructing geometry.
     *	@param _vertices The vertex array to use in construction of mesh.
     *	@param _faces A pb_Face array containing triangle, material per face, and pb_UV parameters for each face.
     *	\sa pb_Face pb_UV
     *	\returns The newly created pb_Object.
     */
    public static pb_Object CreateInstanceWithVerticesFaces(Vector3[] v, pb_Face[] f)
    {
        GameObject _gameObject = new GameObject();
        pb_Object  pb_obj      = _gameObject.AddComponent <pb_Object>();

        pb_obj.SetName("Object");

        pb_obj.GeometryWithVerticesFaces(v, f);


        return(pb_obj);
    }
Esempio n. 2
0
        private pb_Object GetShadowObject(pb_Object pb)
        {
            if (pb == null || pb.name.Contains("-ShadowVolume"))
            {
                return(null);
            }

            for (int i = 0; i < pb.transform.childCount; i++)
            {
                Transform t = pb.transform.GetChild(i);

                if (t.name.Equals(string.Format("{0}-ShadowVolume", pb.name)))
                {
                    pb_Object shadow = t.GetComponent <pb_Object>();

                    if (shadow != null)
                    {
                        pbUndo.RecordObject(shadow, "Update Shadow Object");

                        pb_Face[] faces = new pb_Face[pb.faces.Length];

                        for (int nn = 0; nn < pb.faces.Length; nn++)
                        {
                            faces[nn] = new pb_Face(pb.faces[nn]);
                        }

                        shadow.GeometryWithVerticesFaces(pb.vertices, faces);
                        return(shadow);
                    }
                }
            }

            pb_Object new_shadow = pb_Object.InitWithObject(pb);

            new_shadow.name = string.Format("{0}-ShadowVolume", pb.name);
            new_shadow.MakeUnique();
            new_shadow.transform.SetParent(pb.transform, false);
            Undo.RegisterCreatedObjectUndo(new_shadow.gameObject, "Create Shadow Object");
            return(new_shadow);
        }
Esempio n. 3
0
        public static pb_Object ProBuilderize(Transform t, bool preserveFaces)
        {
            Mesh m = t.GetComponent <MeshFilter>().sharedMesh;

            Vector3[] m_vertices = m.vertices;
            Vector2[] m_uvs      = m.uv;

            List <Vector3> verts = preserveFaces ? new List <Vector3>(m.vertices) : new List <Vector3>();
            List <Vector2> uvs   = preserveFaces ? new List <Vector2>(m.uv) : new List <Vector2>();
            List <pb_Face> faces = new List <pb_Face>();

            for (int n = 0; n < m.subMeshCount; n++)
            {
                int[] tris = m.GetTriangles(n);
                for (int i = 0; i < tris.Length; i += 3)
                {
                    int index = -1;
                    if (preserveFaces)
                    {
                        for (int j = 0; j < faces.Count; j++)
                        {
                            if (faces[j].distinctIndices.Contains(tris[i + 0]) ||
                                faces[j].distinctIndices.Contains(tris[i + 1]) ||
                                faces[j].distinctIndices.Contains(tris[i + 2]))
                            {
                                index = j;
                                break;
                            }
                        }
                    }

                    if (index > -1 && preserveFaces)
                    {
                        int   len = faces[index].indices.Length;
                        int[] arr = new int[len + 3];
                        System.Array.Copy(faces[index].indices, 0, arr, 0, len);
                        arr[len + 0] = tris[i + 0];
                        arr[len + 1] = tris[i + 1];
                        arr[len + 2] = tris[i + 2];
                        faces[index].SetIndices(arr);
                        faces[index].RebuildCaches();
                    }
                    else
                    {
                        int[] faceTris;

                        if (preserveFaces)
                        {
                            faceTris = new int[3]
                            {
                                tris[i + 0],
                                tris[i + 1],
                                tris[i + 2]
                            };
                        }
                        else
                        {
                            verts.Add(m_vertices[tris[i + 0]]);
                            verts.Add(m_vertices[tris[i + 1]]);
                            verts.Add(m_vertices[tris[i + 2]]);

                            uvs.Add(m_uvs[tris[i + 0]]);
                            uvs.Add(m_uvs[tris[i + 1]]);
                            uvs.Add(m_uvs[tris[i + 2]]);
                            faceTris = new int[3] {
                                i + 0, i + 1, i + 2
                            };
                        }

                        faces.Add(
                            new pb_Face(
                                faceTris,
                                t.GetComponent <MeshRenderer>().sharedMaterials[n],
                                new pb_UV(),
                                0,                              // smoothing group
                                -1,                             // texture group
                                -1,                             // element group
                                true,                           // manualUV
                                Color.white
                                ));
                    }
                }
            }

            GameObject go = (GameObject)GameObject.Instantiate(t.gameObject);

            go.GetComponent <MeshFilter>().sharedMesh = null;

            pb_Object pb = go.AddComponent <pb_Object>();

            pb.GeometryWithVerticesFaces(verts.ToArray(), faces.ToArray());

            pb.SetUV(uvs.ToArray());

            pb.SetName(t.name);

            pb_Editor_Utility.SetEntityType(EntityType.Detail, pb.gameObject);

            go.transform.position      = t.position;
            go.transform.localRotation = t.localRotation;
            go.transform.localScale    = t.localScale;

            pb.FreezeScaleTransform();

#if UNITY_3_0 || UNITY_3_0_0 || UNITY_3_1 || UNITY_3_2 || UNITY_3_3 || UNITY_3_4 || UNITY_3_5
            t.gameObject.active = false;
#else
            t.gameObject.SetActive(false);
#endif



            return(pb);
        }
Esempio n. 4
0
        /**
         * "ProBuilder-ize function"
         */
        public static pb_Object CreatePbObjectWithTransform(Transform t, bool preserveFaces)
        {
            Mesh m = t.GetComponent <MeshFilter>().sharedMesh;

            Vector3[] m_vertices = m.vertices;
            Color[]   m_colors   = m.colors ?? new Color[m_vertices.Length];
            Vector2[] m_uvs      = m.uv;

            List <Vector3> verts = preserveFaces ? new List <Vector3>(m.vertices) : new List <Vector3>();
            List <Color>   cols  = preserveFaces ? new List <Color>(m.colors) : new List <Color>();
            List <Vector2> uvs   = preserveFaces ? new List <Vector2>(m.uv) : new List <Vector2>();
            List <pb_Face> faces = new List <pb_Face>();

            for (int n = 0; n < m.subMeshCount; n++)
            {
                int[] tris = m.GetTriangles(n);
                for (int i = 0; i < tris.Length; i += 3)
                {
                    int index = -1;
                    if (preserveFaces)
                    {
                        for (int j = 0; j < faces.Count; j++)
                        {
                            if (faces[j].distinctIndices.Contains(tris[i + 0]) ||
                                faces[j].distinctIndices.Contains(tris[i + 1]) ||
                                faces[j].distinctIndices.Contains(tris[i + 2]))
                            {
                                index = j;
                                break;
                            }
                        }
                    }

                    if (index > -1 && preserveFaces)
                    {
                        int   len = faces[index].indices.Length;
                        int[] arr = new int[len + 3];
                        System.Array.Copy(faces[index].indices, 0, arr, 0, len);
                        arr[len + 0] = tris[i + 0];
                        arr[len + 1] = tris[i + 1];
                        arr[len + 2] = tris[i + 2];
                        faces[index].SetIndices(arr);
                        faces[index].RebuildCaches();
                    }
                    else
                    {
                        int[] faceTris;

                        if (preserveFaces)
                        {
                            faceTris = new int[3]
                            {
                                tris[i + 0],
                                tris[i + 1],
                                tris[i + 2]
                            };
                        }
                        else
                        {
                            verts.Add(m_vertices[tris[i + 0]]);
                            verts.Add(m_vertices[tris[i + 1]]);
                            verts.Add(m_vertices[tris[i + 2]]);

                            cols.Add(m_colors != null ? m_colors[tris[i + 0]] : Color.white);
                            cols.Add(m_colors != null ? m_colors[tris[i + 1]] : Color.white);
                            cols.Add(m_colors != null ? m_colors[tris[i + 2]] : Color.white);

                            uvs.Add(m_uvs[tris[i + 0]]);
                            uvs.Add(m_uvs[tris[i + 1]]);
                            uvs.Add(m_uvs[tris[i + 2]]);

                            faceTris = new int[3] {
                                i + 0, i + 1, i + 2
                            };
                        }

                        faces.Add(
                            new pb_Face(
                                faceTris,
                                t.GetComponent <MeshRenderer>().sharedMaterials[n],
                                new pb_UV(),
                                0,                              // smoothing group
                                -1,                             // texture group
                                -1,                             // element group
                                true                            // manualUV
                                ));
                    }
                }
            }

            GameObject go = (GameObject)GameObject.Instantiate(t.gameObject);

            go.GetComponent <MeshFilter>().sharedMesh = null;

            pb_Object pb = go.AddComponent <pb_Object>();

            pb.GeometryWithVerticesFaces(verts.ToArray(), faces.ToArray());

            pb.SetColors(cols.ToArray());
            pb.SetUV(uvs.ToArray());

            pb.SetName(t.name);

            go.transform.position      = t.position;
            go.transform.localRotation = t.localRotation;
            go.transform.localScale    = t.localScale;

            pb.CenterPivot(null);

            return(pb);
        }