#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); }
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); } } } } }
/// <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); } }
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); } }
/// <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); }
/// <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(); }
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(); }