Beispiel #1
0
#pragma warning disable 612
        /// <summary>
        /// Utility to help convert objects modified with the Beta version of Polybrush (Asset Store)
        /// to Polybrus 1.x.
        /// </summary>
        /// <param name="component"></param>
        internal static PolybrushMesh ConvertGameObjectToNewFormat(z_AdditionalVertexStreams component)
        {
            GameObject    go           = component.gameObject;
            PolybrushMesh newComponent = go.GetComponent <PolybrushMesh>();
            MeshFilter    mf           = go.GetComponent <MeshFilter>();
            Mesh          mesh         = component.m_AdditionalVertexStreamMesh;

            Undo.DestroyObjectImmediate(component);

            // Cancel conversion if no mesh if found on Z_AdditionalVertexStreams
            if (mesh == null)
            {
                return(null);
            }

            if (newComponent == null)
            {
                newComponent = Undo.AddComponent <PolybrushMesh>(go);
                newComponent.Initialize();
            }

            newComponent.mode = PolybrushMesh.Mode.AdditionalVertexStream;
            newComponent.SetMesh(PolyMeshUtility.DeepCopy(mf.sharedMesh));
            newComponent.SetAdditionalVertexStreams(mesh);

            return(newComponent);
        }
Beispiel #2
0
        void DrawExtraActions()
        {
            PolybrushMesh polybrushmesh = target as PolybrushMesh;
            MeshRenderer  mr            = polybrushmesh.gameObject.GetComponent <MeshRenderer>();

            using (new EditorGUILayout.HorizontalScope())
            {
                // Export button
                if (GUILayout.Button(Styles.k_ExportButtonLabel))
                {
                    PolyEditorUtility.SaveMeshAsset(polybrushmesh.polyMesh.ToUnityMesh());
                }

                // Reset button
                if (GUILayout.Button(Styles.k_DeleteButtonLabel))
                {
                    if (EditorUtility.DisplayDialog(Styles.k_DisplayDialogTitle,
                                                    Styles.k_DisplayDialogMessage, Styles.k_DisplayDialogOkLabel, Styles.k_DisplayDialogCancelLabel))
                    {
                        foreach (PolybrushMesh polybrushMesh in targets)
                        {
                            if (polybrushMesh == null)
                            {
                                continue;
                            }

                            polybrushmesh.SetMesh(polybrushmesh.sourceMesh);
                            Undo.DestroyObjectImmediate(polybrushmesh);
                        }
                    }
                }
            }
        }
Beispiel #3
0
        /// <summary>
        /// Create a Composite Mesh from AdditionnalVertexStreams
        /// </summary>
        /// <param name="vertexStream">the object used to create the composite mesh</param>
        /// <param name="applyToCurrent">Create a new Mesh or apply it directly to the current one?</param>
        /// <param name="path">where to save the new mesh</param>
        void CreateComposite(PolybrushMesh polyMesh, bool applyToCurrent, string path = null)
        {
            GameObject go = polyMesh.gameObject;

            Mesh source = go.GetMesh();
            Mesh mesh   = polyMesh.storedMesh;

            if (source == null || mesh == null)
            {
                Debug.LogWarning("Mesh filter or vertex stream mesh is null, cannot continue.");
                return;
            }

            if (applyToCurrent)
            {
                CreateCompositeMesh(source, mesh, polyMesh.sourceMesh);

                MeshRenderer renderer = go.GetComponent <MeshRenderer>();

                if (renderer != null)
                {
                    renderer.additionalVertexStreams = null;
                }

                Undo.DestroyObjectImmediate(polyMesh);
            }
            else
            {
                Mesh composite = new Mesh();
                CreateCompositeMesh(source, mesh, composite);

                if (string.IsNullOrEmpty(path))
                {
                    PolyEditorUtility.SaveMeshAsset(composite, go.GetComponent <MeshFilter>(), go.GetComponent <SkinnedMeshRenderer>());
                }
                else
                {
                    AssetDatabase.CreateAsset(composite, path);

                    MeshFilter mf = go.GetComponent <MeshFilter>();

                    SkinnedMeshRenderer smr = go.GetComponent <SkinnedMeshRenderer>();

                    if (mf != null)
                    {
                        mf.sharedMesh = composite;
                    }
                    else if (smr != null)
                    {
                        smr.sharedMesh = composite;
                    }
                }


                Undo.DestroyObjectImmediate(polyMesh);
            }
        }
