// Called when the mouse exits hovering an editable object.
        internal override void OnBrushExit(EditableObject target)
        {
            base.OnBrushExit(target);

            if (!m_EditableObjectsData.ContainsKey(target))
            {
                return;
            }

            var data = m_EditableObjectsData[target];

            if (data.SplatCache != null)
            {
                data.SplatCache.Apply(target.editMesh);
                target.ApplyMeshAttributes();
                target.graphicsMesh.UploadMeshData(false);
            }

            if (m_MainCacheTarget != null && data.CacheTarget.Equals(m_MainCacheTarget))
            {
                m_MainCacheTarget = null;
            }

            m_EditableObjectsData.Remove(target);
        }
示例#2
0
        void OnGUI()
        {
            Event e = Event.current;

            GUILayout.Space(8);

            DoContextMenu();
            DrawToolbar();
            CheckForEscapeKey(e);

            // Call current mode GUI
            if (mode != null)
            {
                m_Scroll = EditorGUILayout.BeginScrollView(m_Scroll);

                DrawBrushSettings();
                m_BrushMirrorEditor.OnGUI();
                if (tool != BrushTool.None)
                {
                    DrawActiveToolmodeSettings();
                }

                EditorGUILayout.Space();

                if (EditorGUI.EndChangeCheck())
                {
                    mode.OnBrushSettingsChanged(brushTarget, brushSettings);
                }

                EditorGUILayout.EndScrollView();
            }

#if POLYBRUSH_DEBUG
            GUILayout.Label("DEBUG", EditorStyles.boldLabel);

            GUILayout.Label("target: " + (Util.IsValid(brushTarget) ? brushTarget.editableObject.gameObjectAttached.name : "null"));
            GUILayout.Label("vertex: " + (Util.IsValid(brushTarget) ? brushTarget.editableObject.vertexCount : 0));
            GUILayout.Label("applying: " + m_ApplyingBrush);
            GUILayout.Label("lockBrushToFirst: " + s_LockBrushToFirst);
            GUILayout.Label("lastHoveredGameObject: " + m_LastHoveredGameObject);

            GUILayout.Space(6);

            foreach (var kvp in m_Hovering)
            {
                BrushTarget    t            = kvp.Value;
                EditableObject dbg_editable = t.editableObject;
                GUILayout.Label("Vertex Streams: " + dbg_editable.usingVertexStreams);
                GUILayout.Label("Original: " + (dbg_editable.originalMesh == null ? "null" : dbg_editable.originalMesh.name));
                GUILayout.Label("Active: " + (dbg_editable.editMesh == null ? "null" : dbg_editable.editMesh.name));
                GUILayout.Label("Graphics: " + (dbg_editable.graphicsMesh == null ? "null" : dbg_editable.graphicsMesh.name));
            }
#endif

            if (m_WantsRepaint)
            {
                m_WantsRepaint = false;
                Repaint();
            }
        }
        // Called when the mouse begins hovering an editable object.
        internal override void OnBrushEnter(EditableObject target, BrushSettings settings)
        {
            base.OnBrushEnter(target, settings);

            if (target.editMesh == null)
            {
                return;
            }

            bool refresh = (m_MainCacheTarget != null && !m_MainCacheTarget.Equals(target)) || m_MainCacheTarget == null;

            if (m_MainCacheTarget != null && m_MainCacheTarget.Equals(target))
            {
                var targetMaterials = target.gameObjectAttached.GetMaterials();
                refresh = !targetMaterials.SequenceEqual(m_MainCacheMaterials);
            }

            if (refresh)
            {
                SetActiveObject(target);
                RebuildMaterialCaches();
                PolybrushEditor.instance.Repaint();
            }

            if (m_LikelySupportsTextureBlending && (brushColor == null || !brushColor.MatchesAttributes(meshAttributes)))
            {
                brushColor = new SplatWeight(SplatWeight.GetChannelMap(meshAttributes));
                SetBrushColorWithAttributeIndex(selectedAttributeIndex);
            }
            RebuildColorTargets(target, brushColor, settings.strength);
        }
        // Called when the mouse begins hovering an editable object.
        internal override void OnBrushEnter(EditableObject target, BrushSettings settings)
        {
            base.OnBrushEnter(target, settings);

            if (target.graphicsMesh == null)
            {
                return;
            }

            EditableObjectData data;

            if (!m_EditableObjectsData.TryGetValue(target, out data))
            {
                data = new EditableObjectData();
                m_EditableObjectsData.Add(target, data);
            }

            RebuildCaches(target, settings);

            data.TriangleLookup = PolyMeshUtility.GetAdjacentTriangles(target.editMesh);

            MeshRenderer mr = target.gameObjectAttached.GetComponent <MeshRenderer>();

            if (mr != null && mr.sharedMaterials != null)
            {
                data.LikelySupportsVertexColors = mr.sharedMaterials.Any(x =>
                                                                         x != null && x.shader != null && PolyShaderUtil.SupportsVertexColors(x.shader));
            }
            else
            {
                data.LikelySupportsVertexColors = false;
            }
        }
        // Called when the mouse begins hovering an editable object.
        internal override void OnBrushEnter(EditableObject target, BrushSettings settings)
        {
            base.OnBrushEnter(target, settings);

            if (target.editMesh == null)
            {
                return;
            }

            bool refresh = (m_CacheTarget != null && !m_CacheTarget.Equals(target)) || m_CacheTarget == null;

            if (m_CacheTarget != null && m_CacheTarget.Equals(target.gameObjectAttached))
            {
                var targetMaterials = target.gameObjectAttached.GetMaterials();
                refresh = !AreListsEqual(targetMaterials, m_CacheMaterials);
            }

            if (refresh)
            {
                m_CacheTarget             = target;
                m_CacheMaterials          = target.gameObjectAttached.GetMaterials();
                m_MeshAttributesContainer = null;
                currentMeshACIndex        = 0;
                ArrayUtility.Clear(ref m_AvailableMaterialsAsString);
                m_LikelySupportsTextureBlending = CheckForTextureBlendSupport(target.gameObjectAttached);
                RebuildCaches(target.editMesh);
            }

            if (m_LikelySupportsTextureBlending && (brushColor == null || !brushColor.MatchesAttributes(meshAttributes)))
            {
                brushColor = new SplatWeight(SplatWeight.GetChannelMap(meshAttributes));
                SetBrushColorWithAttributeIndex(selectedAttributeIndex);
            }
            RebuildColorTargets(brushColor, settings.strength);
        }
示例#6
0
        protected override void CreateTempComponent(EditableObject target)
        {
            if (target == null)
            {
                return;
            }

            RefreshVertexSculptSupport(target);
            if (!m_LikelyToSupportVertexSculpt)
            {
                return;
            }

            OverlayRenderer ren = target.gameObjectAttached.AddComponent <OverlayRenderer>();

            ren.SetMesh(target.editMesh);

            ren.fullColor           = s_FullStrengthColor;
            ren.gradient            = s_BrushGradientColor;
            ren.vertexBillboardSize = s_VertexBillboardSize;

            EditableObjectData data;

            if (!m_EditableObjectsData.TryGetValue(target, out data))
            {
                data = new EditableObjectData();
                m_EditableObjectsData.Add(target, data);
            }
            data.TempComponent = ren;
        }
示例#7
0
        internal override void OnBrushEnter(EditableObject target, BrushSettings settings)
        {
            base.OnBrushEnter(target, settings);
            nonManifoldIndices = PolyMeshUtility.GetNonManifoldIndices(target.editMesh);

            RefreshVertexSculptSupport(target);
        }
        void RebuildColorTargets(EditableObject target, SplatWeight blend, float strength)
        {
            if (target == null)
            {
                return;
            }

            var data = m_EditableObjectsData[target];

            if (blend == null || data.SplatCache == null || data.SplatTarget == null)
            {
                return;
            }

            m_MinWeights = data.SplatTarget.GetMinWeights();

            data.SplatTarget.LerpWeights(data.SplatCache, blend, strength);

            // get index of texture that is being painted
            var attrib = meshAttributes[selectedAttributeIndex];

            var baseTexture  = attrib.isBaseTexture? attrib : GetBaseTexture();
            var baseTexIndex = baseTexture != null ? (int)baseTexture.index : -1;

            data.SplatErase.LerpWeightOnSingleChannel(data.SplatCache, m_MinWeights, strength, attrib.channel, (int)attrib.index, baseTexIndex);
        }
        /// <summary>
        /// Called when the mouse exits hovering an editable object.
        /// </summary>
        /// <param name="target">Previously hovered object</param>
        internal virtual void OnBrushExit(EditableObject target)
        {
            if (target.renderer != null)
            {
                PolyEditorUtility.SetSelectionRenderState(target.renderer, PolyEditorUtility.GetSelectionRenderState());
            }

            DestroyTempComponent();
        }
        // Called when the mouse exits hovering an editable object.
        internal override void OnBrushExit(EditableObject target)
        {
            base.OnBrushExit(target);

            if (m_EditableObjectsData.ContainsKey(target))
            {
                m_EditableObjectsData.Remove(target);
            }
        }
