diff --git a/.gitignore b/.gitignore index 623b911..c95978b 100644 --- a/.gitignore +++ b/.gitignore @@ -46,15 +46,5 @@ Logs/ ProjectSettings/ProjectVersion\.txt - *.exp - *.lib - -Packages/com\.chisel\.core/Chisel/Core/API\.private/Native/Plugin/x64/Chisel\[TEST\]\.exp\.meta -LICENSE.md.meta -Icons.zip.meta -README.md.meta -Readme.meta -Readme/Images.meta -Readme/Images/house_view.png.meta diff --git a/Icons.zip.meta b/Icons.zip.meta new file mode 100644 index 0000000..167384e --- /dev/null +++ b/Icons.zip.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c8ce9ebc0120f1446abcb89e467f34c4 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/LICENSE.md.meta b/LICENSE.md.meta new file mode 100644 index 0000000..d1df217 --- /dev/null +++ b/LICENSE.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 22ae4c156efc0124e955b4d73bb8744c +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Editor/Resources/RealtimeCSG.meta b/Plugins/Editor/Resources/RealtimeCSG.meta new file mode 100644 index 0000000..c5daea1 --- /dev/null +++ b/Plugins/Editor/Resources/RealtimeCSG.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 27c200eed1214dc7b2213b7cba612d9d +timeCreated: 1654832139 \ No newline at end of file diff --git a/Plugins/Editor/Resources/Textures.meta b/Plugins/Editor/Resources/RealtimeCSG/Textures.meta similarity index 100% rename from Plugins/Editor/Resources/Textures.meta rename to Plugins/Editor/Resources/RealtimeCSG/Textures.meta diff --git a/Plugins/Editor/Resources/Textures/castShadows.png b/Plugins/Editor/Resources/RealtimeCSG/Textures/castShadows.png similarity index 100% rename from Plugins/Editor/Resources/Textures/castShadows.png rename to Plugins/Editor/Resources/RealtimeCSG/Textures/castShadows.png diff --git a/Plugins/Editor/Resources/Textures/castShadows.png.meta b/Plugins/Editor/Resources/RealtimeCSG/Textures/castShadows.png.meta similarity index 100% rename from Plugins/Editor/Resources/Textures/castShadows.png.meta rename to Plugins/Editor/Resources/RealtimeCSG/Textures/castShadows.png.meta diff --git a/Plugins/Editor/Resources/Textures/collider.png b/Plugins/Editor/Resources/RealtimeCSG/Textures/collider.png similarity index 100% rename from Plugins/Editor/Resources/Textures/collider.png rename to Plugins/Editor/Resources/RealtimeCSG/Textures/collider.png diff --git a/Plugins/Editor/Resources/Textures/collider.png.meta b/Plugins/Editor/Resources/RealtimeCSG/Textures/collider.png.meta similarity index 100% rename from Plugins/Editor/Resources/Textures/collider.png.meta rename to Plugins/Editor/Resources/RealtimeCSG/Textures/collider.png.meta diff --git a/Plugins/Editor/Resources/Textures/culled.png b/Plugins/Editor/Resources/RealtimeCSG/Textures/culled.png similarity index 100% rename from Plugins/Editor/Resources/Textures/culled.png rename to Plugins/Editor/Resources/RealtimeCSG/Textures/culled.png diff --git a/Plugins/Editor/Resources/Textures/culled.png.meta b/Plugins/Editor/Resources/RealtimeCSG/Textures/culled.png.meta similarity index 100% rename from Plugins/Editor/Resources/Textures/culled.png.meta rename to Plugins/Editor/Resources/RealtimeCSG/Textures/culled.png.meta diff --git a/Plugins/Editor/Resources/Textures/discarded.png b/Plugins/Editor/Resources/RealtimeCSG/Textures/discarded.png similarity index 100% rename from Plugins/Editor/Resources/Textures/discarded.png rename to Plugins/Editor/Resources/RealtimeCSG/Textures/discarded.png diff --git a/Plugins/Editor/Resources/Textures/discarded.png.meta b/Plugins/Editor/Resources/RealtimeCSG/Textures/discarded.png.meta similarity index 100% rename from Plugins/Editor/Resources/Textures/discarded.png.meta rename to Plugins/Editor/Resources/RealtimeCSG/Textures/discarded.png.meta diff --git a/Plugins/Editor/Resources/Textures/hidden.png b/Plugins/Editor/Resources/RealtimeCSG/Textures/hidden.png similarity index 100% rename from Plugins/Editor/Resources/Textures/hidden.png rename to Plugins/Editor/Resources/RealtimeCSG/Textures/hidden.png diff --git a/Plugins/Editor/Resources/Textures/hidden.png.meta b/Plugins/Editor/Resources/RealtimeCSG/Textures/hidden.png.meta similarity index 100% rename from Plugins/Editor/Resources/Textures/hidden.png.meta rename to Plugins/Editor/Resources/RealtimeCSG/Textures/hidden.png.meta diff --git a/Plugins/Editor/Resources/Textures/invisible.png b/Plugins/Editor/Resources/RealtimeCSG/Textures/invisible.png similarity index 100% rename from Plugins/Editor/Resources/Textures/invisible.png rename to Plugins/Editor/Resources/RealtimeCSG/Textures/invisible.png diff --git a/Plugins/Editor/Resources/Textures/invisible.png.meta b/Plugins/Editor/Resources/RealtimeCSG/Textures/invisible.png.meta similarity index 100% rename from Plugins/Editor/Resources/Textures/invisible.png.meta rename to Plugins/Editor/Resources/RealtimeCSG/Textures/invisible.png.meta diff --git a/Plugins/Editor/Resources/Textures/receiveShadows.png b/Plugins/Editor/Resources/RealtimeCSG/Textures/receiveShadows.png similarity index 100% rename from Plugins/Editor/Resources/Textures/receiveShadows.png rename to Plugins/Editor/Resources/RealtimeCSG/Textures/receiveShadows.png diff --git a/Plugins/Editor/Resources/Textures/receiveShadows.png.meta b/Plugins/Editor/Resources/RealtimeCSG/Textures/receiveShadows.png.meta similarity index 100% rename from Plugins/Editor/Resources/Textures/receiveShadows.png.meta rename to Plugins/Editor/Resources/RealtimeCSG/Textures/receiveShadows.png.meta diff --git a/Plugins/Editor/Resources/Textures/shadowOnly.png b/Plugins/Editor/Resources/RealtimeCSG/Textures/shadowOnly.png similarity index 100% rename from Plugins/Editor/Resources/Textures/shadowOnly.png rename to Plugins/Editor/Resources/RealtimeCSG/Textures/shadowOnly.png diff --git a/Plugins/Editor/Resources/Textures/shadowOnly.png.meta b/Plugins/Editor/Resources/RealtimeCSG/Textures/shadowOnly.png.meta similarity index 100% rename from Plugins/Editor/Resources/Textures/shadowOnly.png.meta rename to Plugins/Editor/Resources/RealtimeCSG/Textures/shadowOnly.png.meta diff --git a/Plugins/Editor/Resources/Textures/trigger.png b/Plugins/Editor/Resources/RealtimeCSG/Textures/trigger.png similarity index 100% rename from Plugins/Editor/Resources/Textures/trigger.png rename to Plugins/Editor/Resources/RealtimeCSG/Textures/trigger.png diff --git a/Plugins/Editor/Resources/Textures/trigger.png.meta b/Plugins/Editor/Resources/RealtimeCSG/Textures/trigger.png.meta similarity index 100% rename from Plugins/Editor/Resources/Textures/trigger.png.meta rename to Plugins/Editor/Resources/RealtimeCSG/Textures/trigger.png.meta diff --git a/Plugins/Editor/Scripts/Control/BrushTraits.cs b/Plugins/Editor/Scripts/Control/BrushTraits.cs index 6cc4f1f..bb49ada 100644 --- a/Plugins/Editor/Scripts/Control/BrushTraits.cs +++ b/Plugins/Editor/Scripts/Control/BrushTraits.cs @@ -39,7 +39,10 @@ public static bool IsSurfaceUnselectable(CSGBrush brush, int surfaceIndex, bool return true; } - if (ignoreSurfaceFlags) + if( (texGenFlags[texGenIndex] & TexGenFlags.NoRender) == TexGenFlags.NoRender ) + return false; + + if (ignoreSurfaceFlags) { var isNotRenderable = (texGenFlags[texGenIndex] & TexGenFlags.NoRender) == TexGenFlags.NoRender; if (!isNotRenderable) diff --git a/Plugins/Editor/Scripts/Control/BrushUtility.cs b/Plugins/Editor/Scripts/Control/BrushUtility.cs index 1f4f76f..6ca5e9e 100644 --- a/Plugins/Editor/Scripts/Control/BrushUtility.cs +++ b/Plugins/Editor/Scripts/Control/BrushUtility.cs @@ -50,7 +50,7 @@ public static void SetPivot(CSGBrush brush, Vector3 newCenter) var realCenter = transform.position; var difference = newCenter - realCenter; - if (difference.sqrMagnitude < MathConstants.ConsideredZero) + if (difference.magnitude < MathConstants.ConsideredZero) return; transform.position += difference; @@ -64,7 +64,7 @@ public static void TranslatePivot(CSGBrush[] brushes, Vector3 offset) { if (brushes == null || brushes.Length == 0 || - offset.sqrMagnitude < MathConstants.ConsideredZero) + offset.magnitude < MathConstants.ConsideredZero) return; for (int i = 0; i < brushes.Length; i++) diff --git a/Plugins/Editor/Scripts/Control/Helpers/ControlMeshUtility.cs b/Plugins/Editor/Scripts/Control/Helpers/ControlMeshUtility.cs index 6231de4..697e4ec 100644 --- a/Plugins/Editor/Scripts/Control/Helpers/ControlMeshUtility.cs +++ b/Plugins/Editor/Scripts/Control/Helpers/ControlMeshUtility.cs @@ -290,7 +290,7 @@ public static void MergeVerticesOnEdges(ControlMesh controlMesh, short[] pointIn var vertex2 = controlMesh.Vertices[vertexIndex2]; var pointOnLine = ProjectPointLine(point, vertex1, vertex2); var delta = pointOnLine - point; - var distance = delta.sqrMagnitude; + var distance = delta.magnitude; if (distance < closestDistance) { closestEdge = e; @@ -3867,7 +3867,7 @@ public static short[] FindDuplicateVerticesToRemove(CSGBrush brush, ControlMeshS for (var index2 = index1 + 1; index2 < vertices.Length; index2++) { var vertex2 = vertices[index2]; - if (!((vertex1 - vertex2).sqrMagnitude < MathConstants.EqualityEpsilon)) + if (!((vertex1 - vertex2).magnitude < MathConstants.EqualityEpsilon)) continue; //if ((pointSelectState[index1] & SelectState.Selected) != SelectState.Selected && @@ -3917,7 +3917,7 @@ public static short[] FindDuplicateVerticesToRemove(CSGBrush brush) for (var index2 = index1 + 1; index2 < vertices.Length; index2++) { var vertex2 = vertices[index2]; - if (!((vertex1 - vertex2).sqrMagnitude < MathConstants.EqualityEpsilon)) + if (!((vertex1 - vertex2).magnitude < MathConstants.EqualityEpsilon)) continue; var found = false; diff --git a/Plugins/Editor/Scripts/Control/Helpers/ShapePolygonUtility.cs b/Plugins/Editor/Scripts/Control/Helpers/ShapePolygonUtility.cs index 7fe8dfa..62ce72d 100644 --- a/Plugins/Editor/Scripts/Control/Helpers/ShapePolygonUtility.cs +++ b/Plugins/Editor/Scripts/Control/Helpers/ShapePolygonUtility.cs @@ -81,12 +81,12 @@ public static void RemoveDuplicatePoints(ref Vector3[] vertices) // remove any points that are too close to one another for (int j = vertices.Length - 1, i = vertices.Length - 2; i >= 0; j = i, i--) { - if ((vertices[j] - vertices[i]).sqrMagnitude < MathConstants.DistanceEpsilon) + if ((vertices[j] - vertices[i]).magnitude < MathConstants.DistanceEpsilon) { ArrayUtility.RemoveAt(ref vertices, j); } } - while (vertices.Length > 3 && (vertices[0] - vertices[vertices.Length - 1]).sqrMagnitude < MathConstants.DistanceEpsilon) + while (vertices.Length > 3 && (vertices[0] - vertices[vertices.Length - 1]).magnitude < MathConstants.DistanceEpsilon) { var lastIndex = vertices.Length - 1; ArrayUtility.RemoveAt(ref vertices, lastIndex); @@ -101,13 +101,13 @@ public static void RemoveDuplicatePoints(ShapePolygon shapePolygon) // remove any points that are too close to one another for (int j = vertices.Length - 1, i = vertices.Length - 2; i >= 0; j = i, i--) { - if ((vertices[j] - vertices[i]).sqrMagnitude < MathConstants.DistanceEpsilon) + if ((vertices[j] - vertices[i]).magnitude < MathConstants.DistanceEpsilon) { ArrayUtility.RemoveAt(ref vertices, j); ArrayUtility.RemoveAt(ref edgeTexgens, j); } } - while (vertices.Length > 3 && (vertices[0] - vertices[vertices.Length - 1]).sqrMagnitude < MathConstants.DistanceEpsilon) + while (vertices.Length > 3 && (vertices[0] - vertices[vertices.Length - 1]).magnitude < MathConstants.DistanceEpsilon) { var lastIndex = vertices.Length - 1; ArrayUtility.RemoveAt(ref vertices, lastIndex); @@ -159,7 +159,7 @@ private static List CreateCleanSubPolygonsFromVertices(Vector2[] v { for (int j = i + 2; j < vertices2d.Length; j++) { - if ((vertices2d[j] - vertices2d[i]).sqrMagnitude < MathConstants.DistanceEpsilon) + if ((vertices2d[j] - vertices2d[i]).magnitude < MathConstants.DistanceEpsilon) { List combined_polygons = null; diff --git a/Plugins/Editor/Scripts/Control/Managers/CSGModelManager.cs b/Plugins/Editor/Scripts/Control/Managers/CSGModelManager.cs index fbfd478..14bb1d3 100644 --- a/Plugins/Editor/Scripts/Control/Managers/CSGModelManager.cs +++ b/Plugins/Editor/Scripts/Control/Managers/CSGModelManager.cs @@ -7,6 +7,13 @@ namespace RealtimeCSG { public static class CSGModelManager { + public static bool AllowInEditorPlayMode = false; + + public static bool IsInPlayMode + { + get => !AllowInEditorPlayMode && (UnityEditor.EditorApplication.isPlaying || UnityEditor.EditorApplication.isPlayingOrWillChangePlaymode); + } + public static void ForceRebuild() { #if UNITY_EDITOR diff --git a/Plugins/Editor/Scripts/Control/Managers/InternalCSGModelManager.Lifetime.cs b/Plugins/Editor/Scripts/Control/Managers/InternalCSGModelManager.Lifetime.cs index f759c25..92dfc70 100644 --- a/Plugins/Editor/Scripts/Control/Managers/InternalCSGModelManager.Lifetime.cs +++ b/Plugins/Editor/Scripts/Control/Managers/InternalCSGModelManager.Lifetime.cs @@ -12,7 +12,7 @@ internal partial class InternalCSGModelManager internal static NativeMethods External; #region Clear - #if UNITY_2019_4_OR_NEWER +#if UNITY_2019_4_OR_NEWER [RuntimeInitializeOnLoadMethod( RuntimeInitializeLoadType.SubsystemRegistration )] #endif public static void Clear() @@ -96,7 +96,7 @@ public static void UndoRedoPerformed() public static bool skipCheckForChanges = false; public static void CheckForChanges(bool forceHierarchyUpdate = false) { - if (EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) return; if (!forceHierarchyUpdate && skipCheckForChanges) @@ -153,5 +153,68 @@ public static void ForceRebuildAll() } #endregion + +#if UNITY_EDITOR + + [UnityEditor.InitializeOnEnterPlayMode] + public static void OnEnterPlayMode() + { + // If saving meshes to scene files, we don't need to dynamically rebuild on scene changes + if (CSGProjectSettings.Instance.SaveMeshesInSceneFiles) + return; + + static bool ensureExternalMethodsPopulated() + { + if (External == null || + External.ResetCSG == null) + { + NativeMethodBindings.RegisterUnityMethods(); + NativeMethodBindings.RegisterExternalMethods(); + } + + if (External == null) + { + Debug.LogError("RealtimeCSG: Cannot rebuild meshes for some reason. External modules not loaded. Please save meshes into the Scene."); + return false; + } + + return true; + } + + static void rebuildMeshes() + { + if (!ensureExternalMethodsPopulated()) + return; + + RealtimeCSG.CSGModelManager.AllowInEditorPlayMode = true; + InternalCSGModelManager.Shutdown(); + DoForcedMeshUpdate(); + InternalCSGModelManager.CheckForChanges(false); + RealtimeCSG.CSGModelManager.AllowInEditorPlayMode = false; + } + + static void sceneLoaded(UnityEngine.SceneManagement.Scene scene, UnityEngine.SceneManagement.LoadSceneMode mode) + { + rebuildMeshes(); + } + + static void onPlayModeChange(PlayModeStateChange playMode) + { + if (playMode == PlayModeStateChange.EnteredEditMode) + { + UnityEngine.SceneManagement.SceneManager.sceneLoaded -= sceneLoaded; + EditorApplication.playModeStateChanged -= onPlayModeChange; + + rebuildMeshes(); + } + } + + if (!ensureExternalMethodsPopulated()) + return; + + EditorApplication.playModeStateChanged += onPlayModeChange; + UnityEngine.SceneManagement.SceneManager.sceneLoaded += sceneLoaded; + } +#endif } } \ No newline at end of file diff --git a/Plugins/Editor/Scripts/Control/Managers/InternalCSGModelManager.Registration.cs b/Plugins/Editor/Scripts/Control/Managers/InternalCSGModelManager.Registration.cs index 0ece289..c5f70e9 100644 --- a/Plugins/Editor/Scripts/Control/Managers/InternalCSGModelManager.Registration.cs +++ b/Plugins/Editor/Scripts/Control/Managers/InternalCSGModelManager.Registration.cs @@ -79,7 +79,7 @@ static bool RegisterAllComponents() Clear(); - if (EditorApplication.isPlaying || EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) { return false; } @@ -105,7 +105,7 @@ static bool RegisterAllComponents() #region Reset public static void Reset(CSGNode node) { - if (EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) { return; } @@ -122,7 +122,7 @@ public static void Reset(CSGNode node) #region AddNodeRegistration static void AddNodeRegistration(CSGNode node) { - if (EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) { return; } @@ -461,7 +461,7 @@ public static void Reset(CSGModel component) #region RegisterChild static void RegisterChild(ChildNodeData childData) { - if (EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) return; // make sure our model has actually been initialized @@ -485,7 +485,7 @@ static void RegisterChild(ChildNodeData childData) #region RegisterBrush static void RegisterBrush(CSGBrush brush) { - if (EditorApplication.isPlayingOrWillChangePlaymode || + if (RealtimeCSG.CSGModelManager.IsInPlayMode || External == null || !brush || !brush.isActiveAndEnabled || @@ -572,7 +572,7 @@ static void RegisterBrush(CSGBrush brush) #region RegisterOperation static void RegisterOperation(CSGOperation op) { - if (EditorApplication.isPlayingOrWillChangePlaymode || + if (RealtimeCSG.CSGModelManager.IsInPlayMode || External == null || !op || !op.isActiveAndEnabled || @@ -634,7 +634,7 @@ static void RegisterOperation(CSGOperation op) #region RegisterModel private static void RegisterModel(CSGModel model) { - if (EditorApplication.isPlayingOrWillChangePlaymode || + if (RealtimeCSG.CSGModelManager.IsInPlayMode || External == null || !model || !model.isActiveAndEnabled || @@ -726,7 +726,7 @@ public static void SetBrushMeshSurfaces(CSGBrush brush) #region UnregisterBrush static void UnregisterBrush(CSGBrush brush) { - if (EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) return; if (External == null) @@ -773,7 +773,7 @@ static void UnregisterBrush(CSGBrush brush) #region UnregisterOperation static void UnregisterOperation(CSGOperation op) { - if (EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) return; if (External == null) @@ -820,7 +820,7 @@ static void UnregisterOperation(CSGOperation op) #region UnregisterModel static void UnregisterModel(CSGModel model) { - if (EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) return; if (!model.IsRegistered) @@ -862,7 +862,7 @@ static void UnregisterModel(CSGModel model) #region EnableModel private static void EnableModel(CSGModel model) { - if (EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) return; if (External == null) @@ -889,7 +889,7 @@ private static void EnableModel(CSGModel model) #region DisableModel private static void DisableModel(CSGModel model) { - if (EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) return; if (External == null) diff --git a/Plugins/Editor/Scripts/Control/Managers/InternalCSGModelManager.UpdateMeshes.cs b/Plugins/Editor/Scripts/Control/Managers/InternalCSGModelManager.UpdateMeshes.cs index 01167d0..d9027f0 100644 --- a/Plugins/Editor/Scripts/Control/Managers/InternalCSGModelManager.UpdateMeshes.cs +++ b/Plugins/Editor/Scripts/Control/Managers/InternalCSGModelManager.UpdateMeshes.cs @@ -176,7 +176,7 @@ public static bool UpdateModelSettings() #region RefreshMeshes public static void RefreshMeshes() { - if (EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) return; if (skipCheckForChanges) @@ -245,6 +245,14 @@ private static bool UpdateMesh(CSGModel model, ref outputHasGeneratedNormals, ref sharedMesh, editorOnly); + + if (!CSGProjectSettings.Instance.SaveMeshesInSceneFiles) + { + // If is prefab scene, allow save + if (string.IsNullOrEmpty(model.gameObject.scene.path) && sharedMesh != null) + sharedMesh.hideFlags &= ~HideFlags.DontSaveInEditor; + } + return true; } @@ -409,8 +417,7 @@ public static void RemoveForcedUpdates() static bool inUpdateMeshes = false; public static bool UpdateMeshes(System.Text.StringBuilder text = null, bool forceUpdate = false) { - if (EditorApplication.isPlaying - || EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) return false; if (inUpdateMeshes) @@ -583,5 +590,31 @@ public static bool UpdateMeshes(System.Text.StringBuilder text = null, bool forc } } #endregion + + #region Destroy meshes + /// + /// Used to destroy any helper surface meshes in the current scene. Useful because they don't get destroyed otherwise, and stay in the Scene file. + /// + [MenuItem("Edit/Realtime-CSG/Destroy All Helper Surface Meshes In Scene")] + public static void DestroyAllHelperSurfaceCSGMeshes() + { + var allMeshesInScene = UnityEngine.Object.FindObjectsOfType(true); + + // regex matches all possible names for the helper surfaces that we can generate + var nameMatch = new System.Text.RegularExpressions.Regex( + $"^{System.Text.RegularExpressions.Regex.Escape("<")}" + + $"(?:{string.Join("|", System.Linq.Enumerable.Select(renderSurfaceMeshNames, n => System.Text.RegularExpressions.Regex.Escape(n)))})" + + $" generated -?[0-9]+{System.Text.RegularExpressions.Regex.Escape(">")}$", + System.Text.RegularExpressions.RegexOptions.Compiled); + + foreach (var mesh in allMeshesInScene) + { + if (nameMatch.IsMatch(mesh.name)) + { + Undo.DestroyObjectImmediate(mesh); + } + } + } + #endregion Destroy meshes } } \ No newline at end of file diff --git a/Plugins/Editor/Scripts/Control/Managers/MeshInstanceManager.Build.cs b/Plugins/Editor/Scripts/Control/Managers/MeshInstanceManager.Build.cs index 822a22d..d8bf724 100644 --- a/Plugins/Editor/Scripts/Control/Managers/MeshInstanceManager.Build.cs +++ b/Plugins/Editor/Scripts/Control/Managers/MeshInstanceManager.Build.cs @@ -130,7 +130,10 @@ internal static void OnBuild() } } - UnityEngine.Object.DestroyImmediate(meshContainer); + if (CSGProjectSettings.Instance.SaveMeshesInSceneFiles || !EditorApplication.isPlayingOrWillChangePlaymode) + UnityEngine.Object.DestroyImmediate(meshContainer); + else + meshContainer.hideFlags |= HideFlags.HideInHierarchy | HideFlags.HideInInspector; } @@ -139,7 +142,10 @@ internal static void OnBuild() { if (meshInstance) { - UnityEngine.Object.DestroyImmediate(meshInstance); + if (CSGProjectSettings.Instance.SaveMeshesInSceneFiles || !EditorApplication.isPlayingOrWillChangePlaymode) + UnityEngine.Object.DestroyImmediate(meshInstance); + else + meshInstance.hideFlags |= HideFlags.HideInHierarchy | HideFlags.HideInInspector; } } @@ -173,8 +179,14 @@ internal static void OnBuild() } else if (gameObject.CompareTag("Untagged")) removableGameObjects.Add(gameObject); + if (csgnode) - UnityEngine.Object.DestroyImmediate(csgnode); + { + if (CSGProjectSettings.Instance.SaveMeshesInSceneFiles || !EditorApplication.isPlayingOrWillChangePlaymode) + UnityEngine.Object.DestroyImmediate(csgnode); + else + csgnode.hideFlags |= HideFlags.HideInHierarchy | HideFlags.HideInInspector; + } } var removableTransforms = new HashSet(); @@ -184,7 +196,8 @@ internal static void OnBuild() var transform = gameObject.transform; if (removableTransforms.Contains(transform)) continue; - RemoveWithChildrenIfPossible(transform, removableTransforms); + if (CSGProjectSettings.Instance.SaveMeshesInSceneFiles || !EditorApplication.isPlayingOrWillChangePlaymode) + RemoveWithChildrenIfPossible(transform, removableTransforms); } } @@ -212,7 +225,7 @@ static bool RemoveWithChildrenIfPossible(Transform transform, HashSet internal static void DestroyAllMeshInstances() { - if (UnityEditor.EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) return; for (var sceneIndex = 0; sceneIndex < SceneManager.sceneCount; sceneIndex++) diff --git a/Plugins/Editor/Scripts/Control/Managers/MeshInstanceManager.cs b/Plugins/Editor/Scripts/Control/Managers/MeshInstanceManager.cs index cc577a0..b5de7ac 100644 --- a/Plugins/Editor/Scripts/Control/Managers/MeshInstanceManager.cs +++ b/Plugins/Editor/Scripts/Control/Managers/MeshInstanceManager.cs @@ -42,7 +42,7 @@ public static void OnDestroyed(GeneratedMeshes container) public static void Destroy(GeneratedMeshes generatedMeshes) { - if (EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) return; if (!generatedMeshes) @@ -104,6 +104,9 @@ public static void OnCreated(GeneratedMeshInstance meshInstance) static void Initialize(GeneratedMeshes container, GeneratedMeshInstance meshInstance) { + // Retain layer + meshInstance.gameObject.layer = container.gameObject.layer; + container.AddMeshInstance(meshInstance); } @@ -323,6 +326,9 @@ static GeneratedMeshes EnsureOneValidGeneratedMeshesComponent(CSGModel model) var generatedMeshesTransform = generatedMeshesObject.transform; generatedMeshesTransform.SetParent(model.transform, false); + // Retain layer + generatedMeshesObject.layer = model.gameObject.layer; + generatedMeshesObject.SetActive(true); UpdateGeneratedMeshesVisibility(generatedMeshes, model.ShowGeneratedMeshes); @@ -334,7 +340,7 @@ static GeneratedMeshes EnsureOneValidGeneratedMeshesComponent(CSGModel model) internal static bool ValidateModelNow(CSGModel model, bool checkChildren = false) { - if (EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) return true; if (!checkChildren && @@ -409,14 +415,14 @@ public static void UpdateHelperSurfaces() if (!ModelTraits.IsModelEditable(model)) continue; + if( !model.generatedMeshes ) + continue; + var container = model.generatedMeshes; if (container.owner != model || !container.gameObject) continue; - - if (!model.generatedMeshes) - continue; - + if (!container.HasHelperSurfaces) { if (!container.HasMeshInstances) @@ -531,7 +537,7 @@ internal static void ResetScene(Scene scene) internal static void Reset() { - if (UnityEditor.EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) return; for (var sceneIndex = 0; sceneIndex < SceneManager.sceneCount; sceneIndex++) @@ -777,15 +783,19 @@ internal static void ClearOrCreateMesh(string baseName, bool editorOnly, ref boo hasGeneratedNormals = false; if (!recreateMeshes &&sharedMesh) { + if (!CSGProjectSettings.Instance.SaveMeshesInSceneFiles) + sharedMesh.hideFlags |= HideFlags.DontSaveInEditor; sharedMesh.Clear(keepVertexLayout: true); return; } sharedMesh = new Mesh(); - sharedMesh.name = string.Format("<{0} generated {1}>", baseName, sharedMesh.GetInstanceID()); + sharedMesh.name = $"<{baseName} generated {sharedMesh.GetInstanceID()}>"; sharedMesh.MarkDynamic(); if (editorOnly) sharedMesh.hideFlags = HideFlags.DontSaveInBuild; + if (!CSGProjectSettings.Instance.SaveMeshesInSceneFiles) + sharedMesh.hideFlags |= HideFlags.DontSaveInEditor; } public static bool UsesLightmapUVs(CSGModel model) @@ -916,33 +926,28 @@ private static bool NeedToGenerateLightmapUVsForInstance(GeneratedMeshInstance i return !instance.HasUV2 && instance.RenderSurfaceType == RenderSurfaceType.Normal; } - private static bool NeedCollider(CSGModel model, GeneratedMeshInstance instance) + private static bool AreBoundsEmpty(GeneratedMeshInstance instance) { - return //((model.HaveCollider || model.IsTrigger) && - - (//instance.RenderSurfaceType == RenderSurfaceType.Normal || - instance.RenderSurfaceType == RenderSurfaceType.Collider || - instance.RenderSurfaceType == RenderSurfaceType.Trigger - ) && - - // Make sure the bounds of the mesh are not empty ... - (Mathf.Abs(instance.SharedMesh.bounds.size.x) > MathConstants.EqualityEpsilon || - Mathf.Abs(instance.SharedMesh.bounds.size.y) > MathConstants.EqualityEpsilon || - Mathf.Abs(instance.SharedMesh.bounds.size.z) > MathConstants.EqualityEpsilon) - //) - ; + return + Mathf.Abs(instance.SharedMesh.bounds.size.x) <= MathConstants.EqualityEpsilon || + Mathf.Abs(instance.SharedMesh.bounds.size.y) <= MathConstants.EqualityEpsilon || + Mathf.Abs(instance.SharedMesh.bounds.size.z) <= MathConstants.EqualityEpsilon; + } + + private static bool NeedCollider(RenderSurfaceType surfaceType) + { + return surfaceType == RenderSurfaceType.Collider || surfaceType == RenderSurfaceType.Trigger; } - private static bool NeedMeshRenderer(RenderSurfaceType renderSurfaceType) + private static bool NeedMeshRenderer(RenderSurfaceType renderSurfaceType) { - return (renderSurfaceType == RenderSurfaceType.Normal || - renderSurfaceType == RenderSurfaceType.ShadowOnly); + return renderSurfaceType == RenderSurfaceType.Normal || renderSurfaceType == RenderSurfaceType.ShadowOnly; } static StaticEditorFlags FilterStaticEditorFlags(StaticEditorFlags modelStaticFlags, RenderSurfaceType renderSurfaceType) { if (!NeedMeshRenderer(renderSurfaceType)) - return (StaticEditorFlags)0; + return modelStaticFlags; var meshStaticFlags = modelStaticFlags; var walkable = renderSurfaceType != RenderSurfaceType.Hidden && @@ -1026,7 +1031,7 @@ public static void Refresh(CSGModel model, bool postProcessScene = false, bool o // internal static double updateMeshColliderMeshTime = 0.0; public static void Refresh(GeneratedMeshInstance instance, CSGModel owner, bool postProcessScene = false, bool onlyFastRefreshes = true, bool skipAssetDatabaseUpdate = true) { - if (EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) return; if (!instance) @@ -1084,7 +1089,6 @@ public static void Refresh(GeneratedMeshInstance instance, CSGModel owner, bool var meshFilterComponent = instance.CachedMeshFilter; var meshRendererComponent = instance.CachedMeshRenderer; - var needMeshCollider = NeedCollider(owner, instance); @@ -1173,12 +1177,12 @@ public static void Refresh(GeneratedMeshInstance instance, CSGModel owner, bool if ((meshFilterComponent.hideFlags & HideFlags.HideInHierarchy) == 0) { meshFilterComponent.hideFlags |= HideFlags.HideInHierarchy; - } - - if ((meshRendererComponent.hideFlags & HideFlags.HideInHierarchy) == 0) + } + + if ((meshRendererComponent.hideFlags & HideFlags.HideInHierarchy) == 0) { meshRendererComponent.hideFlags |= HideFlags.HideInHierarchy; - } + } if (instance.RenderSurfaceType != RenderSurfaceType.ShadowOnly) { @@ -1188,7 +1192,7 @@ public static void Refresh(GeneratedMeshInstance instance, CSGModel owner, bool instance.ResetUVTime = Time.realtimeSinceStartup; if (instance.HasUV2) ClearUVs(instance); - } + } if ((owner.AutoRebuildUVs || postProcessScene)) { @@ -1309,8 +1313,8 @@ public static void Refresh(GeneratedMeshInstance instance, CSGModel owner, bool if (SOModified) meshRendererComponentSO.ApplyModifiedProperties(); - } - } + } + } //*/ #if UNITY_2019_2_OR_NEWER @@ -1328,7 +1332,7 @@ public static void Refresh(GeneratedMeshInstance instance, CSGModel owner, bool { meshRendererComponent.sharedMaterial = requiredMaterial; instance.Dirty = true; - } + } } else { @@ -1353,6 +1357,8 @@ public static void Refresh(GeneratedMeshInstance instance, CSGModel owner, bool // TODO: occludee/reflection probe static var meshColliderComponent = instance.CachedMeshCollider; + var needMeshCollider = !AreBoundsEmpty(instance) && NeedCollider(instance.RenderSurfaceType); + if (needMeshCollider) { if (!meshColliderComponent) @@ -1373,10 +1379,10 @@ public static void Refresh(GeneratedMeshInstance instance, CSGModel owner, bool meshColliderComponent.hideFlags |= HideFlags.HideInHierarchy; } - var currentPhyicsMaterial = instance.PhysicsMaterial ?? owner.DefaultPhysicsMaterial; - if (meshColliderComponent.sharedMaterial != currentPhyicsMaterial) + var currentPhysicsMaterial = instance.PhysicsMaterial ?? owner.DefaultPhysicsMaterial; + if (meshColliderComponent.sharedMaterial != currentPhysicsMaterial) { - meshColliderComponent.sharedMaterial = currentPhyicsMaterial; + meshColliderComponent.sharedMaterial = currentPhysicsMaterial; instance.Dirty = true; } @@ -1492,7 +1498,7 @@ private static void UpdateName(GeneratedMeshInstance instance) public static void UpdateHelperSurfaceVisibility(bool force = false) { - if (EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) return; // updateMeshColliderMeshTime = 0.0; @@ -1623,9 +1629,9 @@ static void AutoUpdateRigidBody(GeneratedMeshes container) constraints = RigidbodyConstraints.None; } - if (rigidBody.isKinematic != isKinematic) rigidBody.isKinematic = isKinematic; - if (rigidBody.useGravity != useGravity) rigidBody.useGravity = useGravity; - if (rigidBody.constraints != constraints) rigidBody.constraints = constraints; + if (rigidBody.isKinematic != isKinematic) rigidBody.isKinematic = isKinematic; + if (rigidBody.useGravity != useGravity) rigidBody.useGravity = useGravity; + if (rigidBody.constraints != constraints) rigidBody.constraints = constraints; container.CachedRigidBody = rigidBody; } else { @@ -1661,7 +1667,7 @@ public static void RemoveIfEmpty(GameObject gameObject) public static bool ValidateGeneratedMeshesNow(GeneratedMeshes generatedMeshes, bool skipSiblingCheck = false) { - if (UnityEditor.EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) return false; if (!generatedMeshes) @@ -1820,7 +1826,7 @@ static void UpdateTransform(GeneratedMeshes container) return; } - if (EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) return; // TODO: make sure outlines are updated when models move @@ -1843,7 +1849,7 @@ static void UpdateTransform(GeneratedMeshes container) public static List FindUnusedMeshInstances(GeneratedMeshes container, HashSet foundInstances) { - if (UnityEditor.EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) return null; if (!container || !container.owner) @@ -1892,7 +1898,7 @@ public static void UpdateContainerComponents(GeneratedMeshes container, HashSet foundInstances, HashSet foundHelperSurfaces) { - if (UnityEditor.EditorApplication.isPlayingOrWillChangePlaymode) + if (RealtimeCSG.CSGModelManager.IsInPlayMode) return; if (!container || !container.owner) @@ -2026,9 +2032,9 @@ private static void UpdateContainerFlags(GeneratedMeshes generatedMeshes) var showVisibleSurfaces = (RealtimeCSG.CSGSettings.VisibleHelperSurfaces & HelperSurfaceFlags.ShowVisibleSurfaces) != 0; - if (ownerStaticFlags != previousStaticFlags || - !ownerGameObject.CompareTag(generatedMeshes.gameObject.tag) || - containerLayer != generatedMeshes.gameObject.layer) + if (ownerStaticFlags != previousStaticFlags + || !ownerGameObject.CompareTag(generatedMeshes.gameObject.tag) + || containerLayer != generatedMeshes.gameObject.layer) { var containerTag = ownerGameObject.tag; foreach (var meshInstance in generatedMeshes.MeshInstances) diff --git a/Plugins/Editor/Scripts/Control/Managers/UpdateLoop.cs b/Plugins/Editor/Scripts/Control/Managers/UpdateLoop.cs index 3203150..6c9f6ac 100644 --- a/Plugins/Editor/Scripts/Control/Managers/UpdateLoop.cs +++ b/Plugins/Editor/Scripts/Control/Managers/UpdateLoop.cs @@ -251,8 +251,8 @@ void OnWaitUntillStoppedPlaying() static void RunEditorUpdate() { - if (!RealtimeCSG.CSGSettings.EnableRealtimeCSG) - return; + //if (!RealtimeCSG.CSGSettings.EnableRealtimeCSG) + // return; if (EditorApplication.isPlayingOrWillChangePlaymode) return; diff --git a/Plugins/Editor/Scripts/Data/Settings/CSGProjectSettings.cs b/Plugins/Editor/Scripts/Data/Settings/CSGProjectSettings.cs new file mode 100644 index 0000000..8498329 --- /dev/null +++ b/Plugins/Editor/Scripts/Data/Settings/CSGProjectSettings.cs @@ -0,0 +1,51 @@ +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; +using System.IO; + +namespace RealtimeCSG +{ + public class CSGProjectSettings : ScriptableObject + { + const string ASSET_PATH = "ProjectSettings/CSGProjectSettings.asset"; + + private static CSGProjectSettings s_Instance; + public static CSGProjectSettings Instance => s_Instance == null ? CreateOrLoad() : s_Instance; + + public bool SaveMeshesInSceneFiles = true; + public bool SnapEverythingTo0001Grid = true; + + CSGProjectSettings() + { + s_Instance = this; + } + + private static CSGProjectSettings CreateOrLoad() + { + InternalEditorUtility.LoadSerializedFileAndForget(ASSET_PATH); + + if (s_Instance == null) + { + var created = CreateInstance(); + created.hideFlags = HideFlags.HideAndDontSave; + } + + System.Diagnostics.Debug.Assert(s_Instance != null); + return s_Instance; + } + + public void Save() + { + if (s_Instance == null) + { + Debug.Log("Cannot save ScriptableSingleton: no instance!"); + return; + } + + string folderPath = Path.GetDirectoryName(ASSET_PATH); + if (!Directory.Exists(folderPath)) + Directory.CreateDirectory(folderPath); + InternalEditorUtility.SaveToSerializedFileAndForget(new[] { s_Instance }, ASSET_PATH, allowTextSerialization: true); + } + } +} diff --git a/Plugins/Editor/Scripts/Data/Settings/CSGProjectSettings.cs.meta b/Plugins/Editor/Scripts/Data/Settings/CSGProjectSettings.cs.meta new file mode 100644 index 0000000..05a5308 --- /dev/null +++ b/Plugins/Editor/Scripts/Data/Settings/CSGProjectSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d5e3f6e022f116d48896fab59bdf2871 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Plugins/Editor/Scripts/Data/Settings/CSGSettings.cs b/Plugins/Editor/Scripts/Data/Settings/CSGSettings.cs index 0af09f3..e6239aa 100644 --- a/Plugins/Editor/Scripts/Data/Settings/CSGSettings.cs +++ b/Plugins/Editor/Scripts/Data/Settings/CSGSettings.cs @@ -761,7 +761,7 @@ public static void Save() builder.Append(sceneView.name); } } - EditorPrefs.SetString("Wireframe", builder.ToString()); + EditorPrefs.SetString("Wireframe", builder.ToString()); } #endregion diff --git a/Plugins/Editor/Scripts/View/DragAndDrop/SceneDragTool.Materials.cs b/Plugins/Editor/Scripts/View/DragAndDrop/SceneDragTool.Materials.cs index b5f6c1e..bbad813 100644 --- a/Plugins/Editor/Scripts/View/DragAndDrop/SceneDragTool.Materials.cs +++ b/Plugins/Editor/Scripts/View/DragAndDrop/SceneDragTool.Materials.cs @@ -561,7 +561,7 @@ void ApplyMaterial(SelectedBrushSurface[] hoverBrushSurfaces) var material = GetMaterial(); if (texGens[m].RenderMaterial != material) { - if (!modified) + if (modified) { UndoInit(); Undo.RecordObject(brush, "Modifying material"); diff --git a/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/EditMode.Clip.cs b/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/EditMode.Clip.cs index 01b9b14..5f4d813 100644 --- a/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/EditMode.Clip.cs +++ b/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/EditMode.Clip.cs @@ -953,7 +953,7 @@ void CreateFirstPoint(SceneView sceneView) RecordAllObjects("Created clip plane"); - if ((points[2] - points[1]).sqrMagnitude < 0.1f) + if ((points[2] - points[1]).magnitude < 0.1f) { var direction = -normal; var snapVector = RealtimeCSG.CSGGrid.CurrentGridSnapVector; diff --git a/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/EditMode.Edit.cs b/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/EditMode.Edit.cs index dc33d26..3e4b289 100644 --- a/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/EditMode.Edit.cs +++ b/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/EditMode.Edit.cs @@ -2001,7 +2001,7 @@ public void HandleEvents(SceneView sceneView, Rect sceneRect) { if (Event.current.button != 0) _nonZeroMouseIsDown = true; - if (!_mouseIsDragging && (_prevMousePos - Event.current.mousePosition).sqrMagnitude > 4.0f) + if (!_mouseIsDragging && (_prevMousePos - Event.current.mousePosition).magnitude > 4.0f) _mouseIsDragging = true; break; } @@ -2623,7 +2623,7 @@ public void HandleEvents(SceneView sceneView, Rect sceneRect) if (!_showMarquee) { - if ((_startMousePoint - Event.current.mousePosition).sqrMagnitude > + if ((_startMousePoint - Event.current.mousePosition).magnitude > (MathConstants.MinimumMouseMovement * MathConstants.MinimumMouseMovement)) { _brushSelection.BackupSelection(); diff --git a/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/EditMode.Place.cs b/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/EditMode.Place.cs index 5f48065..ffaf014 100644 --- a/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/EditMode.Place.cs +++ b/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/EditMode.Place.cs @@ -1315,7 +1315,7 @@ void RenderRotationCircle(Camera camera) PaintUtility.DrawDottedLine(rotateCenter, rotateMousePosition, ColorSettings.BoundsEdgeHover); - if ((worldSpacePivotCenter - rotateCenter).sqrMagnitude > MathConstants.EqualityEpsilon) + if ((worldSpacePivotCenter - rotateCenter).magnitude > MathConstants.EqualityEpsilon) { PaintUtility.DrawDottedLine(worldSpacePivotCenter, rotateCenter, ColorSettings.BoundsEdgeHover); PaintUtility.DrawProjectedPivot(camera, rotateCenter, ColorSettings.BoundsEdgeHover); @@ -1359,12 +1359,13 @@ public void HandleEvents(SceneView sceneView, Rect sceneRect) var inCamera = (camera != null) && camera.pixelRect.Contains(Event.current.mousePosition); var originalEventType = Event.current.type; - if (originalEventType == EventType.MouseMove) { mouseIsDragging = false; draggingOnCamera = null; realMousePosition = Event.current.mousePosition; } - else if (originalEventType == EventType.MouseDown) { mouseIsDragging = false; draggingOnCamera = camera; realMousePosition = prevMousePos = Event.current.mousePosition; } - else if (originalEventType == EventType.MouseUp) { draggingOnCamera = null; } + if( Event.current.type == EventType.MouseMove ) { sceneView.Repaint(); } + else if (originalEventType == EventType.MouseMove) { mouseIsDragging = false; draggingOnCamera = null; realMousePosition = Event.current.mousePosition; } + else if (originalEventType == EventType.MouseDown) { mouseIsDragging = false; draggingOnCamera = camera; realMousePosition = prevMousePos = Event.current.mousePosition; } + else if (originalEventType == EventType.MouseUp) { draggingOnCamera = null; } else if (originalEventType == EventType.MouseDrag) { - if (!mouseIsDragging && (prevMousePos - Event.current.mousePosition).sqrMagnitude > 4.0f) + if (!mouseIsDragging && (prevMousePos - Event.current.mousePosition).magnitude > 4.0f) { mouseIsDragging = true; } diff --git a/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/EditMode.Surface.cs b/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/EditMode.Surface.cs index fed1d3c..c8b9383 100644 --- a/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/EditMode.Surface.cs +++ b/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/EditMode.Surface.cs @@ -959,7 +959,7 @@ public void HandleEvents(SceneView sceneView, Rect sceneRect) else if (originalEventType == EventType.MouseDrag) { mouseIsDown = true; - if (!mouseIsDragging && (prevMousePos - Event.current.mousePosition).sqrMagnitude > 4.0f) + if (!mouseIsDragging && (prevMousePos - Event.current.mousePosition).magnitude > 4.0f) mouseIsDragging = true; } @@ -1344,7 +1344,7 @@ public void HandleEvents(SceneView sceneView, Rect sceneRect) { for (int p = 0; p < surfaceState.surfaceSelectState.Length; p++) { - if (surfaceState.surfaceSelectState[p] != oldSurfaceStates[p]) + if (surfaceState.surfaceSelectState[p] != oldSurfaceStates[p] || oldSurfaceStates[p] == SelectState.None) repaint = true; } } @@ -1353,9 +1353,6 @@ public void HandleEvents(SceneView sceneView, Rect sceneRect) editMode = newEditMode; Handles.matrix = origMatrix; - if (repaint) - CSG_EditorGUIUtility.RepaintAll(); - if (hoverOnTarget >= 0 && hoverOnSurfaceIndex >= 0 && surfaceStates.Length > hoverOnTarget && surfaceStates[hoverOnTarget].surfaceSelectState.Length > hoverOnSurfaceIndex) { @@ -1365,6 +1362,10 @@ public void HandleEvents(SceneView sceneView, Rect sceneRect) currentCursor = MouseCursor.ArrowPlus; } } + + if( repaint ) + CSG_EditorGUIUtility.RepaintAll(); + break; } } @@ -1585,6 +1586,7 @@ public void HandleEvents(SceneView sceneView, Rect sceneRect) if (originalEventType == EventType.MouseUp || originalEventType == EventType.MouseMove) { mouseIsDragging = false; mouseIsDown = false; } } + } diff --git a/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.Base.cs b/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.Base.cs index ed9f936..f6b8823 100644 --- a/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.Base.cs +++ b/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.Base.cs @@ -398,7 +398,7 @@ protected void CalculateWorldSpaceTangents(Camera camera) } } - protected void SetCameraPosition(SceneView sceneView, Vector3 center, float size) + /*protected void SetCameraPosition(SceneView sceneView, Vector3 center, float size) { if (float.IsInfinity(size) || float.IsNaN(size) || float.IsInfinity(center.x) || float.IsNaN(center.x) || @@ -407,7 +407,7 @@ protected void SetCameraPosition(SceneView sceneView, Vector3 center, float size return; if (sceneView) sceneView.LookAt(center, sceneView.rotation, Mathf.Max(size, (sceneView.camera.transform.position - center).magnitude)); - } + }*/ protected void HideGenerateBrushes() @@ -622,7 +622,7 @@ internal void MarkAllBrushesDirty() public abstract AABB GetShapeBounds(); - protected void HandleCameraOrbit(SceneView sceneView, bool allowCameraOrbit) + /*protected void HandleCameraOrbit(SceneView sceneView, bool allowCameraOrbit) { if (!ignoreOrbit && Tools.viewTool == ViewTool.Orbit && @@ -638,7 +638,7 @@ protected void HandleCameraOrbit(SceneView sceneView, bool allowCameraOrbit) if (Event.current.type == EventType.MouseUp || Event.current.type == EventType.MouseMove) ignoreOrbit = false; - } + }*/ public bool UndoRedoPerformed() @@ -658,9 +658,9 @@ public virtual void HandleEvents(SceneView sceneView, Rect sceneRect) CreateControlIDs(); - if (mouseIsDragging || - (Event.current.type == EventType.MouseDown && Tools.viewTool == ViewTool.Orbit)) - HandleCameraOrbit(sceneView, editMode != EditMode.CreatePlane); + //if (mouseIsDragging || + // (Event.current.type == EventType.MouseDown && Tools.viewTool == ViewTool.Orbit)) + // HandleCameraOrbit(sceneView, editMode != EditMode.CreateShape && editMode != EditMode.CreatePlane); // pretend we dragged so we don't click if we just changed edit modes if (prevEditMode != editMode) diff --git a/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.Box.GUI.cs b/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.Box.GUI.cs index 0a550ac..127cf7f 100644 --- a/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.Box.GUI.cs +++ b/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.Box.GUI.cs @@ -51,14 +51,14 @@ static void BoxSettingsGUI(GeneratorBox generator, bool isSceneGUI) GUILayout.BeginHorizontal(CSG_GUIStyleUtility.ContentEmpty); { GUILayout.Label(LengthContent, Width65); - var length = generator.Length; + var width = generator.Width; EditorGUI.BeginChangeCheck(); { - length = Units.DistanceUnitToUnity(distanceUnit, EditorGUILayout.DoubleField(Units.UnityToDistanceUnit(distanceUnit, length))); + width = Units.DistanceUnitToUnity(distanceUnit, EditorGUILayout.DoubleField(Units.UnityToDistanceUnit(distanceUnit, width))); } if (EditorGUI.EndChangeCheck()) { - generator.Length = length; + generator.Width = width; } if (GUILayout.Button(unitText, EditorStyles.miniLabel, Width25)) { @@ -74,14 +74,14 @@ static void BoxSettingsGUI(GeneratorBox generator, bool isSceneGUI) GUILayout.BeginHorizontal(CSG_GUIStyleUtility.ContentEmpty); { GUILayout.Label(WidthContent, Width65); - var width = generator.Width; + var length = generator.Length; EditorGUI.BeginChangeCheck(); { - width = Units.DistanceUnitToUnity(distanceUnit, EditorGUILayout.DoubleField(Units.UnityToDistanceUnit(distanceUnit, width))); + length = Units.DistanceUnitToUnity(distanceUnit, EditorGUILayout.DoubleField(Units.UnityToDistanceUnit(distanceUnit, length))); } if (EditorGUI.EndChangeCheck()) { - generator.Width = width; + generator.Length = length; } if (GUILayout.Button(unitText, EditorStyles.miniLabel, Width25)) { diff --git a/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.Box.cs b/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.Box.cs index 8955c9b..1553d4d 100644 --- a/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.Box.cs +++ b/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.Box.cs @@ -157,7 +157,7 @@ public bool HotKeyReleased() settings.AddPoint(worldPosition); } - if ((settings.vertices[0] - settings.vertices[1]).sqrMagnitude <= MathConstants.EqualityEpsilon) + if ((settings.vertices[0] - settings.vertices[1]).magnitude <= MathConstants.EqualityEpsilon) { Cancel(); return false; diff --git a/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.LinearStairs.cs b/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.LinearStairs.cs index af18604..aaa6c78 100644 --- a/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.LinearStairs.cs +++ b/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.LinearStairs.cs @@ -257,7 +257,7 @@ public bool HotKeyReleased() settings.bounds = GetShapeBounds(); } - if ((settings.vertices[0] - settings.vertices[1]).sqrMagnitude <= MathConstants.EqualityEpsilon) + if ((settings.vertices[0] - settings.vertices[1]).magnitude <= MathConstants.EqualityEpsilon) { Cancel(); return false; @@ -821,7 +821,7 @@ protected override void HandleCreateShapeEvents(SceneView sceneView, Rect sceneR prevWorldPosition = worldPosition; if (settings.vertices.Length > 0) { - if ((settings.vertices[0] - worldPosition).sqrMagnitude > MathConstants.EqualityEpsilon) + if ((settings.vertices[0] - worldPosition).magnitude > MathConstants.EqualityEpsilon) { UpdateSizes(); UpdateBaseShape(true); diff --git a/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.Sphere.cs b/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.Sphere.cs index 2b0672d..c5663f6 100644 --- a/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.Sphere.cs +++ b/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.Sphere.cs @@ -103,7 +103,7 @@ public bool HotKeyReleased() settings.AddPoint(worldPosition); } - if ((settings.vertices[0] - settings.vertices[1]).sqrMagnitude <= MathConstants.EqualityEpsilon) + if ((settings.vertices[0] - settings.vertices[1]).magnitude <= MathConstants.EqualityEpsilon) { Cancel(); return false; @@ -642,7 +642,7 @@ protected override void HandleCreateShapeEvents(SceneView sceneView, Rect sceneR prevWorldPosition = worldPosition; if (settings.vertices.Length > 0) { - if (hadSphere || (settings.vertices[0] - worldPosition).sqrMagnitude > MathConstants.EqualityEpsilon) + if (hadSphere || (settings.vertices[0] - worldPosition).magnitude > MathConstants.EqualityEpsilon) { hadSphere = true; UpdateBaseShape(true); diff --git a/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.SpiralStairs.cs b/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.SpiralStairs.cs index 2687ba8..26f8f9e 100644 --- a/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.SpiralStairs.cs +++ b/Plugins/Editor/Scripts/View/GUI/EditModeGUI/EditModes/Generators/Generator.SpiralStairs.cs @@ -256,7 +256,7 @@ public bool HotKeyReleased() settings.bounds = GetShapeBounds(); } - if ((settings.vertices[0] - settings.vertices[1]).sqrMagnitude <= MathConstants.EqualityEpsilon) + if ((settings.vertices[0] - settings.vertices[1]).magnitude <= MathConstants.EqualityEpsilon) { Cancel(); return false; @@ -810,7 +810,7 @@ protected override void HandleCreateShapeEvents(SceneView sceneView, Rect sceneR prevWorldPosition = worldPosition; if (settings.vertices.Length > 0) { - if ((settings.vertices[0] - worldPosition).sqrMagnitude > MathConstants.EqualityEpsilon) + if ((settings.vertices[0] - worldPosition).magnitude > MathConstants.EqualityEpsilon) { UpdateSizes(); UpdateBaseShape(true); diff --git a/Plugins/Editor/Scripts/View/GUI/PreferenceWindows/CSGOptions.PreferenceWindow.cs b/Plugins/Editor/Scripts/View/GUI/PreferenceWindows/CSGOptions.PreferenceWindow.cs index fd08ebb..66ed912 100644 --- a/Plugins/Editor/Scripts/View/GUI/PreferenceWindows/CSGOptions.PreferenceWindow.cs +++ b/Plugins/Editor/Scripts/View/GUI/PreferenceWindows/CSGOptions.PreferenceWindow.cs @@ -15,13 +15,17 @@ public static void PreferenceWindow() { EditorGUI.BeginChangeCheck(); { - CSGSettings.ShowTooltips = EditorGUILayout.ToggleLeft("Show Tool-Tips", CSGSettings.ShowTooltips); - CSGSettings.SnapNonCSGObjects = EditorGUILayout.ToggleLeft("Snap Non-CSG Objects to the grid", CSGSettings.SnapNonCSGObjects); - CSGSettings.AutoRigidbody = EditorGUILayout.ToggleLeft("Disable auto add rigidbodies", CSGSettings.AutoRigidbody); - CSGSettings.DefaultPreserveUVs = EditorGUILayout.ToggleLeft("Preserve UVs (Default)", CSGSettings.DefaultPreserveUVs); +#if !UNITY_2018_4_OR_NEWER && !UNITY_2019_1_OR_NEWER + CSGProjectSettings.Instance.SaveMeshesInSceneFiles = EditorGUILayout.ToggleLeft("Save Meshes In Scene Files", CSGProjectSettings.Instance.SaveMeshesInSceneFiles); + EditorGUILayout.Separator(); +#endif + CSGSettings.ShowTooltips = EditorGUILayout.ToggleLeft("Show Tool-Tips", CSGSettings.ShowTooltips); + CSGSettings.SnapNonCSGObjects = EditorGUILayout.ToggleLeft("Snap Non-CSG Objects to the grid", CSGSettings.SnapNonCSGObjects); + CSGSettings.AutoRigidbody = EditorGUILayout.ToggleLeft("Disable auto add rigidbodies", CSGSettings.AutoRigidbody); + CSGSettings.DefaultPreserveUVs = EditorGUILayout.ToggleLeft("Preserve UVs (Default)", CSGSettings.DefaultPreserveUVs); EditorGUILayout.Space(); - CSGSettings.MaxCircleSides = EditorGUILayout.IntField("Max Circle Sides", CSGSettings.MaxCircleSides); - CSGSettings.MaxSphereSplits = EditorGUILayout.IntField("Max Sphere Splits", CSGSettings.MaxSphereSplits); + CSGSettings.MaxCircleSides = EditorGUILayout.IntField("Max Circle Sides", CSGSettings.MaxCircleSides); + CSGSettings.MaxSphereSplits = EditorGUILayout.IntField("Max Sphere Splits", CSGSettings.MaxSphereSplits); EditorGUILayout.Space(); EditorGUILayout.LabelField("Surfaces", EditorStyles.boldLabel); @@ -35,13 +39,48 @@ public static void PreferenceWindow() CSGSettings.DefaultTexGenFlags |= TexGenFlags.WorldSpaceTexture; } - CSGSettings.ShowSceneInfo = EditorGUILayout.ToggleLeft( "Show Scene Info", CSGSettings.ShowSceneInfo ); + CSGSettings.ShowSceneInfo = EditorGUILayout.ToggleLeft("Show Scene Info", CSGSettings.ShowSceneInfo); } if (EditorGUI.EndChangeCheck()) { +#if !UNITY_2018_4_OR_NEWER && !UNITY_2019_1_OR_NEWER + CSGProjectSettings.Instance.Save(); +#endif CSGSettings.Save(); } } + + public static void ProjectSettingsWindow() + { + EditorGUI.BeginChangeCheck(); + { + CSGProjectSettings.Instance.SaveMeshesInSceneFiles = !EditorGUILayout.ToggleLeft("[Experimental] Don't Save Meshes In Scene Files", !CSGProjectSettings.Instance.SaveMeshesInSceneFiles); + + if (!CSGProjectSettings.Instance.SaveMeshesInSceneFiles) + { + EditorGUILayout.HelpBox( + "Meshes will be rebuilt on editor & scene load. This is an experimental option, if meshes are not rebuilding properly, please disable it.", + MessageType.Warning, true); + } + else + { + EditorGUILayout.HelpBox( + "If enabled, meshes will be automatically rebuilt on editor & scene load, dramatically saving disk space.", + MessageType.Info, true); + } + + CSGProjectSettings.Instance.SnapEverythingTo0001Grid = EditorGUILayout.ToggleLeft("Snap All CSG Objects To 0.001 Grid", CSGProjectSettings.Instance.SnapEverythingTo0001Grid); + EditorGUILayout.HelpBox( + "If enabled, every CSG object will snap to a small grid regardless of snapping options. " + + "This ensures things line up when on a tiny scale, but can make it difficult to work at a small scale.", + MessageType.Info, true); + } + + if (EditorGUI.EndChangeCheck()) + { + CSGProjectSettings.Instance.Save(); + } + } } #if UNITY_2018_4_OR_NEWER @@ -49,7 +88,7 @@ public static void PreferenceWindow() static class RealtimeCSGOptionsIMGUIRegister { [SettingsProvider] - public static SettingsProvider CreateMyCustomSettingsProvider() + public static SettingsProvider CreateCSGPreferenceSettings() { var keys = CSGKeysPreferenceWindow.GetKeys(); var keywords = new HashSet(); @@ -60,16 +99,16 @@ public static SettingsProvider CreateMyCustomSettingsProvider() keywords.Add(piece); } - var provider = new SettingsProvider("Project/RealtimeCSG", SettingsScope.Project) + var provider = new SettingsProvider("Preferences/RealtimeCSG", SettingsScope.User) { label = "Realtime CSG", + guiHandler = (searchContext) => { GUILayout.Label("Options", EditorStyles.boldLabel); GUILayout.Space(10); CSGOptionsPreferenceWindow.PreferenceWindow(); - - GUILayout.Space(30); + EditorGUILayout.Separator(); GUILayout.Label("Keyboard settings", EditorStyles.boldLabel); GUILayout.Space(10); CSGKeysPreferenceWindow.PreferenceWindow(); @@ -80,6 +119,25 @@ public static SettingsProvider CreateMyCustomSettingsProvider() return provider; } + + [SettingsProvider] + public static SettingsProvider CreateCSGProjectSettings() + { + var provider = new SettingsProvider("Project/RealtimeCSGProjectSettings", SettingsScope.Project) + { + label = "Realtime CSG", + guiHandler = (searchContext) => + { + GUILayout.Label("Options", EditorStyles.boldLabel); + GUILayout.Space(10); + CSGOptionsPreferenceWindow.ProjectSettingsWindow(); + }, + + keywords = new[] { "Meshes" } + }; + + return provider; + } } #endif } diff --git a/Plugins/Editor/Scripts/View/Scene/Grid/CSGGrid.cs b/Plugins/Editor/Scripts/View/Scene/Grid/CSGGrid.cs index 9842568..aeeb77c 100644 --- a/Plugins/Editor/Scripts/View/Scene/Grid/CSGGrid.cs +++ b/Plugins/Editor/Scripts/View/Scene/Grid/CSGGrid.cs @@ -248,8 +248,8 @@ static void OnRender(Camera camera) Vector3 forward = gridOrientation.gridRotation * MathConstants.forwardVector3; Vector3 work_forward = gridOrientation.gridWorkRotation * MathConstants.forwardVector3; if (ForceGrid && - !((forward - work_forward).sqrMagnitude < 0.001f || - (forward + work_forward).sqrMagnitude < 0.001f + !((forward - work_forward).magnitude < 0.001f || + (forward + work_forward).magnitude < 0.001f // && gridOrientation.grid_work_center == gridOrientation.grid_center )) { diff --git a/Plugins/Editor/Scripts/View/Scene/Grid/GridUtility.cs b/Plugins/Editor/Scripts/View/Scene/Grid/GridUtility.cs index 5db1a2c..5d9afa4 100644 --- a/Plugins/Editor/Scripts/View/Scene/Grid/GridUtility.cs +++ b/Plugins/Editor/Scripts/View/Scene/Grid/GridUtility.cs @@ -67,40 +67,43 @@ static public Vector3 CleanNormal(Vector3 normal) static public Vector3 CleanPosition(Vector3 position) { - float signX = Mathf.Sign(position.x); - float signY = Mathf.Sign(position.y); - float signZ = Mathf.Sign(position.z); - - float absPosX = position.x * signX; - float absPosY = position.y * signY; - float absPosZ = position.z * signZ; + if (CSGProjectSettings.Instance.SnapEverythingTo0001Grid) + { + float signX = Mathf.Sign(position.x); + float signY = Mathf.Sign(position.y); + float signZ = Mathf.Sign(position.z); - int intPosX = Mathf.FloorToInt(absPosX); - int intPosY = Mathf.FloorToInt(absPosY); - int intPosZ = Mathf.FloorToInt(absPosZ); + float absPosX = position.x * signX; + float absPosY = position.y * signY; + float absPosZ = position.z * signZ; - float fractPosX = (absPosX - intPosX); - float fractPosY = (absPosY - intPosY); - float fractPosZ = (absPosZ - intPosZ); + int intPosX = Mathf.FloorToInt(absPosX); + int intPosY = Mathf.FloorToInt(absPosY); + int intPosZ = Mathf.FloorToInt(absPosZ); - fractPosX = Mathf.Round(fractPosX * 1000.0f) / 1000.0f; - fractPosY = Mathf.Round(fractPosY * 1000.0f) / 1000.0f; - fractPosZ = Mathf.Round(fractPosZ * 1000.0f) / 1000.0f; + float fractPosX = (absPosX - intPosX); + float fractPosY = (absPosY - intPosY); + float fractPosZ = (absPosZ - intPosZ); - const float epsilon = MathConstants.EqualityEpsilon; + fractPosX = Mathf.Round(fractPosX * 1000.0f) / 1000.0f; + fractPosY = Mathf.Round(fractPosY * 1000.0f) / 1000.0f; + fractPosZ = Mathf.Round(fractPosZ * 1000.0f) / 1000.0f; - if (fractPosX < epsilon) fractPosX = 0; - if (fractPosY < epsilon) fractPosY = 0; - if (fractPosZ < epsilon) fractPosZ = 0; + const float epsilon = MathConstants.EqualityEpsilon; - if (fractPosX >= 1 - epsilon) fractPosX = 1; - if (fractPosY >= 1 - epsilon) fractPosY = 1; - if (fractPosZ >= 1 - epsilon) fractPosZ = 1; + if (fractPosX < epsilon) fractPosX = 0; + if (fractPosY < epsilon) fractPosY = 0; + if (fractPosZ < epsilon) fractPosZ = 0; + + if (fractPosX >= 1 - epsilon) fractPosX = 1; + if (fractPosY >= 1 - epsilon) fractPosY = 1; + if (fractPosZ >= 1 - epsilon) fractPosZ = 1; + + if (!float.IsNaN(fractPosX) && !float.IsInfinity(fractPosX)) position.x = (intPosX + fractPosX) * signX; + if (!float.IsNaN(fractPosY) && !float.IsInfinity(fractPosY)) position.y = (intPosY + fractPosY) * signY; + if (!float.IsNaN(fractPosZ) && !float.IsInfinity(fractPosZ)) position.z = (intPosZ + fractPosZ) * signZ; + } - if (!float.IsNaN(fractPosX) && !float.IsInfinity(fractPosX)) position.x = (intPosX + fractPosX) * signX; - if (!float.IsNaN(fractPosY) && !float.IsInfinity(fractPosY)) position.y = (intPosY + fractPosY) * signY; - if (!float.IsNaN(fractPosZ) && !float.IsInfinity(fractPosZ)) position.z = (intPosZ + fractPosZ) * signZ; - return position; } diff --git a/Plugins/Runtime/Resources/RealtimeCSG/Materials/Floor.mat b/Plugins/Runtime/Resources/RealtimeCSG/Materials/Floor.mat index ecca516..e69de29 100644 Binary files a/Plugins/Runtime/Resources/RealtimeCSG/Materials/Floor.mat and b/Plugins/Runtime/Resources/RealtimeCSG/Materials/Floor.mat differ diff --git a/Plugins/Runtime/Resources/RealtimeCSG/Materials/Metal.mat b/Plugins/Runtime/Resources/RealtimeCSG/Materials/Metal.mat index da22d9a..e18848d 100644 --- a/Plugins/Runtime/Resources/RealtimeCSG/Materials/Metal.mat +++ b/Plugins/Runtime/Resources/RealtimeCSG/Materials/Metal.mat @@ -12,26 +12,38 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} m_Name: m_EditorClassIdentifier: - version: 5 + version: 6 --- !u!21 &2100000 Material: - serializedVersion: 6 + serializedVersion: 8 m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_Name: Metal - m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} - m_ShaderKeywords: _DETAIL_MULX2 _METALLICGLOSSMAP + m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _DETAIL_MULX2 + - _METALLICSPECGLOSSMAP + m_InvalidKeywords: + - _METALLICGLOSSMAP m_LightmapFlags: 4 m_EnableInstancingVariants: 0 m_DoubleSidedGI: 0 m_CustomRenderQueue: -1 - stringTagMap: {} + stringTagMap: + RenderType: Opaque disabledShaderPasses: [] + m_LockedProperties: m_SavedProperties: serializedVersion: 3 m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} - _BumpMap: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} @@ -68,12 +80,37 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} m_Ints: [] m_Floats: + - _AlphaClip: 0 + - _Blend: 0 + - _BlendModePreserveSpecular: 1 - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 - _DetailNormalMapScale: 1 - _DstBlend: 0 + - _DstBlendAlpha: 0 + - _EnvironmentReflections: 1 - _GlossMapScale: 1 - _Glossiness: 0.314 - _GlossyReflections: 1 @@ -81,12 +118,20 @@ Material: - _Mode: 0 - _OcclusionStrength: 1 - _Parallax: 0.02 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _Smoothness: 0.5 - _SmoothnessTextureChannel: 0 - _SpecularHighlights: 1 - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _Surface: 0 - _UVSec: 0 + - _WorkflowMode: 1 - _ZWrite: 1 m_Colors: - - _Color: {r: 0.8301887, g: 0.8301887, b: 0.8301887, a: 1} + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} + - _Color: {r: 1, g: 1, b: 1, a: 1} - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} m_BuildTextureStacks: [] diff --git a/Plugins/Runtime/Resources/RealtimeCSG/Materials/Wall.mat b/Plugins/Runtime/Resources/RealtimeCSG/Materials/Wall.mat index a888dbb..e69de29 100644 Binary files a/Plugins/Runtime/Resources/RealtimeCSG/Materials/Wall.mat and b/Plugins/Runtime/Resources/RealtimeCSG/Materials/Wall.mat differ diff --git a/Plugins/Runtime/Resources/RealtimeCSG/Materials/Window.mat b/Plugins/Runtime/Resources/RealtimeCSG/Materials/Window.mat index 64fe320..e69de29 100644 Binary files a/Plugins/Runtime/Resources/RealtimeCSG/Materials/Window.mat and b/Plugins/Runtime/Resources/RealtimeCSG/Materials/Window.mat differ diff --git a/Plugins/Runtime/Resources/RealtimeCSG/Textures/Window.png b/Plugins/Runtime/Resources/RealtimeCSG/Textures/Window.png index 36bd66c..f86978b 100644 Binary files a/Plugins/Runtime/Resources/RealtimeCSG/Textures/Window.png and b/Plugins/Runtime/Resources/RealtimeCSG/Textures/Window.png differ diff --git a/README.md b/README.md index 2d4c5c3..a56dbe1 100644 --- a/README.md +++ b/README.md @@ -56,4 +56,4 @@ If you use this plugin, please let us know, we'd love to see what you've done wi * Create your own branch * Submit a PR (do not submit PRs from the master branch of your fork) -README last updated March 4th, 2022 +README last updated June 9th, 2022 diff --git a/README.md.meta b/README.md.meta new file mode 100644 index 0000000..dd123cf --- /dev/null +++ b/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6cf88510b97e70d46ae01d5e906a15a8 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Readme.meta b/Readme.meta new file mode 100644 index 0000000..ef67649 --- /dev/null +++ b/Readme.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 43eab678fc07d0341bab03b1bc17147f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Readme/Images.meta b/Readme/Images.meta new file mode 100644 index 0000000..3135152 --- /dev/null +++ b/Readme/Images.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fecc954b06bddad4895bac125b25e963 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Readme/Images/house_view.png.meta b/Readme/Images/house_view.png.meta new file mode 100644 index 0000000..b400444 --- /dev/null +++ b/Readme/Images/house_view.png.meta @@ -0,0 +1,98 @@ +fileFormatVersion: 2 +guid: 48600d27b94721b4a95f5ea75e59408d +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMasterTextureLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: