Beispiel #1
0
    /**
     *	\brief Duplicates and mirrors the passed pb_Object.
     *	@param pb The donor pb_Object.
     *	@param axe The axis to mirror the object on.
     *	\returns The newly duplicated pb_Object.
     *	\sa ProBuilder.Axis
     */
    public static pb_Object Mirror(pb_Object pb, Vector3 scale)
    {
        pb_Object p = ProBuilder.CreateObjectWithObject(pb);

        // p.SetName(p.GetName()+"-DUPLICATE-");

        p.transform.position      = pb.transform.position;
        p.transform.localRotation = pb.transform.localRotation;

        Vector3 lScale = p.gameObject.transform.localScale;

        p.transform.localScale = new Vector3(lScale.x * scale.x, lScale.y * scale.y, lScale.z * scale.z);

        // if flipping on an odd number of axes, flip winding order
        if ((scale.x * scale.y * scale.z) < 0)
        {
            p.ReverseWindingOrder();
        }

        p.FreezeScaleTransform();

        EditorUtility.SetDirty(p);

        return(p);
    }
Beispiel #2
0
    /**
     *	\brief Duplicates and mirrors the passed pb_Object.
     *	@param pb The donor pb_Object.
     *	@param axe The axis to mirror the object on.
     *	\returns The newly duplicated pb_Object.
     *	\sa ProBuilder.Axis
     */
    public static pb_Object Mirror(pb_Object pb, Vector3 scale)
    {
        pb_Object p = ProBuilder.CreateObjectWithObject(pb);

        p.MakeUnique();

        p.transform.parent = pb.transform.parent;

        p.transform.position      = pb.transform.position;
        p.transform.localRotation = pb.transform.localRotation;

        Vector3 lScale = p.gameObject.transform.localScale;

        p.transform.localScale = new Vector3(lScale.x * scale.x, lScale.y * scale.y, lScale.z * scale.z);

        // if flipping on an odd number of axes, flip winding order
        if ((scale.x * scale.y * scale.z) < 0)
        {
            p.ReverseWindingOrder(p.faces);
        }

        p.FreezeScaleTransform();

        p.Refresh();
        p.GenerateUV2(true);

        pb_Editor_Utility.InitObjectFlags(p, ColliderType.MeshCollider, pb.entity.entityType);
        return(p);
    }
Beispiel #3
0
        /**
         *	\brief Duplicates and mirrors the passed pb_Object.
         *	@param pb The donor pb_Object.
         *	@param axe The axis to mirror the object on.
         *	\returns The newly duplicated pb_Object.
         *	\sa ProBuilder.Axis
         */
        public static pb_Object Mirror(pb_Object pb, Vector3 scale)
        {
            pb_Object p = pb_Object.InitWithObject(pb);

            p.MakeUnique();

            p.transform.parent = pb.transform.parent;

            p.transform.localRotation = pb.transform.localRotation;

            Vector3 lScale = p.gameObject.transform.localScale;

            p.transform.localScale = new Vector3(lScale.x * scale.x, lScale.y * scale.y, lScale.z * scale.z);

            // if flipping on an odd number of axes, flip winding order
            if ((scale.x * scale.y * scale.z) < 0)
            {
                p.ReverseWindingOrder(p.faces);
            }

            p.FreezeScaleTransform();

            p.transform.localScale = pb.transform.localScale;

            Collider     col     = pb.GetComponent <Collider>();
            ColliderType colType = ColliderType.None;

            if (col != null)
            {
                if (col is MeshCollider)
                {
                    colType = ColliderType.MeshCollider;
                }
                else
                {
                    colType = ColliderType.BoxCollider;
                }
            }

            pb_Editor_Utility.InitObjectFlags(p, colType, pb.GetComponent <pb_Entity>().entityType);

            p.ToMesh();
            p.Refresh();

            // InitObjectFlags runs ScreenCenter()
            p.transform.position = pb.transform.position;

            Undo.RegisterCreatedObjectUndo(p.gameObject, "Mirror Object");

            return(p);
        }
        private void AlignWithPreviewObject(GameObject go)
        {
            if (go == null || previewObject == null)
            {
                return;
            }
            go.transform.position   = previewObject.transform.position;
            go.transform.rotation   = previewObject.transform.rotation;
            go.transform.localScale = previewObject.transform.localScale;

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

            pb.FreezeScaleTransform();
            pb.ToMesh();
            pb.Refresh();
        }