示例#11
0
        // Called when the mouse exits hovering an editable object.
        internal override void OnBrushExit(EditableObject target)
        {
            base.OnBrushExit(target);

            if (m_EditableObjectsData.ContainsKey(target))
            {
                DestroyImmediate(m_EditableObjectsData[target].TempComponent);
                m_EditableObjectsData.Remove(target);
            }
        }
        /// <summary>
        /// Called when the mouse begins hovering an editable object.
        /// </summary>
        /// <param name="target">Object being hovered</param>
        /// <param name="settings">Current brush settings</param>
        internal virtual void OnBrushEnter(EditableObject target, BrushSettings settings)
        {
            if (s_HideWireframe.value && target.renderer != null)
            {
                // disable wirefame
                PolyEditorUtility.SetSelectionRenderState(target.renderer, PolyEditorUtility.GetSelectionRenderState() & SelectionRenderState.Outline);
            }

            CreateTempComponent(target);
        }
示例#13
0
        /// <summary>
        /// Create the temporary component
        /// </summary>
        /// <param name="target">The object to attach the temporary component on</param>
        protected virtual void CreateTempComponent(EditableObject target)
        {
            if (!Util.IsValid(target))
            {
                return;
            }

            tempComponent           = target.gameObjectAttached.AddComponent <ZoomOverride>();
            tempComponent.hideFlags = HideFlags.HideAndDontSave;
            tempComponent.SetWeights(null, 0f);
        }
示例#14
0
        // Called when the mouse exits hovering an editable object.
        internal override void OnBrushExit(EditableObject target)
        {
            base.OnBrushExit(target);

            if (target.editMesh != null)
            {
                target.editMesh.colors = m_MeshVertexColors.OriginalColors;
                target.ApplyMeshAttributes(MeshChannel.Color);
            }

            m_LikelySupportsVertexColors = true;
        }
示例#15
0
 /// <summary>
 /// Explicit constructor.
 /// </summary>
 /// <param name="editableObject"></param>
 /// <param name="hits"></param>
 internal BrushTarget(EditableObject editableObject, List <PolyRaycastHit> hits)
 {
     this.raycastHits     = hits;
     this._editableObject = editableObject;
     if (this.editableObject != null)
     {
         this._weights = new float[this._editableObject.editMesh.vertexCount];
     }
     else
     {
         this._weights = new float[0];
     }
 }
示例#16
0
        // Called when the mouse exits hovering an editable object.
        internal override void OnBrushExit(EditableObject target)
        {
            base.OnBrushExit(target);

            if (splat_cache != null)
            {
                splat_cache.Apply(target.editMesh);
                target.ApplyMeshAttributes();
                target.graphicsMesh.UploadMeshData(false);
            }

            //likelySupportsTextureBlending = true;
        }