Beispiel #4
0
        void DrawAdditionalVertexStreamsGUI()
        {
            PolybrushMesh polybrushmesh = target as PolybrushMesh;
            MeshRenderer  mr            = polybrushmesh.gameObject.GetComponent <MeshRenderer>();

            // Don't draw AVS section when working on SkinnedMeshes as
            // they don't support it.
            if (polybrushmesh.type == PolybrushMesh.ObjectType.SkinnedMesh)
            {
                return;
            }

            if (targets.Length > 1)
            {
                EditorGUI.showMixedValue = true;
            }

            GUI.enabled = false;
            if (mr != null)
            {
                EditorGUILayout.ObjectField(Styles.k_AVSLabel, mr.additionalVertexStreams, typeof(Mesh), true);
            }
            GUI.enabled = true;

            EditorGUI.showMixedValue = false;

            int count = 0;

            foreach (PolybrushMesh polybrushMesh in targets)
            {
                if (!polybrushMesh.CanApplyAdditionalVertexStreams())
                {
                    // Do the following to make sure to catch cases where
                    // an user would change the referenced mesh in MeshFilter.
                    if (polybrushMesh.hasAppliedAdditionalVertexStreams)
                    {
                        polybrushMesh.RemoveAdditionalVertexStreams();
                    }

                    ++count;
                }
            }

            if (count > 1)
            {
                EditorGUILayout.HelpBox(string.Format(Styles.k_WarningCannotApplyAVSMultipleObjectsStringFormat, count.ToString()), MessageType.Warning, true);
            }
            else if (count == 1)
            {
                EditorGUILayout.HelpBox(Styles.k_WarningCannotApplyAVS, MessageType.Warning, true);
            }
        }
Beispiel #5
0
        /// <summary>
        /// Generate a static preview for a PolybrushMesh.
        /// A mesh is generated from a PolybrushMesh then feed to a default Mesh editor.
        /// </summary>
        /// <returns>Static preview of the given PolybrushMesh.</returns>
        internal Texture2D GeneratePreview()
        {
            PolybrushMesh castTarget = (m_Asset as GameObject).GetComponent <PolybrushMesh>();
            Mesh          mesh       = castTarget.storedMesh;

            Editor meshEditor = Editor.CreateEditor(mesh);

            Texture2D preview = meshEditor.RenderStaticPreview(null, null, k_PreviewSize.x, k_PreviewSize.y);

            ScriptableObject.DestroyImmediate(meshEditor);

            return(preview);
        }
Beispiel #6
0
        /// <summary>
        /// Overriding function to make a custom IMGUI inspector.
        /// </summary>
        public override void OnInspectorGUI()
        {
            PolybrushMesh polybrushmesh = target as PolybrushMesh;

            EditorGUILayout.Space();
            DrawModeGUI();

            if (polybrushmesh.mode == PolybrushMesh.Mode.AdditionalVertexStream)
            {
                DrawAdditionalVertexStreamsGUI();
            }

            EditorGUILayout.Space();
            DrawExtraActions();
        }