Beispiel #5
0
        public static pb_Object ProBuilderize(Transform t)
        {
            Mesh m = t.GetComponent <MeshFilter>().sharedMesh;

            pb_Face[] faces = new pb_Face[m.triangles.Length / 3];
            int       f     = 0;

            for (int n = 0; n < m.subMeshCount; n++)
            {
                for (int i = 0; i < m.triangles.Length; i += 3)
                {
                    faces[f] = new pb_Face(
                        new int[3] {
                        m.triangles[i + 0],
                        m.triangles[i + 1],
                        m.triangles[i + 2]
                    },
                        t.GetComponent <MeshRenderer>().sharedMaterials[n],
                        new pb_UV(),
                        0,
                        Color.white
                        );
                    f++;
                }
            }

            t.gameObject.SetActive(false);
            pb_Object pb = ProBuilder.CreateObjectWithVerticesFaces(m.vertices, faces);

            pb.SetName("FrankenMesh");
            pb_Editor_Utility.SetEntityType(ProBuilder.EntityType.Detail, pb.gameObject);

            GameObject go = pb.gameObject;

            go.transform.position      = t.position;
            go.transform.localRotation = t.localRotation;
            go.transform.localScale    = t.localScale;
            pb.FreezeScaleTransform();
            return(pb);
        }
        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);
        }
        public static pb_Object ProBuilderize(Transform t)
        {
            Mesh m = t.GetComponent <MeshFilter>().sharedMesh;

            // pb_Face[] faces = new pb_Face[m.triangles.Length/3];
            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;
                    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)
                    {
                        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
                    {
                        faces.Add(
                            new pb_Face(
                                new int[3] {
                            tris[i + 0],
                            tris[i + 1],
                            tris[i + 2]
                        },
                                t.GetComponent <MeshRenderer>().sharedMaterials[n],
                                new pb_UV(),
                                0,
                                -1,
                                Color.white
                                ));
                    }
                }
            }

#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

            pb_Object pb = ProBuilder.CreateObjectWithVerticesFaces(m.vertices, faces.ToArray());
            pb.SetName("FrankenMesh");
            pb.Refresh();
            pb_Editor_Utility.SetEntityType(ProBuilder.EntityType.Detail, pb.gameObject);

            GameObject go = pb.gameObject;

            go.transform.position      = t.position;
            go.transform.localRotation = t.localRotation;
            go.transform.localScale    = t.localScale;
            pb.FreezeScaleTransform();
            return(pb);
        }
Beispiel #8
0
    void OnSceneGUI()
    {
        // #if !PROTOTYPE
        //  // Event.current.type == EventType.DragUpdated ||
        //  if(Event.current.type == EventType.DragPerform)
        //  {
        //      if( HandleUtility.PickGameObject(Event.current.mousePosition, false) == pb.gameObject )
        //      {
        //          Material mat = null;
        //          foreach(Object t in DragAndDrop.objectReferences)
        //          {
        //              if(t is Material)
        //              {
        //                  mat = (Material)t;
        //                  break;
        //              }
        //              /* This works, but throws some bullshit errors. Not creating a material leaks, so disable this functionality. */
        //              // else
        //              // if(t is Texture2D)
        //              // {
        //              //  mat = new Material(Shader.Find("Diffuse"));
        //              //  mat.mainTexture = (Texture2D)t;

        //              //  // string texPath = AssetDatabase.GetAssetPath(mat.mainTexture);
        //              //  // int lastDot = texPath.LastIndexOf(".");
        //              //  // texPath = texPath.Substring(0, texPath.Length - (texPath.Length-lastDot));
        //              //  // texPath = AssetDatabase.GenerateUniqueAssetPath(texPath + ".mat");

        //              //  AssetDatabase.CreateAsset(mat, texPath);
        //              //  AssetDatabase.Refresh();

        //              //  break;
        //              // }
        //          }

        //          if(mat != null)
        //          {
        //              if(	pb_Editor.instanceIfExists != null &&
        //                  pb_Editor.instanceIfExists.editLevel == EditLevel.Geometry)
        //              {
        //                  // Bugger.Log("Setting SELECT face material - DragAndDrop");
        //                  pbUndo.RecordObjects(pb_Editor.instanceIfExists.selection, "Set Face Materials");
        //                  foreach(pb_Object pbs in pb_Editor.instanceIfExists.selection)
        //                  {
        //                      pbs.SetFaceMaterial(pbs.SelectedFaces.Length < 1 ? pbs.faces : pbs.SelectedFaces, mat);
        //                  }
        //              }
        //              else
        //              {
        //                  // Bugger.Log("Setting ALL face material - DragAndDrop");
        //                  pbUndo.RecordObjects(pbUtil.GetComponents<pb_Object>(Selection.transforms), "Set Face Materials");
        //                  foreach(pb_Object pbs in pbUtil.GetComponents<pb_Object>(Selection.transforms))
        //                  {
        //                      pbs.SetFaceMaterial(pbs.faces, mat);
        //                  }
        //              }

        //              pb.GenerateUV2(true);
        //              Event.current.Use();
        //          }
        //      }
        //  }
        // #endif

        if (EditorApplication.isPlayingOrWillChangePlaymode || pb == null)
        {
            return;
        }

        if (GUIUtility.hotControl < 1 && pb.transform.localScale != Vector3.one)
        {
            pb.FreezeScaleTransform();
        }
    }