示例#17
0
        // Called when the mouse begins hovering an editable object.
        internal override void OnBrushEnter(EditableObject target, BrushSettings settings)
        {
            base.OnBrushEnter(target, settings);

            EditableObjectData data;

            if (!m_EditableObjectsData.TryGetValue(target, out data))
            {
                data = new EditableObjectData();
                m_EditableObjectsData.Add(target, data);
            }
            data.LastBrushApplication = 0f;
        }
        internal override void OnBrushEnter(EditableObject target, BrushSettings settings)
        {
            base.OnBrushEnter(target, settings);

            if (!likelyToSupportVertexSculpt)
            {
                return;
            }

            vertices          = target.editMesh.vertices;
            neighborLookup    = PolyMeshUtility.GetAdjacentVertices(target.editMesh);
            commonVertices    = PolyMeshUtility.GetCommonVertices(target.editMesh);
            commonVertexCount = commonVertices.Count;
        }
        internal override void OnBrushEnter(EditableObject target, BrushSettings settings)
        {
            base.OnBrushEnter(target, settings);

            if (!likelyToSupportVertexSculpt)
            {
                return;
            }

            vertices          = target.editMesh.vertices;
            normalLookup      = PolyMeshUtility.GetSmoothNormalLookup(target.editMesh);
            commonVertices    = PolyMeshUtility.GetCommonVertices(target.editMesh);
            commonVertexCount = commonVertices.Length;
        }
        // Called when the mouse exits hovering an editable object.
        internal override void OnBrushExit(EditableObject target)
        {
            base.OnBrushExit(target);

            var data = m_EditableObjectsData[target];

            if (target.editMesh != null)
            {
                target.editMesh.colors = data.MeshVertexColors.OriginalColors;
                target.ApplyMeshAttributes(MeshChannel.Color);
            }

            data.LikelySupportsVertexColors = true;

            m_EditableObjectsData.Remove(target);
        }
        /// <summary>
        /// Get a EditableObject matching the GameObject go or create a new one.
        /// </summary>
        /// <param name="go">Gameobject to edit</param>
        /// <returns></returns>
        BrushTarget GetOrCreateBrushTarget(GameObject go)
        {
            BrushTarget target = null;

            if (!m_Hovering.TryGetValue(go, out target))
            {
                target = new BrushTarget(EditableObject.Create(go));
                m_Hovering.Add(go, target);
            }
            else if (!target.IsValid())
            {
                m_Hovering[go] = new BrushTarget(EditableObject.Create(go));
            }

            return(target);
        }
        void SetActiveObject(EditableObject activeObject)
        {
            m_MainCacheTarget = activeObject;

            EditableObjectData data;

            if (!m_EditableObjectsData.TryGetValue(activeObject, out data))
            {
                data = new EditableObjectData();
                m_EditableObjectsData.Add(activeObject, data);
            }

            data.CacheTarget    = activeObject;
            data.CacheMaterials = activeObject.gameObjectAttached.GetMaterials();
            RebuildCaches(data);
        }
示例#23
0
        internal override void OnBrushEnter(EditableObject target, BrushSettings settings)
        {
            base.OnBrushEnter(target, settings);

            EditableObjectData data;

            if (!m_EditableObjectsData.TryGetValue(target, out data))
            {
                data = new EditableObjectData();
                m_EditableObjectsData.Add(target, data);
            }

            data.NonManifoldIndices = PolyMeshUtility.GetNonManifoldIndices(target.editMesh);

            RefreshVertexSculptSupport(target);
        }
示例#24
0
        /// <summary>
        /// Will ensure that the check is not done everytime (inspired from BrushModeTexture script)
        /// </summary>
        /// <param name="target"></param>
        void RefreshVertexSculptSupport(EditableObject target)
        {
            bool refresh = (cache_target != null && !cache_target.Equals(target.gameObjectAttached)) || cache_target == null;

            if (cache_target != null && cache_target.Equals(target.gameObjectAttached))
            {
                refresh = cache_materials != target.gameObjectAttached.GetMaterials();
            }

            if (refresh)
            {
                cache_target                = target;
                cache_materials             = target.gameObjectAttached.GetMaterials();
                likelyToSupportVertexSculpt = CheckForVertexScluptSupport(target.gameObjectAttached);
            }
        }
