From c2bb35a46d78ecb70f820a12f9c105906205ef23 Mon Sep 17 00:00:00 2001 From: Vova <3emaster@gmail.com> Date: Fri, 6 Oct 2023 10:09:30 +0300 Subject: [PATCH] add floorplan 2.0 package --- Packages/Floorplan-2.0/.gitattributes | 2 + Packages/Floorplan-2.0/DefaultTileset.meta | 8 + .../DefaultTileset/DefaultTileset.asset | 33 + .../DefaultTileset/DefaultTileset.asset.meta | 8 + .../Floorplan-2.0/DefaultTileset/Meshes.meta | 8 + .../DefaultTileset/Meshes/mech_arch.fbx | Bin 0 -> 38364 bytes .../DefaultTileset/Meshes/mech_arch.fbx.meta | 95 +++ .../Meshes/mesh_arch_large_1.fbx | Bin 0 -> 16380 bytes .../Meshes/mesh_arch_large_1.fbx.meta | 99 +++ .../Meshes/mesh_arch_large_2.fbx | Bin 0 -> 16380 bytes .../Meshes/mesh_arch_large_2.fbx.meta | 99 +++ .../Meshes/mesh_arch_large_3.fbx | Bin 0 -> 15212 bytes .../Meshes/mesh_arch_large_3.fbx.meta | 99 +++ .../DefaultTileset/Meshes/mesh_door.fbx | Bin 0 -> 14940 bytes .../DefaultTileset/Meshes/mesh_door.fbx.meta | 95 +++ .../DefaultTileset/Meshes/mesh_pillar.fbx | Bin 0 -> 14860 bytes .../Meshes/mesh_pillar.fbx.meta | 95 +++ .../DefaultTileset/Meshes/mesh_tile.fbx | Bin 0 -> 14508 bytes .../DefaultTileset/Meshes/mesh_tile.fbx.meta | 95 +++ .../DefaultTileset/Meshes/mesh_wall.fbx | Bin 0 -> 14892 bytes .../DefaultTileset/Meshes/mesh_wall.fbx.meta | 95 +++ .../DefaultTileset/Meshes/mesh_window.fbx | Bin 0 -> 15692 bytes .../Meshes/mesh_window.fbx.meta | 95 +++ .../Meshes/mesh_window_large_1.fbx | Bin 0 -> 15964 bytes .../Meshes/mesh_window_large_1.fbx.meta | 99 +++ .../Meshes/mesh_window_large_2.fbx | Bin 0 -> 16124 bytes .../Meshes/mesh_window_large_2.fbx.meta | 99 +++ .../Floorplan-2.0/DefaultTileset/Prefabs.meta | 8 + .../DefaultTileset/Prefabs/prefab_arch.prefab | 261 ++++++++ .../Prefabs/prefab_arch.prefab.meta | 7 + .../Prefabs/prefab_arch_bathroom.prefab | 287 +++++++++ .../Prefabs/prefab_arch_bathroom.prefab.meta | 7 + .../Prefabs/prefab_arch_large_1.prefab | 175 ++++++ .../Prefabs/prefab_arch_large_1.prefab.meta | 7 + .../Prefabs/prefab_arch_large_2.prefab | 170 ++++++ .../Prefabs/prefab_arch_large_2.prefab.meta | 7 + .../Prefabs/prefab_arch_large_3.prefab | 170 ++++++ .../Prefabs/prefab_arch_large_3.prefab.meta | 7 + .../DefaultTileset/Prefabs/prefab_door.prefab | 146 +++++ .../Prefabs/prefab_door.prefab.meta | 7 + .../Prefabs/prefab_pillar.prefab | 146 +++++ .../Prefabs/prefab_pillar.prefab.meta | 7 + .../DefaultTileset/Prefabs/prefab_tile.prefab | 149 +++++ .../Prefabs/prefab_tile.prefab.meta | 7 + .../Prefabs/prefab_wall 1.prefab | 148 +++++ .../Prefabs/prefab_wall 1.prefab.meta | 7 + .../DefaultTileset/Prefabs/prefab_wall.prefab | 148 +++++ .../Prefabs/prefab_wall.prefab.meta | 7 + .../prefab_wall_bathroom_dirty 1.prefab | 259 ++++++++ .../prefab_wall_bathroom_dirty 1.prefab.meta | 7 + .../prefab_wall_bathroom_dirty 2.prefab | 259 ++++++++ .../prefab_wall_bathroom_dirty 2.prefab.meta | 7 + .../prefab_wall_bathroom_dirty 3.prefab | 354 +++++++++++ .../prefab_wall_bathroom_dirty 3.prefab.meta | 7 + .../prefab_wall_bathroom_dirty 4.prefab | 544 +++++++++++++++++ .../prefab_wall_bathroom_dirty 4.prefab.meta | 7 + .../Prefabs/prefab_window.prefab | 147 +++++ .../Prefabs/prefab_window.prefab.meta | 7 + .../Prefabs/prefab_window_large_1.prefab | 269 +++++++++ .../Prefabs/prefab_window_large_1.prefab.meta | 7 + .../Prefabs/prefab_window_large_2.prefab | 175 ++++++ .../Prefabs/prefab_window_large_2.prefab.meta | 7 + Packages/Floorplan-2.0/Editor.meta | 8 + .../com.alexism.floorplan.editor.asmdef | 20 + .../com.alexism.floorplan.editor.asmdef.meta | 7 + .../Editor/floorplanComponentEditor.cs | 47 ++ .../Editor/floorplanComponentEditor.cs.meta | 11 + .../Floorplan-2.0/Editor/floorplanEditor.cs | 279 +++++++++ .../Editor/floorplanEditor.cs.meta | 11 + .../Floorplan-2.0/Editor/floorplanMenuItem.cs | 19 + .../Editor/floorplanMenuItem.cs.meta | 12 + Packages/Floorplan-2.0/LICENSE | 21 + Packages/Floorplan-2.0/LICENSE.meta | 7 + Packages/Floorplan-2.0/README.md | 33 + Packages/Floorplan-2.0/README.md.meta | 7 + Packages/Floorplan-2.0/Resources.meta | 8 + Packages/Floorplan-2.0/Resources/Icons.meta | 8 + .../Resources/Icons/BrickIcon.png | Bin 0 -> 64041 bytes .../Resources/Icons/BrickIcon.png.meta | 139 +++++ .../Resources/Icons/FilledRectTool.png | Bin 0 -> 658 bytes .../Resources/Icons/FilledRectTool.png.meta | 139 +++++ .../Resources/Icons/FloorIcon.png | Bin 0 -> 3773 bytes .../Resources/Icons/FloorIcon.png.meta | 139 +++++ .../Resources/Icons/PillarIcon.png | Bin 0 -> 795 bytes .../Resources/Icons/PillarIcon.png.meta | 139 +++++ .../Resources/Icons/RectTool.png | Bin 0 -> 585 bytes .../Resources/Icons/RectTool.png.meta | 139 +++++ .../Floorplan-2.0/Resources/Materials.meta | 8 + .../Resources/Materials/Preview.mat | 78 +++ .../Resources/Materials/Preview.mat.meta | 8 + Packages/Floorplan-2.0/Resources/Prefabs.meta | 8 + .../Resources/Prefabs/Text (TMP).prefab | 206 +++++++ .../Resources/Prefabs/Text (TMP).prefab.meta | 7 + Packages/Floorplan-2.0/Scripts.meta | 8 + Packages/Floorplan-2.0/Scripts/Abstract.meta | 8 + .../Floorplan-2.0/Scripts/Abstract/Tool.cs | 254 ++++++++ .../Scripts/Abstract/Tool.cs.meta | 11 + .../Floorplan-2.0/Scripts/DrawGizmoGrid.cs | 102 ++++ .../Scripts/DrawGizmoGrid.cs.meta | 11 + Packages/Floorplan-2.0/Scripts/Enums.meta | 8 + .../Floorplan-2.0/Scripts/Enums/TileTypes.cs | 10 + .../Scripts/Enums/TileTypes.cs.meta | 11 + .../Floorplan-2.0/Scripts/Enums/ToolTypes.cs | 12 + .../Scripts/Enums/ToolTypes.cs.meta | 11 + .../Scripts/MeshColliderTools.cs | 547 +++++++++++++++++ .../Scripts/MeshColliderTools.cs.meta | 11 + .../Floorplan-2.0/Scripts/MeshCombiner.cs | 298 +++++++++ .../Scripts/MeshCombiner.cs.meta | 11 + .../Floorplan-2.0/Scripts/MeshExtension.cs | 104 ++++ .../Scripts/MeshExtension.cs.meta | 11 + ...exism.floorplacom.alexism.floorplan.asmdef | 17 + ....floorplacom.alexism.floorplan.asmdef.meta | 7 + Packages/Floorplan-2.0/Scripts/floorplan.cs | 115 ++++ .../Floorplan-2.0/Scripts/floorplan.cs.meta | 12 + .../Scripts/floorplanComponent.cs | 136 +++++ .../Scripts/floorplanComponent.cs.meta | 11 + .../Floorplan-2.0/Scripts/floorplanTileset.cs | 14 + .../Scripts/floorplanTileset.cs.meta | 11 + Packages/Floorplan-2.0/Static.meta | 8 + .../Floorplan-2.0/Static/GridUtilityEditor.cs | 571 ++++++++++++++++++ .../Static/GridUtilityEditor.cs.meta | 11 + Packages/Floorplan-2.0/Static/MeshWelder.cs | 194 ++++++ .../Floorplan-2.0/Static/MeshWelder.cs.meta | 11 + .../com.alexismorin.floorplan.static.asmdef | 13 + ...m.alexismorin.floorplan.static.asmdef.meta | 7 + Packages/Floorplan-2.0/package.json | 12 + Packages/Floorplan-2.0/package.json.meta | 7 + Packages/manifest.json | 1 - Packages/packages-lock.json | 13 +- 129 files changed, 9157 insertions(+), 8 deletions(-) create mode 100644 Packages/Floorplan-2.0/.gitattributes create mode 100644 Packages/Floorplan-2.0/DefaultTileset.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/DefaultTileset.asset create mode 100644 Packages/Floorplan-2.0/DefaultTileset/DefaultTileset.asset.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mech_arch.fbx create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mech_arch.fbx.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_arch_large_1.fbx create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_arch_large_1.fbx.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_arch_large_2.fbx create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_arch_large_2.fbx.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_arch_large_3.fbx create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_arch_large_3.fbx.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_door.fbx create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_door.fbx.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_pillar.fbx create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_pillar.fbx.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_tile.fbx create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_tile.fbx.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_wall.fbx create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_wall.fbx.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_window.fbx create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_window.fbx.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_window_large_1.fbx create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_window_large_1.fbx.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_window_large_2.fbx create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_window_large_2.fbx.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_arch.prefab create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_arch.prefab.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_arch_bathroom.prefab create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_arch_bathroom.prefab.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_arch_large_1.prefab create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_arch_large_1.prefab.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_arch_large_2.prefab create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_arch_large_2.prefab.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_arch_large_3.prefab create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_arch_large_3.prefab.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_door.prefab create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_door.prefab.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_pillar.prefab create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_pillar.prefab.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_tile.prefab create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_tile.prefab.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_wall 1.prefab create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_wall 1.prefab.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_wall.prefab create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_wall.prefab.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_wall_bathroom_dirty 1.prefab create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_wall_bathroom_dirty 1.prefab.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_wall_bathroom_dirty 2.prefab create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_wall_bathroom_dirty 2.prefab.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_wall_bathroom_dirty 3.prefab create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_wall_bathroom_dirty 3.prefab.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_wall_bathroom_dirty 4.prefab create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_wall_bathroom_dirty 4.prefab.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_window.prefab create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_window.prefab.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_window_large_1.prefab create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_window_large_1.prefab.meta create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_window_large_2.prefab create mode 100644 Packages/Floorplan-2.0/DefaultTileset/Prefabs/prefab_window_large_2.prefab.meta create mode 100644 Packages/Floorplan-2.0/Editor.meta create mode 100644 Packages/Floorplan-2.0/Editor/com.alexism.floorplan.editor.asmdef create mode 100644 Packages/Floorplan-2.0/Editor/com.alexism.floorplan.editor.asmdef.meta create mode 100644 Packages/Floorplan-2.0/Editor/floorplanComponentEditor.cs create mode 100644 Packages/Floorplan-2.0/Editor/floorplanComponentEditor.cs.meta create mode 100644 Packages/Floorplan-2.0/Editor/floorplanEditor.cs create mode 100644 Packages/Floorplan-2.0/Editor/floorplanEditor.cs.meta create mode 100644 Packages/Floorplan-2.0/Editor/floorplanMenuItem.cs create mode 100644 Packages/Floorplan-2.0/Editor/floorplanMenuItem.cs.meta create mode 100644 Packages/Floorplan-2.0/LICENSE create mode 100644 Packages/Floorplan-2.0/LICENSE.meta create mode 100644 Packages/Floorplan-2.0/README.md create mode 100644 Packages/Floorplan-2.0/README.md.meta create mode 100644 Packages/Floorplan-2.0/Resources.meta create mode 100644 Packages/Floorplan-2.0/Resources/Icons.meta create mode 100644 Packages/Floorplan-2.0/Resources/Icons/BrickIcon.png create mode 100644 Packages/Floorplan-2.0/Resources/Icons/BrickIcon.png.meta create mode 100644 Packages/Floorplan-2.0/Resources/Icons/FilledRectTool.png create mode 100644 Packages/Floorplan-2.0/Resources/Icons/FilledRectTool.png.meta create mode 100644 Packages/Floorplan-2.0/Resources/Icons/FloorIcon.png create mode 100644 Packages/Floorplan-2.0/Resources/Icons/FloorIcon.png.meta create mode 100644 Packages/Floorplan-2.0/Resources/Icons/PillarIcon.png create mode 100644 Packages/Floorplan-2.0/Resources/Icons/PillarIcon.png.meta create mode 100644 Packages/Floorplan-2.0/Resources/Icons/RectTool.png create mode 100644 Packages/Floorplan-2.0/Resources/Icons/RectTool.png.meta create mode 100644 Packages/Floorplan-2.0/Resources/Materials.meta create mode 100644 Packages/Floorplan-2.0/Resources/Materials/Preview.mat create mode 100644 Packages/Floorplan-2.0/Resources/Materials/Preview.mat.meta create mode 100644 Packages/Floorplan-2.0/Resources/Prefabs.meta create mode 100644 Packages/Floorplan-2.0/Resources/Prefabs/Text (TMP).prefab create mode 100644 Packages/Floorplan-2.0/Resources/Prefabs/Text (TMP).prefab.meta create mode 100644 Packages/Floorplan-2.0/Scripts.meta create mode 100644 Packages/Floorplan-2.0/Scripts/Abstract.meta create mode 100644 Packages/Floorplan-2.0/Scripts/Abstract/Tool.cs create mode 100644 Packages/Floorplan-2.0/Scripts/Abstract/Tool.cs.meta create mode 100644 Packages/Floorplan-2.0/Scripts/DrawGizmoGrid.cs create mode 100644 Packages/Floorplan-2.0/Scripts/DrawGizmoGrid.cs.meta create mode 100644 Packages/Floorplan-2.0/Scripts/Enums.meta create mode 100644 Packages/Floorplan-2.0/Scripts/Enums/TileTypes.cs create mode 100644 Packages/Floorplan-2.0/Scripts/Enums/TileTypes.cs.meta create mode 100644 Packages/Floorplan-2.0/Scripts/Enums/ToolTypes.cs create mode 100644 Packages/Floorplan-2.0/Scripts/Enums/ToolTypes.cs.meta create mode 100644 Packages/Floorplan-2.0/Scripts/MeshColliderTools.cs create mode 100644 Packages/Floorplan-2.0/Scripts/MeshColliderTools.cs.meta create mode 100644 Packages/Floorplan-2.0/Scripts/MeshCombiner.cs create mode 100644 Packages/Floorplan-2.0/Scripts/MeshCombiner.cs.meta create mode 100644 Packages/Floorplan-2.0/Scripts/MeshExtension.cs create mode 100644 Packages/Floorplan-2.0/Scripts/MeshExtension.cs.meta create mode 100644 Packages/Floorplan-2.0/Scripts/com.alexism.floorplacom.alexism.floorplan.asmdef create mode 100644 Packages/Floorplan-2.0/Scripts/com.alexism.floorplacom.alexism.floorplan.asmdef.meta create mode 100644 Packages/Floorplan-2.0/Scripts/floorplan.cs create mode 100644 Packages/Floorplan-2.0/Scripts/floorplan.cs.meta create mode 100644 Packages/Floorplan-2.0/Scripts/floorplanComponent.cs create mode 100644 Packages/Floorplan-2.0/Scripts/floorplanComponent.cs.meta create mode 100644 Packages/Floorplan-2.0/Scripts/floorplanTileset.cs create mode 100644 Packages/Floorplan-2.0/Scripts/floorplanTileset.cs.meta create mode 100644 Packages/Floorplan-2.0/Static.meta create mode 100644 Packages/Floorplan-2.0/Static/GridUtilityEditor.cs create mode 100644 Packages/Floorplan-2.0/Static/GridUtilityEditor.cs.meta create mode 100644 Packages/Floorplan-2.0/Static/MeshWelder.cs create mode 100644 Packages/Floorplan-2.0/Static/MeshWelder.cs.meta create mode 100644 Packages/Floorplan-2.0/Static/com.alexismorin.floorplan.static.asmdef create mode 100644 Packages/Floorplan-2.0/Static/com.alexismorin.floorplan.static.asmdef.meta create mode 100644 Packages/Floorplan-2.0/package.json create mode 100644 Packages/Floorplan-2.0/package.json.meta diff --git a/Packages/Floorplan-2.0/.gitattributes b/Packages/Floorplan-2.0/.gitattributes new file mode 100644 index 00000000..dfe07704 --- /dev/null +++ b/Packages/Floorplan-2.0/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/Packages/Floorplan-2.0/DefaultTileset.meta b/Packages/Floorplan-2.0/DefaultTileset.meta new file mode 100644 index 00000000..824e03f1 --- /dev/null +++ b/Packages/Floorplan-2.0/DefaultTileset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 749ab9885ade742439b98417ba092f34 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/DefaultTileset/DefaultTileset.asset b/Packages/Floorplan-2.0/DefaultTileset/DefaultTileset.asset new file mode 100644 index 00000000..60dbe972 --- /dev/null +++ b/Packages/Floorplan-2.0/DefaultTileset/DefaultTileset.asset @@ -0,0 +1,33 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8441b0125f23fb644b2d1fbd1835ee18, type: 3} + m_Name: DefaultTileset + m_EditorClassIdentifier: + floorTiles: + - {fileID: 254791854324832132, guid: 381ed00a800c7ae438567827f63d59ab, type: 3} + wallTiles: + - {fileID: 521578371659750298, guid: b15f933ae2fe0b545a5adfb036e3a417, type: 3} + - {fileID: 521578371659750298, guid: 6a1ffa776d6688a44a0f14835e3e53a5, type: 3} + - {fileID: 521578371659750298, guid: 48f9a004f13996242846f8a5989d3a98, type: 3} + - {fileID: 521578371659750298, guid: 842c193116fb587429cad010c2d09e8f, type: 3} + - {fileID: 521578371659750298, guid: f10f378709028f44dae833efc1cc7289, type: 3} + - {fileID: 521578371659750298, guid: 4f27ddea839e7eb498d34e23bd316a5f, type: 3} + - {fileID: 764512528839231858, guid: 934ba286f9a61cf4c8abe65a39b8202c, type: 3} + - {fileID: 2760337413371881268, guid: 7779d0ef6488ede469edbd327dca5fe4, type: 3} + - {fileID: 2760337413371881268, guid: 97aa43477860ad04fa4d579a5633e9a2, type: 3} + - {fileID: 2760337413371881268, guid: a4fd8598690fb414694e3b5f97fd42ac, type: 3} + - {fileID: 764512528839231858, guid: 6aa0301cf6fc3f34c8f9b20f9547c567, type: 3} + - {fileID: -927199367670048503, guid: cb3740ab608be7c4aa803b547e7fc259, type: 3} + - {fileID: 2760337413371881268, guid: 2d6fde89eebde394db4dac2e1e2bc81f, type: 3} + - {fileID: 2760337413371881268, guid: bdbaa7cf00eee39429b788a3c83408eb, type: 3} + pillarTiles: + - {fileID: 6653626983322759584, guid: b4e0bf2c4458c7d4781665e683e55262, type: 3} diff --git a/Packages/Floorplan-2.0/DefaultTileset/DefaultTileset.asset.meta b/Packages/Floorplan-2.0/DefaultTileset/DefaultTileset.asset.meta new file mode 100644 index 00000000..2b786037 --- /dev/null +++ b/Packages/Floorplan-2.0/DefaultTileset/DefaultTileset.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 04655de02232d0642ad32b971b2e2a91 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/DefaultTileset/Meshes.meta b/Packages/Floorplan-2.0/DefaultTileset/Meshes.meta new file mode 100644 index 00000000..435504d4 --- /dev/null +++ b/Packages/Floorplan-2.0/DefaultTileset/Meshes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8637391c73eb48c408b66ff24ac4dde2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/DefaultTileset/Meshes/mech_arch.fbx b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mech_arch.fbx new file mode 100644 index 0000000000000000000000000000000000000000..cccd617a261a92a2dcd321a8db056b7cb1aca926 GIT binary patch literal 38364 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 PL3;V)Zl%hMQD*-K`hUsK literal 0 HcmV?d00001 diff --git a/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_arch_large_1.fbx.meta b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_arch_large_1.fbx.meta new file mode 100644 index 00000000..3ccf39f1 --- /dev/null +++ b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_arch_large_1.fbx.meta @@ -0,0 +1,99 @@ +fileFormatVersion: 2 +guid: 826fbfbb0ca21c848bf195205513c6dd +ModelImporter: + serializedVersion: 19300 + internalIDToNameTable: + - first: + 74: 3889634814954103615 + second: Body|Idle + externalObjects: {} + materials: + materialImportMode: 1 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_arch_large_2.fbx b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_arch_large_2.fbx new file mode 100644 index 0000000000000000000000000000000000000000..a3e95a23bd996b5dc28fcc0599ed8c3348025902 GIT binary patch literal 16380 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 QWkGuR<8GzOj8SI)2fOCU9smFU literal 0 HcmV?d00001 diff --git a/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_arch_large_2.fbx.meta b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_arch_large_2.fbx.meta new file mode 100644 index 00000000..f658bbc1 --- /dev/null +++ b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_arch_large_2.fbx.meta @@ -0,0 +1,99 @@ +fileFormatVersion: 2 +guid: ffb966328d8740d44962d1822eeb11c7 +ModelImporter: + serializedVersion: 19300 + internalIDToNameTable: + - first: + 74: 3889634814954103615 + second: Body|Idle + externalObjects: {} + materials: + materialImportMode: 1 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_arch_large_3.fbx b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_arch_large_3.fbx new file mode 100644 index 0000000000000000000000000000000000000000..0762e9177a0694654c7891705fe8f41052565281 GIT binary patch literal 15212 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 literal 0 HcmV?d00001 diff --git a/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_arch_large_3.fbx.meta b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_arch_large_3.fbx.meta new file mode 100644 index 00000000..577e3aa3 --- /dev/null +++ b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_arch_large_3.fbx.meta @@ -0,0 +1,99 @@ +fileFormatVersion: 2 +guid: f73f85382a251584ba9bb903fab009e3 +ModelImporter: + serializedVersion: 19300 + internalIDToNameTable: + - first: + 74: 3889634814954103615 + second: Body|Idle + externalObjects: {} + materials: + materialImportMode: 1 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 1 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_door.fbx b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_door.fbx new file mode 100644 index 0000000000000000000000000000000000000000..814cefbf0756bb80b7ec89bfa8e8e8625298e83d GIT binary patch literal 14940 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 literal 0 HcmV?d00001 diff --git a/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_door.fbx.meta b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_door.fbx.meta new file mode 100644 index 00000000..9c8d4c26 --- /dev/null +++ b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_door.fbx.meta @@ -0,0 +1,95 @@ +fileFormatVersion: 2 +guid: 209ba71e1b105f34e9309b2f4a3ff7f1 +ModelImporter: + serializedVersion: 28 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 0 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + swapUVChannels: 0 + generateSecondaryUV: 1 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 0 + humanoidOversampling: 1 + avatarSetup: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_pillar.fbx b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_pillar.fbx new file mode 100644 index 0000000000000000000000000000000000000000..9b27ca8856a9075d489ebea326efcb9b22c6cdd1 GIT binary patch literal 14860 zcmc&*dvF}ZnIB=Ye!uRX z-C1d8cP;&qE{}I+y1!q4um1Y$?$IWFJf=H(O=s&(HLa$lJL5Gq+9letOEs;#Ld%qe zsNZPlF~jK?a}6tH+Scb#S%zySt_7LuLBnBX`1lM>8}qfOMhmZw;1Bxh=5<(6XFTbG zZeToVgi)p4MQBydZ*vS?)S3w+;_8XyE2#1MuE@Zm%XfSgF89$Mpu1%217NV)n@+z=KD_pYp2Q&V5t*ihSm zo3*v|q1uLK$Z{SCmgB05L=DRbTf=tblX%<^w}tIJ;(R}U3;an+i-Pa89}Xg`zmG*m~PyNkobPz>xxKvXuA=0Ma4IL z6|-8>?kH43f*pp_zpjsXn6Io4fQ*< z!$V_FE12t12bg(m;zXx{bQDPCAYUqxXsuqy9Kq0y3)4Zwq@A{6k`2^qH=sF1=)#4* z>Es^8?v`XSZbrr68icz+&wh!}Qj<6fapyT?C*cLjLkhVUwLqqC=R@w%F>LeWa%_3H z6CC|r1>PdT{~`cfjs5`qS)h``r5!4u7P=)IM@NQNIIl5)*z)-e-2+02-ixdfBjhwx zcQyXiU9&z^6AE1`{?&#;p?ejyGVb|)=uR_k6p)|(0QW1tz3TXPm%jYMbBDjR>dC84|L!T(jxx{5 zncS!^`q!FJ9sbqSDKCSsg-$4Q zlM@(|pkQlGRd7`fw9UzuF*7CNpot(0ezmaW8Y6~`-eGp|bw##Dl2vEP%n_?F={t&a zwIt=>=yWid7w#0{U;7l=lGl)=Erq@-=QW#ZkVSL7=j+nr!GH?Z&X4j=OD`yc|6s`dol^$QEMhC=#_kq`pa{Fy>BU zpMqP4dWcM(IKOn;F(bnGZdmC=c5VrC7WkBaJaqM{x!#+jtGj>}#<=Tl(2P){t6j|KZjm-cGD34Gi zRjRzqC-ne&^#ae#He?pA2ond;nEBLVT$NtquGg3Rcr6ixEFz!H-o9ZwwobVMUEpPSY2z%0AA9%bFNbNPSbkQ+-m3OhAv}p%QUq zg2JhtLG_xVR!hx@)c~VT?o<(;3_!e`@(5-xOj1akr&1U(&P6E4_;gQ(wjb&ky5;o+3wPSwyAFfD=qQUcRf9&n$z z)1ET!=O^QGmPcwhJ$}EdaKn;cT14Sai{0M?miDQYuv~EsIJ%XBO`u{Ks`I%m+G(2* z;wIR}M>~yS{a9h(sgLeA0ZeIq11*>1n}TFrgaoA^<<=m|{$i9j2T|@XOsS6ra{E#- z%0O_Qsx=qyA|E1VHb>Wu8lo9q-;^6({{Sdgz5HL z@w|Z-?X?#b#&r?{KApvI&Ea9oNTqHno^)y2JS=u8ej%W(r2uUy0qEvZfbLg7At@Ti z8<$I6hE<$;Y4dSVlSJkCOpp5jx zB!T`=1f(Q!RxOb`f@-RvI9;~Aqs8^Mn?#N}aZhkaQK>1I?z%ZC)6jx+Uj`k+4}KVw zIl)Ip?c4G#pUP18hHBm@n`0i(dW;dQYj+yhV8-dbi)|Sk)2EY38@s}U%d@Am_zKyn zLcv1A+s|%saaujZ?-%fO!C3H#3y%`F#6rbzqy=D!*pVO6<%`HR%N!6i5A{ zLhVFjn3MS%QN1~8;`1cTd^6OGz@&@ROH5{IzHPe+k9iOmEtT{gk{+ukAAOBVFLmr4 zM+#I4T>d9E1$k3K`Oa0)0@`s>^>5Kt;<=j}W~Ls$9o(@ECG>6aKcPsOrA*%FrPZ;~ z8%aCESWWkh+SbU!An;1gZrzM!61)zzFbVC-txIfPiCw~gvm3G_a2pl*a!F2gcjMs4 z?9#{8`ah4S?*$Q^t5p(F{*Hv1N@1AF&1S-9kDiJ;>tV%&askF956^ef<~v@?L43dI zA{=j!pB7w72RX-LdD)SB-9Pa*y?r->fFp@gDaBK8C2{lkWNzBAp^;7%QqH8E_sm}W zuP1Y(;7a0VJuFMzbV%JWa*F_y)RAVWW5c}qK|@g{2bo=fB#Fu?xpk9;jEui7Pbf~6QLrnLr-Rb@y?&MC*B7%QIIvE~b*Dhg z3Jwyxfk#F9VwQ*JV=CB>zo+QeNd3`|BcnLL)$N#>> z98Z-Bd2*Xth;cUq@8CaLrFY=kwf*8ZuzZB3=<+;5#m8%nTA5cbax}iab~Rhck~7hI zFU9X?(aM|F=X)65x465}un!~cD?nR=YQ0)_FtY2-MY)YRjc^Jk}tNy zX$X_RwXn~QkB`_E`!L2tUTd-&mTlsH*_IkPgS7TM{PLc*`WVj)cD$!Ie28cI4eyDM z$Fuz9Guxb2^|%!u-ID%3#mfzB(-9jnQYLc{mXQ1rQ2uVcF6i^sxMt&;i;G_P?ONG2 zyIUxdkdC+rdNRm|@mf2gx)f}CN;gpP8(&4a_(*}x7b{5SS{GuLNFq1lSHYMx=l3S)4{;`nrh#HHx-iGRE*}Q2I;0W`17+q^YiE@jBWoo z@JRoe(3ZFBD{7y+{H4~%oBCGtJbA~1JC6M9hwohe)V|0u`*Z(0yiL>gK6Zr((rkGY zN+lp=pXb-l=0TyG6F&WAK7F8WW?d}_sdT9uT0WsC>uyjr=cpf7k#Rf)>xXs~PB~yp zHO*H7>_^3Un+Icb5(=~j*H~Hl-lyl@8JbgmOMP|Zo_`3h_{BY+{Es8CzuDhBx4V4t z-1vg89A5rUm8*`Q`M+I%yLauO*B*cS(a-+d^}l^@)0Y+Fbq+2!`5zdZTo zAK$xi_p=+0-nU`bdug_`Z*PS_iblrik z&A;O(O{dP@+5LBlwFFqHfIhiK%o$4@HyjHTnT34gcv7Pic#cf1ax!F8=E`#cu1Z`~ z1a(hOqw$2c@jDL}2ZuLka4XAxq@SLpFYsI1TUrQv|4Q*p$Q*nB-dB+w3riFzdkY#1 zl&~cpkKn_nn^g02wDBHAc0Q1*Ja$tirD36pCY70p+Mc*Gg}6e#XB1S9d@)d8S)YZN z<5$laML{FTkNU~Izl9u}7X!fSu$n<2CJZim%|hdDe^5_Rg+LdOJ<*u{o;DBeDYcgm zf_iyHA>a^1^+MP2_u^^zc&UAXKA_Yir=XWF#f3i>!Dl92mwY(yTDFeRgOhFPA)`(! zlWR*Fl5?i+vt7mskD>BAYw@2dIg{ysf`We5gG=Qf)7kpid*6fNROPL+XAk^fH994> zh`n+}T=Le(zaM_`Ig+$@pQse;48#JUA z)gm&&k=o zU{kSCao9&&JwfaQjiO49n}x7M72yn(FdCy?@uj!~ddoYe^WE&33|D-g0dURMoTmg_ z?#&MXNBI!2$Q{R5>H7?rIj|#5;aaog-U_5>2JaI}dH7pRJ-{P73`AguvCP9OA%8#8 zv`^8mk@QuhFS4R}?0^3Fr?Y1pnqO9=ura&lypbU-vZC=IE`twH8x#i+bm;8*V@mqi z21M!uV~U8J$g_wgXawy`D@%BKqsr_y+p^>`EcKEaY>fP6Z4r*#-rh_+?(#_9%iGLb z?_}CvfL=IsbJ4t^n`!2uir=k1&So-{q`L6Ni#`Y#4mXj+*v_HLdHCp=uU8#8{Mzu- oJ3s#GOaFA`9ob6$E##l8d~oyr?Qfp?#T_T!opUsOVCC%p2TJb&{r~^~ literal 0 HcmV?d00001 diff --git a/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_pillar.fbx.meta b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_pillar.fbx.meta new file mode 100644 index 00000000..80300fd4 --- /dev/null +++ b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_pillar.fbx.meta @@ -0,0 +1,95 @@ +fileFormatVersion: 2 +guid: cf71fdf079dbc574f992c8fffc463935 +ModelImporter: + serializedVersion: 28 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 0 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + swapUVChannels: 0 + generateSecondaryUV: 1 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 0 + humanoidOversampling: 1 + avatarSetup: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_tile.fbx b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_tile.fbx new file mode 100644 index 0000000000000000000000000000000000000000..a94ff30ab1a967b151148243eff18d615f24bb73 GIT binary patch literal 14508 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 U?SB4^Uw-t&v4*4ByVuPBUut0nrvLx| literal 0 HcmV?d00001 diff --git a/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_wall.fbx.meta b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_wall.fbx.meta new file mode 100644 index 00000000..b1fdcb00 --- /dev/null +++ b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_wall.fbx.meta @@ -0,0 +1,95 @@ +fileFormatVersion: 2 +guid: 9ba1cf0f4d4975a4d8b5ff5a2acac3db +ModelImporter: + serializedVersion: 28 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 0 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + swapUVChannels: 0 + generateSecondaryUV: 1 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 0 + humanoidOversampling: 1 + avatarSetup: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_window.fbx b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_window.fbx new file mode 100644 index 0000000000000000000000000000000000000000..954cd3803c3051a20c2014abc59c212cd73e5b09 GIT binary patch literal 15692 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 hc8@tyCH3pNp_GP^q{vQls|8oEU literal 0 HcmV?d00001 diff --git a/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_window.fbx.meta b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_window.fbx.meta new file mode 100644 index 00000000..e1c9de19 --- /dev/null +++ b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_window.fbx.meta @@ -0,0 +1,95 @@ +fileFormatVersion: 2 +guid: cb3740ab608be7c4aa803b547e7fc259 +ModelImporter: + serializedVersion: 28 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 0 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 1 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + swapUVChannels: 0 + generateSecondaryUV: 1 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + animationType: 0 + humanoidOversampling: 1 + avatarSetup: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_window_large_1.fbx b/Packages/Floorplan-2.0/DefaultTileset/Meshes/mesh_window_large_1.fbx new file mode 100644 index 0000000000000000000000000000000000000000..89a1a5a0317597d58557f4fce2d4df0b307bc064 GIT binary patch literal 15964 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 selectedMaterials = new List(4); + + GUIContent[] drawToolStrings; + + Abstract.Tool currentTool; + Abstract.Tool[] tools = { new RectangleStrat(), new RectangleFilledStrat() }; + + GUIContent[] drawItemTextures; + Material[] materials; + + GameObject[] selecting; + + + Renderer currentObjectRenderer; + + GUIStyle TitleLabels; + + Vector2 scrollPos; + Vector2 scrollPos2; + + + void print(object print) + { + Debug.Log(print); + } + private void Awake() + { + script = (floorplan)target; + materials = new Material[0]; + } + + public void OnDisable() + { + + if (SceneView.lastActiveSceneView) + { + SceneView.lastActiveSceneView.isRotationLocked = false; + SceneView.lastActiveSceneView.rotation = Quaternion.identity; + SceneView.lastActiveSceneView.orthographic = false; + } + } + + + public void OnEnable() + { + + script = (floorplan)target; + if (SceneView.lastActiveSceneView) + { + SceneView.lastActiveSceneView.isRotationLocked = false; + SceneView.lastActiveSceneView.rotation = Quaternion.LookRotation(-Vector3.up, Vector3.up); + SceneView.lastActiveSceneView.isRotationLocked = true; + SceneView.lastActiveSceneView.orthographic = true; + } + drawToolStrings = new GUIContent[]{ + new GUIContent("0",Resources.Load("icons/RectTool"),"Rectangle"), + new GUIContent("1",Resources.Load("icons/FilledRectTool"),"Filled rectangle") + }; + drawItemTextures = new GUIContent[] { + new GUIContent("0",Resources.Load("icons/BrickIcon"),"Wall"), + new GUIContent("1",Resources.Load("icons/PillarIcon"),"Pillar"), + new GUIContent("2",Resources.Load("icons/FloorIcon"),"Floor") + }; + drawToolInt = EditorPrefs.GetInt("DrawTool", 0); + drawObjetInt = EditorPrefs.GetInt("DrawObjet", 0); + materials = new Material[0]; + if (script.selected.Count < 4 || selectedMaterials.Count < 4) + { + selectedMaterials = new List(4) { -1, -1, -1, -1 }; + script.selected = selectedMaterials; + } + else if(script.selected.Count > 4 || selectedMaterials.Count > 4) + { + selectedMaterials = new List(4) { -1, -1, -1, -1 }; + script.selected = selectedMaterials; + } + + } + public override void OnInspectorGUI() + { + DrawDefaultInspector(); + //Display drawing tools + + TitleLabels = new GUIStyle() + { + fontStyle = FontStyle.Normal + }; + TitleLabels.normal.textColor = Color.white; + script = (floorplan)target; + + //Saving certain variables (selected draw tool, selected object, selected material) + EditorPrefs.SetInt("DrawTool", drawToolInt); + EditorPrefs.SetInt("DrawObjet", drawObjetInt); + + //Generate toolbars for the drawing tools and objects. + EditorGUILayout.BeginVertical("Box"); + { + EditorGUILayout.BeginHorizontal("Box"); + { + GUILayout.Label("Drawing tools", TitleLabels, GUILayout.Height(16), GUILayout.Width(96)); + drawToolInt = GUILayout.Toolbar(drawToolInt, drawToolStrings, GUILayout.Width(48 * drawToolStrings.Length), GUILayout.Height(48)); + + GUILayout.Label("Objects", TitleLabels, GUILayout.Height(16), GUILayout.Width(64)); + drawObjetInt = GUILayout.Toolbar(drawObjetInt, drawItemTextures, GUILayout.Width(48 * drawItemTextures.Length), GUILayout.Height(48)); + currentTool = tools[drawToolInt]; + } + EditorGUILayout.EndHorizontal(); + } + EditorGUILayout.EndVertical(); + + EditorGUILayout.BeginVertical("Box"); + { + EditorGUILayout.LabelField("Tile", TitleLabels); + scrollPos2 = EditorGUILayout.BeginScrollView(scrollPos2, GUILayout.Width(450), GUILayout.Height(64)); + { + + selecting = IndexToTileArray(drawObjetInt); + GUIContent[] thumbnails = new GUIContent[selecting.Length]; + + for (int t = 0; t < selecting.Length; t++) + { + if (selecting[t] != null) + thumbnails[t] = new GUIContent(t.ToString(), AssetPreview.GetAssetPreview(selecting[t]), selecting[t].name); + } + selectedObject = GUILayout.Toolbar(selectedObject, thumbnails, GUILayout.Width(75 * selecting.Length), GUILayout.Height(50)); + } + EditorGUILayout.EndScrollView(); + } + EditorGUILayout.EndVertical(); + + currentObjectRenderer = selecting[selectedObject].GetComponentInChildren(); + + for (int i = 0; i < currentObjectRenderer.sharedMaterials.Length; i++) + { + if (!materials.Any(x => (x == null))) + { + EditorGUILayout.BeginVertical("Box"); + { + EditorGUILayout.LabelField("Material " + (i + 1).ToString(), TitleLabels); + scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.Width(250), GUILayout.Height(64)); + { + + //Generate material selection + materials = script.wallMaterials; + GUIContent[] materialPreviews = new GUIContent[materials.Length]; + + for (int m = 0; m < materials.Length; m++) + { + if (materials[m] != null) + materialPreviews[m] = new GUIContent(m.ToString(), materials[m].mainTexture, materials[m].name); + } + selectedMaterials[i] = GUILayout.Toolbar(selectedMaterials[i], materialPreviews, GUILayout.Width(50 * materials.Length), GUILayout.Height(50)); + } + EditorGUILayout.EndScrollView(); + } + EditorGUILayout.EndVertical(); + } + } + } + + public GameObject[] IndexToTileArray(int ind) + { + GameObject[] returning=new GameObject[0]; + switch (ind) + { + case 0: + returning = script.tileset.wallTiles; + break; + case 1: + returning = script.tileset.pillarTiles; + break; + case 2: + returning = script.tileset.floorTiles; + break; + } + + return returning; + } + + public static Vector3 snap(Vector3 pos, int v) + { + float x = pos.x; + float y = pos.y; + float z = pos.z; + x = Mathf.RoundToInt(x / v) * v; + y = Mathf.RoundToInt(y / v) * v; + z = Mathf.RoundToInt(z / v) * v; + return new Vector3(x, y, z); + } + + public void GetMousePosition(Vector3 MouseScreenPosition,out Vector3 MouseWorldPosition) + { + MouseWorldPosition = Vector3.zero; //initialize MouseWorldPosition as Vector3.zero + Ray ray = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition); + RaycastHit hit; + if (Physics.Raycast(ray, out hit)) + { + MouseWorldPosition = snap(hit.point, (int)script.tileSize); + MouseWorldPosition.y = hit.point.y; + } + } + + void OnSceneGUI() + { + floorplan script = (floorplan)target; + if (mouseEnd!=Vector3.zero && mouseStart != Vector3.zero) + { + currentTool.RenderPreview(); + } + HandleUtility.AddDefaultControl(GUIUtility.GetControlID(FocusType.Keyboard)); + Event e = Event.current; + + switch (e.type) + { + case EventType.KeyDown: + { + break; + } + case EventType.MouseDown: + { + if (Event.current.button != 0) + { + return; + } + if (selectedMaterials.All(r => r == -1)) + { + Debug.Log("No material selected. Select a material before drawing"); + return; + } + GetMousePosition(Event.current.mousePosition, out mouseStart); + currentTool.MouseDown(mouseStart); + break; + } + case EventType.MouseDrag: + { + if (Event.current.button != 0 || mouseStart == Vector3.zero) + return; + GetMousePosition(Event.current.mousePosition, out mouseEnd); + currentTool.MouseDrag(mouseEnd); + break; + } + case EventType.MouseUp: + { + if (mouseEnd == Vector3.zero || mouseStart == Vector3.zero) + return; + GetMousePosition(Event.current.mousePosition, out mouseEnd); + currentTool.MouseUp(mouseEnd, (TileTypes)drawObjetInt,selecting[selectedObject],script,materials,selectedMaterials); + mouseEnd = Vector3.zero; + break; + } + case EventType.ExecuteCommand: + { + Debug.Log(Event.current.commandName); + break; + } + } + } + } +} \ No newline at end of file diff --git a/Packages/Floorplan-2.0/Editor/floorplanEditor.cs.meta b/Packages/Floorplan-2.0/Editor/floorplanEditor.cs.meta new file mode 100644 index 00000000..057813ef --- /dev/null +++ b/Packages/Floorplan-2.0/Editor/floorplanEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0e3dcaa8f5484a543a0e1347a2244fe2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Editor/floorplanMenuItem.cs b/Packages/Floorplan-2.0/Editor/floorplanMenuItem.cs new file mode 100644 index 00000000..3b4a4dfb --- /dev/null +++ b/Packages/Floorplan-2.0/Editor/floorplanMenuItem.cs @@ -0,0 +1,19 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + + +namespace alexism.Floorplan.Core.editor +{ + public class floorplanMenuItem : MonoBehaviour + { + + [MenuItem("Tools/Add Floorplan Handle")] + static void addFloorplanHandle() + { + GameObject floorplanHandleGameObject = new GameObject("New Floorplan Handle"); + floorplanHandleGameObject.AddComponent(); + } + } +} \ No newline at end of file diff --git a/Packages/Floorplan-2.0/Editor/floorplanMenuItem.cs.meta b/Packages/Floorplan-2.0/Editor/floorplanMenuItem.cs.meta new file mode 100644 index 00000000..2205f1eb --- /dev/null +++ b/Packages/Floorplan-2.0/Editor/floorplanMenuItem.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 974d7f4ab24eac949bf3d3cb48dd0128 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: + - defaultTileset: {fileID: 11400000, guid: 04655de02232d0642ad32b971b2e2a91, type: 2} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/LICENSE b/Packages/Floorplan-2.0/LICENSE new file mode 100644 index 00000000..325699cf --- /dev/null +++ b/Packages/Floorplan-2.0/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Bradley Bath + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Packages/Floorplan-2.0/LICENSE.meta b/Packages/Floorplan-2.0/LICENSE.meta new file mode 100644 index 00000000..13e8b114 --- /dev/null +++ b/Packages/Floorplan-2.0/LICENSE.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e1d356df1bc1a0349b98f6e0602e92e9 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/README.md b/Packages/Floorplan-2.0/README.md new file mode 100644 index 00000000..f432b987 --- /dev/null +++ b/Packages/Floorplan-2.0/README.md @@ -0,0 +1,33 @@ +# BEING REWORKED +Due to how awful my code is in this and how much of this code is tailored towards how I'm developing my game rather than fitting a general purpose role, I've decided I'm going to recreate completely it under a new name. This won't get any new updates and I'll update this once the new tool is ready. + +# Floorplan + Based off of the Unity asset by Alexis Morin. + + +This is an extensiive modification to Alexis Morin's floorplan unity plugin. So much so that I believe the code base to be atleast 90% changed if not 100%. + +Bewarned, however, a lot of this code was written by a complete idiot (me) and while I'm developing a game so a lot of features may be based around said game and may not be fit for general purpose. + + +What are the changes I've made, you say? Well: + +1. Completely overhauled controls. Now it's a custom inspector with it's own UI where you can choose which tile you want to draw, it's materials (supports objects with multiple materials) and which tool you want to draw with (currently only a rectangle and filled rectangle tool. The filled rectangle tool only works with floor tiles and the normal rectangle tool only works with walls) + +2. Added a script that combines all the tiles created by floorplan into one big mesh. I found that, even with static batching, performance was significantly reduced especially when post-processing was used. This script just goes through all tiles and combines their meshes. It has a filter for any objects with a rigidbody (to stop stuff like doors that you want to have dynamic hinges on from being merged) + +3. Tileset changes. Before, a tileset only had 1 tile per type (Floor, Wall, Arch, Window). Now there's three categories and it's been changed so each type is an array of game objects so you can have (technically) an infinite amount of tiles per type. + +4. Overlap prevention. Before a tile is placed it checks that area using CheckSphere to make sure there isn't another tile. If there is, it won't place a tile there. (this will only check for objects created by floorplan). Floor tiles however will replace any floor tile at that position. + +5. Multi material support. As aforementioned, I implemented support to choose materials for objects that can have multiple materials on the tile. For this to work, the first child of the tile prefab should be the object that you want to change material for. It only supports up to 4 materials but this can easily be changed (limited due to space each material row takes up) + + +## Roadmap +1. Optimize mesh collider for merged tiles. Currently, when tiles are merged, there's a tonne of redundant triangles that can reduced down to as little as two triangles. I haven't seen any performance problems due to the current mesh, but that may be different for each person. If anyone has any ideas on how I could achieve this, please create an issue. I'm pretty dumb so please link to any specific algorithm I could use. + +2. Better code. This code is very ugly. Performance doesn't suffer from it I believe, but readability and coherence does. + +3. Better undo/redo functionality. Currently it supports the undo/redo of walls you place. + +4. Delete tool. There's currently no way to directly delete tiles without selecting them in the editor and manually deleting them. diff --git a/Packages/Floorplan-2.0/README.md.meta b/Packages/Floorplan-2.0/README.md.meta new file mode 100644 index 00000000..424a043b --- /dev/null +++ b/Packages/Floorplan-2.0/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: be1cd7f75d7689a46be70a919634a369 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Resources.meta b/Packages/Floorplan-2.0/Resources.meta new file mode 100644 index 00000000..24c80d3e --- /dev/null +++ b/Packages/Floorplan-2.0/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 180851805e6493f408ba5f91e794ed35 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Resources/Icons.meta b/Packages/Floorplan-2.0/Resources/Icons.meta new file mode 100644 index 00000000..4477ec8e --- /dev/null +++ b/Packages/Floorplan-2.0/Resources/Icons.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 75afe7b3b08c0aa44b19da3f6d67b0da +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Resources/Icons/BrickIcon.png b/Packages/Floorplan-2.0/Resources/Icons/BrickIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..c317bdbf1fae1a4ba86c39648505149e49faa574 GIT binary patch literal 64041 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⪻A(0$=F#NxBltDnmC*Bdr19X&R#Gm60LRm9k=meZ}ItWrPDIjiMzrLJ+CjHlG z{~w*K;Q2+=TdS}x$#fmz*cQUZ;@os)A`WAuk0fFpTnJ@oIB@fd6)(uk9Ze7-NTQ6w z5;M(fX|E+7DvgYswFskac3>4GqE zzI5k#A6@1gcQk^dFQ49vo-rrF+G8jnfx@XGFzwmBdm84@V*n{XjNXCL8RIAnfRy$r zkRqo?3`}m@tMn$FCf?}i6c?lF>H~l1Gjcj!WTA>U{8~JY3^HrDUWQ<%6bK}C!a%or zKU@4LK?T;wmaOzBSF6GveaJOCa&&C@%TQ1jEOzg{gc5~N4@WH=W_*a)=yim%_Rg3I zDOpz35K62e)#)A>*G|1!?8EXw-7CZYuc|YF>oHyX_!EYX##9E;n3OeJQKC|Ip+f3! zi9cCNwnnmMsq9OPkWwm1MRCG0QpZvl!_-V6X)K2K=W{-1oBq#o zKlgntzw3AXE>TQCVeLQofathoW#1D*A!GAwb5Zs_8tXMgrE{v!(4Rs0SYBQ(`pqkz zo*ki~SL?vvfxF!DVQmdj@edWd44Q@?uZnvLmMGfA6$imyd_g=n<{{;;~kZ=45pnW}= zvmnFaj~xs1yQi#)KA9v<7iC}aot&KP@t>oBGmuUg*0gC;SN%2?3EI6z&);i;0imhc zGQBYrkoiPzr9f@f4GeA^S><+XefXR#;v`fq`iUOC5778d8Z|!kC~li`((e4k)c&yJ z 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 literal 0 HcmV?d00001 diff --git a/Packages/Floorplan-2.0/Resources/Icons/BrickIcon.png.meta b/Packages/Floorplan-2.0/Resources/Icons/BrickIcon.png.meta new file mode 100644 index 00000000..3bc35a74 --- /dev/null +++ b/Packages/Floorplan-2.0/Resources/Icons/BrickIcon.png.meta @@ -0,0 +1,139 @@ +fileFormatVersion: 2 +guid: 96f28131411f7fa48907c02d928a3a77 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + 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 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + 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: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + 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: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Resources/Icons/FilledRectTool.png b/Packages/Floorplan-2.0/Resources/Icons/FilledRectTool.png new file mode 100644 index 0000000000000000000000000000000000000000..44cc4826a6712e341e634915c6da98e1e2618543 GIT binary patch literal 658 zcmV;D0&V??P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0w+mCK~y+TVG0rdk~2CkjmfVdPvq_9!Q#E~*^ z2vkrMFR0&qD)v4H9p>^CvuHODyq@!3&f~ef&!-|HL$O%=U^1EFJg3QIk_rZcZ`bSf z9KI4%DwX0Iklh&!1}7SgMvugDxs*nuQORz%hu|xr-|rVJ7E9p#8k^0wr{?+2YPABX z04LPlZg+R%Dgt@bZCu){-@(tLR4Vl;5{W!VqEIN@DwRqk%QDU9S5Im%7)YnnQ6LbY zP)KZkmCNP6#N+XOklkf_na}6nBU7nV?)iK^((CouB|;a#M%jGhG4FCQ&VAmk?`~AWKcs(VGX+U)gu-)=LIV5!K>X7j}B^*(^FgnGUH)8p~%vE)Q| zpE4W{$5U}Z*=+V`EA&hzbDT&d4ta_~BVv~@W0RA~O+8qeuQx=^cQT85nwdf sey~YwO0R*-#+5u|yN>|lI}v^U15aJ+XinFu`Tzg`07*qoM6N<$g8Nn~K>z>% literal 0 HcmV?d00001 diff --git a/Packages/Floorplan-2.0/Resources/Icons/FilledRectTool.png.meta b/Packages/Floorplan-2.0/Resources/Icons/FilledRectTool.png.meta new file mode 100644 index 00000000..c2be0d01 --- /dev/null +++ b/Packages/Floorplan-2.0/Resources/Icons/FilledRectTool.png.meta @@ -0,0 +1,139 @@ +fileFormatVersion: 2 +guid: 16a16847bb2ec9a498043385cadef5fa +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + 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 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + 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: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + 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: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Resources/Icons/FloorIcon.png b/Packages/Floorplan-2.0/Resources/Icons/FloorIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..b5975f2131fd9f43c374acaaefea4cfd10677565 GIT binary patch literal 3773 zcmb7Hi9b}`{~v2+6g5PQrN+n>O4+wk_NWKLFxI53)7WJQH58d9%2EbTmTcK$G`2yS zY-xms8O!96WXX~t!teGxzklF+Uaxb{J@4=O$mZH9rKAgn&SxLzWho z?11t8pDw@;Tq{vkdBDIMYGUai0JIo^>koiA7;E7i3IYj={OMev=cHpGkdTMvr3(&G zq@@YJ$I?iNcdPsO$MIlG6!dt4iI24jSDhR$H7>08vugk-neG>bz&K_wu;1jqJO$jY;28=Io$Mn25kgly`b zw_1%)OI+15^df)S>?0UkzPlgB6{DZhz=QsWUYn@i2dqaa^rziwXcfK3) zQGswZCU>MK?nyOw6{w2e5k?FaOu-i?jq%`dzB>% za}%%O&Z={@*>1&eXhU>_Q8x@YT~y47kwe;-7Wz^Ub(HVJ*+Wgts7FX@u_83{tpR;0 zfZBtXT{qnTm2f>wog)$9UY1nY#2$pf2;S?VO3{ABCBwav|308|6c^SE(s|watDiSd z^TRB1`YmJ*-bK=;v`QU=dAZNTSJaqy#_>0%oK}}O39wDg!zSL%;1z*sH7^CA>I z=u}~RXsvlC5!9?es=ls_41@JKOjil5E4v7}n~_4UN={>k%*eGrLHRuHG!80{U&zuZ zpsdm+0an}k%!RtKRlr1@@cmMJ@OQSkNUJMLk6ckq-*J`zLtXVmf(vKoXWz(+5D@S;$(XN+BIdY0!L#VvZj2t z_+A%Xc(~*BJxBn8WPSC-?m0~gp?fFhcJovDBe8PZQTt!+WJbH5$`CT+ile&Q&x!qE z^k^QC8vc#4p1X#-5K6>&ubvCc8%zAvd$>1~-{ucv;u3}4PC4T&!4T+;>l;|?y}bSt z+-pd-Za!-x(a+u6`k*gCFrGe<9e8q-OO4y{>hhb|0@#y`j#wUa>u=tgTjF2Qk+Sfo zR+)1@Q`P#Nl1@W$xK00Q8g=WR`l|emgn(K@qH3pRQA7Hm3q(KpaSz&^H5XqvbmfiK zBYt-(hvj#rJ2mj~*2(%if_p;Q=`o`d^}1LQ&fJ1H)vV{HD(3#xJsJ*oio5N6ef2>i z$o9Y_l_Rx#K+~D{Icy=jv;+4)?{c z`)G(Z^{(ny`B#U+e_k z&jhhZz~sNp!!%qSL+Ve4d^a`e9J#ocRs-zBW2meZR}yc_bpuDi3^%tq)e=XjbJ#-u($gl3gWWvT1A0=Cv7ITWN7WAk_Fq&>WcVYbzDNa#U`k!C z8JL$_L>VvAmvX3C$0%>G3X2}cR2?GZ&l3EH$}}QHFgB>@Pa%0DRN@1XKYr#Us6t4z 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 literal 0 HcmV?d00001 diff --git a/Packages/Floorplan-2.0/Resources/Icons/RectTool.png.meta b/Packages/Floorplan-2.0/Resources/Icons/RectTool.png.meta new file mode 100644 index 00000000..45f85eb3 --- /dev/null +++ b/Packages/Floorplan-2.0/Resources/Icons/RectTool.png.meta @@ -0,0 +1,139 @@ +fileFormatVersion: 2 +guid: 8d7cafb452df9a2458eb3240b417c79a +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + 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 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + 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: 1 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 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 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Windows Store Apps + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + 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: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Resources/Materials.meta b/Packages/Floorplan-2.0/Resources/Materials.meta new file mode 100644 index 00000000..702db372 --- /dev/null +++ b/Packages/Floorplan-2.0/Resources/Materials.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 57e4a37311f25eb458b7331e9285d337 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Resources/Materials/Preview.mat b/Packages/Floorplan-2.0/Resources/Materials/Preview.mat new file mode 100644 index 00000000..cfb9e961 --- /dev/null +++ b/Packages/Floorplan-2.0/Resources/Materials/Preview.mat @@ -0,0 +1,78 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 6 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Preview + m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0} + m_ShaderKeywords: _ALPHAPREMULTIPLY_ON + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: 3000 + stringTagMap: + RenderType: Transparent + disabledShaderPasses: [] + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Floats: + - _BumpScale: 1 + - _Cutoff: 0.5 + - _DetailNormalMapScale: 1 + - _DstBlend: 10 + - _GlossMapScale: 1 + - _Glossiness: 0.5 + - _GlossyReflections: 1 + - _Metallic: 0 + - _Mode: 3 + - _OcclusionStrength: 1 + - _Parallax: 0.02 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _UVSec: 0 + - _ZWrite: 0 + m_Colors: + - _Color: {r: 0.18781996, g: 1, b: 0, a: 0.2627451} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Packages/Floorplan-2.0/Resources/Materials/Preview.mat.meta b/Packages/Floorplan-2.0/Resources/Materials/Preview.mat.meta new file mode 100644 index 00000000..8756a566 --- /dev/null +++ b/Packages/Floorplan-2.0/Resources/Materials/Preview.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8301f891926601e43baa728534af9c49 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Resources/Prefabs.meta b/Packages/Floorplan-2.0/Resources/Prefabs.meta new file mode 100644 index 00000000..fefb33e8 --- /dev/null +++ b/Packages/Floorplan-2.0/Resources/Prefabs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a50e142ea1be1ba4e9db72311fe65f34 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Resources/Prefabs/Text (TMP).prefab b/Packages/Floorplan-2.0/Resources/Prefabs/Text (TMP).prefab new file mode 100644 index 00000000..55cd2b5b --- /dev/null +++ b/Packages/Floorplan-2.0/Resources/Prefabs/Text (TMP).prefab @@ -0,0 +1,206 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &6118086287173152400 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6702624060538877900} + - component: {fileID: 5013107265394775091} + - component: {fileID: 4016085969097017413} + - component: {fileID: 8295655866629025237} + - component: {fileID: 2459529298631480252} + m_Layer: 0 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6702624060538877900 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6118086287173152400} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 5} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!23 &5013107265394775091 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6118086287173152400} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 +--- !u!33 &4016085969097017413 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6118086287173152400} + m_Mesh: {fileID: 0} +--- !u!222 &8295655866629025237 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6118086287173152400} + m_CullTransparentMesh: 0 +--- !u!114 &2459529298631480252 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6118086287173152400} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 9541d86e2fd84c1d9990edf0852d74ab, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Sample text + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_outlineColor: + serializedVersion: 2 + rgba: 4278190080 + m_fontSize: 36 + m_fontSizeBase: 36 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_textAlignment: 257 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_firstOverflowCharacterIndex: -1 + m_linkedTextComponent: {fileID: 0} + m_isLinkedTextComponent: 0 + m_isTextTruncated: 0 + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 0 + m_isCullingEnabled: 0 + m_ignoreRectMaskCulling: 0 + m_ignoreCulling: 1 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_VertexBufferAutoSizeReduction: 1 + m_firstVisibleCharacter: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_textInfo: + textComponent: {fileID: 2459529298631480252} + characterCount: 11 + spriteCount: 0 + spaceCount: 1 + wordCount: 2 + linkCount: 0 + lineCount: 1 + pageCount: 1 + materialCount: 1 + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_spriteAnimator: {fileID: 0} + m_hasFontAssetChanged: 0 + m_renderer: {fileID: 5013107265394775091} + m_subTextObjects: + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + - {fileID: 0} + m_maskType: 0 diff --git a/Packages/Floorplan-2.0/Resources/Prefabs/Text (TMP).prefab.meta b/Packages/Floorplan-2.0/Resources/Prefabs/Text (TMP).prefab.meta new file mode 100644 index 00000000..d9cd947c --- /dev/null +++ b/Packages/Floorplan-2.0/Resources/Prefabs/Text (TMP).prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 90fafcffd036eed4ea20a9a143fbb3c1 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Scripts.meta b/Packages/Floorplan-2.0/Scripts.meta new file mode 100644 index 00000000..e65ef676 --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0471fb480fb9a984982bb23e1b126769 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Scripts/Abstract.meta b/Packages/Floorplan-2.0/Scripts/Abstract.meta new file mode 100644 index 00000000..77d4a622 --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/Abstract.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6b60e70ac29709245a6762ce1b754786 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Scripts/Abstract/Tool.cs b/Packages/Floorplan-2.0/Scripts/Abstract/Tool.cs new file mode 100644 index 00000000..cd140369 --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/Abstract/Tool.cs @@ -0,0 +1,254 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using TMPro; +using UnityEditor; +using alexism.Floorplan.Core.Enums; +using alexism.Floorplan.Core; +using alexism.Floorplan.Core.Abstract; +using System.Runtime.InteropServices; +using UnityEditor.Experimental.GraphView; + +//Implement strategy pattern for drawing tools + +namespace alexism.Floorplan.Core.Abstract +{ + public abstract class Tool + { + public abstract void MouseDown(Vector3 mousePos); + public abstract void MouseDrag(Vector3 mousePos); + public abstract void MouseUp(Vector3 mousePos, TileTypes tileType, GameObject tile,floorplan script, Material[] mat, List selected); + + public abstract void RenderPreview(); + } +} +//Some classes that inherit Tool. I should probably put these into their own separate files. + +public class RectangleFilledStrat : alexism.Floorplan.Core.Abstract.Tool +{ + float width; + float height; + Vector3 mouseStart; + Vector3 mouseEnd; + + public void Render(GameObject tile, floorplan script, Material[] mats) + { + GameObject gO = new GameObject("Floor"); + gO.transform.parent = script.geometry.transform; + Vector3 topLeft = new Vector3(Mathf.Max(mouseStart.x, mouseEnd.x), mouseStart.y, Mathf.Max(mouseStart.z, mouseEnd.z)); + for (int y = 0; y < Mathf.Abs(height); y += (int)script.tileSize) + { + for (int x = 0; x < Mathf.Abs(width); x += (int)script.tileSize) + { + GameObject floor = script.createInstance(tile, (topLeft - new Vector3(x, 0, y + script.tileSize)), Quaternion.identity); + floor.GetComponent().materials = mats; + floor.transform.parent.parent = gO.transform; + } + } + Undo.RegisterCreatedObjectUndo(gO,"Undo floor creation"); + } + + public override void MouseDown(Vector3 mousePos) + { + mouseStart = mousePos; + } + + public override void MouseDrag(Vector3 mousePos) + { + width = -(mouseEnd.x - mouseStart.x); + height = -(mouseEnd.z - mouseStart.z); + mouseEnd = mousePos; + } + + public override void MouseUp(Vector3 mousePos, TileTypes tileType, GameObject tile, floorplan script, Material[] mat, List selected) + { + Vector3[] points = new Vector3[] + { + mouseStart, + mouseEnd, + mouseStart-(new Vector3(width,0,0)), + mouseEnd+(new Vector3(width,0,0)) + }; + List mats = new List(); + selected.RemoveAll(o => o == -1); + for (int i = 0; i < selected.Count; i++) + { + mats.Add(mat[selected[i]]); + } + //Should we even do this (manage which tiletypes a tool can create) inside tools? Should this be handled by something else? + switch (tileType){ + case TileTypes.Wall: + Debug.LogWarning("Trying to draw type Wall with incorrect tool"); + break; + case TileTypes.Floor: + Render(tile,script,mats.ToArray()); + break; + case TileTypes.Pillar: + Debug.LogWarning("Trying to draw type Pillar with incorrect tool"); + break; + } + + mouseStart = Vector3.zero; + mouseEnd = Vector3.zero; + } + + public override void RenderPreview() + { + Handles.color = Color.red; + Handles.DrawWireCube(mouseStart - new Vector3(width / 2, 0, height / 2), new Vector3(width, 2, height)); + } +} + + +public class RectangleStrat : alexism.Floorplan.Core.Abstract.Tool +{ + float width; + float height; + Vector3 mouseStart; + Vector3 mouseEnd; + GameObject depthText; + GameObject widthText; + bool replace; + void Render(floorplan script, GameObject tile,Material[] mats) + { + GameObject pillar = script.getTilesFromType(TileTypes.Pillar)[0]; + GameObject gO = new GameObject("Walls"); + gO.transform.parent = script.geometry.transform; + Vector3 topLeft = new Vector3(Mathf.Max(mouseStart.x, mouseEnd.x), mouseStart.y, Mathf.Max(mouseStart.z, mouseEnd.z)); + Vector3 bottomLeft = new Vector3(Mathf.Min(mouseStart.x, mouseEnd.x), mouseStart.y, Mathf.Min(mouseStart.z, mouseEnd.z)); + + for (int x = 0; x < Mathf.Abs(width); x += (int)script.tileSize) + { + Vector3 offset = topLeft - new Vector3(x+script.tileSize/2, -.5f, 0); + Vector3 offset2 = bottomLeft - new Vector3(-x-script.tileSize/2, -.5f, 0); + + GameObject wall = null; + if (!Physics.CheckSphere(offset, .1f)) + { + wall = script.createInstance(tile, (topLeft - new Vector3(x + script.tileSize, 0, 0)), Quaternion.LookRotation(Vector3.right, Vector3.up)); + wall.GetComponent().materials = mats; + wall.transform.parent.parent = gO.transform; + } + if (!Physics.CheckSphere(offset2, .1f)) + { + wall = script.createInstance(tile, (bottomLeft - new Vector3(-x - script.tileSize, 0, 0)), Quaternion.LookRotation(-Vector3.right, Vector3.up)); + wall.GetComponent().materials = mats; + wall.transform.parent.parent = gO.transform; + } + } + for (int z = 0; z < Mathf.Abs(height); z += (int)script.tileSize) + { + Vector3 offset = topLeft - new Vector3(0, -.5f, z+script.tileSize/2); + Vector3 offset2 = bottomLeft - new Vector3(0,-.5f, -z-script.tileSize/2); + GameObject wall = null; + if (!Physics.CheckSphere(offset, .1f)) + { + wall = script.createInstance(tile, (topLeft - new Vector3(0, 0, z)), Quaternion.LookRotation(-Vector3.forward, Vector3.up)); + wall.GetComponent().materials = mats; + wall.transform.parent.parent = gO.transform; + + } + + if (!Physics.CheckSphere(offset2, .1f)) + { + wall = script.createInstance(tile, (bottomLeft - new Vector3(0, 0, -z)), Quaternion.identity); + wall.GetComponent().materials = mats; + wall.transform.parent.parent = gO.transform; + } + } + //Create pillars. God all of the code in this place is awful. I'm sorry. + GameObject pillarTopLeft = script.createInstance(pillar, bottomLeft, Quaternion.identity); + GameObject pillarBottomLeft = script.createInstance(pillar, topLeft, Quaternion.identity); + GameObject pillarTopRight = script.createInstance(pillar, topLeft + new Vector3(width, 0, 0), Quaternion.identity); + GameObject pillarBottomRight = script.createInstance(pillar, bottomLeft + new Vector3(-width, 0, 0), Quaternion.identity); + pillarTopLeft.GetComponent().materials = mats; + pillarBottomLeft.GetComponent().materials = mats; + pillarTopRight.GetComponent().materials = mats; + pillarBottomRight.GetComponent().materials = mats; + + + pillarTopLeft.transform.parent.parent = gO.transform; + pillarBottomLeft.transform.parent.parent = gO.transform; + pillarTopRight.transform.parent.parent = gO.transform; + pillarBottomRight.transform.parent.parent = gO.transform; + + Undo.RegisterCreatedObjectUndo(gO, "Undo wall creation"); + } + + public override void RenderPreview() + { + + Handles.color = Color.red; + Handles.DrawWireCube(mouseStart - new Vector3(width / 2, 0, height / 2), new Vector3(width, 2, height)); + } + + public override void MouseDown(Vector3 mousePos) + { + mouseStart = mousePos; + } + public override void MouseDrag(Vector3 mousePos) + { + width = -(mouseEnd.x - mouseStart.x); + height = -(mouseEnd.z - mouseStart.z); + mouseEnd = mousePos; + if (depthText == null) + { + //Initialize text. I could probably just use Handles.Label but this gives me more control over the look for text imo (and gives me way more awful code :D!) + depthText = new GameObject(); + TextMeshPro dText = depthText.AddComponent(); + dText.enableAutoSizing = true; + depthText.transform.rotation = Quaternion.LookRotation(-Vector3.up, -Vector3.right); + dText.color = Color.black; + dText.fontSizeMax = 8; + widthText = new GameObject(); + TextMeshPro wText = widthText.AddComponent(); + wText.enableAutoSizing = true; + widthText.transform.rotation = Quaternion.LookRotation(-Vector3.up, Vector3.up); + widthText.transform.localScale = new Vector3(1, 1, -1); + wText.color = Color.black; + wText.fontSizeMax = 8; + } + else + { + TextMeshPro dText = depthText.GetComponent(); + depthText.GetComponent().position = mouseStart - new Vector3(.5f, -1, (height / 2) + dText.textBounds.center.x); + depthText.GetComponent().text = "Depth: "+Mathf.Abs((height / 2)).ToString(); + TextMeshPro wText = widthText.GetComponent(); + + widthText.GetComponent().position = mouseStart - new Vector3((width/2)+wText.textBounds.center.x, -1, -.5f); + widthText.GetComponent().text = "Width: "+Mathf.Abs((width / 2)).ToString(); + + } + } + public override void MouseUp(Vector3 mousePos, TileTypes tileType,GameObject tile,floorplan script, Material[] mat,List selected) + { + //Get the 4 corners of the rectangle + Vector3[] points = new Vector3[] + { + mouseStart, + mouseEnd, + mouseStart-(new Vector3(width,0,0)), + mouseEnd+(new Vector3(width,0,0)) + }; + List mats = new List(); + selected.RemoveAll(o => o == -1); + Debug.Log(selected.Count); + for(int i=0; i(); + gridScale = grid.cellSize.x/10; + } + // draw the grid :) + void OnDrawGizmosSelected() + { + + // orient to the gameobject, so you can rotate the grid independently if desired + Gizmos.matrix = transform.localToWorldMatrix; + + // set colours + Color dimColor = new Color(gizmoLineColor.r, gizmoLineColor.g, gizmoLineColor.b, 0.25f * gizmoLineColor.a); + Color brightColor = Color.Lerp(Color.white, gizmoLineColor, 0.75f); + + // draw the horizontal lines + for (int x = minX; x < maxX + 1; x++) + { + // find major lines + Gizmos.color = (x % gizmoMajorLines == 0 ? gizmoLineColor : dimColor); + if (x == 0) + Gizmos.color = brightColor; + + Vector3 pos1 = new Vector3(x, minY, 0) * gridScale; + Vector3 pos2 = new Vector3(x, maxY, 0) * gridScale; + + // convert to topdown/overhead units if necessary + if (topDownGrid) + { + pos1 = new Vector3(pos1.x, 0, pos1.y); + pos2 = new Vector3(pos2.x, 0, pos2.y); + } + + Gizmos.DrawLine((gridOffset + pos1), (gridOffset + pos2)); + } + + // draw the vertical lines + for (int y = minY; y < maxY + 1; y++) + { + // find major lines + Gizmos.color = (y % gizmoMajorLines == 0 ? gizmoLineColor : dimColor); + if (y == 0) + Gizmos.color = brightColor; + + Vector3 pos1 = new Vector3(minX, y, 0) * gridScale; + Vector3 pos2 = new Vector3(maxX, y, 0) * gridScale; + + // convert to topdown/overhead units if necessary + if (topDownGrid) + { + pos1 = new Vector3(pos1.x, 0, pos1.y); + pos2 = new Vector3(pos2.x, 0, pos2.y); + } + + Gizmos.DrawLine((gridOffset + pos1), (gridOffset + pos2)); + } + } +} \ No newline at end of file diff --git a/Packages/Floorplan-2.0/Scripts/DrawGizmoGrid.cs.meta b/Packages/Floorplan-2.0/Scripts/DrawGizmoGrid.cs.meta new file mode 100644 index 00000000..dd9b9e7d --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/DrawGizmoGrid.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 86e1e5e2582bb564fa54cb6dc6cde247 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Scripts/Enums.meta b/Packages/Floorplan-2.0/Scripts/Enums.meta new file mode 100644 index 00000000..994d5aab --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/Enums.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1d6771a18eba00443b669d8971816238 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Scripts/Enums/TileTypes.cs b/Packages/Floorplan-2.0/Scripts/Enums/TileTypes.cs new file mode 100644 index 00000000..3c9d4491 --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/Enums/TileTypes.cs @@ -0,0 +1,10 @@ +namespace alexism.Floorplan.Core.Enums +{ + public enum TileTypes + { + Wall, + Pillar, + Floor, + None + } +} diff --git a/Packages/Floorplan-2.0/Scripts/Enums/TileTypes.cs.meta b/Packages/Floorplan-2.0/Scripts/Enums/TileTypes.cs.meta new file mode 100644 index 00000000..d5b45c7e --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/Enums/TileTypes.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b75a3cb37a7c18844bf12d735e9683b7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Scripts/Enums/ToolTypes.cs b/Packages/Floorplan-2.0/Scripts/Enums/ToolTypes.cs new file mode 100644 index 00000000..59223dc8 --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/Enums/ToolTypes.cs @@ -0,0 +1,12 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace alexism.Floorplan.Core.Enums +{ + public enum ToolTypes + { + Rectangle, + RectangleFilled + } +} \ No newline at end of file diff --git a/Packages/Floorplan-2.0/Scripts/Enums/ToolTypes.cs.meta b/Packages/Floorplan-2.0/Scripts/Enums/ToolTypes.cs.meta new file mode 100644 index 00000000..23d725bb --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/Enums/ToolTypes.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 43e3308c14f4ea248a1f49a0ec902c80 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Scripts/MeshColliderTools.cs b/Packages/Floorplan-2.0/Scripts/MeshColliderTools.cs new file mode 100644 index 00000000..78e09e49 --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/MeshColliderTools.cs @@ -0,0 +1,547 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using UnityEngine; +using UnityEditor; +using System.Linq; + +static public class MeshColliderTools +{ + + public static void SnapToGrid(this Mesh mesh, float gridDelta) + { + if (gridDelta < 1e-5f) + return; + float inverse = 1f / gridDelta; + var verts = mesh.vertices; + for (int i = 0; i < verts.Length; i++) + { + verts[i].x = Mathf.RoundToInt(verts[i].x * inverse) / inverse; + verts[i].y = Mathf.RoundToInt(verts[i].y * inverse) / inverse; + verts[i].z = Mathf.RoundToInt(verts[i].z * inverse) / inverse; + } + mesh.vertices = verts; + } + + public static void Weld(this Mesh mesh, float threshold, float bucketStep) + { + Vector3[] oldVertices = mesh.vertices; + Vector3[] newVertices = new Vector3[oldVertices.Length]; + int[] old2new = new int[oldVertices.Length]; + Vector2[] oldUVs = mesh.uv; + + int newSize = 0; + + // Find AABB + Vector3 min = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue); + Vector3 max = new Vector3(float.MinValue, float.MinValue, float.MinValue); + for (int i = 0; i < oldVertices.Length; i++) + { + if (oldVertices[i].x < min.x) min.x = oldVertices[i].x; + if (oldVertices[i].y < min.y) min.y = oldVertices[i].y; + if (oldVertices[i].z < min.z) min.z = oldVertices[i].z; + if (oldVertices[i].x > max.x) max.x = oldVertices[i].x; + if (oldVertices[i].y > max.y) max.y = oldVertices[i].y; + if (oldVertices[i].z > max.z) max.z = oldVertices[i].z; + } + min -= Vector3.one * 0.111111f; + max += Vector3.one * 0.899999f; + + // Make cubic buckets, each with dimensions "bucketStep" + int bucketSizeX = Mathf.FloorToInt((max.x - min.x) / bucketStep) + 1; + int bucketSizeY = Mathf.FloorToInt((max.y - min.y) / bucketStep) + 1; + int bucketSizeZ = Mathf.FloorToInt((max.z - min.z) / bucketStep) + 1; + List[,,] buckets = new List[bucketSizeX, bucketSizeY, bucketSizeZ]; + + // Make new vertices + for (int i = 0; i < oldVertices.Length; i++) + { + // Determine which bucket it belongs to + int x = Mathf.FloorToInt((oldVertices[i].x - min.x) / bucketStep); + int y = Mathf.FloorToInt((oldVertices[i].y - min.y) / bucketStep); + int z = Mathf.FloorToInt((oldVertices[i].z - min.z) / bucketStep); + + // Check to see if it's already been added + if (buckets[x, y, z] == null) + buckets[x, y, z] = new List(); // Make buckets lazily + + for (int j = 0; j < buckets[x, y, z].Count; j++) + { + Vector3 to = newVertices[buckets[x, y, z][j]] - oldVertices[i]; + if (Vector3.SqrMagnitude(to) < 0.001f) + { + old2new[i] = buckets[x, y, z][j]; + goto skip; // Skip to next old vertex if this one is already there + } + } + + // Add new vertex + newVertices[newSize] = oldVertices[i]; + buckets[x, y, z].Add(newSize); + old2new[i] = newSize; + newSize++; + + skip:; + } + + // Make new triangles + int[] oldTris = mesh.triangles; + int[] newTris = new int[oldTris.Length]; + for (int i = 0; i < oldTris.Length; i++) + { + newTris[i] = old2new[oldTris[i]]; + } + + Vector3[] finalVertices = new Vector3[newSize]; + for (int i = 0; i < newSize; i++) + finalVertices[i] = newVertices[i]; + + mesh.Clear(); + mesh.vertices = finalVertices; + mesh.triangles = newTris; + Vector2[] newUVs = new Vector2[mesh.vertices.Length]; + for(int i=0; i(origNumVerts); + for (int i = 0; i < origNumVerts; i++) + { + var r = new Vertice(); + r.position = verts[i]; + workingSet.Add(r); + } + + var tris = mesh.triangles; + var triLength = tris.Length; + for (int i = 0; i < triLength; i += 3) + Face.AddFace(workingSet, tris, i); + + for (int i = 0; i < origNumVerts; i++) + workingSet[i].AssignLinearPosition(); + + + /********************************* + * * + * Simplify mesh! * + * * + ********************************/ + + HashSet candidates; + HashSet nextCandidates = new HashSet(); + + foreach (Vertice v in workingSet) if (!v.IsStatic) + nextCandidates.Add(v); + + while (nextCandidates.Count != 0) + { + candidates = nextCandidates; + nextCandidates = new HashSet(); + foreach (Vertice a in candidates) + { + if (a.edges != null) foreach (Edge ac in a.edges) + { + Vertice c; + if (a.CanFollow(ac, out c)) + { + foreach (Face f in ac.faces) + Edge.Collapse(f.GetOpposite(c), f.GetOpposite(a), f); + foreach (Edge edge_of_a in a.edges) + { + if (edge_of_a != ac) + { + var o = edge_of_a.GetOpposite(a); + if (!o.IsStatic) nextCandidates.Add(o); + edge_of_a.Reconnect(a, c); + } + } + if (!c.IsStatic) nextCandidates.Add(c); + + c.DisconnectFrom(ac); + a.Disconnect(); + ac.DisconnectIncludingFaces(); + break; + } + } + } + } + + var simplifiedVerts = new List(); + foreach (Vertice v in workingSet) if (v.edges != null) + simplifiedVerts.Add(v); + + var simplifiedNumVerts = simplifiedVerts.Count; + var newPositions = new Vector3[simplifiedNumVerts]; + //var resultColors = new Color[simplifiedNumVerts]; + for (int i = 0; i < simplifiedNumVerts; i++) + { + simplifiedVerts[i].finalIndex = i; + newPositions[i] = simplifiedVerts[i].position; + } + + var resultTris = new List(); + var triSet = new HashSet(); + foreach (Vertice v in simplifiedVerts) + { + foreach (Edge e in v.edges) + { + foreach (Face f in e.faces) if (!triSet.Contains(f)) + { + triSet.Add(f); + f.GetIndexes(resultTris); + } + } + } + + mesh.Clear(); + mesh.vertices = newPositions; + mesh.triangles = resultTris.ToArray(); + Array.Clear(mesh.uv, 0, mesh.uv.Length); + + Vector3[] oldVerts = mesh.vertices; + int[] triangles = mesh.triangles; + Vector3[] vertices = new Vector3[triangles.Length]; + for (int i = 0; i < triangles.Length; i++) + { + vertices[i] = oldVerts[triangles[i]]; + triangles[i] = i; + } + + + mesh.vertices = vertices; + mesh.triangles = triangles; + mesh.RecalculateBounds(); + mesh.RecalculateNormals(); + mesh.Optimize(); + + Debug.LogFormat("Simplify vert count: {0} vs. {1}", simplifiedNumVerts, origNumVerts); + } + + private class Vertice + { + public List edges = new List(); + public Vector3 position; + + ///