Beispiel #7
0
        void DrawModeGUI()
        {
            EditorGUI.BeginChangeCheck();

            PolybrushMesh polybrushmesh = target as PolybrushMesh;

            if (polybrushmesh.type == PolybrushMesh.ObjectType.SkinnedMesh)
            {
                GUI.enabled = false;
            }

            PolybrushMesh.Mode newMode = (PolybrushMesh.Mode)EditorGUILayout.Popup(Styles.k_ApplyAsLabel, (int)polybrushmesh.mode, Styles.k_ApplyAsOptions);
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(polybrushmesh, string.Format(Styles.k_FormatUndoSwitchMode, newMode.ToString()));
                polybrushmesh.mode = newMode;
            }

            if (polybrushmesh.type == PolybrushMesh.ObjectType.SkinnedMesh)
            {
                GUI.enabled = true;
            }
        }
        private void Initialize(GameObject go)
        {
            CheckBackwardCompatiblity(go);

            gameObjectAttached = go;
            isProBuilderObject = false;

#if PROBUILDER_4_0_OR_NEWER
            if (ProBuilderBridge.ProBuilderExists())
            {
                isProBuilderObject = ProBuilderBridge.IsValidProBuilderMesh(gameObjectAttached);
            }
#endif
            Mesh         mesh         = null;
            MeshRenderer meshRenderer = gameObjectAttached.GetComponent <MeshRenderer>();
            meshFilter        = gameObjectAttached.GetComponent <MeshFilter>();
            _skinMeshRenderer = gameObjectAttached.GetComponent <SkinnedMeshRenderer>();

            originalMesh = go.GetMesh();

            if (originalMesh == null && _skinMeshRenderer != null)
            {
                originalMesh = _skinMeshRenderer.sharedMesh;
            }

            m_PolybrushMesh = gameObjectAttached.GetComponent <PolybrushMesh>();

            if (m_PolybrushMesh == null)
            {
                m_PolybrushMesh = Undo.AddComponent <PolybrushMesh>(gameObjectAttached);
                m_PolybrushMesh.Initialize();
                m_PolybrushMesh.mode = (s_UseAdditionalVertexStreams) ? PolybrushMesh.Mode.AdditionalVertexStream : PolybrushMesh.Mode.Mesh;
            }

            //attach the skinmesh ref to the polybrushmesh
            //it will be used when making a prefab containing a skin mesh. The limitation here is that the skin mesh must comes from an asset (which is 99.9999% of the time)
            if (_skinMeshRenderer != null)
            {
                Mesh sharedMesh = _skinMeshRenderer.sharedMesh;
                if (AssetDatabase.Contains(sharedMesh))
                {
                    m_PolybrushMesh.skinMeshRef = sharedMesh;
                }
            }

#if PROBUILDER_4_0_OR_NEWER
            // if it's a probuilder object rebuild the mesh without optimization
            if (isProBuilderObject)
            {
                if (ProBuilderBridge.IsValidProBuilderMesh(gameObjectAttached))
                {
                    ProBuilderBridge.ToMesh(gameObjectAttached);
                    ProBuilderBridge.Refresh(gameObjectAttached);
                }
            }
#endif

            if (meshRenderer != null || _skinMeshRenderer != null)
            {
                mesh = m_PolybrushMesh.storedMesh;

                if (mesh == null)
                {
                    mesh             = PolyMeshUtility.DeepCopy(originalMesh);
                    hadVertexStreams = false;
                }
                else
                {
                    //prevents leak
                    if (!MeshInstanceMatchesGameObject(mesh, gameObjectAttached))
                    {
                        mesh = PolyMeshUtility.DeepCopy(mesh);
                    }
                }

                mesh.name = k_MeshInstancePrefix + gameObjectAttached.GetInstanceID();
            }

            polybrushMesh.SetMesh(mesh);
            PrefabUtility.RecordPrefabInstancePropertyModifications(polybrushMesh);
            _graphicsMesh = m_PolybrushMesh.storedMesh;

            source = polybrushMesh.mode == PolybrushMesh.Mode.AdditionalVertexStream? ModelSource.AdditionalVertexStreams : PolyEditorUtility.GetMeshGUID(originalMesh);

            GenerateCompositeMesh();
        }