示例#25
0
        protected override void CreateTempComponent(EditableObject target)
        {
            RefreshVertexSculptSupport(target);
            if (!likelyToSupportVertexSculpt)
            {
                return;
            }

            OverlayRenderer ren = target.gameObjectAttached.AddComponent <OverlayRenderer>();

            ren.SetMesh(target.editMesh);

            ren.fullColor           = s_FullStrengthColor;
            ren.gradient            = s_BrushGradientColor;
            ren.vertexBillboardSize = s_VertexBillboardSize;

            tempComponent = ren;
        }
示例#26
0
        void RebuildCaches(EditableObject target, BrushSettings settings)
        {
            PolyMesh m           = target.editMesh;
            int      vertexCount = m.vertexCount;

            Color32[] newBaseColors = null;

            if (m.colors != null && m.colors.Length == vertexCount)
            {
                newBaseColors = Util.Duplicate(m.colors);
            }
            else
            {
                newBaseColors = Util.Fill <Color32>(x => { return(Color.white); }, vertexCount);
            }

            m_MeshVertexColors.Build(newBaseColors);
            m_MeshVertexColors.RebuildColorTargets(m_BrushColor, settings.strength, mask);
        }
示例#27
0
        /// <summary>
        /// Will ensure that the check is not done everytime (inspired from BrushModeTexture script)
        /// </summary>
        /// <param name="target"></param>
        void RefreshVertexSculptSupport(EditableObject target)
        {
            EditableObjectData data;

            if (m_EditableObjectsData.TryGetValue(target, out data))
            {
                bool refresh = (data.CacheTarget != null && !data.CacheTarget.Equals(target.gameObjectAttached)) || data.CacheTarget == null;
                if (data.CacheTarget != null && data.CacheTarget.Equals(target.gameObjectAttached))
                {
                    refresh = data.CacheMaterials != target.gameObjectAttached.GetMaterials();
                }

                if (refresh)
                {
                    data.CacheTarget              = target;
                    data.CacheMaterials           = target.gameObjectAttached.GetMaterials();
                    m_LikelyToSupportVertexSculpt = CheckForVertexScluptSupport(target.gameObjectAttached);
                }
            }
        }
        internal override void OnBrushEnter(EditableObject target, BrushSettings settings)
        {
            base.OnBrushEnter(target, settings);

            if (!m_LikelyToSupportVertexSculpt)
            {
                return;
            }

            EditableObjectData data;

            if (!m_EditableObjectsData.TryGetValue(target, out data))
            {
                data = new EditableObjectData();
                m_EditableObjectsData.Add(target, data);
            }
            data.Vertices          = target.editMesh.vertices;
            data.NormalLookup      = PolyMeshUtility.GetSmoothNormalLookup(target.editMesh);
            data.CommonVertices    = PolyMeshUtility.GetCommonVertices(target.editMesh);
            data.CommonVertexCount = data.CommonVertices.Length;
        }
        static HierarchyChanged()
        {
            EditorApplication.hierarchyChanged += () =>
            {
                foreach (var gameObject in Selection.gameObjects)
                {
                    var mesh = Util.GetMesh(gameObject);
                    var id   = EditableObject.GetMeshId(mesh);

                    // if the mesh is an instance managed by polybrush check that it's not a duplicate.
                    if (id != -1)
                    {
                        if (id != gameObject.GetInstanceID() && EditorUtility.InstanceIDToObject(id) != null)
                        {
                            mesh      = PolyMeshUtility.DeepCopy(mesh);
                            mesh.name = EditableObject.k_MeshInstancePrefix + gameObject.GetInstanceID();

                            var mf       = gameObject.GetComponent <MeshFilter>();
                            var sf       = gameObject.GetComponent <SkinnedMeshRenderer>();
                            var polyMesh = gameObject.GetComponent <PolybrushMesh>();

                            if (polyMesh != null)
                            {
                                polyMesh.SetMesh(mesh);
                                PrefabUtility.RecordPrefabInstancePropertyModifications(polyMesh);
                            }
                            else if (mf != null)
                            {
                                mf.sharedMesh = mesh;
                            }
                            else if (sf != null)
                            {
                                sf.sharedMesh = mesh;
                            }
                        }
                    }
                }
            };
        }
示例#30
0
 // Called when the mouse exits hovering an editable object.
 internal override void OnBrushExit(EditableObject target)
 {
     base.OnBrushExit(target);
 }