A cache used for identifying a vertice during mesh reconstruction. + public int finalIndex; + + /// + /// - Null if vertice is internal in a plane + /// - A non-zero vector if vertice is internal in a line + /// - Vector3.zero otherwise. + /// + public Vector3? linearPosition; + + public void AssignLinearPosition() + { + for (int i = 0; i < edges.Count; i++) + { + var edge = edges[i]; + if (!edge.HasEqualPlanes()) + { + if (linearPosition == null) + linearPosition = edge.vertices[1].position - edge.vertices[0].position; + else if (!edge.IsParallel(linearPosition)) + { + linearPosition = Vector3.zero; + break; + } + } + } + } + + public bool IsStatic { + get { + return linearPosition == Vector3.zero; + } + } + + public Edge GetExistingConnectingEdge(Vertice v) + { + foreach (Edge e in edges) + { + if (e.vertices[0] == this && e.vertices[1] == v) return e; + if (e.vertices[1] == this && e.vertices[0] == v) return e; + } + return null; + } + + public Edge GetConnectingEdge(Vertice v) + { + Edge result = GetExistingConnectingEdge(v); + if (result == null) + { + result = new Edge(this, v); + edges.Add(result); + v.edges.Add(result); + } + return result; + } + + /// When collapsing an edge a->c, the linear space must + /// be respected, and all faces, not connected with a->c, + /// must not flip. + /// + public bool CanFollow(Edge transportEdge, out Vertice opposite) + { + if (IsStatic) { opposite = default(Vertice); return false; } + if (linearPosition != null && !transportEdge.IsParallel(linearPosition)) { opposite = default(Vertice); return false; } + + var localTris = new HashSet(); + foreach (Edge e in edges) foreach (Face f in e.faces) + localTris.Add(f); + + localTris.ExceptWith(transportEdge.faces); + + opposite = transportEdge.GetOpposite(this); + var targetPos = opposite.position; + var lTriEnum = localTris.GetEnumerator(); + try + { + while (lTriEnum.MoveNext()) + if (lTriEnum.Current.MoveWouldFlip(this, targetPos)) + return false; + } + finally { lTriEnum.Dispose(); } + return true; + } + + public void DisconnectFrom(Edge e) + { + edges.Remove(e); + } + + public void Disconnect() + { + edges.Clear(); + edges = null; + } + + } + + private class Edge + { + public List vertices; + public List faces; + + public static void Collapse(Edge moved, Edge target, Face f) + { + Face faceOutsideMoved; + try { faceOutsideMoved = moved.GetOpposite(f); } + catch (Exception e) + { + throw new Exception(e.Message + "\n" + moved.vertices[0].position.ToString() + " <--> " + moved.vertices[1].position.ToString()); + } + faceOutsideMoved.Replace(moved, target); + target.Replace(f, faceOutsideMoved); + foreach (Vertice v in moved.vertices) + { + v.edges.Remove(moved); + } + } + + public Edge(Vertice v0, Vertice v1) + { + vertices = new List(2); + vertices.Add(v0); + vertices.Add(v1); + faces = new List(2); + } + + public Vertice GetOpposite(Vertice v) + { + var v0 = vertices[0]; + return v != v0 ? v0 : vertices[1]; + } + + public Face GetOpposite(Face v) + { + if (faces.Count != 2) throw new Exception("Collapsing an edge with only 1 face into another. This is not supported."); + var face0 = faces[0]; + return face0 == v ? faces[1] : face0; + } + + public bool HasEqualPlanes() + { + if (faces.Count != 2) return false; + var f0 = faces[0]; + var f0e0 = faces[0].edges[0]; + + var f1 = faces[1]; + var f1e0 = faces[1].edges[0]; + + var e0 = f0e0 != this ? f0e0 : f0.edges[1]; + var e1 = f1e0 != this ? f1e0 : f1.edges[1]; + + var v0 = vertices[1].position - vertices[0].position; + var v1 = e0.vertices[1].position - e0.vertices[0].position; + var v2 = e1.vertices[1].position - e1.vertices[0].position; + + var n0 = Vector3.Cross(v0, v1); + + var dot = Vector3.Dot(n0, v2); + return -5e-3 < dot && dot < 5e-3; + } + + public void Replace(Face oldFace, Face newFace) + { + for (int j = 0; j < faces.Count; j++) + { + if (faces[j] == oldFace) + { + faces[j] = newFace; + return; + } + } + } + + public void Reconnect(Vertice oldVertice, Vertice newVertice) + { + if (vertices[0] == oldVertice) vertices[0] = newVertice; + else vertices[1] = newVertice; + newVertice.edges.Add(this); + } + + public bool Contains(Vertice v) + { + return v == vertices[0] || v == vertices[1]; + } + + public bool IsParallel(Vector3? nv) + { + var v0 = vertices[0].position; + var v1 = vertices[1].position; + float cross = Vector3.Cross(v1 - v0, nv.Value).sqrMagnitude; + return -5e-6f < cross && cross < 5e-6f; + } + + public void DisconnectIncludingFaces() + { + vertices.Clear(); + vertices = null; + foreach (Face f in faces) + f.Disconnect(); + faces.Clear(); + faces = null; + } + } + + private class Face + { + public Edge[] edges; + + /* + * Edge between v0 and v1 + * Edge between v0 and v2 + * Edge between v1 and v2 + */ + private Face(Edge e0, Edge e1, Edge e2) + { + edges = new Edge[] { e0, e1, e2 }; + } + + /* + * List of vertices, in the same order as 'verts' from the mesh. + * The tris array from the mesh. + * The index of the first vertex in this triangle. + */ + public static void AddFace(List allVertices, int[] tris, int triIndex) + { + var v0 = allVertices[tris[triIndex + 0]]; + var v1 = allVertices[tris[triIndex + 1]]; + var v2 = allVertices[tris[triIndex + 2]]; + + var e0 = v0.GetConnectingEdge(v1); + var e1 = v0.GetConnectingEdge(v2); + var e2 = v1.GetConnectingEdge(v2); + + var face = new Face(e0, e1, e2); + + e0.faces.Add(face); + e1.faces.Add(face); + e2.faces.Add(face); + } + + public Edge GetOpposite(Vertice v) + { + Edge e0, e1; + if (!(e0 = edges[0]).Contains(v)) return e0; + if (!(e1 = edges[1]).Contains(v)) return e1; + return edges[2]; + } + + public Vertice GetOpposite(Edge o) + { + var o0 = o.vertices[0]; + var o1 = o.vertices[1]; + for (int i = 0; i < 3; i++) + { // Will never reach 3 because there will be an unequal vertice before the third edge + Edge e = edges[i]; + Vertice e0 = e.vertices[0]; + if (e0 != o0 && e0 != o1) return e0; + Vertice e1 = e.vertices[1]; + if (e1 != o0 && e1 != o1) return e1; + } + throw new Exception("A face seems to have three edges that all share a vertice with a given edge."); + } + + public void Replace(Edge oldEdge, Edge newEdge) + { + if (edges[0] == oldEdge) edges[0] = newEdge; + else if (edges[1] == oldEdge) edges[1] = newEdge; + else edges[2] = newEdge; + } + + public bool MoveWouldFlip(Vertice v, Vector3 p) + { + Edge oppositeEdge = GetOpposite(v); + var ov0 = oppositeEdge.vertices[0].position; + var ov = oppositeEdge.vertices[1].position - ov0; + var ot = p - ov0; + var ct = v.position - ov0; + + var cross0 = Vector3.Cross(ot, ov); + var c0SqrMagnitude = cross0.sqrMagnitude; + if (c0SqrMagnitude < 0.0001f) return true; + + var cross1 = Vector3.Cross(ct, ov); + var c1SqrMagnitude = cross1.sqrMagnitude; + if (c1SqrMagnitude < 0.0001f) return true; + + if (Mathf.Sign(Vector3.Dot(cross0, cross1)) < 0f) return true; + + return false; + } + + /* + * Adds the finalIndex for the verts in order: v0, v1, v2. + */ + public void GetIndexes(List results) + { + results.Add(GetOpposite(edges[2]).finalIndex); + results.Add(GetOpposite(edges[1]).finalIndex); + results.Add(GetOpposite(edges[0]).finalIndex); + } + + public void Disconnect() + { + edges = null; + } + } +} \ No newline at end of file diff --git a/Packages/Floorplan-2.0/Scripts/MeshColliderTools.cs.meta b/Packages/Floorplan-2.0/Scripts/MeshColliderTools.cs.meta new file mode 100644 index 00000000..2af739e2 --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/MeshColliderTools.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bb70efa811894a9439ee60d4e6cf4c6e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Scripts/MeshCombiner.cs b/Packages/Floorplan-2.0/Scripts/MeshCombiner.cs new file mode 100644 index 00000000..093d86d7 --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/MeshCombiner.cs @@ -0,0 +1,298 @@ +using UnityEngine; +using System.Collections; +using System.Linq; +using System.Collections.Generic; +using UnityEditor.UI; + +public class MeshCombiner : MonoBehaviour +{ + GameObject wallMesh; + GameObject floorMesh; + public void Awake() + { + + } + + private void Start() + { + wallMesh = new GameObject("WallMesh", typeof(MeshFilter), typeof(Renderer)); + floorMesh = new GameObject("FloorMesh", typeof(MeshFilter), typeof(Renderer)); + print(transform.childCount); + for (int i = transform.childCount - 1; i >= 0; --i) + { + Transform child = transform.GetChild(i); + if (child.name == "Floor") + child.SetParent(floorMesh.transform, true); + else if (child.name == "Walls") + child.SetParent(wallMesh.transform, true); + } + wallMesh.transform.parent = transform; + floorMesh.transform.parent = transform; + + CombineWalls(); + CombineFloor(); + ClearChildren(floorMesh.transform); + ClearChildren(wallMesh.transform); + SplitMesh(floorMesh.GetComponent()); + SplitMesh(wallMesh.GetComponent()); + + for (int i = 0; i < floorMesh.transform.childCount; i++) + { + Simplify(floorMesh.transform.GetChild(i).GetComponent()); + } + for (int i = 0; i < wallMesh.transform.childCount; i++) + { + Simplify(wallMesh.transform.GetChild(i).GetComponent()); + } + } + + void ClearChildren(Transform t) + { + for(int i=0; i(); + filter.mesh=mf.mesh.GetSubmesh(i); + Renderer r = gO.AddComponent(); + r.material = mf.gameObject.GetComponent().materials[i]; + MeshCollider c = gO.AddComponent(); + c.sharedMesh = filter.mesh; + } + Destroy(mf.gameObject.GetComponent()); + Destroy(mf.gameObject.GetComponent()); + } + + private void CombineWalls() + { + Vector3 basePosition = transform.position; + Quaternion baseRotation = transform.rotation; + transform.position = Vector3.zero; + transform.rotation = Quaternion.identity; + + + + ArrayList materials = new ArrayList(); + ArrayList combineInstanceArrays = new ArrayList(); + MeshFilter[] meshFilters = wallMesh.GetComponentsInChildren(); + + //Linq solution to make sure we don't combine any of the doors(a door is easily identifiable by it's rigidbody component, so we look for that). + meshFilters = meshFilters.Where((source, index) => !(source.transform.name == "FloorMesh" || source.transform.name == "WallMesh" || source.transform.GetComponent() || source.transform.GetComponentInParent())).ToArray(); + foreach (MeshFilter meshFilter in meshFilters) + { + MeshRenderer meshRenderer = meshFilter.GetComponent(); + if (!meshRenderer || + !meshFilter.sharedMesh || + meshRenderer.sharedMaterials.Length != meshFilter.sharedMesh.subMeshCount) + { + print(meshFilter.gameObject.name); + continue; + } + + for (int s = 0; s < meshFilter.sharedMesh.subMeshCount; s++) + { + if (meshRenderer.sharedMaterials[s]){ + int materialArrayIndex = Contains(materials, meshRenderer.sharedMaterials[s].name); + if (materialArrayIndex == -1) + { + materials.Add(meshRenderer.sharedMaterials[s]); + materialArrayIndex = materials.Count - 1; + } + combineInstanceArrays.Add(new ArrayList()); + + CombineInstance combineInstance = new CombineInstance(); + combineInstance.transform = meshRenderer.transform.localToWorldMatrix; + combineInstance.subMeshIndex = s; + combineInstance.mesh = meshFilter.sharedMesh; + (combineInstanceArrays[materialArrayIndex] as ArrayList).Add(combineInstance); + } + } + } + + // Get / Create mesh filter & renderer + MeshFilter meshFilterCombine = wallMesh.GetComponent(); + if (meshFilterCombine == null) + { + meshFilterCombine = wallMesh.AddComponent(); + } + MeshRenderer meshRendererCombine = gameObject.GetComponent(); + if (meshRendererCombine == null) + { + meshRendererCombine = wallMesh.AddComponent(); + } + + // Combine by material index into per-material meshes + // also, Create CombineInstance array for next step + Mesh[] meshes = new Mesh[materials.Count]; + CombineInstance[] combineInstances = new CombineInstance[materials.Count]; + + for (int m = 0; m < materials.Count; m++) + { + CombineInstance[] combineInstanceArray = (combineInstanceArrays[m] as ArrayList).ToArray(typeof(CombineInstance)) as CombineInstance[]; + meshes[m] = new Mesh(); + meshes[m].CombineMeshes(combineInstanceArray, true, true); + + combineInstances[m] = new CombineInstance(); + combineInstances[m].mesh = meshes[m]; + combineInstances[m].subMeshIndex = 0; + + } + + // Combine into one + meshFilterCombine.sharedMesh = new Mesh(); + meshFilterCombine.sharedMesh.CombineMeshes(combineInstances, false, false); + + // Destroy other meshes + foreach (Mesh oldMesh in meshes) + { + oldMesh.Clear(); + DestroyImmediate(oldMesh); + } + + // Assign materials + Material[] materialsArray = materials.ToArray(typeof(Material)) as Material[]; + meshRendererCombine.materials = materialsArray; + + foreach (MeshFilter meshFilter in meshFilters) + { + + if (!meshFilter || meshFilter.transform.GetComponent() || meshFilter.transform.GetComponentInParent() || meshFilter.transform.GetComponentInChildren()) + continue; + print(meshFilter.gameObject.transform.parent.name); + DestroyImmediate(meshFilter.gameObject.transform.parent.gameObject); + } + wallMesh.transform.position = basePosition; + wallMesh.transform.rotation = baseRotation; + wallMesh.AddComponent().sharedMesh = wallMesh.GetComponent().sharedMesh; + } + private void CombineFloor() + { + Vector3 basePosition = transform.position; + Quaternion baseRotation = transform.rotation; + transform.position = Vector3.zero; + transform.rotation = Quaternion.identity; + + + + ArrayList materials = new ArrayList(); + ArrayList combineInstanceArrays = new ArrayList(); + MeshFilter[] meshFilters = floorMesh.GetComponentsInChildren(); + + //Linq solution to make sure we don't combine any of the doors(a door is easily identifiable by it's rigidbody component, so we look for that). + meshFilters = meshFilters.Where((source, index) => !(source.transform.name=="FloorMesh" || source.transform.name=="WallMesh" || source.transform.GetComponent() || source.transform.GetComponentInParent())).ToArray(); + foreach (MeshFilter meshFilter in meshFilters) + { + MeshRenderer meshRenderer = meshFilter.GetComponent(); + if (!meshRenderer || + !meshFilter.sharedMesh || + meshRenderer.sharedMaterials.Length != meshFilter.sharedMesh.subMeshCount) + { + continue; + } + + for (int s = 0; s < meshFilter.sharedMesh.subMeshCount; s++) + { + if (meshRenderer.sharedMaterials[s]) + { + int materialArrayIndex = Contains(materials, meshRenderer.sharedMaterials[s].name); + if (materialArrayIndex == -1) + { + materials.Add(meshRenderer.sharedMaterials[s]); + materialArrayIndex = materials.Count - 1; + } + combineInstanceArrays.Add(new ArrayList()); + + CombineInstance combineInstance = new CombineInstance(); + combineInstance.transform = meshRenderer.transform.localToWorldMatrix; + combineInstance.subMeshIndex = s; + combineInstance.mesh = meshFilter.sharedMesh; + (combineInstanceArrays[materialArrayIndex] as ArrayList).Add(combineInstance); + } + } + } + + // Get / Create mesh filter & renderer + MeshFilter meshFilterCombine = floorMesh.GetComponent(); + if (meshFilterCombine == null) + { + meshFilterCombine = floorMesh.AddComponent(); + } + MeshRenderer meshRendererCombine = gameObject.GetComponent(); + if (meshRendererCombine == null) + { + meshRendererCombine = floorMesh.AddComponent(); + } + + // Combine by material index into per-material meshes + // also, Create CombineInstance array for next step + Mesh[] meshes = new Mesh[materials.Count]; + CombineInstance[] combineInstances = new CombineInstance[materials.Count]; + + for (int m = 0; m < materials.Count; m++) + { + CombineInstance[] combineInstanceArray = (combineInstanceArrays[m] as ArrayList).ToArray(typeof(CombineInstance)) as CombineInstance[]; + meshes[m] = new Mesh(); + meshes[m].CombineMeshes(combineInstanceArray, true, true); + + combineInstances[m] = new CombineInstance(); + combineInstances[m].mesh = meshes[m]; + combineInstances[m].subMeshIndex = 0; + } + + // Combine into one + meshFilterCombine.sharedMesh = new Mesh(); + meshFilterCombine.sharedMesh.CombineMeshes(combineInstances, false, false); + + // Destroy other meshes + foreach (Mesh oldMesh in meshes) + { + oldMesh.Clear(); + DestroyImmediate(oldMesh); + } + + // Assign materials + Material[] materialsArray = materials.ToArray(typeof(Material)) as Material[]; + meshRendererCombine.materials = materialsArray; + + foreach (MeshFilter meshFilter in meshFilters) + { + + if (!meshFilter || meshFilter.transform.GetComponent() || meshFilter.transform.GetComponentInParent() || meshFilter.transform.GetComponentInChildren()) + continue; + DestroyImmediate(meshFilter.gameObject.transform.parent.gameObject); + } + floorMesh.transform.position = basePosition; + floorMesh.transform.rotation = baseRotation; + floorMesh.AddComponent().sharedMesh = floorMesh.GetComponent().sharedMesh; + } + + private int Contains(ArrayList searchList, string searchName) + { + for (int i = 0; i < searchList.Count; i++) + { + if (((Material)searchList[i]).name == searchName) + { + return i; + } + } + return -1; + } +} \ No newline at end of file diff --git a/Packages/Floorplan-2.0/Scripts/MeshCombiner.cs.meta b/Packages/Floorplan-2.0/Scripts/MeshCombiner.cs.meta new file mode 100644 index 00000000..66f7fb55 --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/MeshCombiner.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9d1dd59961254a34585afe7927f04a02 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Scripts/MeshExtension.cs b/Packages/Floorplan-2.0/Scripts/MeshExtension.cs new file mode 100644 index 00000000..a595a87a --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/MeshExtension.cs @@ -0,0 +1,104 @@ +using UnityEngine; +using System.Collections.Generic; + +public static class MeshExtension +{ + private class Vertices + { + List verts = null; + List uv1 = null; + List uv2 = null; + List uv3 = null; + List uv4 = null; + List normals = null; + List tangents = null; + List colors = null; + List boneWeights = null; + + public Vertices() + { + verts = new List(); + } + public Vertices(Mesh aMesh) + { + verts = CreateList(aMesh.vertices); + uv1 = CreateList(aMesh.uv); + uv2 = CreateList(aMesh.uv2); + uv3 = CreateList(aMesh.uv3); + uv4 = CreateList(aMesh.uv4); + normals = CreateList(aMesh.normals); + tangents = CreateList(aMesh.tangents); + colors = CreateList(aMesh.colors32); + boneWeights = CreateList(aMesh.boneWeights); + } + + private List CreateList(T[] aSource) + { + if (aSource == null || aSource.Length == 0) + return null; + return new List(aSource); + } + private void Copy(ref List aDest, List aSource, int aIndex) + { + if (aSource == null) + return; + if (aDest == null) + aDest = new List(); + aDest.Add(aSource[aIndex]); + } + public int Add(Vertices aOther, int aIndex) + { + int i = verts.Count; + Copy(ref verts, aOther.verts, aIndex); + Copy(ref uv1, aOther.uv1, aIndex); + Copy(ref uv2, aOther.uv2, aIndex); + Copy(ref uv3, aOther.uv3, aIndex); + Copy(ref uv4, aOther.uv4, aIndex); + Copy(ref normals, aOther.normals, aIndex); + Copy(ref tangents, aOther.tangents, aIndex); + Copy(ref colors, aOther.colors, aIndex); + Copy(ref boneWeights, aOther.boneWeights, aIndex); + return i; + } + public void AssignTo(Mesh aTarget) + { + if (verts.Count > 65535) + aTarget.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32; + aTarget.SetVertices(verts); + if (uv1 != null) aTarget.SetUVs(0, uv1); + if (uv2 != null) aTarget.SetUVs(1, uv2); + if (uv3 != null) aTarget.SetUVs(2, uv3); + if (uv4 != null) aTarget.SetUVs(3, uv4); + if (normals != null) aTarget.SetNormals(normals); + if (tangents != null) aTarget.SetTangents(tangents); + if (colors != null) aTarget.SetColors(colors); + if (boneWeights != null) aTarget.boneWeights = boneWeights.ToArray(); + } + } + + public static Mesh GetSubmesh(this Mesh aMesh, int aSubMeshIndex) + { + if (aSubMeshIndex < 0 || aSubMeshIndex >= aMesh.subMeshCount) + return null; + int[] indices = aMesh.GetTriangles(aSubMeshIndex); + Vertices source = new Vertices(aMesh); + Vertices dest = new Vertices(); + Dictionary map = new Dictionary(); + int[] newIndices = new int[indices.Length]; + for (int i = 0; i < indices.Length; i++) + { + int o = indices[i]; + int n; + if (!map.TryGetValue(o, out n)) + { + n = dest.Add(source, o); + map.Add(o, n); + } + newIndices[i] = n; + } + Mesh m = new Mesh(); + dest.AssignTo(m); + m.triangles = newIndices; + return m; + } +} \ No newline at end of file diff --git a/Packages/Floorplan-2.0/Scripts/MeshExtension.cs.meta b/Packages/Floorplan-2.0/Scripts/MeshExtension.cs.meta new file mode 100644 index 00000000..7e9b182b --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/MeshExtension.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9cfee6f65c36c224ab66a34ea32ca686 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Scripts/com.alexism.floorplacom.alexism.floorplan.asmdef b/Packages/Floorplan-2.0/Scripts/com.alexism.floorplacom.alexism.floorplan.asmdef new file mode 100644 index 00000000..a598372b --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/com.alexism.floorplacom.alexism.floorplan.asmdef @@ -0,0 +1,17 @@ +{ + "name": "com.alexism.floorplacom.alexism.floorplan", + "references": [ + "GUID:6055be8ebefd69e48b49212b09b47b2f", + "GUID:3a9781db4804a9945b9883f3a7c46d45", + "GUID:c4df6f69b1bd3d542a0bd5e003678751" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/Floorplan-2.0/Scripts/com.alexism.floorplacom.alexism.floorplan.asmdef.meta b/Packages/Floorplan-2.0/Scripts/com.alexism.floorplacom.alexism.floorplan.asmdef.meta new file mode 100644 index 00000000..722b84ea --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/com.alexism.floorplacom.alexism.floorplan.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 12d6d9ac7109b014bbe1f60624409612 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Scripts/floorplan.cs b/Packages/Floorplan-2.0/Scripts/floorplan.cs new file mode 100644 index 00000000..aeb80730 --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/floorplan.cs @@ -0,0 +1,115 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; +using alexism.Floorplan.Core.ScriptableObjects; +using alexism.Floorplan.Core.Components; +using alexism.Floorplan.Core.Enums; +using System.Linq; + + +namespace alexism.Floorplan.Core +{ + [RequireComponent(typeof(Grid))] + [ExecuteInEditMode] + + public class floorplan : MonoBehaviour + { + + + public Bounds bounds; + [HideInInspector] + public GameObject geometry; + + private void Awake() + { + if (!geometry) + geometry = new GameObject("FloorPlanGeometry"); + //geometry = GameObject.Find("New Floorplan Geometry"); + } + + bool toolActive; + [SerializeField] + public floorplanTileset tileset; + + public Material[] wallMaterials=new Material[100]; + + public List selected = new List(4) { -1,-1,-1,-1}; + + [Space(15)] + Vector3 lastHandlePosition; + Vector3 snapLastHandlePosition; + Vector3 handlePosition; + Vector3 lastTileDelta; + Vector3 tileDelta; + GameObject geometryRoot; + [HideInInspector] + public float tileSize = 2f; + Color gizmoColor = Color.red; + + public GameObject[] getTilesFromType(TileTypes type) + { + switch (type) + { + case TileTypes.Wall: + return tileset.wallTiles; + case TileTypes.Pillar: + return tileset.pillarTiles; + case TileTypes.Floor: + return tileset.floorTiles; + } + return null; + } + + private void OnDrawGizmosSelected() + { + + } + + + + public TileTypes getTypeFromTile(GameObject tile) + { + TileTypes type = TileTypes.None; + if (tileset.wallTiles.ToList().Find(x => x == tile)) + type = TileTypes.Wall; + if (tileset.floorTiles.ToList().Find(x => x == tile)) + type = TileTypes.Floor; + if (tileset.pillarTiles.ToList().Find(x => x == tile)) + type = TileTypes.Pillar; + return type; + } + + + void OnEnable() + { + print("Selected: " + selected.Count); + snapLastHandlePosition = transform.position; + } + + void Start() + { + snapLastHandlePosition = transform.position; + geometryRoot = geometry; + } + + void Update() + { + } + + private void OnDrawGizmos() + { + } + + public GameObject createInstance(GameObject instanceType, Vector3 spawnPosition, Quaternion spawnRotation) + { + GameObject instance = PrefabUtility.InstantiatePrefab(instanceType) as GameObject; + instance.transform.position = spawnPosition; + instance.transform.rotation = spawnRotation; + instance.transform.parent = geometry.transform; + instance.GetComponent().tileset = tileset; + instance.name = instanceType.name; + return instance.transform.GetChild(0).gameObject; + } + } +} \ No newline at end of file diff --git a/Packages/Floorplan-2.0/Scripts/floorplan.cs.meta b/Packages/Floorplan-2.0/Scripts/floorplan.cs.meta new file mode 100644 index 00000000..2dfaaad9 --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/floorplan.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b9106951e7a6bcb4eae8310b1362189a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: + - tileset: {fileID: 11400000, guid: 04655de02232d0642ad32b971b2e2a91, type: 2} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Scripts/floorplanComponent.cs b/Packages/Floorplan-2.0/Scripts/floorplanComponent.cs new file mode 100644 index 00000000..0aa5c03a --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/floorplanComponent.cs @@ -0,0 +1,136 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityEngine; +using alexism.Floorplan.Core.ScriptableObjects; +using alexism.Floorplan.Core.Enums; + +namespace alexism.Floorplan.Core.Components +{ + [ExecuteInEditMode] + [SelectionBase] + + public class floorplanComponent : MonoBehaviour + { + public floorplanTileset tileset; + public List stuff; + Vector3 offset; + public TileTypes tileType=TileTypes.Wall; + void Start() { + if (EditorApplication.isPlaying) + return; + Renderer r = transform.GetChild(0).GetComponent(); + offset = r.bounds.center - new Vector3(0, r.bounds.size.y / 2.4f); + stuff = new List(); +#if UNITY_EDITOR + if (Physics.CheckSphere(offset, .1f) && tileType==TileTypes.Floor) + { + + Collider[] overlaps = Physics.OverlapSphere(offset, .1f); + foreach (Collider overlap in overlaps) + { + if (overlap.transform.root == transform.root && !isChild(overlap.transform, transform)) + { + print("Destroyed overlap: " + overlap.transform.name); + DestroyImmediate(overlap.transform.parent.gameObject); + } + } + } +#endif + } + + private void OnEnable() + { + //if (EditorApplication.isPlaying) + // return; + //if (Physics.CheckSphere(offset, .1f)) + //{ + + // Collider[] overlaps = Physics.OverlapSphere(offset, .1f); + // foreach (Collider overlap in overlaps) + // { + // if (overlap.transform.root == transform.root && !isChild(overlap.transform, transform)) + // { + // print("Destroyed overlap: " + overlap.transform.name); + // overlap.transform.parent.position += new Vector3(0, 10, 0); + // } + // } + //} + } + + bool isChild(Transform c,Transform p) + { + bool t = false; + foreach(Transform child in p) + { + if (child == c) + { + t = true; + break; + } + else + { + if (child.childCount > 0) + { + t=isChild(c, child); + } + } + } + return t; + } + + public GameObject[] getTilesFromType(TileTypes type) + { + switch (type) + { + case TileTypes.Wall: + return tileset.wallTiles; + case TileTypes.Pillar: + return tileset.pillarTiles; + case TileTypes.Floor: + return tileset.floorTiles; + } + return null; + } + + public TileTypes getTypeFromTile(GameObject tile) + { + TileTypes type=TileTypes.None; + if(tileset.wallTiles.ToList().Find(x => x==tile)) + type = TileTypes.Wall; + if(tileset.floorTiles.ToList().Find(x => x==tile)) + type = TileTypes.Floor; + if(tileset.pillarTiles.ToList().Find(x => x==tile)) + type = TileTypes.Pillar; + return type; + } + + public void ChangeComponentType(GameObject newType) + { + + // GameObject newInstance = GameObject.Instantiate (newType, transform.position, transform.rotation); + GameObject newInstance = PrefabUtility.InstantiatePrefab(newType) as GameObject; + newInstance.transform.position = this.transform.position; + newInstance.transform.rotation = this.transform.rotation; + newInstance.transform.localScale = this.transform.localScale; + newInstance.transform.parent = this.transform.parent; + newInstance.GetComponent().tileset = tileset; + Renderer newRenderer = newInstance.transform.GetChild(0).GetComponent(); + Renderer oldRenderer = transform.GetChild(0).GetComponent(); + if (newRenderer.sharedMaterials.Length > 0) + { + newInstance.transform.GetChild(0).GetComponent().materials = transform.GetChild(0).GetComponent().sharedMaterials; + } + else + { + newInstance.transform.GetChild(0).GetComponent().material = transform.GetChild(0).GetComponent().sharedMaterial; + } + GameObject.DestroyImmediate(this.gameObject); + + } + private void OnDrawGizmos() + { + } + } +} \ No newline at end of file diff --git a/Packages/Floorplan-2.0/Scripts/floorplanComponent.cs.meta b/Packages/Floorplan-2.0/Scripts/floorplanComponent.cs.meta new file mode 100644 index 00000000..bdbed34c --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/floorplanComponent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d933d9bbd3e611d41a488afaa8ac3106 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Scripts/floorplanTileset.cs b/Packages/Floorplan-2.0/Scripts/floorplanTileset.cs new file mode 100644 index 00000000..396f949e --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/floorplanTileset.cs @@ -0,0 +1,14 @@ +using System.Collections; +using UnityEngine; +using alexism.Floorplan.Core.Enums; + +namespace alexism.Floorplan.Core.ScriptableObjects +{ + [CreateAssetMenu(fileName = "New Floorplan Tileset", menuName = "Floorplan Tileset")] + public class floorplanTileset : ScriptableObject + { + public GameObject[] floorTiles; + public GameObject[] wallTiles; + public GameObject[] pillarTiles; + } +} \ No newline at end of file diff --git a/Packages/Floorplan-2.0/Scripts/floorplanTileset.cs.meta b/Packages/Floorplan-2.0/Scripts/floorplanTileset.cs.meta new file mode 100644 index 00000000..5e722126 --- /dev/null +++ b/Packages/Floorplan-2.0/Scripts/floorplanTileset.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8441b0125f23fb644b2d1fbd1835ee18 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Static.meta b/Packages/Floorplan-2.0/Static.meta new file mode 100644 index 00000000..60b21619 --- /dev/null +++ b/Packages/Floorplan-2.0/Static.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 72f2b3ca417977c478c453ea0f2609a0 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Static/GridUtilityEditor.cs b/Packages/Floorplan-2.0/Static/GridUtilityEditor.cs new file mode 100644 index 00000000..df567dbb --- /dev/null +++ b/Packages/Floorplan-2.0/Static/GridUtilityEditor.cs @@ -0,0 +1,571 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace alexism.Floorplan.Core.Static +{ + public static class GridEditorUtility + { + private const int k_GridGizmoVertexCount = 32000; + private const float k_GridGizmoDistanceFalloff = 50f; + + public static Vector3Int ClampToGrid(Vector3Int p, Vector2Int origin, Vector2Int gridSize) + { + return new Vector3Int( + Math.Max(Math.Min(p.x, origin.x + gridSize.x - 1), origin.x), + Math.Max(Math.Min(p.y, origin.y + gridSize.y - 1), origin.y), + p.z + ); + } + + public static Vector3 ScreenToLocal(Transform transform, Vector2 screenPosition) + { + return ScreenToLocal(transform, screenPosition, new Plane(transform.forward * -1f, transform.position)); + } + + public static Vector3 ScreenToLocal(Transform transform, Vector2 screenPosition, Plane plane) + { + Ray ray; + if (Camera.current.orthographic) + { + Vector2 screen = EditorGUIUtility.PointsToPixels(screenPosition); + screen.y = Screen.height - screen.y; + Vector3 cameraWorldPoint = Camera.current.ScreenToWorldPoint(screen); + ray = new Ray(cameraWorldPoint, Camera.current.transform.forward); + } + else + { + ray = HandleUtility.GUIPointToWorldRay(screenPosition); + } + + float result; + plane.Raycast(ray, out result); + Vector3 world = ray.GetPoint(result); + return transform.InverseTransformPoint(world); + } + + public static RectInt GetMarqueeRect(Vector2Int p1, Vector2Int p2) + { + return new RectInt( + Math.Min(p1.x, p2.x), + Math.Min(p1.y, p2.y), + Math.Abs(p2.x - p1.x) + 1, + Math.Abs(p2.y - p1.y) + 1 + ); + } + + public static BoundsInt GetMarqueeBounds(Vector3Int p1, Vector3Int p2) + { + return new BoundsInt( + Math.Min(p1.x, p2.x), + Math.Min(p1.y, p2.y), + Math.Min(p1.z, p2.z), + Math.Abs(p2.x - p1.x) + 1, + Math.Abs(p2.y - p1.y) + 1, + Math.Abs(p2.z - p1.z) + 1 + ); + } + + // http://ericw.ca/notes/bresenhams-line-algorithm-in-csharp.html + public static IEnumerable GetPointsOnLine(Vector2Int p1, Vector2Int p2) + { + int x0 = p1.x; + int y0 = p1.y; + int x1 = p2.x; + int y1 = p2.y; + + bool steep = Math.Abs(y1 - y0) > Math.Abs(x1 - x0); + if (steep) + { + int t; + t = x0; // swap x0 and y0 + x0 = y0; + y0 = t; + t = x1; // swap x1 and y1 + x1 = y1; + y1 = t; + } + if (x0 > x1) + { + int t; + t = x0; // swap x0 and x1 + x0 = x1; + x1 = t; + t = y0; // swap y0 and y1 + y0 = y1; + y1 = t; + } + int dx = x1 - x0; + int dy = Math.Abs(y1 - y0); + int error = dx / 2; + int ystep = (y0 < y1) ? 1 : -1; + int y = y0; + for (int x = x0; x <= x1; x++) + { + yield return new Vector2Int((steep ? y : x), (steep ? x : y)); + error = error - dy; + if (error < 0) + { + y += ystep; + error += dx; + } + } + } + + public static void DrawBatchedHorizontalLine(float x1, float x2, float y) + { + GL.Vertex3(x1, y, 0f); + GL.Vertex3(x2, y, 0f); + GL.Vertex3(x2, y + 1, 0f); + GL.Vertex3(x1, y + 1, 0f); + } + + public static void DrawBatchedVerticalLine(float y1, float y2, float x) + { + GL.Vertex3(x, y1, 0f); + GL.Vertex3(x, y2, 0f); + GL.Vertex3(x + 1, y2, 0f); + GL.Vertex3(x + 1, y1, 0f); + } + + public static void DrawBatchedLine(Vector3 p1, Vector3 p2) + { + GL.Vertex3(p1.x, p1.y, p1.z); + GL.Vertex3(p2.x, p2.y, p2.z); + } + + public static void DrawLine(Vector2 p1, Vector2 p2, Color color) + { + if (Event.current.type != EventType.Repaint) + return; + + GL.PushMatrix(); + GL.MultMatrix(GUI.matrix); + GL.Begin(GL.LINES); + GL.Color(color); + DrawBatchedLine(p1, p2); + GL.End(); + GL.PopMatrix(); + } + + public static void DrawBox(Rect r, Color color) + { + if (Event.current.type != EventType.Repaint) + return; + + GL.PushMatrix(); + GL.MultMatrix(GUI.matrix); + GL.Begin(GL.LINES); + GL.Color(color); + DrawBatchedLine(new Vector3(r.xMin, r.yMin, 0f), new Vector3(r.xMax, r.yMin, 0f)); + DrawBatchedLine(new Vector3(r.xMax, r.yMin, 0f), new Vector3(r.xMax, r.yMax, 0f)); + DrawBatchedLine(new Vector3(r.xMax, r.yMax, 0f), new Vector3(r.xMin, r.yMax, 0f)); + DrawBatchedLine(new Vector3(r.xMin, r.yMax, 0f), new Vector3(r.xMin, r.yMin, 0f)); + GL.End(); + GL.PopMatrix(); + } + + public static void DrawFilledBox(Rect r, Color color) + { + if (Event.current.type != EventType.Repaint) + return; + + GL.PushMatrix(); + GL.MultMatrix(GUI.matrix); + GL.Begin(GL.QUADS); + GL.Color(color); + GL.Vertex3(r.xMin, r.yMin, 0f); + GL.Vertex3(r.xMax, r.yMin, 0f); + GL.Vertex3(r.xMax, r.yMax, 0f); + GL.Vertex3(r.xMin, r.yMax, 0f); + GL.End(); + GL.PopMatrix(); + } + + public static void DrawGridMarquee(GridLayout gridLayout, BoundsInt area, Color color) + { + switch (gridLayout.cellLayout) + { + case GridLayout.CellLayout.Hexagon: + DrawSelectedHexGridArea(gridLayout, area, color); + break; + case GridLayout.CellLayout.Isometric: + case GridLayout.CellLayout.IsometricZAsY: + case GridLayout.CellLayout.Rectangle: + var cellStride = gridLayout.cellSize + gridLayout.cellGap; + var cellGap = Vector3.one; + if (!Mathf.Approximately(cellStride.x, 0f)) + { + cellGap.x = gridLayout.cellSize.x / cellStride.x; + } + if (!Mathf.Approximately(cellStride.y, 0f)) + { + cellGap.y = gridLayout.cellSize.y / cellStride.y; + } + + Vector3[] cellLocals = + { + gridLayout.CellToLocal(new Vector3Int(area.xMin, area.yMin, area.zMin)), + gridLayout.CellToLocalInterpolated(new Vector3(area.xMax - 1 + cellGap.x, area.yMin, area.zMin)), + gridLayout.CellToLocalInterpolated(new Vector3(area.xMax - 1 + cellGap.x, area.yMax - 1 + cellGap.y, area.zMin)), + gridLayout.CellToLocalInterpolated(new Vector3(area.xMin, area.yMax - 1 + cellGap.y, area.zMin)) + }; + + GL.PushMatrix(); + GL.MultMatrix(gridLayout.transform.localToWorldMatrix); + GL.Begin(GL.LINES); + GL.Color(color); + int i = 0; + + for (int j = cellLocals.Length - 1; i < cellLocals.Length; j = i++) + DrawBatchedLine(cellLocals[j], cellLocals[i]); + + GL.End(); + GL.PopMatrix(); + break; + } + } + + public static void DrawSelectedHexGridArea(GridLayout gridLayout, BoundsInt area, Color color) + { + int requiredVertices = 4 * (area.size.x + area.size.y) - 2; + if (requiredVertices < 0) + return; + Vector3[] cellLocals = new Vector3[requiredVertices]; + int horizontalCount = area.size.x * 2; + int verticalCount = area.size.y * 2 - 1; + int bottom = 0; + int top = horizontalCount + verticalCount + horizontalCount - 1; + int left = requiredVertices - 1; + int right = horizontalCount; + Vector3[] cellOffset = + { + Grid.Swizzle(gridLayout.cellSwizzle, new Vector3(0, gridLayout.cellSize.y / 2, area.zMin)), + Grid.Swizzle(gridLayout.cellSwizzle, new Vector3(gridLayout.cellSize.x / 2, gridLayout.cellSize.y / 4, area.zMin)), + Grid.Swizzle(gridLayout.cellSwizzle, new Vector3(gridLayout.cellSize.x / 2, -gridLayout.cellSize.y / 4, area.zMin)), + Grid.Swizzle(gridLayout.cellSwizzle, new Vector3(0, -gridLayout.cellSize.y / 2, area.zMin)), + Grid.Swizzle(gridLayout.cellSwizzle, new Vector3(-gridLayout.cellSize.x / 2, -gridLayout.cellSize.y / 4, area.zMin)), + Grid.Swizzle(gridLayout.cellSwizzle, new Vector3(-gridLayout.cellSize.x / 2, gridLayout.cellSize.y / 4, area.zMin)) + }; + // Fill Top and Bottom Vertices + for (int x = area.min.x; x < area.max.x; x++) + { + cellLocals[bottom++] = gridLayout.CellToLocal(new Vector3Int(x, area.min.y, area.zMin)) + cellOffset[4]; + cellLocals[bottom++] = gridLayout.CellToLocal(new Vector3Int(x, area.min.y, area.zMin)) + cellOffset[3]; + cellLocals[top--] = gridLayout.CellToLocal(new Vector3Int(x, area.max.y - 1, area.zMin)) + cellOffset[0]; + cellLocals[top--] = gridLayout.CellToLocal(new Vector3Int(x, area.max.y - 1, area.zMin)) + cellOffset[1]; + } + // Fill first Left and Right Vertices + cellLocals[left--] = gridLayout.CellToLocal(new Vector3Int(area.min.x, area.min.y, area.zMin)) + cellOffset[5]; + cellLocals[top--] = gridLayout.CellToLocal(new Vector3Int(area.max.x - 1, area.max.y - 1, area.zMin)) + cellOffset[2]; + // Fill Left and Right Vertices + for (int y = area.min.y + 1; y < area.max.y; y++) + { + cellLocals[left--] = gridLayout.CellToLocal(new Vector3Int(area.min.x, y, area.zMin)) + cellOffset[4]; + cellLocals[left--] = gridLayout.CellToLocal(new Vector3Int(area.min.x, y, area.zMin)) + cellOffset[5]; + } + for (int y = area.min.y; y < (area.max.y - 1); y++) + { + cellLocals[right++] = gridLayout.CellToLocal(new Vector3Int(area.max.x - 1, y, area.zMin)) + cellOffset[2]; + cellLocals[right++] = gridLayout.CellToLocal(new Vector3Int(area.max.x - 1, y, area.zMin)) + cellOffset[1]; + } + GL.PushMatrix(); + GL.MultMatrix(gridLayout.transform.localToWorldMatrix); + GL.Begin(GL.LINES); + GL.Color(color); + int i = 0; + for (int j = cellLocals.Length - 1; i < cellLocals.Length; j = i++) + { + DrawBatchedLine(cellLocals[j], cellLocals[i]); + } + GL.End(); + GL.PopMatrix(); + } + + public static void DrawGridGizmo(GridLayout gridLayout, Transform transform, Color color, ref Mesh gridMesh, ref Material gridMaterial) + { + // TODO: Hook this up with DrawGrid + if (Event.current.type != EventType.Repaint) + return; + + if (gridMesh == null) + gridMesh = GenerateCachedGridMesh(gridLayout, color); + + if (gridMaterial == null) + { + gridMaterial = (Material)EditorGUIUtility.LoadRequired("SceneView/GridGap.mat"); + } + + if (gridLayout.cellLayout == GridLayout.CellLayout.Hexagon) + { + gridMaterial.SetVector("_Gap", new Vector4(1f, 1f / 3f, 1f, 1f)); + gridMaterial.SetVector("_Stride", new Vector4(1f, 1f, 1f, 1f)); + } + else + { + gridMaterial.SetVector("_Gap", gridLayout.cellSize); + gridMaterial.SetVector("_Stride", gridLayout.cellGap + gridLayout.cellSize); + } + + gridMaterial.SetPass(0); + GL.PushMatrix(); + if (gridMesh.GetTopology(0) == MeshTopology.Lines) + GL.Begin(GL.LINES); + else + GL.Begin(GL.QUADS); + + Graphics.DrawMeshNow(gridMesh, transform.localToWorldMatrix); + GL.End(); + GL.PopMatrix(); + } + + public static Vector3 GetSpriteWorldSize(Sprite sprite) + { + if (sprite != null && sprite.rect.size.magnitude > 0f) + { + return new Vector3( + sprite.rect.size.x / sprite.pixelsPerUnit, + sprite.rect.size.y / sprite.pixelsPerUnit, + 1f + ); + } + return Vector3.one; + } + + private static Mesh GenerateCachedGridMesh(GridLayout gridLayout, Color color) + { + switch (gridLayout.cellLayout) + { + case GridLayout.CellLayout.Hexagon: + return GenerateCachedHexagonalGridMesh(gridLayout, color); + case GridLayout.CellLayout.Isometric: + case GridLayout.CellLayout.IsometricZAsY: + case GridLayout.CellLayout.Rectangle: + int min = k_GridGizmoVertexCount / -32; + int max = min * -1; + int numCells = max - min; + RectInt bounds = new RectInt(min, min, numCells, numCells); + + return GenerateCachedGridMesh(gridLayout, color, 0f, bounds, MeshTopology.Lines); + } + return null; + } + + public static Mesh GenerateCachedGridMesh(GridLayout gridLayout, Color color, float screenPixelSize, RectInt bounds, MeshTopology topology) + { + Mesh mesh = new Mesh(); + mesh.hideFlags = HideFlags.HideAndDontSave; + + int vertex = 0; + + int totalVertices = topology == MeshTopology.Quads ? + 8 * (bounds.size.x + bounds.size.y) : + 4 * (bounds.size.x + bounds.size.y); + + Vector3 horizontalPixelOffset = new Vector3(screenPixelSize, 0f, 0f); + Vector3 verticalPixelOffset = new Vector3(0f, screenPixelSize, 0f); + + Vector3[] vertices = new Vector3[totalVertices]; + Vector2[] uvs2 = new Vector2[totalVertices]; + + Vector3 cellStride = gridLayout.cellSize + gridLayout.cellGap; + Vector3Int minPosition = new Vector3Int(0, bounds.min.y, 0); + Vector3Int maxPosition = new Vector3Int(0, bounds.max.y, 0); + + Vector3 cellGap = Vector3.zero; + if (!Mathf.Approximately(cellStride.x, 0f)) + { + cellGap.x = gridLayout.cellSize.x / cellStride.x; + } + + for (int x = bounds.min.x; x < bounds.max.x; x++) + { + minPosition.x = x; + maxPosition.x = x; + + vertices[vertex + 0] = gridLayout.CellToLocal(minPosition); + vertices[vertex + 1] = gridLayout.CellToLocal(maxPosition); + uvs2[vertex + 0] = Vector2.zero; + uvs2[vertex + 1] = new Vector2(0f, cellStride.y * bounds.size.y); + if (topology == MeshTopology.Quads) + { + vertices[vertex + 2] = gridLayout.CellToLocal(maxPosition) + horizontalPixelOffset; + vertices[vertex + 3] = gridLayout.CellToLocal(minPosition) + horizontalPixelOffset; + uvs2[vertex + 2] = new Vector2(0f, cellStride.y * bounds.size.y); + uvs2[vertex + 3] = Vector2.zero; + } + vertex += topology == MeshTopology.Quads ? 4 : 2; + + vertices[vertex + 0] = gridLayout.CellToLocalInterpolated(minPosition + cellGap); + vertices[vertex + 1] = gridLayout.CellToLocalInterpolated(maxPosition + cellGap); + uvs2[vertex + 0] = Vector2.zero; + uvs2[vertex + 1] = new Vector2(0f, cellStride.y * bounds.size.y); + if (topology == MeshTopology.Quads) + { + vertices[vertex + 2] = gridLayout.CellToLocalInterpolated(maxPosition + cellGap) + horizontalPixelOffset; + vertices[vertex + 3] = gridLayout.CellToLocalInterpolated(minPosition + cellGap) + horizontalPixelOffset; + uvs2[vertex + 2] = new Vector2(0f, cellStride.y * bounds.size.y); + uvs2[vertex + 3] = Vector2.zero; + } + vertex += topology == MeshTopology.Quads ? 4 : 2; + } + + minPosition = new Vector3Int(bounds.min.x, 0, 0); + maxPosition = new Vector3Int(bounds.max.x, 0, 0); + cellGap = Vector3.zero; + if (!Mathf.Approximately(cellStride.y, 0f)) + { + cellGap.y = gridLayout.cellSize.y / cellStride.y; + } + + for (int y = bounds.min.y; y < bounds.max.y; y++) + { + minPosition.y = y; + maxPosition.y = y; + + vertices[vertex + 0] = gridLayout.CellToLocal(minPosition); + vertices[vertex + 1] = gridLayout.CellToLocal(maxPosition); + uvs2[vertex + 0] = Vector2.zero; + uvs2[vertex + 1] = new Vector2(cellStride.x * bounds.size.x, 0f); + if (topology == MeshTopology.Quads) + { + vertices[vertex + 2] = gridLayout.CellToLocal(maxPosition) + verticalPixelOffset; + vertices[vertex + 3] = gridLayout.CellToLocal(minPosition) + verticalPixelOffset; + uvs2[vertex + 2] = new Vector2(cellStride.x * bounds.size.x, 0f); + uvs2[vertex + 3] = Vector2.zero; + } + vertex += topology == MeshTopology.Quads ? 4 : 2; + + vertices[vertex + 0] = gridLayout.CellToLocalInterpolated(minPosition + cellGap); + vertices[vertex + 1] = gridLayout.CellToLocalInterpolated(maxPosition + cellGap); + uvs2[vertex + 0] = Vector2.zero; + uvs2[vertex + 1] = new Vector2(cellStride.x * bounds.size.x, 0f); + if (topology == MeshTopology.Quads) + { + vertices[vertex + 2] = gridLayout.CellToLocalInterpolated(maxPosition + cellGap) + verticalPixelOffset; + vertices[vertex + 3] = gridLayout.CellToLocalInterpolated(minPosition + cellGap) + verticalPixelOffset; + uvs2[vertex + 2] = new Vector2(cellStride.x * bounds.size.x, 0f); + uvs2[vertex + 3] = Vector2.zero; + } + vertex += topology == MeshTopology.Quads ? 4 : 2; + } + + var uv0 = new Vector2(k_GridGizmoDistanceFalloff, 0f); + var uvs = new Vector2[vertex]; + var indices = new int[vertex]; + var colors = new Color[vertex]; + var normals = new Vector3[totalVertices]; // Normal channel stores the position of the other end point of the line. + var uvs3 = new Vector2[totalVertices]; // UV3 channel stores the UV2 value of the other end point of the line. + + for (int i = 0; i < vertex; i++) + { + uvs[i] = uv0; + indices[i] = i; + colors[i] = color; + var alternate = i + ((i % 2) == 0 ? 1 : -1); + normals[i] = vertices[alternate]; + uvs3[i] = uvs2[alternate]; + } + + mesh.vertices = vertices; + mesh.uv = uvs; + mesh.uv2 = uvs2; + mesh.uv3 = uvs3; + mesh.colors = colors; + mesh.normals = normals; + mesh.SetIndices(indices, topology, 0); + + return mesh; + } + + private static Mesh GenerateCachedHexagonalGridMesh(GridLayout gridLayout, Color color) + { + Mesh mesh = new Mesh(); + mesh.hideFlags = HideFlags.HideAndDontSave; + int vertex = 0; + int max = k_GridGizmoVertexCount / (2 * (6 * 2)); + max = (max / 4) * 4; + int min = -max; + float numVerticalCells = 6 * (max / 4); + int totalVertices = max * 2 * 6 * 2; + var cellStrideY = gridLayout.cellGap.y + gridLayout.cellSize.y; + var cellOffsetY = gridLayout.cellSize.y / 2; + var hexOffset = (1.0f / 3.0f); + var drawTotal = numVerticalCells * 2.0f * hexOffset; + var drawDiagTotal = 2 * drawTotal; + Vector3[] vertices = new Vector3[totalVertices]; + Vector2[] uvs2 = new Vector2[totalVertices]; + // Draw Vertical Lines + for (int x = min; x < max; x++) + { + vertices[vertex] = gridLayout.CellToLocal(new Vector3Int(x, min, 0)); + vertices[vertex + 1] = gridLayout.CellToLocal(new Vector3Int(x, max, 0)); + uvs2[vertex] = new Vector2(0f, 2 * hexOffset); + uvs2[vertex + 1] = new Vector2(0f, 2 * hexOffset + drawTotal); + vertex += 2; + // Alternate Row Offset + vertices[vertex] = gridLayout.CellToLocal(new Vector3Int(x, min - 1, 0)); + vertices[vertex + 1] = gridLayout.CellToLocal(new Vector3Int(x, max - 1, 0)); + uvs2[vertex] = new Vector2(0f, 2 * hexOffset); + uvs2[vertex + 1] = new Vector2(0f, 2 * hexOffset + drawTotal); + vertex += 2; + } + // Draw Diagonals + for (int y = min; y < max; y++) + { + float drawDiagOffset = ((y + 1) % 3) * hexOffset; + var cellOffSet = Grid.Swizzle(gridLayout.cellSwizzle, new Vector3(0f, y * cellStrideY + cellOffsetY, 0.0f)); + // Slope Up + vertices[vertex] = gridLayout.CellToLocal(new Vector3Int(Mathf.RoundToInt(1.5f * min), min, 0)) + cellOffSet; + vertices[vertex + 1] = gridLayout.CellToLocal(new Vector3Int(Mathf.RoundToInt(1.5f * max), max, 0)) + cellOffSet; + uvs2[vertex] = new Vector2(0f, drawDiagOffset); + uvs2[vertex + 1] = new Vector2(0f, drawDiagOffset + drawDiagTotal); + vertex += 2; + // Slope Down + vertices[vertex] = gridLayout.CellToLocal(new Vector3Int(Mathf.RoundToInt(1.5f * max), min, 0)) + cellOffSet; + vertices[vertex + 1] = gridLayout.CellToLocal(new Vector3Int(Mathf.RoundToInt(1.5f * min), max, 0)) + cellOffSet; + uvs2[vertex] = new Vector2(0f, drawDiagOffset); + uvs2[vertex + 1] = new Vector2(0f, drawDiagOffset + drawDiagTotal); + vertex += 2; + // Alternate Row Offset + vertices[vertex] = gridLayout.CellToLocal(new Vector3Int(Mathf.RoundToInt(1.5f * min) + 1, min, 0)) + cellOffSet; + vertices[vertex + 1] = gridLayout.CellToLocal(new Vector3Int(Mathf.RoundToInt(1.5f * max) + 1, max, 0)) + cellOffSet; + uvs2[vertex] = new Vector2(0f, drawDiagOffset); + uvs2[vertex + 1] = new Vector2(0f, drawDiagOffset + drawDiagTotal); + vertex += 2; + vertices[vertex] = gridLayout.CellToLocal(new Vector3Int(Mathf.RoundToInt(1.5f * max) + 1, min, 0)) + cellOffSet; + vertices[vertex + 1] = gridLayout.CellToLocal(new Vector3Int(Mathf.RoundToInt(1.5f * min) + 1, max, 0)) + cellOffSet; + uvs2[vertex] = new Vector2(0f, drawDiagOffset); + uvs2[vertex + 1] = new Vector2(0f, drawDiagOffset + drawDiagTotal); + vertex += 2; + } + var uv0 = new Vector2(k_GridGizmoDistanceFalloff, 0f); + var indices = new int[totalVertices]; + var uvs = new Vector2[totalVertices]; + var colors = new Color[totalVertices]; + var normals = new Vector3[totalVertices]; // Normal channel stores the position of the other end point of the line. + var uvs3 = new Vector2[totalVertices]; // UV3 channel stores the UV2 value of the other end point of the line. + + for (int i = 0; i < totalVertices; i++) + { + uvs[i] = uv0; + indices[i] = i; + colors[i] = color; + var alternate = i + ((i % 2) == 0 ? 1 : -1); + normals[i] = vertices[alternate]; + uvs3[i] = uvs2[alternate]; + } + + mesh.vertices = vertices; + mesh.uv = uvs; + mesh.uv2 = uvs2; + mesh.uv3 = uvs3; + mesh.colors = colors; + mesh.normals = normals; + mesh.SetIndices(indices, MeshTopology.Lines, 0); + return mesh; + } + } +} \ No newline at end of file diff --git a/Packages/Floorplan-2.0/Static/GridUtilityEditor.cs.meta b/Packages/Floorplan-2.0/Static/GridUtilityEditor.cs.meta new file mode 100644 index 00000000..b1b48c61 --- /dev/null +++ b/Packages/Floorplan-2.0/Static/GridUtilityEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4dbeb7e810b463742b937ae39fe73c12 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Static/MeshWelder.cs b/Packages/Floorplan-2.0/Static/MeshWelder.cs new file mode 100644 index 00000000..f2dbeaca --- /dev/null +++ b/Packages/Floorplan-2.0/Static/MeshWelder.cs @@ -0,0 +1,194 @@ +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + + public enum EVertexAttribute + { + Position = 0x0001, + Normal = 0x0002, + Tangent = 0x0004, + Color = 0x0008, + UV1 = 0x0010, + UV2 = 0x0020, + UV3 = 0x0040, + UV4 = 0x0080, + BoneWeight = 0x0100, + } + + public class Vertex + { + public Vector3 pos; + public Vector3 normal; + public Vector4 tangent; + public Color color; + public Vector2 uv1; + public Vector2 uv2; + public Vector2 uv3; + public Vector2 uv4; + public BoneWeight bWeight; + public Vertex(Vector3 aPos) + { + pos = aPos; + } + } + + public class MeshWelder + { + + Vertex[] vertices; + List newVerts; + int[] map; + + EVertexAttribute m_Attributes; + Mesh m_Mesh; + public float MaxUVDelta = 0.0001f; + public float MaxPositionDelta = 0.001f; + public float MaxAngleDelta = 0.01f; + public float MaxColorDelta = 1f / 255f; + public float MaxBWeightDelta = 0.01f; + + public MeshWelder(Mesh aMesh) + { + m_Mesh = aMesh; + } + + private bool HasAttr(EVertexAttribute aAttr) + { + return (m_Attributes & aAttr) != 0; + } + private bool CompareColor(Color c1, Color c2) + { + return + (Mathf.Abs(c1.r - c2.r) <= MaxColorDelta) && + (Mathf.Abs(c1.g - c2.g) <= MaxColorDelta) && + (Mathf.Abs(c1.b - c2.b) <= MaxColorDelta) && + (Mathf.Abs(c1.a - c2.a) <= MaxColorDelta); + } + + private bool CompareBoneWeight(BoneWeight v1, BoneWeight v2) + { + if (v1.boneIndex0 != v2.boneIndex0 || v1.boneIndex1 != v2.boneIndex1 || + v1.boneIndex2 != v2.boneIndex2 || v1.boneIndex3 != v2.boneIndex3) return false; + if (Mathf.Abs(v1.weight0 - v2.weight0) > MaxBWeightDelta) return false; + if (Mathf.Abs(v1.weight1 - v2.weight1) > MaxBWeightDelta) return false; + if (Mathf.Abs(v1.weight2 - v2.weight2) > MaxBWeightDelta) return false; + if (Mathf.Abs(v1.weight3 - v2.weight3) > MaxBWeightDelta) return false; + return true; + } + + private bool Compare(Vertex v1, Vertex v2) + { + if ((v1.pos - v2.pos).sqrMagnitude > MaxPositionDelta) return false; + if (HasAttr(EVertexAttribute.Normal) && Vector3.Angle(v1.normal, v2.normal) > MaxAngleDelta) return false; + if (HasAttr(EVertexAttribute.Tangent) && Vector3.Angle(v1.tangent, v2.tangent) > MaxAngleDelta || v1.tangent.w != v2.tangent.w) return false; + if (HasAttr(EVertexAttribute.Color) && !CompareColor(v1.color, v2.color)) return false; + if (HasAttr(EVertexAttribute.UV1) && (v1.uv1 - v2.uv1).sqrMagnitude > MaxUVDelta) return false; + if (HasAttr(EVertexAttribute.UV2) && (v1.uv2 - v2.uv2).sqrMagnitude > MaxUVDelta) return false; + if (HasAttr(EVertexAttribute.UV3) && (v1.uv3 - v2.uv3).sqrMagnitude > MaxUVDelta) return false; + if (HasAttr(EVertexAttribute.UV4) && (v1.uv4 - v2.uv4).sqrMagnitude > MaxUVDelta) return false; + if (HasAttr(EVertexAttribute.BoneWeight) && !CompareBoneWeight(v1.bWeight, v2.bWeight)) return false; + return true; + } + + private void CreateVertexList() + { + var Positions = m_Mesh.vertices; + var Normals = m_Mesh.normals; + var Tangents = m_Mesh.tangents; + var Colors = m_Mesh.colors; + var Uv1 = m_Mesh.uv; + var Uv2 = m_Mesh.uv2; + var Uv3 = m_Mesh.uv3; + var Uv4 = m_Mesh.uv4; + var BWeights = m_Mesh.boneWeights; + m_Attributes = EVertexAttribute.Position; + if (Normals != null && Normals.Length > 0) m_Attributes |= EVertexAttribute.Normal; + if (Tangents != null && Tangents.Length > 0) m_Attributes |= EVertexAttribute.Tangent; + if (Colors != null && Colors.Length > 0) m_Attributes |= EVertexAttribute.Color; + if (Uv1 != null && Uv1.Length > 0) m_Attributes |= EVertexAttribute.UV1; + if (Uv2 != null && Uv2.Length > 0) m_Attributes |= EVertexAttribute.UV2; + if (Uv3 != null && Uv3.Length > 0) m_Attributes |= EVertexAttribute.UV3; + if (Uv4 != null && Uv4.Length > 0) m_Attributes |= EVertexAttribute.UV4; + if (BWeights != null && BWeights.Length > 0) m_Attributes |= EVertexAttribute.BoneWeight; + + vertices = new Vertex[Positions.Length]; + for (int i = 0; i < Positions.Length; i++) + { + var v = new Vertex(Positions[i]); + if (HasAttr(EVertexAttribute.Normal)) v.normal = Normals[i]; + if (HasAttr(EVertexAttribute.Tangent)) v.tangent = Tangents[i]; + if (HasAttr(EVertexAttribute.Color)) v.color = Colors[i]; + if (HasAttr(EVertexAttribute.UV1)) v.uv1 = Uv1[i]; + if (HasAttr(EVertexAttribute.UV2)) v.uv2 = Uv2[i]; + if (HasAttr(EVertexAttribute.UV3)) v.uv3 = Uv3[i]; + if (HasAttr(EVertexAttribute.UV4)) v.uv4 = Uv4[i]; + if (HasAttr(EVertexAttribute.BoneWeight)) v.bWeight = BWeights[i]; + vertices[i] = v; + } + } + private void RemoveDuplicates() + { + map = new int[vertices.Length]; + newVerts = new List(); + for (int i = 0; i < vertices.Length; i++) + { + var v = vertices[i]; + bool dup = false; + for (int i2 = 0; i2 < newVerts.Count; i2++) + { + if (Compare(v, newVerts[i2])) + { + map[i] = i2; + dup = true; + break; + } + } + if (!dup) + { + map[i] = newVerts.Count; + newVerts.Add(v); + } + } + } + private void AssignNewVertexArrays() + { + m_Mesh.vertices = newVerts.Select(v => v.pos).ToArray(); + if (HasAttr(EVertexAttribute.Normal)) + m_Mesh.normals = newVerts.Select(v => v.normal).ToArray(); + if (HasAttr(EVertexAttribute.Tangent)) + m_Mesh.tangents = newVerts.Select(v => v.tangent).ToArray(); + if (HasAttr(EVertexAttribute.Color)) + m_Mesh.colors = newVerts.Select(v => v.color).ToArray(); + if (HasAttr(EVertexAttribute.UV1)) + m_Mesh.uv = newVerts.Select(v => v.uv1).ToArray(); + if (HasAttr(EVertexAttribute.UV2)) + m_Mesh.uv2 = newVerts.Select(v => v.uv2).ToArray(); + if (HasAttr(EVertexAttribute.UV3)) + m_Mesh.uv3 = newVerts.Select(v => v.uv3).ToArray(); + if (HasAttr(EVertexAttribute.UV4)) + m_Mesh.uv4 = newVerts.Select(v => v.uv4).ToArray(); + if (HasAttr(EVertexAttribute.BoneWeight)) + m_Mesh.boneWeights = newVerts.Select(v => v.bWeight).ToArray(); + } + + private void RemapTriangles() + { + for (int n = 0; n < m_Mesh.subMeshCount; n++) + { + var tris = m_Mesh.GetTriangles(n); + for (int i = 0; i < tris.Length; i++) + { + tris[i] = map[tris[i]]; + } + m_Mesh.SetTriangles(tris, n); + } + } + public void Weld() + { + CreateVertexList(); + RemoveDuplicates(); + RemapTriangles(); + AssignNewVertexArrays(); + } + } + diff --git a/Packages/Floorplan-2.0/Static/MeshWelder.cs.meta b/Packages/Floorplan-2.0/Static/MeshWelder.cs.meta new file mode 100644 index 00000000..7f6df793 --- /dev/null +++ b/Packages/Floorplan-2.0/Static/MeshWelder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a067ff12ca6ed39469eda7ab2c4b00df +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/Static/com.alexismorin.floorplan.static.asmdef b/Packages/Floorplan-2.0/Static/com.alexismorin.floorplan.static.asmdef new file mode 100644 index 00000000..05f88a00 --- /dev/null +++ b/Packages/Floorplan-2.0/Static/com.alexismorin.floorplan.static.asmdef @@ -0,0 +1,13 @@ +{ + "name": "com.alexismorin.floorplan.static", + "references": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Packages/Floorplan-2.0/Static/com.alexismorin.floorplan.static.asmdef.meta b/Packages/Floorplan-2.0/Static/com.alexismorin.floorplan.static.asmdef.meta new file mode 100644 index 00000000..d11031ff --- /dev/null +++ b/Packages/Floorplan-2.0/Static/com.alexismorin.floorplan.static.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c4df6f69b1bd3d542a0bd5e003678751 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/Floorplan-2.0/package.json b/Packages/Floorplan-2.0/package.json new file mode 100644 index 00000000..14af5ab2 --- /dev/null +++ b/Packages/Floorplan-2.0/package.json @@ -0,0 +1,12 @@ +{ + "name": "com.alexismorin.floorplan", + "displayName": "Floorplan", + "version": "2.0.0", + "unity": "2019.2", + "description": "A Sims-Like Unity Level Design Plugin", + "keywords": [ + "building", + "blocking" + ], + "category": "Open-Source" +} \ No newline at end of file diff --git a/Packages/Floorplan-2.0/package.json.meta b/Packages/Floorplan-2.0/package.json.meta new file mode 100644 index 00000000..0b80fbf0 --- /dev/null +++ b/Packages/Floorplan-2.0/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3d1ddb03157474846b14b0778778b020 +PackageManifestImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/manifest.json b/Packages/manifest.json index b6ac80c4..e21586e8 100644 --- a/Packages/manifest.json +++ b/Packages/manifest.json @@ -7,7 +7,6 @@ "com.unity.formats.fbx": "5.0.0", "com.unity.ide.rider": "3.0.24", "com.unity.ide.visualstudio": "2.0.18", - "com.unity.ide.vscode": "1.2.5", "com.unity.render-pipelines.universal": "15.0.6", "com.unity.test-framework": "1.3.9", "com.unity.textmeshpro": "3.0.6", diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json index 1f01105e..c963b2ff 100644 --- a/Packages/packages-lock.json +++ b/Packages/packages-lock.json @@ -1,5 +1,11 @@ { "dependencies": { + "com.alexismorin.floorplan": { + "version": "file:Floorplan-2.0", + "depth": 0, + "source": "embedded", + "dependencies": {} + }, "com.autodesk.fbx": { "version": "5.0.0", "depth": 1, @@ -86,13 +92,6 @@ }, "url": "https://packages.unity.com" }, - "com.unity.ide.vscode": { - "version": "1.2.5", - "depth": 0, - "source": "registry", - "dependencies": {}, - "url": "https://packages.unity.com" - }, "com.unity.mathematics": { "version": "1.2.6", "depth": 1,