From 7934513b05f1765cb7fb11285d8b139afa18e399 Mon Sep 17 00:00:00 2001 From: Joywayer Date: Tue, 28 Jul 2026 11:50:33 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E5=88=A0=E9=99=A4=E7=AC=AC=E4=B8=89?= =?UTF-8?q?=E6=96=B9=202D=20=E5=AF=BB=E8=B7=AF=E5=BA=93=E6=95=B4=E5=8C=85(?= =?UTF-8?q?112=20=E8=84=9A=E6=9C=AC/21069=20=E8=A1=8C,=E5=90=AB=204=20?= =?UTF-8?q?=E5=A4=84=E5=AF=B9=E5=85=B6=E6=BA=90=E7=A0=81=E7=9A=84=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E6=94=B9=E5=8A=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 敌人导航已改为 GroundNavigator/FlyingNavigator 直接移动方案: 可达性由 EnemyMovement 的墙/悬崖夹紧天然决定,不再需要烘焙导航图, 'agent 脱离导航段导致寻路全面静默失效'这一整类问题随之消失。 --- Assets/PathBerserker2d.meta | 8 - Assets/PathBerserker2d/Documentation.meta | 8 - .../Documentation/Documentation.zip | Bin 1297173 -> 0 bytes .../Documentation/Documentation.zip.meta | 7 - .../PathBerserker2d/Documentation/README.txt | 15 - .../Documentation/README.txt.meta | 7 - Assets/PathBerserker2d/Icons.meta | 8 - Assets/PathBerserker2d/Icons/follow_path.png | Bin 7307 -> 0 bytes .../Icons/follow_path.png.meta | 115 - Assets/PathBerserker2d/Icons/link_icon.png | Bin 4579 -> 0 bytes .../PathBerserker2d/Icons/link_icon.png.meta | 103 - Assets/PathBerserker2d/Icons/lost_path.png | Bin 5105 -> 0 bytes .../PathBerserker2d/Icons/lost_path.png.meta | 115 - Assets/PathBerserker2d/Icons/planning.png | Bin 9541 -> 0 bytes .../PathBerserker2d/Icons/planning.png.meta | 115 - Assets/PathBerserker2d/Icons/portal.png | Bin 36145 -> 0 bytes Assets/PathBerserker2d/Icons/portal.png.meta | 103 - Assets/PathBerserker2d/Resources.meta | 8 - .../Resources/PathBerserker2dSettings.asset | 54 - .../PathBerserker2dSettings.asset.meta | 8 - Assets/PathBerserker2d/Scripts.meta | 8 - .../Scripts/PathBerserker2d.Editor.meta | 8 - .../AttributeDrawers.meta | 8 - .../ReadOnlyAttributeDrawer.cs | 22 - .../ReadOnlyAttributeDrawer.cs.meta | 11 - .../PathBerserker2d.Editor/CustomGUI.meta | 8 - .../CustomGUI/IconHandle2D.cs | 51 - .../CustomGUI/IconHandle2D.cs.meta | 11 - .../CustomGUI/MathUtilityDrawer.cs | 41 - .../CustomGUI/MathUtilityDrawer.cs.meta | 11 - .../PathBerserker2d.Editor/CustomGUI/MyGUI.cs | 73 - .../CustomGUI/MyGUI.cs.meta | 11 - .../CustomGUI/PositionHandle2D.cs | 137 - .../CustomGUI/PositionHandle2D.cs.meta | 11 - .../ExecutionOrderManager.cs | 34 - .../ExecutionOrderManager.cs.meta | 11 - .../PathBerserker2d.Editor/Gizmos.meta | 8 - .../Gizmos/GizmosDrawingExtensions.cs | 239 - .../Gizmos/GizmosDrawingExtensions.cs.meta | 11 - .../Gizmos/NavAgentDrawer.cs | 94 - .../Gizmos/NavAgentDrawer.cs.meta | 11 - .../Gizmos/NavAreaMarkerDrawer.cs | 29 - .../Gizmos/NavAreaMarkerDrawer.cs.meta | 11 - .../Gizmos/NavGraphDrawer.cs | 56 - .../Gizmos/NavGraphDrawer.cs.meta | 11 - .../Gizmos/NavLinkClusterGizmosDrawer.cs | 60 - .../Gizmos/NavLinkClusterGizmosDrawer.cs.meta | 11 - .../Gizmos/NavLinkGizmosDrawer.cs | 129 - .../Gizmos/NavLinkGizmosDrawer.cs.meta | 11 - .../Gizmos/NavLinkInstanceDrawer.cs | 13 - .../Gizmos/NavLinkInstanceDrawer.cs.meta | 11 - .../Gizmos/NavSegmentSubstractorDrawer.cs | 28 - .../NavSegmentSubstractorDrawer.cs.meta | 11 - .../Gizmos/NavSurfaceDrawer.cs | 135 - .../Gizmos/NavSurfaceDrawer.cs.meta | 11 - .../Gizmos/PBWorldDrawer.cs | 17 - .../Gizmos/PBWorldDrawer.cs.meta | 11 - .../PathBerserker2d.Editor/Inspectors.meta | 8 - .../Inspectors/BaseNavLinkInspector.cs | 66 - .../Inspectors/BaseNavLinkInspector.cs.meta | 11 - .../Inspectors/FootStepSoundsInspector.cs | 61 - .../FootStepSoundsInspector.cs.meta | 11 - .../Inspectors/NavAgentInspector.cs | 178 - .../Inspectors/NavAgentInspector.cs.meta | 11 - .../Inspectors/NavAreaMarkerInspector.cs | 38 - .../Inspectors/NavAreaMarkerInspector.cs.meta | 11 - .../Inspectors/NavLinkClusterInspector.cs | 130 - .../NavLinkClusterInspector.cs.meta | 11 - .../Inspectors/NavLinkInspector.cs | 246 - .../Inspectors/NavLinkInspector.cs.meta | 11 - .../NavSegmentSubstractorInspector.cs | 33 - .../NavSegmentSubstractorInspector.cs.meta | 11 - .../Inspectors/NavSurface2dInspector.cs | 159 - .../Inspectors/NavSurface2dInspector.cs.meta | 11 - .../PathBerserker2d.Editor/PBWorldFaker.cs | 23 - .../PBWorldFaker.cs.meta | 11 - .../PathBerserker2d.Editor.asmdef | 17 - .../PathBerserker2d.Editor.asmdef.meta | 7 - .../PathBerserker2dSettingsProvider.cs | 258 - .../PathBerserker2dSettingsProvider.cs.meta | 11 - .../PathBerserker2d.Editor/Utilities.meta | 8 - .../Utilities/GLThickLine.cs | 65 - .../Utilities/GLThickLine.cs.meta | 11 - .../Utilities/MiterLine.cs | 217 - .../Utilities/MiterLine.cs.meta | 11 - .../Utilities/PrimitiveMesh.cs | 31 - .../Utilities/PrimitiveMesh.cs.meta | 11 - .../Utilities/SharedMaterials.cs | 90 - .../Utilities/SharedMaterials.cs.meta | 11 - .../PathBerserker2d.Editor/Windows.meta | 8 - .../Windows/NavLinkCreatorWindow.cs | 93 - .../Windows/NavLinkCreatorWindow.cs.meta | 11 - .../Scripts/PathBerserker2d.Upgrade.meta | 8 - .../DeleteObsoleteFiles.cs | 62 - .../DeleteObsoleteFiles.cs.meta | 11 - .../Scripts/PathBerserker2d.Upgrade/MD4.cs | 198 - .../PathBerserker2d.Upgrade/MD4.cs.meta | 11 - .../MissingScriptResolver.cs | 127 - .../MissingScriptResolver.cs.meta | 11 - .../PathBerserker2d.Upgrade.asmdef | 17 - .../PathBerserker2d.Upgrade.asmdef.meta | 7 - .../UpdateNotificationWindow.cs | 96 - .../UpdateNotificationWindow.cs.meta | 11 - .../Scripts/PathBerserker2d.meta | 8 - .../Scripts/PathBerserker2d/AssemblyInfo.cs | 11 - .../PathBerserker2d/AssemblyInfo.cs.meta | 11 - .../Scripts/PathBerserker2d/BoostClipper.meta | 8 - .../BoostClipper/ClipperWrapper.cs | 136 - .../BoostClipper/ClipperWrapper.cs.meta | 11 - .../PathBerserker2d/BoostClipper/License.txt | 24 - .../BoostClipper/License.txt.meta | 7 - .../PathBerserker2d/BoostClipper/clipper.cs | 4932 ----------------- .../BoostClipper/clipper.cs.meta | 11 - .../Scripts/PathBerserker2d/Clipping.meta | 8 - .../PathBerserker2d/Clipping/Contour.cs | 123 - .../PathBerserker2d/Clipping/Contour.cs.meta | 11 - .../PathBerserker2d/Clipping/IClipper.cs | 16 - .../PathBerserker2d/Clipping/IClipper.cs.meta | 11 - .../PathBerserker2d/Clipping/Polygon.cs | 162 - .../PathBerserker2d/Clipping/Polygon.cs.meta | 11 - .../PathBerserker2d/CustomAttributes.meta | 8 - .../CustomAttributes/ReadOnlyAttribute.cs | 9 - .../ReadOnlyAttribute.cs.meta | 11 - .../ScriptExecutionOrderAttribute.cs | 20 - .../ScriptExecutionOrderAttribute.cs.meta | 11 - .../High-Speed-Priority-Queue.meta | 8 - .../ExternalSortingFastPriorityQueueNode.cs | 12 - ...ternalSortingFastPriorityQueueNode.cs.meta | 11 - .../FastPriorityQueue.cs | 418 -- .../FastPriorityQueue.cs.meta | 12 - .../FastPriorityQueueNode.cs | 16 - .../FastPriorityQueueNode.cs.meta | 12 - .../IFixedSizePriorityQueue.cs | 24 - .../IFixedSizePriorityQueue.cs.meta | 12 - .../IPriorityQueue.cs | 53 - .../IPriorityQueue.cs.meta | 12 - .../SimplePriorityQueue.cs | 229 - .../SimplePriorityQueue.cs.meta | 12 - .../StablePriorityQueue.cs | 423 -- .../StablePriorityQueue.cs.meta | 12 - .../StablePriorityQueueNode.cs | 10 - .../StablePriorityQueueNode.cs.meta | 12 - .../SweepEventPriorityQueue.cs | 386 -- .../SweepEventPriorityQueue.cs.meta | 11 - .../PathBerserker2d/IVelocityProvider.cs | 12 - .../PathBerserker2d/IVelocityProvider.cs.meta | 11 - .../Scripts/PathBerserker2d/NavAgent.meta | 8 - .../PathBerserker2d/NavAgent/NavAgent.cs | 1044 ---- .../PathBerserker2d/NavAgent/NavAgent.cs.meta | 11 - .../NavAgent/NavAgentUsers.meta | 8 - .../NavAgent/NavAgentUsers/AdjustRotation.cs | 32 - .../NavAgentUsers/AdjustRotation.cs.meta | 11 - .../NavAgent/NavAgentUsers/Follower.cs | 93 - .../NavAgent/NavAgentUsers/Follower.cs.meta | 11 - .../NavAgent/NavAgentUsers/FootStepSounds.cs | 90 - .../NavAgentUsers/FootStepSounds.cs.meta | 11 - .../NavAgent/NavAgentUsers/KeepGrounded.cs | 35 - .../NavAgentUsers/KeepGrounded.cs.meta | 11 - .../NavAgent/NavAgentUsers/MouseWalker.cs | 45 - .../NavAgentUsers/MouseWalker.cs.meta | 11 - .../NavAgent/NavAgentUsers/MultiGoalWalker.cs | 52 - .../NavAgentUsers/MultiGoalWalker.cs.meta | 11 - .../NavAgent/NavAgentUsers/PatrolWalker.cs | 79 - .../NavAgentUsers/PatrolWalker.cs.meta | 11 - .../NavAgent/NavAgentUsers/RandomWalker.cs | 53 - .../NavAgentUsers/RandomWalker.cs.meta | 11 - .../NavAgent/TransformBasedMovement.cs | 369 -- .../NavAgent/TransformBasedMovement.cs.meta | 11 - .../Scripts/PathBerserker2d/NavGraph.meta | 8 - .../PathBerserker2d/NavGraph/NavGraph.cs | 831 --- .../PathBerserker2d/NavGraph/NavGraph.cs.meta | 11 - .../PathBerserker2d/NavGraph/NavGraphNode.cs | 96 - .../NavGraph/NavGraphNode.cs.meta | 11 - .../NavGraph/NavGraphNodeCluster.cs | 155 - .../NavGraph/NavGraphNodeCluster.cs.meta | 11 - .../NavGraph/NavSurfaceRecord.cs | 49 - .../NavGraph/NavSurfaceRecord.cs.meta | 11 - .../Scripts/PathBerserker2d/NavObjects.meta | 8 - .../NavObjects/ArtificialLink.cs | 41 - .../NavObjects/ArtificialLink.cs.meta | 11 - .../PathBerserker2d/NavObjects/BaseNavLink.cs | 109 - .../NavObjects/BaseNavLink.cs.meta | 11 - .../NavObjects/DynamicObstacle.cs | 13 - .../NavObjects/DynamicObstacle.cs.meta | 11 - .../PathBerserker2d/NavObjects/INavLink.cs | 31 - .../NavObjects/INavLink.cs.meta | 11 - .../NavObjects/INavLinkInstanceCreator.cs | 19 - .../INavLinkInstanceCreator.cs.meta | 11 - .../NavObjects/NavAreaMarker.cs | 173 - .../NavObjects/NavAreaMarker.cs.meta | 11 - .../PathBerserker2d/NavObjects/NavLink.cs | 207 - .../NavObjects/NavLink.cs.meta | 11 - .../NavObjects/NavLinkCluster.cs | 118 - .../NavObjects/NavLinkCluster.cs.meta | 11 - .../NavObjects/NavLinkInstance.cs | 106 - .../NavObjects/NavLinkInstance.cs.meta | 11 - .../NavObjects/NavSegmentSubstractor.cs | 25 - .../NavObjects/NavSegmentSubstractor.cs.meta | 11 - .../NavObjects/SegmentConnectionLink.cs | 45 - .../NavObjects/SegmentConnectionLink.cs.meta | 11 - .../Scripts/PathBerserker2d/NavSurface.meta | 8 - .../NavSurface/ColliderLayerFilter.cs | 26 - .../NavSurface/ColliderLayerFilter.cs.meta | 11 - .../PathBerserker2d/NavSurface/Creation.meta | 8 - .../NavSurface/Creation/ColliderConverter.cs | 236 - .../Creation/ColliderConverter.cs.meta | 11 - .../NavSurface/Creation/IntersectionTester.cs | 639 --- .../Creation/IntersectionTester.cs.meta | 11 - .../NavSurface/Creation/NavSurfaceBakeJob.cs | 311 -- .../Creation/NavSurfaceBakeJob.cs.meta | 11 - .../NavSurface/Creation/PolygonSet.cs | 91 - .../NavSurface/Creation/PolygonSet.cs.meta | 11 - .../NavSurface/Creation/StableConnector.cs | 63 - .../Creation/StableConnector.cs.meta | 11 - .../NavSurface/Creation/StablePointChain.cs | 90 - .../Creation/StablePointChain.cs.meta | 11 - .../NavSurface/IColliderFilter.cs | 10 - .../NavSurface/IColliderFilter.cs.meta | 11 - .../INavSegmentCreationParamProvider.cs | 12 - .../INavSegmentCreationParamProvider.cs.meta | 11 - .../NavSurface/NavSegments.meta | 8 - .../NavSurface/NavSegments/NavSegment.cs | 28 - .../NavSurface/NavSegments/NavSegment.cs.meta | 11 - .../NavSegments/NavSegmentPointer.cs | 51 - .../NavSegments/NavSegmentPointer.cs.meta | 11 - .../NavSegments/NavSegmentPositionPointer.cs | 95 - .../NavSegmentPositionPointer.cs.meta | 11 - .../NavSegments/NavSubsegmentPointer.cs | 67 - .../NavSegments/NavSubsegmentPointer.cs.meta | 11 - .../PathBerserker2d/NavSurface/NavSurface.cs | 321 -- .../NavSurface/NavSurface.cs.meta | 11 - .../Scripts/PathBerserker2d/PBWorld.cs | 235 - .../Scripts/PathBerserker2d/PBWorld.cs.meta | 11 - .../PathBerserker2d/PathBerserker2d.asmdef | 15 - .../PathBerserker2d.asmdef.meta | 7 - .../PathBerserker2dSettings.cs | 298 - .../PathBerserker2dSettings.cs.meta | 11 - .../Scripts/PathBerserker2d/Pathfinder.meta | 8 - .../PathBerserker2d/Pathfinder/Path.cs | 111 - .../PathBerserker2d/Pathfinder/Path.cs.meta | 11 - .../PathBerserker2d/Pathfinder/PathRequest.cs | 90 - .../Pathfinder/PathRequest.cs.meta | 11 - .../PathBerserker2d/Pathfinder/PathSegment.cs | 77 - .../Pathfinder/PathSegment.cs.meta | 11 - .../PathBerserker2d/Pathfinder/PathValues.cs | 17 - .../Pathfinder/PathValues.cs.meta | 11 - .../PathBerserker2d/Pathfinder/Pathfinder.cs | 339 -- .../Pathfinder/Pathfinder.cs.meta | 11 - .../Pathfinder/PathfinderThread.cs | 55 - .../Pathfinder/PathfinderThread.cs.meta | 11 - .../Scripts/PathBerserker2d/Utilities.meta | 8 - .../Utilities/B2DynamicTree.cs | 959 ---- .../Utilities/B2DynamicTree.cs.meta | 11 - .../Utilities/DebugDrawingExtensions.cs | 192 - .../Utilities/DebugDrawingExtensions.cs.meta | 11 - .../Utilities/DifferentColors.cs | 767 --- .../Utilities/DifferentColors.cs.meta | 11 - .../Utilities/ExtensionMethods.cs | 101 - .../Utilities/ExtensionMethods.cs.meta | 11 - .../PathBerserker2d/Utilities/Geometry.cs | 71 - .../Utilities/Geometry.cs.meta | 11 - .../PathBerserker2d/Utilities/LineSegment.cs | 67 - .../Utilities/LineSegment.cs.meta | 11 - .../Utilities/LineSegmentWithClearance.cs | 93 - .../LineSegmentWithClearance.cs.meta | 11 - .../PathBerserker2d/Utilities/Utility.cs | 49 - .../PathBerserker2d/Utilities/Utility.cs.meta | 11 - .../PathBerserker2d/clipper_library.meta | 8 - .../clipper_library/Connector.cs | 65 - .../clipper_library/Connector.cs.meta | 11 - .../clipper_library/ExtendedGeometry.cs | 452 -- .../clipper_library/ExtendedGeometry.cs.meta | 11 - .../clipper_library/PointChain.cs | 109 - .../clipper_library/PointChain.cs.meta | 11 - .../clipper_library/PolygonClipper.cs | 684 --- .../clipper_library/PolygonClipper.cs.meta | 11 - Assets/PathBerserker2d/Shaders.meta | 8 - .../Shaders/UnlitSegmented.shader | 57 - .../Shaders/UnlitSegmented.shader.meta | 9 - .../Shaders/UnlitTransparentTinted.shader | 47 - .../UnlitTransparentTinted.shader.meta | 9 - .../Shaders/UnlitVertexColor.shader | 42 - .../Shaders/UnlitVertexColor.shader.meta | 9 - .../UnlitVertexColorTransparent.shader | 43 - .../UnlitVertexColorTransparent.shader.meta | 9 - 285 files changed, 23541 deletions(-) delete mode 100644 Assets/PathBerserker2d.meta delete mode 100644 Assets/PathBerserker2d/Documentation.meta delete mode 100644 Assets/PathBerserker2d/Documentation/Documentation.zip delete mode 100644 Assets/PathBerserker2d/Documentation/Documentation.zip.meta delete mode 100644 Assets/PathBerserker2d/Documentation/README.txt delete mode 100644 Assets/PathBerserker2d/Documentation/README.txt.meta delete mode 100644 Assets/PathBerserker2d/Icons.meta delete mode 100644 Assets/PathBerserker2d/Icons/follow_path.png delete mode 100644 Assets/PathBerserker2d/Icons/follow_path.png.meta delete mode 100644 Assets/PathBerserker2d/Icons/link_icon.png delete mode 100644 Assets/PathBerserker2d/Icons/link_icon.png.meta delete mode 100644 Assets/PathBerserker2d/Icons/lost_path.png delete mode 100644 Assets/PathBerserker2d/Icons/lost_path.png.meta delete mode 100644 Assets/PathBerserker2d/Icons/planning.png delete mode 100644 Assets/PathBerserker2d/Icons/planning.png.meta delete mode 100644 Assets/PathBerserker2d/Icons/portal.png delete mode 100644 Assets/PathBerserker2d/Icons/portal.png.meta delete mode 100644 Assets/PathBerserker2d/Resources.meta delete mode 100644 Assets/PathBerserker2d/Resources/PathBerserker2dSettings.asset delete mode 100644 Assets/PathBerserker2d/Resources/PathBerserker2dSettings.asset.meta delete mode 100644 Assets/PathBerserker2d/Scripts.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/AttributeDrawers.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/AttributeDrawers/ReadOnlyAttributeDrawer.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/AttributeDrawers/ReadOnlyAttributeDrawer.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/IconHandle2D.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/IconHandle2D.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/MathUtilityDrawer.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/MathUtilityDrawer.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/MyGUI.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/MyGUI.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/PositionHandle2D.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/PositionHandle2D.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/ExecutionOrderManager.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/ExecutionOrderManager.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/GizmosDrawingExtensions.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/GizmosDrawingExtensions.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavAgentDrawer.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavAgentDrawer.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavAreaMarkerDrawer.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavAreaMarkerDrawer.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavGraphDrawer.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavGraphDrawer.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkClusterGizmosDrawer.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkClusterGizmosDrawer.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkGizmosDrawer.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkGizmosDrawer.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkInstanceDrawer.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkInstanceDrawer.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavSegmentSubstractorDrawer.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavSegmentSubstractorDrawer.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavSurfaceDrawer.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavSurfaceDrawer.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/PBWorldDrawer.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/PBWorldDrawer.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/BaseNavLinkInspector.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/BaseNavLinkInspector.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/FootStepSoundsInspector.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/FootStepSoundsInspector.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavAgentInspector.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavAgentInspector.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavAreaMarkerInspector.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavAreaMarkerInspector.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavLinkClusterInspector.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavLinkClusterInspector.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavLinkInspector.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavLinkInspector.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavSegmentSubstractorInspector.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavSegmentSubstractorInspector.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavSurface2dInspector.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavSurface2dInspector.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PBWorldFaker.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PBWorldFaker.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PathBerserker2d.Editor.asmdef delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PathBerserker2d.Editor.asmdef.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PathBerserker2dSettingsProvider.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PathBerserker2dSettingsProvider.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/GLThickLine.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/GLThickLine.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/MiterLine.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/MiterLine.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/PrimitiveMesh.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/PrimitiveMesh.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/SharedMaterials.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/SharedMaterials.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Windows.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Windows/NavLinkCreatorWindow.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Windows/NavLinkCreatorWindow.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/DeleteObsoleteFiles.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/DeleteObsoleteFiles.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/MD4.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/MD4.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/MissingScriptResolver.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/MissingScriptResolver.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/PathBerserker2d.Upgrade.asmdef delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/PathBerserker2d.Upgrade.asmdef.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/UpdateNotificationWindow.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/UpdateNotificationWindow.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/AssemblyInfo.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/AssemblyInfo.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/ClipperWrapper.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/ClipperWrapper.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/License.txt delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/License.txt.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/clipper.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/clipper.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/Contour.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/Contour.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/IClipper.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/IClipper.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/Polygon.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/Polygon.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/CustomAttributes.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/CustomAttributes/ReadOnlyAttribute.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/CustomAttributes/ReadOnlyAttribute.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/CustomAttributes/ScriptExecutionOrderAttribute.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/CustomAttributes/ScriptExecutionOrderAttribute.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/ExternalSortingFastPriorityQueueNode.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/ExternalSortingFastPriorityQueueNode.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/FastPriorityQueue.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/FastPriorityQueue.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/FastPriorityQueueNode.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/FastPriorityQueueNode.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/IFixedSizePriorityQueue.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/IFixedSizePriorityQueue.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/IPriorityQueue.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/IPriorityQueue.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/SimplePriorityQueue.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/SimplePriorityQueue.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/StablePriorityQueue.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/StablePriorityQueue.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/StablePriorityQueueNode.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/StablePriorityQueueNode.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/SweepEventPriorityQueue.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/SweepEventPriorityQueue.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/IVelocityProvider.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/IVelocityProvider.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgent.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgent.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/AdjustRotation.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/AdjustRotation.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/Follower.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/Follower.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/FootStepSounds.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/FootStepSounds.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/KeepGrounded.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/KeepGrounded.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/MouseWalker.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/MouseWalker.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/MultiGoalWalker.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/MultiGoalWalker.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/PatrolWalker.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/PatrolWalker.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/RandomWalker.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/RandomWalker.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/TransformBasedMovement.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/TransformBasedMovement.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraph.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraph.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraphNode.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraphNode.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraphNodeCluster.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraphNodeCluster.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavSurfaceRecord.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavSurfaceRecord.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/ArtificialLink.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/ArtificialLink.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/BaseNavLink.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/BaseNavLink.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/DynamicObstacle.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/DynamicObstacle.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/INavLink.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/INavLink.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/INavLinkInstanceCreator.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/INavLinkInstanceCreator.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavAreaMarker.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavAreaMarker.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLink.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLink.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLinkCluster.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLinkCluster.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLinkInstance.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLinkInstance.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavSegmentSubstractor.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavSegmentSubstractor.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/SegmentConnectionLink.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/SegmentConnectionLink.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/ColliderLayerFilter.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/ColliderLayerFilter.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/ColliderConverter.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/ColliderConverter.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/IntersectionTester.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/IntersectionTester.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/NavSurfaceBakeJob.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/NavSurfaceBakeJob.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/PolygonSet.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/PolygonSet.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/StableConnector.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/StableConnector.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/StablePointChain.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/StablePointChain.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/IColliderFilter.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/IColliderFilter.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/INavSegmentCreationParamProvider.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/INavSegmentCreationParamProvider.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegment.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegment.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegmentPointer.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegmentPointer.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegmentPositionPointer.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegmentPositionPointer.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSubsegmentPointer.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSubsegmentPointer.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSurface.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSurface.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/PBWorld.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/PBWorld.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/PathBerserker2d.asmdef delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/PathBerserker2d.asmdef.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/PathBerserker2dSettings.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/PathBerserker2dSettings.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/Path.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/Path.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathRequest.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathRequest.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathSegment.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathSegment.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathValues.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathValues.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/Pathfinder.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/Pathfinder.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathfinderThread.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathfinderThread.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/B2DynamicTree.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/B2DynamicTree.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/DebugDrawingExtensions.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/DebugDrawingExtensions.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/DifferentColors.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/DifferentColors.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/ExtensionMethods.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/ExtensionMethods.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/Geometry.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/Geometry.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/LineSegment.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/LineSegment.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/LineSegmentWithClearance.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/LineSegmentWithClearance.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/Utility.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/Utility.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/Connector.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/Connector.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/ExtendedGeometry.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/ExtendedGeometry.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/PointChain.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/PointChain.cs.meta delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/PolygonClipper.cs delete mode 100644 Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/PolygonClipper.cs.meta delete mode 100644 Assets/PathBerserker2d/Shaders.meta delete mode 100644 Assets/PathBerserker2d/Shaders/UnlitSegmented.shader delete mode 100644 Assets/PathBerserker2d/Shaders/UnlitSegmented.shader.meta delete mode 100644 Assets/PathBerserker2d/Shaders/UnlitTransparentTinted.shader delete mode 100644 Assets/PathBerserker2d/Shaders/UnlitTransparentTinted.shader.meta delete mode 100644 Assets/PathBerserker2d/Shaders/UnlitVertexColor.shader delete mode 100644 Assets/PathBerserker2d/Shaders/UnlitVertexColor.shader.meta delete mode 100644 Assets/PathBerserker2d/Shaders/UnlitVertexColorTransparent.shader delete mode 100644 Assets/PathBerserker2d/Shaders/UnlitVertexColorTransparent.shader.meta diff --git a/Assets/PathBerserker2d.meta b/Assets/PathBerserker2d.meta deleted file mode 100644 index 2ee1c18d..00000000 --- a/Assets/PathBerserker2d.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 79d9b19d4c18d0240920de7d6b598473 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Documentation.meta b/Assets/PathBerserker2d/Documentation.meta deleted file mode 100644 index 33057678..00000000 --- a/Assets/PathBerserker2d/Documentation.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: e0383e08b93337e41bd2254c4304147f -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Documentation/Documentation.zip b/Assets/PathBerserker2d/Documentation/Documentation.zip deleted file mode 100644 index 1d0bd28d49a391da7b234454e3aa2d91112e9eeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1297173 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%0DwjsuK+FWso&&!G4f@e7;T58?gsnz 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≺0#5vD1z-`w4Zxwe_h1q4 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

!!~A>CLQv^; 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

jKYl+};g`HTg7b|?1>I1%?pnsrFC-(cIVBmTs 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

fJ3=1ti7fLkvbK({?y<>TPp+mJ>X+ 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

AP84+-_+Hek5R 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%0Ds%jp-?V$=!9`lrtxOx@mLy2KbINQExV) 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дldPYZvG_68w?oL@Lp@{gAprO|L2_p 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�QT#3Z5+F?a8q^H-f1;)R6}&IGy=r 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 o5>-Fq(afH$7#8cXAJY1!5dZ)H diff --git a/Assets/PathBerserker2d/Documentation/Documentation.zip.meta b/Assets/PathBerserker2d/Documentation/Documentation.zip.meta deleted file mode 100644 index 05e1b8ed..00000000 --- a/Assets/PathBerserker2d/Documentation/Documentation.zip.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 21035a61c7bbb0c43adb502350355869 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Documentation/README.txt b/Assets/PathBerserker2d/Documentation/README.txt deleted file mode 100644 index 7d81d40f..00000000 --- a/Assets/PathBerserker2d/Documentation/README.txt +++ /dev/null @@ -1,15 +0,0 @@ -Pathberserker2d - -Thanks for purchasing. To get started, I suggest trying out the various demo scenes. - -The documentation is shipped as a zip file in the same folder. -Alternatively you can read the most up to date version of the documentation online here: -https://oribow.github.io/PathBerserker2dDemo/Documentation/ - -The documentation also includes guides on a variety of topics and explains the core concepts of this asset. - -As an extra treat, this Asset also comes with its complete source code, also as zip in this folder. -Setting your project up to use the source code instead of the DLL's requires some knowledge about C# projects. -I recommend using the source code primarily as a reference guide. - -Happy path-finding! \ No newline at end of file diff --git a/Assets/PathBerserker2d/Documentation/README.txt.meta b/Assets/PathBerserker2d/Documentation/README.txt.meta deleted file mode 100644 index 602979b6..00000000 --- a/Assets/PathBerserker2d/Documentation/README.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 1605f3fdba2679842a2f72c81ec408ac -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Icons.meta b/Assets/PathBerserker2d/Icons.meta deleted file mode 100644 index e06727a0..00000000 --- a/Assets/PathBerserker2d/Icons.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 446c632a2de6b8c4c87487c4533abd7f -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Icons/follow_path.png b/Assets/PathBerserker2d/Icons/follow_path.png deleted file mode 100644 index f69bb0d77026f864b6ee24d0cd370cb823b7185f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7307 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 diff --git a/Assets/PathBerserker2d/Icons/follow_path.png.meta b/Assets/PathBerserker2d/Icons/follow_path.png.meta deleted file mode 100644 index a82619e3..00000000 --- a/Assets/PathBerserker2d/Icons/follow_path.png.meta +++ /dev/null @@ -1,115 +0,0 @@ -fileFormatVersion: 2 -guid: 1076c1b4e7774d14cb5f02e81e131660 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 10 - mipmaps: - mipMapMode: 0 - enableMipMap: 0 - 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: 0 - lightmap: 0 - compressionQuality: 50 - spriteMode: 1 - 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: 2 - 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: 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: 5e97eb03825dee720800000000000000 - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spritePackingTag: - pSDRemoveMatte: 0 - pSDShowRemoveMatteOption: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Icons/link_icon.png b/Assets/PathBerserker2d/Icons/link_icon.png deleted file mode 100644 index ce2075b87c1803b67e304d9ab9f21271732aa46e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4579 zcmV<95ghJ`P)(f8p z0S1_v`<#34Iq$jmKHtyh{fs2%p7T5Jd46Ykm*-7jq)JPmH_)f)M@Xw0h{u~%v zw|yD#W!>K`z^A}kU>#7Nan**JBHseCgqFZ*z_7aVZJ=8N+igZ?j&A|SE4KR@_yBmX zUik>9R{Yj5LLmX13QPpv0jdB|l*+o_CgW-4{u(OZ0P}&L0cQfm>7A-!B&Ps43wR3n zg4Bbzo#I%}q_O{o%<>X&4RCDAXKxq{&<%GNUQcF%wU6SMvodt7!%Ho&2)GeACY8!C z41f{99H55G2Iz3bvFBv?m<^R0U>@+dz)=C~#>i7f0k0EYP<~&bVL^z;Z>W?3_W@l4 z)RU1%dLj*@DJS~+e6ZOiB-N5+Y`v10pZxDI~lPnr=09dYv?w5F&9 zev4~5%@?}kOj3Vz@kc=O0Q>ms5Of(4&>Q!9l*||(lHaW|{c+90Rk&{yE#qwrGFM3eg92RLT~g5CH9v^SYt=z{D4Dyd7s3ld`7{!1Rn+b zJh?puB3AUowKN@m5#GjiY8l}&7&liXh(Yf1qBIYgN8=Zv3^?1Lw7j7&Zmx&c95ui> zK7{5IKSDPQWD+jllo1}?36{3#YpnS^G&%y?&|QeV=<-Av>Cp?=gx(;pW8WX4@GSa^ zaFr*G`A9$9NM`M|xyFyo++{TS%Kvvy8uOX6aQT2W*QXrIx|lHva9PAP75^E~+K=G3q5Jf8S0Ou zZK`a;2D-(Cv(RUe9OFr2)>DE$LBh43G#U*v1>JRf-Iu^@Xa5w;WMwTj(l%}!O~XTc z8Y+W5Y0O#*fHmkU_cBi!ji#A^?)p9FOJKG#23^IzhYb^nDt((KW*d{y-EFS)CC~`OQ|PXzX8rZNrUkk| zY-QN=%WPpNI&<9OOJKHe5xR=J*Ox#eC03FAn!f2xU6$|y$t$r6w??>;J=}xty5>qo z`;60)rqg!rFSC6KG*ad?bZ-QI<4a%=eDochk82xG#>}vV7#U|NZYWSP&J0;c)}qOz zw-Z}!C|j9H^6R_Uo4Od&1~>0JS>?^}CD2Hlt4V%+_uw*F8uhps-8<>|z62U+a{|e) zZ#6FMPppaBy`vP{l;hTbFtU?1xNM30r!iOIR*_m>ue^_Ydc>Nj&GB8uHZKDeVGA)r zqZarD?z?drF444I&m?q1_eyoCFM)>Pi*Y13MlI0ElRm>ZgedztG~XK^09(TrVi+2t zG{;EAHVZ;mVHh!^54!J-^Lz<33}2iMtRwk=G|OUW#D=IdVV42}fm7=K4#af^6#`4J z?080uh(ntAmcRg9+8rC~pL-PHZi;Q|{+8DJ_iErRf6@%Y5BCAPX!=$9ac}ArSh^b{ zENXFY1x*p_b>ht&Mp*1nY*QM#iZn2D7-3Pa*v8CZc&c ze2z}QC%AR2*W*?LT7THT_lB&&@WW2UHkw2mIg2I>-X>fRxshA+MmL@=wr?+C3)AF9 ztp;jB)?q|XwQ{@I-WcOxj`bmHF#Mo3M{Ki@gl&$Vifuj(S%cvRGe;77D7M)UvIfHs zT64s9oyV}v(N(dHJvnldD&=;0`{dB90rzFd8VosMeHie|dsz|mssHRK{%bHuivBdwW$0>=VF>dIdL$KgK0+pj^F40SID);0S-+{gK6 zz*^vK;Li#8JROaOH%f5puq2}!t|K_R5hxWHEATskO#;$b`IDk|v{e(ouUEbhm@ROn z=w8!|c+eVM4|x|~0@Fs|s5(RZw?Ks=m_&3?jA9FE#+y=f<~Z7y zz?2av5x6ng6QZ#)O;ItYq_E$5WwXF7l6)$r;fD_B%#l5B0|E(w9}8?vBXH$cii$Zq zJ#*|YW#aPi8u6kNI&;K!*!m$Y1p@7W*MO&ij_K@JGnhX^w~P+JRDov%T4iRJMh4Ih zD2(l((*x!ZI0m;?+c}xoaiwCL3=ihN99Sm0AuC4sX!|d;orRH81R(C?X&&hrq9Z?Gt!Hg1ygARfxDR!2S^ECh&;BUWMkTg6umBIRW=+=R1&ct!!uifLVbL zk_6duN$p!?hC;~16!we2Ndha9=w6e`zO#&n@gGdNR<1u#y8=6#3NT51P~eLSA-AWv zZvb0^J(DbB~Hl*GiQLNZT)8gA0`%~FBMh)(S zbD47BXTC+`5I0k=X}N%=r>S-V77Lu4!hu3FhrnpuVmD3AG+dv^eRF{Owp!*}L=Ny0 zF#nMMMc}R`UQOzkMFQssI9P9BPy=Noa8_OE6-2$j=>o4R^-c=1?=0tZT*`mnuO-=9 zDsb_72nlf=Zy%$((*vvoW&yJjZfWFD5$Fe84Ez8%S^2YSpkE?CKFas=J6t^_rFrw_ z^y}9zWI29WzI-_%>KBJez-ZOMjC1$hcL#ZDEJfSg zFHj`#D}kCA1bUECD==ANoFFVhE=L(0-MV#?-Me@Dj^~WAY11ZY)vA@&7`3>Dj9`ds z75Z}wf?iXW3Y?K%JmnM#U?EC_Oq@8;cT8uDE3UXgYYYK?n^rB08y)*b3=GgvStKwf ztrN^$PT^oDXp^Nyix#qB!v^1Roi>XXFP20ip*6;CpnFDYTHrK+2L#r8HpB*jhs3S> zVKmKDly}j~F1yTkY^OzSZLJI$G9<`TVhVBo-kEM2;kf`aTCtGR2}F8cQE%jV7M356E}vqO}mLtGNL zjsnLEoGdU%U_jl!JBdr^V1!38Zj^xPt~zDP6yFblz}$A*Z9$$Ie~hy7jrj9@l)=-n zV@D}3FZUhqYSyh=C(WBT*BYZ5_{&IZ-pC4mkJ2Ew-g>L=m{)V*g%<{SYCI8XjT>3R zNhqh(78e)G>eZ`#$9+;3ELaf47~66A%?zVKG}&MTkP9xjz<2C7Np*F#3>YvVh&gVI zw5E-$qaALcAXPxkojcdJ2O8zE#~uq}jFs51B16ITD1++66Hk=N%1YlpID+llw@Zf( z9fFu6BN;r6+@}y&fikcrPoC`C3rBFn4L1Za#(zawxkmQ$U6jGqu3bARD=YKuhXbr! zxl)=nYo;|u1@TXrYQ&J2P#WaA>#pC-2OIsQJwSz>)ErX?A^OJa${`SvPIgqZ5zZK--)sUjoc-Hn;M`B zynF7sCvtOKdF7QsjPY!gm1pEWLs4c+EGa3GjT<*cW{hRamPtWDfz}v%aOs^4BcnWn z^6or#?AS<*QCnLpBSwq}^3?cwq%~&b4aWfApa{Z5A|VSGE)3lqGiJ;PVvNtR_2`Wd zxgBLN4jME_YHDgiGsd1hd!&2!?m^6PX{0q}g{Pf-Ts^y$+>Gshiw+!4eWZ()fy zj0m_GWl(nN)Jb;i*pYE#Y}~j}N=iz!#;5^KjkJc0yk-z_6&rX`AE8C!Y*rj8A~0BCHR?IE0%}2J1;Dog`INRVf=| z$BrG+xpU_r=164$SHs8{MYuH|RRR0>U)@nV!GX&9;US16~{wr<^8HgDd1gfZTI_gyJ0EYuofFK!7v!^jGr zLwVP~>Z+@bFvl5ZoDt-yaaW{gW*BL5EU*hja2FI5$dV;X4jAM4=bsN^j7`|oS0f9# z6J?MO8#YX8YiniCo;}i|M~@)p_`4`i$S^WR3*55Usz9GPbEe#R=bb@}@h5ERtC7Y0 z5M{7;?bs?O?@?Tkbfe5b9^sy)rJuP#lXj;Zj1%dOE!$?IFHnfQ3dq(pw}=W z|FIFG>x=1HVRZj_W;XGz>4aL$}8HR-l_M;JfNsbuMti zhbd_o5CflJV!LqQH;IS3F$@Iq#K#^uqz&rYfRfo;^_jQ6yMwo%wU<4}&(BZD`GqUY z*4o2f$lc2^>!%zG2t@ZnL*P z)6bqY`m69UxV1Gw+GeVo9OcdB<xXetDK_Q8?v&EudN6krz%B9T?)H0{rJi{TwNY`nIZHQ@ z#~){s(_P^n7#V4^zHbk`uMmgh=V|qJdlr1s2UnonbI9Ib9c?`9*>dPwot<0`+T8q} z@ceXEdalUok{u*OQ=`l({J9$g8ejGZyOVXx+dH)370wg9`i@c_VZN|y9IFXjzDcj= zN@{CFzg&z&>VqFa22`sEr@@@E|FA4F23|h2iGE0xuN!rrL_?p72y^QBu0(jH!xaji z>=C6LoEa{I+4FRe=gXx0mirShC@An~x%jDF+(ekHFp-eEgxU98tq&^q?y-<^v5?;u z6$#bFaFb{6eD2PGF?GtN@9ILNe@zu`HFac+^6taip%%GpC#{xN-Bd};0}o!1le$+a zS?_z(k5tnV-m z&tVuNyX(W8UDp!Uct8FRFH;^gk#x8C546a!C%@dMT>LlYVq2Ji#$}MByR3hId$E(q z%U`M|q1}?uw7mu42IXJ>Kp!udGTGU~6of}2w3Q+;WqY2anP4uWkWxT0q%QK6Xr&@X z>hwcM1SJ{H*-XfoTUH{QaRgy=X!jkDvJ7tnwPb&dA4xt`#^#?k7ULgF%3UZ>J$B)_SNImrQAD@s69bP`q-@Kc005*K1JQS6YNrQH_^qEJGH3S}xiYhp2Yc)`@2 z%#kkT-@%B?8<2$_3*X#!J#zxOe~66^ufjx}dvY>H)2Np=b%a6$7DASFOjBf;UtIWV ztP#1k;pNn|(Z7D=D^` zHj-xBhZy4S(Ybx;64j5_hkoK2e7E0QkxyeTpS4f3O{d|auJ8M| z5_o;)X19s-p|o)`w)N7x8uc?c^;}(Pnw{E+S@cy_d@FYeh8ND!X&zKVkX42z<4M$C z=*P=dhM)$s-)~V46&%DYddPDgq@+29tPj*V0ymu&=KATrqel1}hs#wOb>qkyRx7Is zaU&xOVQzCOb*X_4{O++j-sC08v|H@73x~IsLhFNm>Mj^=*(a#ZUVF-OlKYFDs1NOb z-U!=<3Uq{?3*VWlG0w@1wi%W@fbR2o)}oE$;R4NDI0Kh+cv0>(%GxA`qsLx0n-1B} z8vC}LrQSFD<3?^xmG8Iu>5nDbthy+^zb%ZDf2QdB`%+qoSN(d|W&l$FyMSyjHW4w# zV*0jsq}0C4O`rOwYWfP}R1*T*mGBAiL`yLJc&TOe(T|`_K@VfXH2X7)R|3nV28DH> z&-wlPWA&b+tbT(OO?>-!ZnfkSIv5L9s7+G;e?Z|G(;MDZvx4htc*6NTp|#5 zef6|(+`_a;bkpta1HxxaUmboqU5x> ziF?X?7HEAcBGkNiZru?Oh9E)?ooOA1;Tx$>rfe-@Q9)Jr*9Ja1NkyN`rf_tHpZv>{ z!ryfNeHm>xLrhP*26wC0@X&a(ceHO53rKPHC*HQKZ}8N*x`Wq9sOc~Psv zm{{=x&Z)HXx4pU;)$Cx~3OF+jC|<7oAi#aGEt7hmB6q*v@nBEu;&Nj7ni?+$C6-OY zOhKRmsS>Vw$EtxTfB@U(%u0LNTJ)e3AE(UD^#)TQrI@{(_UfdO_rXLkYa%OYIOT>q zzMBAx_&*b;|C$VbVSe~34*UkUFl0i)^Y{q^&>aCT~M5zbKOyI*=5r&36?y(fgPy!2W+?{2WUapTPt}6z(0x z_P=7-|B8imNSB5}U3n-uX?VX{1u|0U*z7(ZC(Gj|H38CTSR(`nsa}2qTp>srt~Tn0 zjNL`d7s8!5mu}FeDG5~Yc4nMZ3j(Ws`8b(}8~*w|!Wq&n{p&|Ts!rHYjzwM^)l>Xd z>=R=|UygEkkDJI-<%;E&d_W&B7XH`b2(aKRzrmP<;AkXl11t`RZ|>ss@$?bZHy}s4 zicj;QHz1|4xQXD7zaW4Gc*nem;oUBxtN;$~`FIoG6LtbHiP|(az8C-UaTbZR-e4yw z<7jl>yNOR$hEyHbx2r|%coC_m_(R0>2AM|;=B8ji^zk&6Pj9Fn|DRY_BNEQFicH{Jx)K|_E)Q-zGQIc2~v%ZGQj-f&z% zUlj3LHB>JVc~>E0^Inm)tI~awk(`?hd$n>m#${hw$KOyrweI_I~`iu)3A61Zp@I$FoKor_CW{7Ap< zFmpJp1qBF_qDz&B>z5bC5;^JsVnL&7l!*{P+{jZg0~2Hfh)t3V(TG%1fVgTb5+KG# zKjY8`5aTL|n*`OG$j{PZ^XPb1mg^dU&BLP7U_$&QHV+-6GE^ouk4D~#DcBP>0B$~u zVHZ(K0l?+->>Zm;5(04JRwsegchjJhROCN;`O$)!>S~YN2)w#!ZI{ z8B$+QWC?Pw94V7zj7F4_VQGgdkInQ6LUYy7&mDpTtDSL`bc(p)e{yqOGlA$+L0c85 z%sW8L+*}zzMv+)uv|VXn^%{_+pq_2&|4Ic|oklPDvDp`FH4@2-(1`cg3W1r`W?>X0 z0G|ebbR~+VKC^kOM||E%BzkRR=c;&r4&wktBN{R1#XoDRf)s(jmi!T5y>zqUYeR4f za617VU6r5IY$9RH)9V^ism7_?prH@b#oPxc>mRcjlGZvd2D8l z#YTo~2Uf>p^WN65lZUDUS5or`T%TJJfR&;-%X2H7ZzOQx|4PPK-KZiuuo|C}zU_Wa zMbeR&i4Eb7f;^P6q7xND3m>U7XrSI9$+ z`uSH~Hb(;y`}Nt6jr{a1eCO+9nBfGG1W*z!#xRk7HG+ zrRFLZdun0KoSL9+=?f9x*Jq#Y@wXkwdba`nY7#kyFx~JiCbBlY9tFOc5%YzQA&&8wWW^|!ct*3Wi7uj?-5roMG z!f7f3q|;`4+4&%a4N7TqGebTHA&`_2J*oBCPr%ElalzUcNFh$X1-1YoCOlUeOQ2T9 zzv?)<#A}R$UTUfPcD>xUoW-lpFXHNzx=`I)^YUlvWIz)mcVKS_Z>g&F8gxeA8bG6fDE|<2;d$I@3T#}2_@kEqtEE}ts0$+!b zn%8+JpN@&|NBt_n5$kF(@!?qCbEIOG@&1x!riY-=aeqy+8tG5*2T$rGuSWkM3s7sew$&J{%e-(HB*{4J(~CuG|i@!4xTQ!AZX=&_HzE2csjMF)b|#_Wr#q=$Txk> zS>-zK-V)y<)1@~LR_@(pqN)`h_=%SP_I@!dD&ZmG-fw2Q!lX~KCk4mc$BvO6t7%at z!2;7KeH|4V>b@9!_z!I}vsC2K=L7Em3B21T+sl6BPe!2q7lE}Cc{z;DQ@ua-L2y5p z(kEM@3Iua!b1xGY-t9Vad|~V?KjTskcg|j_qXHbth1%^E^8|)Fy}Kq(joW`4KD06a zG_$gR@$f|QlKbPsgEka|U}q0y$e~R{l4I$(wV}pbDwf&ncIy%ioktGsS(5k&@KRT8 zpWi*Ch(<@nN_BPU73GKBY`Ft$B(@wcKL!!*hut3DP+udlrmbSqj` z6xhM+yO-sjFs<*srbgAoHWz~oF-Lrn4p44c@a;_W@=9o`WlhAXz7XiYT`2VGDZ4<) zgsMB#Fqp0T0LOow?ZM&r_w?(Kl3%y9)$N^>L}`ys3y-IpS25cjpT9`WHQy4ykl>Yl zF>J{y0W}m;@8$tX_Q|RZdll_1BUG8}iVd0NWnJVhI6IL^9>a(NlY;jfMpvZD>W_gp&^K3O z+lzIKOB@_}=Jo8hd9uUo8b_{%a?Y5esb|JJhj-3l@bj|`7s z2Ob-#3}0le<;)NkEgcpu?f;#5kaN+J-;rTbsjcA%$ys8Onk)%iDOX|gP){xSz}VRI zDsd=S4B?MFqc*d!?9*pGy9>7w><5FNyz2ix@%BNmz|@RU$>Yh2AZ%9%@mgHj%*N1L zB{i^S#p`9;Mt2O#Auw!hcJg#eLa!x_i~{AfEJnLA?A+x21X129URqfnLh;W)Q=z8Kp2H0s^gv^GgsFqz}%tsA73VrV+vT zuGANUevuSUtu1JESu}wNA&HO@Erj^Tu>ORQ=&GEf)R=T^$S2?a4KA{*g{<_)P>o~^ Z(Gg-`zGH-Y7Z}fhG*q=!s+FwX{s$yX(82%! diff --git a/Assets/PathBerserker2d/Icons/lost_path.png.meta b/Assets/PathBerserker2d/Icons/lost_path.png.meta deleted file mode 100644 index 54c20e81..00000000 --- a/Assets/PathBerserker2d/Icons/lost_path.png.meta +++ /dev/null @@ -1,115 +0,0 @@ -fileFormatVersion: 2 -guid: 410455380032bfb45b40e7c043a62b4f -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 10 - mipmaps: - mipMapMode: 0 - enableMipMap: 0 - 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: 0 - lightmap: 0 - compressionQuality: 50 - spriteMode: 1 - 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: 2 - 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: 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: 5e97eb03825dee720800000000000000 - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spritePackingTag: - pSDRemoveMatte: 0 - pSDShowRemoveMatteOption: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Icons/planning.png b/Assets/PathBerserker2d/Icons/planning.png deleted file mode 100644 index e2bee00c2e4068f044c41e45ed5e755ffb5083c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9541 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 FV1f|7+j#&0 diff --git a/Assets/PathBerserker2d/Icons/portal.png.meta b/Assets/PathBerserker2d/Icons/portal.png.meta deleted file mode 100644 index 01353970..00000000 --- a/Assets/PathBerserker2d/Icons/portal.png.meta +++ /dev/null @@ -1,103 +0,0 @@ -fileFormatVersion: 2 -guid: 550c17ae955373049aee7dff67a18fa9 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 10 - mipmaps: - mipMapMode: 0 - enableMipMap: 0 - 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: 0 - lightmap: 0 - compressionQuality: 50 - spriteMode: 1 - 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: 2 - 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 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - physicsShape: [] - bones: [] - spriteID: 5e97eb03825dee720800000000000000 - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spritePackingTag: - pSDRemoveMatte: 0 - pSDShowRemoveMatteOption: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Resources.meta b/Assets/PathBerserker2d/Resources.meta deleted file mode 100644 index ea79f1ff..00000000 --- a/Assets/PathBerserker2d/Resources.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: f88aed787b8decc4086d9222249beace -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Resources/PathBerserker2dSettings.asset b/Assets/PathBerserker2d/Resources/PathBerserker2dSettings.asset deleted file mode 100644 index 27e23e72..00000000 --- a/Assets/PathBerserker2d/Resources/PathBerserker2dSettings.asset +++ /dev/null @@ -1,54 +0,0 @@ -%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: 393b1ec75130eb047bc70f7635277936, type: 3} - m_Name: PathBerserker2dSettings - m_EditorClassIdentifier: - pointMappingDistance: 0.2 - pathfinderThreadCount: 4 - initiateUpdateInterval: 0.1 - closestToSegmentMaxDistance: 20 - navLinkTypeNames: - - corner - - jump - - fall - - teleport - - climb - - elevator - navLinkTypeColors: - - {r: 0, g: 0, b: 0, a: 1} - - {r: 1, g: 1, b: 1, a: 1} - - {r: 0, g: 0.51575685, b: 1, a: 1} - - {r: 0, g: 1, b: 0, a: 1} - - {r: 0, g: 0.03320258, b: 0.49803922, a: 1} - - {r: 1, g: 0, b: 1, a: 1} - navTags: - - default - - water - - lava - - grass - - concrete - - dirt - navTagColors: - - {r: 0, g: 0, b: 0, a: 0} - - {r: 0, g: 0.5736413, b: 1, a: 1} - - {r: 1, g: 0.19613811, b: 0, a: 1} - - {r: 0.03921567, g: 0.99607843, b: 0.124506705, a: 1} - - {r: 0.4528302, g: 0.4528302, b: 0.4528302, a: 1} - - {r: 0.4339623, g: 0.2691755, b: 0, a: 1} - drawUnselectedLinks: 1 - drawUnselectedSurfaces: 1 - drawUnselectedSubstractors: 1 - drawUnselectedAreaMarkers: 1 - drawGraphWhilePlaying: 1 - navSurfaceLineWidth: 0.04 - navAreaMarkerLineWidth: 0.2 - usePolygonCollider2dPathsForBaking: 0 diff --git a/Assets/PathBerserker2d/Resources/PathBerserker2dSettings.asset.meta b/Assets/PathBerserker2d/Resources/PathBerserker2dSettings.asset.meta deleted file mode 100644 index 9b9b3349..00000000 --- a/Assets/PathBerserker2d/Resources/PathBerserker2dSettings.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 25dcc2654112bc54090ee2accbac7499 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts.meta b/Assets/PathBerserker2d/Scripts.meta deleted file mode 100644 index b0b50104..00000000 --- a/Assets/PathBerserker2d/Scripts.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 80a179a567cbfc148b23c441354e6057 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor.meta deleted file mode 100644 index 2d500d7e..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: cd800ca490ca3504a91a04cbbe34fe93 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/AttributeDrawers.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/AttributeDrawers.meta deleted file mode 100644 index 51af481e..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/AttributeDrawers.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 91a2221b1f964c946af33b7bb66b948d -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/AttributeDrawers/ReadOnlyAttributeDrawer.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/AttributeDrawers/ReadOnlyAttributeDrawer.cs deleted file mode 100644 index e8d63920..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/AttributeDrawers/ReadOnlyAttributeDrawer.cs +++ /dev/null @@ -1,22 +0,0 @@ -using UnityEditor; -using UnityEngine; - -namespace PathBerserker2d -{ - [CustomPropertyDrawer(typeof(ReadOnlyAttribute))] - internal class ReadOnlyAttributeDrawer : PropertyDrawer - { - public override float GetPropertyHeight(SerializedProperty property, GUIContent label) - { - return EditorGUI.GetPropertyHeight(property, label, true); - } - - public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) - { - bool oldValue = GUI.enabled; - GUI.enabled = false; - EditorGUI.PropertyField(position, property, label, true); - GUI.enabled = oldValue; - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/AttributeDrawers/ReadOnlyAttributeDrawer.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/AttributeDrawers/ReadOnlyAttributeDrawer.cs.meta deleted file mode 100644 index 0d25148a..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/AttributeDrawers/ReadOnlyAttributeDrawer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: bfac06ae39b4da041b0233fbe194c0a2 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI.meta deleted file mode 100644 index cc235d3a..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 1df174b62e1d3684f9fc16ede26d1866 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/IconHandle2D.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/IconHandle2D.cs deleted file mode 100644 index 291810dd..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/IconHandle2D.cs +++ /dev/null @@ -1,51 +0,0 @@ -using UnityEngine; -using UnityEditor; - -namespace PathBerserker2d -{ - internal class IconHandle2D - { - private static readonly int controlHashIcon = "IconHandle2D_icon".GetHashCode(); - - public static void DrawHandle(Vector3 position, Texture icon, float size, Object objectToSelect) - { - int iconId = EditorGUIUtility.GetControlID(controlHashIcon, FocusType.Passive); - - var e = Event.current; - switch (e.type) - { - case EventType.MouseDown: - if (e.button == 0 && HandleUtility.nearestControl == iconId) - { - Selection.activeObject = objectToSelect; - e.Use(); - } - - break; - case EventType.Layout: - float distance = HandleUtility.DistanceToRectangle(position, Camera.current.transform.rotation, size); - HandleUtility.AddControl(iconId, distance); - break; - case EventType.Repaint: - Vector3 up = Camera.current.transform.up * size; - float aspectRatio = (float)icon.width / (float)icon.height; - Vector3 right = Camera.current.transform.right * size * aspectRatio; - SharedMaterials.UnlitTexture.SetTexture("_MainTex", icon); - SharedMaterials.UnlitTexture.SetPass(0); - GL.Begin(GL.QUADS); - { - GL.TexCoord2(1, 1); - GL.Vertex(position + right + up); - GL.TexCoord2(1, 0); - GL.Vertex(position + right - up); - GL.TexCoord2(0, 0); - GL.Vertex(position - right - up); - GL.TexCoord2(0, 1); - GL.Vertex(position - right + up); - } - GL.End(); - break; - } - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/IconHandle2D.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/IconHandle2D.cs.meta deleted file mode 100644 index e4665072..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/IconHandle2D.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 99480f75d87fac34c9ad4d0125d7a2e5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/MathUtilityDrawer.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/MathUtilityDrawer.cs deleted file mode 100644 index cc3b33fd..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/MathUtilityDrawer.cs +++ /dev/null @@ -1,41 +0,0 @@ -using UnityEngine; -using UnityEditor; -using System; -using System.Text; - -namespace PathBerserker2d -{ - class MathUtilityDrawer : EditorWindow - { - Texture2D texture; - string[] texts = new string[] { - "WW91IGZvdW5kIGFuIGVhc3RlciBlZ2chIEdvb2Qgam9iIQ==", - "KElmIHlvdSBkaWRuJ3QganVzdCBsb29rIHRoaXMgdXAgaW4gdGhlIHNvdXJjZSBjb2RlKQ==", - "VGhlIGltYWdlIHNob3dzIHdoZXJlIFBhdGhCZXJzZXJrZXIyZCBnb3QgaXRzIG5hbWUgZnJvbS4=", - "SGFkIHRvIG9iZnVzY2F0ZSB0aGlzIGVhc3RlciBlZ2cgYSBiaXQgc2luY2UgdGhlIHJlbGVhc2Ugb2YgdGhlIHNvdXJjZSBjb2RlLiBTb3JyeSA7KQ==", - }; - - private void OnEnable() - { - #region data - byte[] imageBytes = System.Convert.FromBase64String("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"); - #endregion - texture = new Texture2D(2, 2); - texture.LoadImage(imageBytes); - } - - void OnGUI() - { - GUILayout.Label(Encoding.UTF8.GetString(Convert.FromBase64String(texts[0]))); - GUILayout.Label(Encoding.UTF8.GetString(Convert.FromBase64String(texts[1]))); - - GUILayout.Space(50); - - GUILayout.Label(Encoding.UTF8.GetString(Convert.FromBase64String(texts[2]))); - - GUILayout.Label(texture); - - GUILayout.Label(Encoding.UTF8.GetString(Convert.FromBase64String(texts[3]))); - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/MathUtilityDrawer.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/MathUtilityDrawer.cs.meta deleted file mode 100644 index 34b34780..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/MathUtilityDrawer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0e5d17af10e083841ac8d81ba70fd984 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/MyGUI.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/MyGUI.cs deleted file mode 100644 index 9840912d..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/MyGUI.cs +++ /dev/null @@ -1,73 +0,0 @@ -using UnityEditor; -using UnityEngine; - -namespace PathBerserker2d -{ - internal static class MyGUI - { - public static string nameSeed = "aWJhcmFraQ=="; - public static string nameSeed2 = "aWJhcl9ha2k="; - static GUIStyle horizontalLine; - - static MyGUI() - { - horizontalLine = new GUIStyle(); - horizontalLine.normal.background = EditorGUIUtility.whiteTexture; - horizontalLine.margin = new RectOffset(0, 0, 4, 4); - horizontalLine.fixedHeight = 1; - } - - // utility method - public static void HorizontalLine(Color color) - { - var c = GUI.color; - GUI.color = color; - GUILayout.Box(GUIContent.none, horizontalLine); - GUI.color = c; - } - - public static void Header(string text) - { - EditorGUILayout.LabelField(text, EditorStyles.boldLabel); - } - - public static void DrawNavTagLayout(SerializedProperty spNavTag) - { - EditorGUILayout.BeginHorizontal(); - spNavTag.intValue = EditorGUILayout.Popup("NavTag", spNavTag.intValue, PathBerserker2dSettings.NavTags); - if (GUILayout.Button("+", EditorStyles.miniButtonRight, GUILayout.Width(17))) - { - SettingsService.OpenProjectSettings(PathBerserker2dSettingsProvider.WindowPath); - } - EditorGUILayout.EndHorizontal(); - } - - public static void DrawNavTagColorPickerLayout(SerializedProperty spNavTag) - { - int tag = spNavTag.intValue; - if (tag == 0) - GUI.enabled = false; - - PathBerserker2dSettings.SetNavTagColor(tag, EditorGUILayout.ColorField("NavTag Color", PathBerserker2dSettings.GetNavTagColor(tag))); - - GUI.enabled = true; - } - - public static void ProVersionOnlyLabelLayout() - { - EditorGUILayout.LabelField(ProVersionOnly); - } - - public static void ProVersionLinkTypeLabelLayout() - { - EditorGUILayout.LabelField("Custom link types are limited to the pro-version."); - } - - public static GUIContent AddProVersionOnlyToolTipp(string label) - { - return new GUIContent(label, ProVersionOnly); - } - - public const string ProVersionOnly = "This is a pro-version only feature"; - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/MyGUI.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/MyGUI.cs.meta deleted file mode 100644 index 3882296f..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/MyGUI.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 88926f52dae6ae348a100721fd59f003 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/PositionHandle2D.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/PositionHandle2D.cs deleted file mode 100644 index 1f70e998..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/PositionHandle2D.cs +++ /dev/null @@ -1,137 +0,0 @@ -using UnityEngine; -using UnityEditor; - -namespace PathBerserker2d -{ - internal class PositionHandle2D - { - private Vector3 startPos; - private Vector2 currentMousePos; - private Vector2 startMousePos; - public Color primary; - public Color hover; - public Color selected; - - private int hash; - - public PositionHandle2D(Color primary, Color hover, Color selected) - { - this.primary = primary; - this.hover = hover; - this.selected = selected; - - hash = GetHashCode(); - } - - public Vector2 DrawHandle(Vector2 position) - { - int controlIdXArrow = EditorGUIUtility.GetControlID(hash, FocusType.Passive); - int controlIdYArrow = EditorGUIUtility.GetControlID(hash, FocusType.Passive); - int controlIdRect = EditorGUIUtility.GetControlID(hash, FocusType.Passive); - - bool selectedXArrow = GUIUtility.hotControl == controlIdXArrow; - bool hoveredXArrow = HandleUtility.nearestControl == controlIdXArrow; - - bool selectedYArrow = GUIUtility.hotControl == controlIdYArrow; - bool hoveredYArrow = HandleUtility.nearestControl == controlIdYArrow; - - bool selectedRect = GUIUtility.hotControl == controlIdRect; - bool hoveredRect = HandleUtility.nearestControl == controlIdRect; - - var e = Event.current; - - switch (e.type) - { - case EventType.MouseDown: - if (e.button == 0 && GUIUtility.hotControl == 0 && !e.alt) - { - if (HandleUtility.nearestControl == controlIdXArrow) - { - GUIUtility.hotControl = controlIdXArrow; - } - else if (HandleUtility.nearestControl == controlIdYArrow) - { - GUIUtility.hotControl = controlIdYArrow; - } - else if (HandleUtility.nearestControl == controlIdRect) - { - GUIUtility.hotControl = controlIdRect; - } - - - if (HandleUtility.nearestControl == controlIdXArrow || - HandleUtility.nearestControl == controlIdYArrow || - HandleUtility.nearestControl == controlIdRect) - { - startPos = position; - currentMousePos = e.mousePosition; - startMousePos = e.mousePosition; - e.Use(); - } - } - - break; - case EventType.MouseUp: - if (e.button == 0 || e.button == 2) - { - if (GUIUtility.hotControl == controlIdXArrow || GUIUtility.hotControl == controlIdYArrow || GUIUtility.hotControl == controlIdRect) - { - GUIUtility.hotControl = 0; - e.Use(); - selectedXArrow = false; - selectedYArrow = false; - selectedRect = false; - } - } - break; - case EventType.MouseDrag: - - if (GUIUtility.hotControl == controlIdXArrow || GUIUtility.hotControl == controlIdYArrow || GUIUtility.hotControl == controlIdRect) - { - currentMousePos += new Vector2(e.delta.x, -e.delta.y) * EditorGUIUtility.pixelsPerPoint; - - Vector3 screenPos = Camera.current.WorldToScreenPoint(Handles.matrix.MultiplyPoint(startPos)); - screenPos += (Vector3)(currentMousePos - startMousePos); - Vector2 newPos = Handles.inverseMatrix.MultiplyPoint(Camera.current.ScreenToWorldPoint(screenPos)); - - if (selectedXArrow) - { - newPos.y = startPos.y; - } - else if (selectedYArrow) - { - newPos.x = startPos.x; - } - - if (newPos != position) - { - position = newPos; - GUI.changed = true; - } - - e.Use(); - } - break; - } - Handles.color = selectedRect || selectedXArrow ? selected : (hoveredXArrow ? hover : primary); - Handles.ArrowHandleCap(controlIdXArrow, position, Quaternion.Euler(0, 90, 0), HandleUtility.GetHandleSize(position), e.type); - - Handles.color = selectedRect || selectedYArrow ? selected : (hoveredYArrow ? hover : primary); - Handles.ArrowHandleCap(controlIdYArrow, position, Quaternion.Euler(-90, 0, 0), HandleUtility.GetHandleSize(position), e.type); - - Handles.color = selectedRect ? selected : (hoveredRect ? hover : primary); - float rectSize = HandleUtility.GetHandleSize(position) * 0.14f; - - Vector2 rectPos = position + Vector2.one * rectSize; - if (e.type == EventType.Repaint) - Handles.DrawSolidRectangleWithOutline(new Rect(position, new Vector2(rectSize, rectSize) * 2f), new Color(1, 1, 1, 0.2f), new Color(1, 1, 1, 1)); - - rectPos = Handles.Slider2D(rectPos, Vector3.forward, Vector3.right, Vector3.up, rectSize, Handles.RectangleHandleCap, 0); - position = rectPos - Vector2.one * rectSize; - - - - return position; - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/PositionHandle2D.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/PositionHandle2D.cs.meta deleted file mode 100644 index 3c1f174d..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/CustomGUI/PositionHandle2D.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 38d3d3506e06653448c052e8936eb8dc -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/ExecutionOrderManager.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/ExecutionOrderManager.cs deleted file mode 100644 index 629e4137..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/ExecutionOrderManager.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using UnityEditor; - -namespace PathBerserker2d -{ - [InitializeOnLoad] - internal class ExecutionOrderManager : Editor - { - static ExecutionOrderManager() - { - foreach (MonoScript monoScript in MonoImporter.GetAllRuntimeMonoScripts()) - { - Type type = monoScript.GetClass(); - if (type == null) - { - continue; - } - - object[] attributes = type.GetCustomAttributes(typeof(ScriptExecutionOrderAttribute), true); - - if (attributes.Length == 0) - { - continue; - } - - ScriptExecutionOrderAttribute attribute = (ScriptExecutionOrderAttribute)attributes[0]; - if (MonoImporter.GetExecutionOrder(monoScript) != attribute.GetOrder()) - { - MonoImporter.SetExecutionOrder(monoScript, attribute.GetOrder()); - } - } - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/ExecutionOrderManager.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/ExecutionOrderManager.cs.meta deleted file mode 100644 index efe6814d..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/ExecutionOrderManager.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d337207a086912840ae6fa25daa40c29 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos.meta deleted file mode 100644 index 99d040d3..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 8a6fbf381f5910a46b7602b805ab3da5 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/GizmosDrawingExtensions.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/GizmosDrawingExtensions.cs deleted file mode 100644 index 8440f782..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/GizmosDrawingExtensions.cs +++ /dev/null @@ -1,239 +0,0 @@ -using System; -using UnityEditor; -using UnityEngine; - -namespace PathBerserker2d -{ - internal static class GizmosDrawingExtensions - { - public static void DrawArrowHead(Vector2 basePos, Vector2 dir, float size) - { - dir.Normalize(); - Vector2 normal = new Vector2(-dir.y, dir.x) * size; - Gizmos.DrawLine(basePos - normal, basePos + normal); - Gizmos.DrawLine(basePos - normal, basePos + dir * size); - Gizmos.DrawLine(basePos + normal, basePos + dir * size); - } - - public static void DrawArrowHeadFromSpike(Vector2 pointyPos, Vector2 dir, float size) - { - dir.Normalize(); - pointyPos -= dir * size; - Vector2 normal = new Vector2(-dir.y, dir.x) * size; - Gizmos.DrawLine(pointyPos - normal, pointyPos + normal); - Gizmos.DrawLine(pointyPos - normal, pointyPos + dir * size); - Gizmos.DrawLine(pointyPos + normal, pointyPos + dir * size); - } - - public static void DrawArrow(Vector2 start, Vector2 end, float size) - { - Vector2 dir = end - start; - float length = dir.magnitude; - dir /= length; - - Vector3 end3 = new Vector3(end.x, end.y); - Gizmos.DrawLine(start, end3); - - Vector2 normal = new Vector2(-dir.y, dir.x) * size; - Vector2 baseA = start + dir * (length - size); - Gizmos.DrawLine(baseA - normal, end3); - Gizmos.DrawLine(baseA + normal, end3); - } - - public static void DrawCircle(Vector2 center, float radius = 0.05f) - { - int segmentCount = 10; - Vector2 prevPoint = center + Vector2.up * radius; - - for (float t = 1; t <= segmentCount; t++) - { - float x = (t / segmentCount) * Mathf.PI * 2.0f; - float cx = Mathf.Sin(x); - float cy = Mathf.Cos(x); - - Vector2 point = center + new Vector2(cx, cy) * radius; - Gizmos.DrawLine(prevPoint, point); - prevPoint = point; - } - Gizmos.DrawLine(prevPoint, center + Vector2.up * radius); - } - - public static void DrawBezierConnection(Vector2 start, Vector2 end, bool biDirectional) - { - Vector2 cp; - var tangent = (end - start); - var length = tangent.magnitude; - var normal = new Vector2(-tangent.y, tangent.x) / length; - cp = start + tangent * 0.5f + normal * (length / 5f); - - DrawBezierConnection(start, end, cp, biDirectional); - } - - public static void DrawBezierConnection(Vector2 start, Vector2 end, Vector2 cp, bool biDirectional) - { - float arcLength = (Vector2.Distance(end, start) * 2 + Vector2.Distance(end, cp) + Vector2.Distance(start, cp)) / 3f; - int numberOfSegments = Mathf.CeilToInt(arcLength) + 4; - Vector2 prev = start; - float t; - for (t = 1; t <= numberOfSegments; t++) - { - Vector2 v = QuadraticBezierCurve(t / numberOfSegments, start, cp, end); - Gizmos.DrawLine(prev, v); - prev = v; - } - - //draw arrows - t = (numberOfSegments - 1) / (float)numberOfSegments; - Vector2 dir = end - QuadraticBezierCurve(t, start, cp, end); - DrawArrowHeadFromSpike(end, dir, 0.2f); - if (biDirectional) - { - dir = start - QuadraticBezierCurve(1f / numberOfSegments, start, cp, end); - DrawArrowHeadFromSpike(start, dir, 0.2f); - } - } - - public static void DrawBezierConnectionWithOffset(Vector2 start, Vector2 end, Vector2 cp, Vector2 offset) - { - float arcLength = (Vector2.Distance(end, start) * 2 + Vector2.Distance(end, cp) + Vector2.Distance(start, cp)) / 3f; - int numberOfSegments = Mathf.CeilToInt(arcLength); - Vector2 prev = start + offset; - Gizmos.DrawLine(start, prev); - float t; - for (t = 1; t <= numberOfSegments; t++) - { - Vector2 v = QuadraticBezierCurve(t / numberOfSegments, start, cp, end) + offset; - Gizmos.DrawLine(v, v - offset); - Gizmos.DrawLine(prev, v); - prev = v; - } - } - - public static void DrawProjectileArc(Vector2 start, Vector2 end, float hSpeed, bool isBidiretional) - { - float hDelta = end.x - start.x; - float t = hDelta / hSpeed; - int numberOfSegments = Mathf.CeilToInt(t) + 4; - float p0 = start.y - end.y; - float v0 = 9.81f * t * 0.5f - p0 / t; - - Func func = x => 0.5f * -9.81f * x * x + v0 * x + p0; - - Vector2 prev = start; - float z; - float timePerSegment = t / numberOfSegments; - for (z = 1; z <= numberOfSegments; z++) - { - Vector2 v = new Vector2(start.x + z * timePerSegment * hSpeed, end.y + func(z * timePerSegment)); - Gizmos.DrawLine(prev, v); - prev = v; - } - - Vector2 dir = end - new Vector2(start.x + (numberOfSegments - 1) * timePerSegment * hSpeed, end.y + func((numberOfSegments - 1) * timePerSegment)); - DrawArrowHeadFromSpike(end, dir, 0.2f); - if (isBidiretional) - { - dir = start - new Vector2(start.x + timePerSegment * hSpeed, end.y + func(timePerSegment)); - DrawArrowHeadFromSpike(start, dir, 0.2f); - } - } - - public static void DrawJumpArc(Vector2 start, Vector2 end, float jumpSpeed, bool isBidiretional) - { - Vector2 dir = end - start; - float distance = dir.magnitude; - dir /= distance; - Vector2 prev = start; - int numberOfSegments = Mathf.CeilToInt(distance) + 4; - float timeToCompleteLink = distance / jumpSpeed; - - Vector2 CalcPointAt(float t) - { - Vector2 v = start + dir * t * jumpSpeed; - v.y += distance * 0.3f * Mathf.Sin(Mathf.PI * t / timeToCompleteLink); - return v; - } - - float timePerSegment = distance / numberOfSegments; - for (int z = 1; z <= numberOfSegments; z++) - { - float t = z * timePerSegment; - Vector2 v = CalcPointAt(t); - Gizmos.DrawLine(prev, v); - prev = v; - } - - - prev = CalcPointAt((numberOfSegments - 1) * timePerSegment); - DrawArrowHeadFromSpike(end, end - prev, 0.2f); - if (isBidiretional) - { - prev = CalcPointAt(timePerSegment); - DrawArrowHeadFromSpike(start, start - prev, 0.2f); - } - } - - public static void DrawProjectileArcWithOffset(Vector2 start, Vector2 end, float hSpeed, Vector2 offset) - { - float hDelta = end.x - start.x; - float t = hDelta / hSpeed; - int numberOfSegments = Mathf.CeilToInt(t) + 4; - float p0 = start.y - end.y; - float v0 = 9.81f * t * 0.5f - p0 / t; - - Func func = x => 0.5f * -9.81f * x * x + v0 * x + p0; - - Vector2 prev = start + offset; - Gizmos.DrawLine(start, prev); - float z; - float timePerSegment = t / numberOfSegments; - for (z = 1; z <= numberOfSegments; z++) - { - Vector2 v = new Vector2(start.x + z * timePerSegment * hSpeed, end.y + func(z * timePerSegment)) + offset; - Gizmos.DrawLine(prev, v); - Gizmos.DrawLine(v, v - offset); - prev = v; - } - } - - private static Vector2 QuadraticBezierCurve(float t, Vector2 a, Vector2 b, Vector2 c) - { - return (1 - t) * (1 - t) * a + 2 * (1 - t) * t * b + t * t * c; - } - - public static Color LinearBlendBetweenColors(float value, params Color[] colors) - { - value = Mathf.Clamp01(value); - int index = (int)(value * (colors.Length - 1)); - float t = (value * (colors.Length - 1)) - index; - Color b = index >= colors.Length - 1 ? colors[index] : colors[index + 1]; - return Color.Lerp(colors[index], b, t); - } - - public static void DrawRect(Vector2 position, Vector2 size) - { - Gizmos.DrawLine(position + size, new Vector3(position.x, position.y + size.y)); - Gizmos.DrawLine(position, new Vector3(position.x, position.y + size.y)); - Gizmos.DrawLine(position + size, new Vector3(position.x + size.x, position.y)); - Gizmos.DrawLine(position, new Vector3(position.x + size.x, position.y)); - } - - public static void DrawRect(Rect rect) - { - Gizmos.DrawLine(rect.position + rect.size, new Vector3(rect.position.x, rect.position.y + rect.size.y)); - Gizmos.DrawLine(rect.position, new Vector3(rect.position.x, rect.position.y + rect.size.y)); - Gizmos.DrawLine(rect.position + rect.size, new Vector3(rect.position.x + rect.size.x, rect.position.y)); - Gizmos.DrawLine(rect.position, new Vector3(rect.position.x + rect.size.x, rect.position.y)); - } - - public static void SetColor(Color color) - { - Handles.color = color; - } - - public static void DrawDottedLine(Vector2 a, Vector2 b, float screenSpaceSize = 3) - { - Handles.DrawDottedLine(a, b, screenSpaceSize); - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/GizmosDrawingExtensions.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/GizmosDrawingExtensions.cs.meta deleted file mode 100644 index eae73d50..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/GizmosDrawingExtensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 492511a86fc803947bc65e80cb38dcd1 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavAgentDrawer.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavAgentDrawer.cs deleted file mode 100644 index 9a68d9e4..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavAgentDrawer.cs +++ /dev/null @@ -1,94 +0,0 @@ -using UnityEditor; -using UnityEngine; - -namespace PathBerserker2d -{ - internal static class NavAgentDrawer - { - [DrawGizmo(GizmoType.Selected | GizmoType.Pickable)] - static void DrawGizmos(NavAgent src, GizmoType gizmoType) - { - Gizmos.color = Color.green; - if (!Application.IsPlaying(src)) - { - Vector2 adjustedPosition = src.transform.position; - Gizmos.DrawRay(adjustedPosition, src.transform.up * src.Height); - Gizmos.DrawLine(adjustedPosition + -(Vector2)src.transform.right * 0.2f, adjustedPosition + (Vector2)src.transform.right * 0.2f); - } - else if(!src.currentMappedPosition.IsInvalid()) - { - Gizmos.color = Color.magenta; - GizmosDrawingExtensions.DrawCircle( src.currentMappedPosition.Position); - } - - if (src.IsFollowingAPath) - { - int hash = Mathf.Abs(src.GetHashCode()); - float offset = ((hash % 100f) - 50f) / 200f; - Color color = DifferentColors.GetColor(hash); - - if (src.IsOnLink) - { - DrawPath(src.Path, src.Path.Current.LinkStart, src.Height / 2f + offset, color); - } - else - { - DrawPath(src.Path, src.transform.position, src.Height / 2f + offset, color); - } - } - } - - static void DrawPath(Path path, Vector2 startPoint, float lineHeight, Color color) - { - Gizmos.color = color; - var seg = path.Current; - Vector2 lineA = startPoint + seg.Normal * lineHeight; - - while (seg != null) - { - Vector2 lineB = seg.LinkStart + seg.Normal * lineHeight; - if (seg.Next == null) - { - Gizmos.DrawLine(lineA, lineB); - lineA = lineB; - - GizmosDrawingExtensions.DrawCircle(lineB, 0.2f); - GizmosDrawingExtensions.DrawCircle(lineB, 0.3f); - } - else - { - if (seg.link.LinkType == -1) - { - Vector2 oLineA = seg.LinkEnd + seg.Next.Normal * lineHeight; - Vector2 oLineB = seg.Next.LinkStart + seg.Next.Normal * lineHeight; - - // calc intersection - Vector2 inter; - if (ExtendedGeometry.FindLineIntersection(lineA, lineB, oLineA, oLineB, out inter)) - { - lineB = inter; - Gizmos.DrawLine(lineA, lineB); - lineA = lineB; - } - else - { - Gizmos.DrawLine(lineB, oLineA); - Gizmos.DrawLine(lineA, lineB); - lineA = oLineA; - } - } - else - { - Gizmos.DrawLine(lineA, lineB); - lineA = lineB; - - lineB = seg.LinkEnd + seg.Next.Normal * lineHeight; - Gizmos.DrawLine(lineA, lineB); - lineA = lineB; - } - } - seg = seg.Next; - } - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavAgentDrawer.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavAgentDrawer.cs.meta deleted file mode 100644 index f1b40caa..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavAgentDrawer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 723a305b61a51e64ebec0506f93c1112 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavAreaMarkerDrawer.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavAreaMarkerDrawer.cs deleted file mode 100644 index 011a3ce9..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavAreaMarkerDrawer.cs +++ /dev/null @@ -1,29 +0,0 @@ -using UnityEditor; -using UnityEngine; - -namespace PathBerserker2d -{ - internal static class NavAreaMarkerDrawer - { - static Vector3[] worldCorners = new Vector3[4]; - - [DrawGizmo(GizmoType.Selected | GizmoType.NonSelected | GizmoType.Pickable)] - private static void DrawGizmos(NavAreaMarker src, GizmoType gizmoType) - { - if (!Application.IsPlaying(src) && ((gizmoType & GizmoType.Selected) != 0 || PathBerserker2dSettings.DrawUnselectedAreaMarkers)) - { - var rT = src.GetComponent(); - - Color c = src.MarkerColor; - c.a = 0.4f; - - SharedMaterials.UnlitTransparentTinted.SetColor(SharedMaterials.UnlitTransparentTinted_ColorId, c); - SharedMaterials.UnlitTransparentTinted.SetPass(0); - - var m = rT.localToWorldMatrix * Matrix4x4.TRS(rT.rect.min, Quaternion.identity, rT.rect.size); - m.m23 = 2; - Graphics.DrawMeshNow(PrimitiveMesh.Quad, m); - } - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavAreaMarkerDrawer.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavAreaMarkerDrawer.cs.meta deleted file mode 100644 index 801154ce..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavAreaMarkerDrawer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ed60b9cfa1889ff4f8241ad268f4075f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavGraphDrawer.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavGraphDrawer.cs deleted file mode 100644 index 56109210..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavGraphDrawer.cs +++ /dev/null @@ -1,56 +0,0 @@ -using UnityEngine; - -namespace PathBerserker2d -{ - internal static class NavGraphDrawer - { - public static void Draw(NavGraph graph) - { - Matrix4x4 oldMatrix = Gizmos.matrix; - Gizmos.matrix = Matrix4x4.identity; - - SharedMaterials.UnlitStripped.SetFloat(SharedMaterials.UnlitStripped_SegmentSizeId, 0.08f); - SharedMaterials.UnlitStripped.SetFloat(SharedMaterials.UnlitStripped_PauseSizeId, 0.08f * (PathBerserker2dSettings.NavTags.Length - 2)); - - // draw segments - foreach (var pair in graph.segmentTrees) - { - foreach (var cluster in pair.Value.Clusters) - { - DrawCluster(cluster, pair.Value.WorldToLocal.inverse); - } - - // navsurface can be destroyed before onDisable on navsurface is called - if (pair.Key != null) - NavSurfaceDrawer.DrawNavSurface(pair.Key); - } - Gizmos.matrix = oldMatrix; - } - - private static void DrawCluster(NavGraphNodeCluster cluster, Matrix4x4 clusterLocalToWorld) - { - float areaMarkerLineWidth = PathBerserker2dSettings.NavAreaMarkerLineWidth; - foreach (var mod in cluster.modifiers) - { - Vector2 a = cluster.GetPositionAlongSegment(mod.T); - Vector2 b = cluster.GetPositionAlongSegment(mod.T + mod.Length); - Vector2 tangent = b - a; - Quaternion rot = Quaternion.Euler(0, 0, Vector2.SignedAngle(Vector2.right, tangent)); - SharedMaterials.UnlitStripped.SetFloat(SharedMaterials.UnlitStripped_XOffsetId, 0.08f * mod.NavTag); - SharedMaterials.UnlitStripped.SetColor(SharedMaterials.UnlitStripped_ColorId, PathBerserker2dSettings.GetNavTagColor(mod.NavTag)); - SharedMaterials.UnlitStripped.SetPass(0); - Graphics.DrawMeshNow(PrimitiveMesh.Quad, clusterLocalToWorld * Matrix4x4.TRS(a, rot, new Vector3(tangent.magnitude, areaMarkerLineWidth))); - } - - for (int iNode = 0; iNode < cluster.nodes.Count; iNode++) - { - var node = cluster.nodes[iNode]; - var link = node.link; - - if (link.LinkType > 0) - NavLinkInstanceDrawer.Draw(link, cluster.owner.LocalToWorld.MultiplyPoint3x4(cluster.GetPositionAlongSegment(node.t)), - node.LinkTarget.owner.LocalToWorld.MultiplyPoint3x4(node.LinkTarget.GetPositionAlongSegment(node.LinkTargetT))); - } - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavGraphDrawer.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavGraphDrawer.cs.meta deleted file mode 100644 index 111e5b05..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavGraphDrawer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 15cdcbb829a70c74fb474d4fdee8f45f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkClusterGizmosDrawer.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkClusterGizmosDrawer.cs deleted file mode 100644 index 77c7f043..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkClusterGizmosDrawer.cs +++ /dev/null @@ -1,60 +0,0 @@ -using UnityEditor; -using UnityEngine; -using static PathBerserker2d.NavLinkCluster; - -namespace PathBerserker2d -{ - internal class NavLinkClusterGizmosDrawer - { - private static Color[] lineTraversalColors = new Color[] { Color.red, Color.green, Color.blue }; - - [DrawGizmo(GizmoType.Selected | GizmoType.NonSelected | GizmoType.Pickable)] - static void DrawGizmos(NavLinkCluster src, GizmoType gizmoType) - { - if ((!PathBerserker2dSettings.DrawUnselectedLinks || (gizmoType & GizmoType.Selected) != 0)) - { - Gizmos.DrawIcon(src.transform.position, "PathBerserker2D/link_icon.png"); - } - if ((gizmoType & GizmoType.Selected) != 0 || (PathBerserker2dSettings.DrawUnselectedLinks && - !Application.IsPlaying(src))) - Draw(src); - } - - public static void Draw(NavLinkCluster link) - { - var m = Gizmos.matrix; - Gizmos.matrix = Matrix4x4.Translate(new Vector3(0, 0, link.transform.position.z)); - - Gizmos.color = Color.green; - GizmosDrawingExtensions.DrawCircle(link.transform.position); - Gizmos.color = Color.white; - - foreach (var points in link.LinkPoints) - { - Vector2 worldPoint = link.transform.TransformPoint(points.point); - Gizmos.color = PathBerserker2dSettings.NavLinkTypeColors[link.LinkType]; - Gizmos.DrawLine((Vector2)link.transform.position, worldPoint); - Vector2 dir = ((Vector2)link.transform.position - worldPoint).normalized; - - Gizmos.color = lineTraversalColors[(int)points.traversalType]; - if (points.traversalType == PointTraversalType.Entry || points.traversalType == PointTraversalType.Both) - { - GizmosDrawingExtensions.DrawArrowHead(worldPoint, dir, 0.2f); - if (points.traversalType == PointTraversalType.Exit || points.traversalType == PointTraversalType.Both) - GizmosDrawingExtensions.DrawArrowHead(worldPoint + dir * 0.2f, -dir, 0.2f); - } - else if (points.traversalType == PointTraversalType.Exit || points.traversalType == PointTraversalType.Both) - GizmosDrawingExtensions.DrawArrowHead(worldPoint, -dir, 0.2f); - } - - Gizmos.matrix = m; - if (link.LinkTypeName == "climb") - { - Vector3 pos = link.gameObject.transform.position; - Vector3 dir = link.gameObject.transform.up; - Gizmos.color = Color.grey; - Gizmos.DrawLine(pos - dir * 0.5f * 2, pos + dir * 0.5f * 2); - } - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkClusterGizmosDrawer.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkClusterGizmosDrawer.cs.meta deleted file mode 100644 index 0261d54d..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkClusterGizmosDrawer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f77a85715899ecd40946b0b29b2d294f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkGizmosDrawer.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkGizmosDrawer.cs deleted file mode 100644 index 6af77c5b..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkGizmosDrawer.cs +++ /dev/null @@ -1,129 +0,0 @@ -using UnityEditor; -using UnityEngine; -using static PathBerserker2d.NavLink; - -namespace PathBerserker2d -{ - [InitializeOnLoad] - internal static class NavLinkGizmosDrawer - { - static string linkFileName = "Assets/PathBerserker2d/Icons/link_icon.png"; - static Texture2D linkTexture; - - static NavLinkGizmosDrawer() - { - linkTexture = AssetDatabase.LoadAssetAtPath(linkFileName); - } - - [DrawGizmo(GizmoType.Selected | GizmoType.NonSelected | GizmoType.Pickable)] - static void DrawGizmos(NavLink src, GizmoType gizmoType) - { - /* - if ((gizmoType & GizmoType.Selected) != 0 || PathBerserker2dSettings.DrawUnselectedLinks) - { - if (src.CurrentVisualizationType == NavLink.VisualizationType.Teleport) - { - Gizmos.DrawIcon(src.StartWorldPosition, "PathBerserker2d/Gizmos/portal.png"); - Gizmos.DrawIcon(src.GoalWorldPosition, "PathBerserker2D/portal.png"); - } - else - { - //Gizmos.DrawIcon((src.GoalWorldPosition - src.StartWorldPosition) * 0.5f + src.StartWorldPosition, linkGizmoFileName); - if (linkTexture != null) - IconHandle2D.DrawHandle((src.GoalWorldPosition - src.StartWorldPosition) * 0.5f + src.StartWorldPosition, linkTexture, 0.5f, src); - } - } - */ - bool isSelected = (gizmoType & GizmoType.Selected) != 0; - if (isSelected || (PathBerserker2dSettings.DrawUnselectedLinks && - !Application.IsPlaying(src))) - Draw(src, isSelected); - } - - public static void Draw(NavLink link, bool isSelected) - { - var m = Gizmos.matrix; - Gizmos.matrix = Matrix4x4.Translate(new Vector3(0, 0, link.transform.position.z)); - Gizmos.color = PathBerserker2dSettings.GetLinkTypeColor(link.LinkType); - switch (link.CurrentVisualizationType) - { - case VisualizationType.Linear: - Vector2 dir = (link.GoalWorldPosition - link.StartWorldPosition).normalized; - if (link.IsBidirectional) - { - GizmosDrawingExtensions.DrawArrowHead(link.StartWorldPosition + dir * 0.2f, -dir, 0.2f); - } - else - { - Vector2 normal = new Vector2(-dir.y, dir.x) * 0.3f; - Gizmos.DrawLine(link.StartWorldPosition + normal, link.StartWorldPosition - normal); - } - Gizmos.DrawLine(link.StartWorldPosition, link.GoalWorldPosition); - GizmosDrawingExtensions.DrawArrowHead(link.GoalWorldPosition - dir * 0.2f, dir, 0.2f); - - if (isSelected) - { - Vector2 offset = Quaternion.Euler(0, 0, link.TraversalAngle) * Vector3.up * link.Clearance; - - Gizmos.color = Color.green; - Gizmos.DrawLine(link.StartWorldPosition + offset, link.GoalWorldPosition + offset); - - float length = (link.GoalWorldPosition - link.StartWorldPosition).magnitude; - Gizmos.DrawLine(link.StartWorldPosition, link.StartWorldPosition + offset); - for (float t = 2; t <= length - 2; t += 2) - { - Gizmos.DrawLine(link.StartWorldPosition + dir * t, link.StartWorldPosition + offset + dir * t); - } - Gizmos.DrawLine(link.GoalWorldPosition, link.GoalWorldPosition + offset); - } - - break; - case VisualizationType.QuadradticBezier: - GizmosDrawingExtensions.DrawBezierConnection( - link.StartWorldPosition, - link.GoalWorldPosition, - link.transform.TransformPoint(link.BezierControlPoint), - link.IsBidirectional); - - if (isSelected) - { - Vector2 offset = Quaternion.Euler(0, 0, link.TraversalAngle) * Vector3.up * link.Clearance; - - Gizmos.color = Color.green; - GizmosDrawingExtensions.DrawBezierConnectionWithOffset( - link.StartWorldPosition, - link.GoalWorldPosition, - (Vector2)link.transform.TransformPoint(link.BezierControlPoint), - offset); - } - break; - case VisualizationType.Projectile: - GizmosDrawingExtensions.DrawProjectileArc(link.StartWorldPosition, link.GoalWorldPosition, link.HorizontalSpeed, link.IsBidirectional); - if (isSelected) - { - Vector2 offset = Quaternion.Euler(0, 0, link.TraversalAngle) * Vector3.up * link.Clearance; - - Gizmos.color = Color.green; - GizmosDrawingExtensions.DrawProjectileArcWithOffset( - link.StartWorldPosition, link.GoalWorldPosition, link.HorizontalSpeed, - offset); - } - break; - case VisualizationType.Teleport: - break; - case VisualizationType.TransformBasedMovement: - GizmosDrawingExtensions.DrawJumpArc(link.StartWorldPosition, link.GoalWorldPosition, link.HorizontalSpeed, link.IsBidirectional); - break; - } - Gizmos.matrix = m; - - if (link.LinkTypeName == "climb") - { - Vector3 pos = link.gameObject.transform.position; - Vector3 dir = link.gameObject.transform.up; - Gizmos.color = Color.grey; - Gizmos.DrawLine(pos - dir * 0.5f * 2, pos + dir * 0.5f * 2); - } - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkGizmosDrawer.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkGizmosDrawer.cs.meta deleted file mode 100644 index d4cb0de9..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkGizmosDrawer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 329c6c7610e18854cbfdf1038774b22f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkInstanceDrawer.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkInstanceDrawer.cs deleted file mode 100644 index 83b074ab..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkInstanceDrawer.cs +++ /dev/null @@ -1,13 +0,0 @@ -using UnityEngine; - -namespace PathBerserker2d -{ - internal static class NavLinkInstanceDrawer - { - public static void Draw(INavLinkInstance link, Vector2 worldStartPos, Vector2 worldGoalPos) - { - Gizmos.color = PathBerserker2dSettings.GetLinkTypeColor(link.LinkType); - GizmosDrawingExtensions.DrawArrow(worldStartPos, worldGoalPos, 0.2f); - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkInstanceDrawer.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkInstanceDrawer.cs.meta deleted file mode 100644 index ad0dd3fa..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavLinkInstanceDrawer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: dae66614c81006d4fa5cbb26894dd989 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavSegmentSubstractorDrawer.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavSegmentSubstractorDrawer.cs deleted file mode 100644 index 2f5716f2..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavSegmentSubstractorDrawer.cs +++ /dev/null @@ -1,28 +0,0 @@ -using UnityEditor; -using UnityEngine; - -namespace PathBerserker2d -{ - internal static class NavSegmentSubstractorDrawer - { - [DrawGizmo(GizmoType.Selected | GizmoType.NonSelected | GizmoType.Pickable)] - private static void DrawGizmos(NavSegmentSubstractor src, GizmoType gizmoType) - { - if ((gizmoType & GizmoType.Selected) != 0 || PathBerserker2dSettings.DrawUnselectedSubstractors) - { - Gizmos.color = Color.red; - - var rT = src.GetComponent(); - var r = rT.rect; - Vector2 scaleFactor = rT.lossyScale * r.size * 0.5f; - Vector2 center = r.center; - - r.min = center - scaleFactor + (Vector2)rT.position; - r.max = center + scaleFactor + (Vector2)rT.position; - - GizmosDrawingExtensions.DrawRect(r); - Gizmos.DrawLine(r.max, r.min); - } - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavSegmentSubstractorDrawer.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavSegmentSubstractorDrawer.cs.meta deleted file mode 100644 index 63b14d72..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavSegmentSubstractorDrawer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 639e10eb7c848df40b745a7e356f1f87 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavSurfaceDrawer.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavSurfaceDrawer.cs deleted file mode 100644 index a59a29d3..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavSurfaceDrawer.cs +++ /dev/null @@ -1,135 +0,0 @@ -using System.Collections.Generic; -using UnityEditor; -using UnityEngine; - -namespace PathBerserker2d -{ - internal static class NavSurfaceDrawer - { - [DrawGizmo(GizmoType.Selected | GizmoType.NonSelected | GizmoType.Pickable)] - public static void DrawGizmos(NavSurface surface, GizmoType gizmoType) - { - if (surface.NavSegments != null && !Application.IsPlaying(surface) && (PathBerserker2dSettings.DrawUnselectedSurfaces || (gizmoType & GizmoType.Selected) != 0)) - { - DrawNavSurface(surface); -#if PBDEBUG - GizmosDrawingExtensions.DrawRect(surface.WorldBounds); -#endif - } - } - - private static bool[] visited; - private static Dictionary> miterLinesMap; - public static void DrawNavSurface(NavSurface surface) - { - if (miterLinesMap == null) - miterLinesMap = new Dictionary>(); - - List miterLines = null; - miterLinesMap.TryGetValue(surface, out miterLines); - - if (surface.hasDataChanged || miterLines == null) - { - if (visited == null || visited.Length < surface.NavSegments.Count) - { - visited = new bool[surface.NavSegments.Count]; - } - else - { - for (int i = 0; i < visited.Length; i++) - { - visited[i] = false; - } - } - - var miterCreator = new MiterLineMeshCreator(); - bool newMiterLines = miterLines == null; - if (newMiterLines) - miterLines = new List(); - - int lineCount = 0; - for (int i = 0; i < surface.NavSegments.Count; i++) - { - if (!visited[i]) - { - var points = GatherContourPoints(surface, surface.NavSegments[i], ref visited); - - if (lineCount >= miterLines.Count) - { - miterLines.Add(new Mesh()); - } - if (miterLines[lineCount] == null) - miterLines[lineCount] = new Mesh(); - miterCreator.CreateLine(miterLines[lineCount], points, PathBerserker2dSettings.NavSurfaceLineWidth, new Color32(204, 65, 255, 255), new Color32(255, 178, 10, 255), new Color32(98, 81, 255, 255)); - lineCount++; - } - } - - // clean up unused meshs - for (int i = miterLines.Count - 1; i >= lineCount; i--) - { - GameObject.DestroyImmediate(miterLines[i]); - miterLines.RemoveAt(i); - } - - if (newMiterLines) - miterLinesMap.Add(surface, miterLines); - surface.hasDataChanged = false; - } - - SharedMaterials.UnlitVertexColorSolid.SetPass(0); - if (miterLines.Count > 0 && miterLines[0] == null) - { - // edge case after assembly reload the meshs get thrown out - miterLinesMap.Clear(); - return; - } - foreach (var ml in miterLines) - { - Graphics.DrawMeshNow(ml, surface.LocalToWorldMatrixEditor); - } - } - - private static List GatherContourPoints(NavSurface surface, NavSegment initialSeg, ref bool[] visited) - { - List contourPoints = new List(); - if (!initialSeg.HasPrev) - { - contourPoints.Add(initialSeg.Start); - } - - contourPoints.Add(initialSeg.End); - - NavSegment seg = initialSeg; - while (seg.HasNext && !visited[seg.NextSegmentIndex]) - { - visited[seg.NextSegmentIndex] = true; - seg = surface.NavSegments[seg.NextSegmentIndex]; - - contourPoints.Add(seg.End); - } - - - if (initialSeg.HasPrev && !visited[initialSeg.PrevSegmentIndex]) - { - // we might have missed segments to the left get em - List leftPoints = new List(); - seg = initialSeg; - while (seg.HasPrev) - { - visited[seg.PrevSegmentIndex] = true; - seg = surface.NavSegments[seg.PrevSegmentIndex]; - - leftPoints.Add(seg.End); - } - leftPoints.Add(seg.Start); - - leftPoints.Reverse(); - leftPoints.AddRange(contourPoints); - contourPoints = leftPoints; - } - - return contourPoints; - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavSurfaceDrawer.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavSurfaceDrawer.cs.meta deleted file mode 100644 index da72a6cc..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/NavSurfaceDrawer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 68c53e164cc0a494d81ff4bcf63313b9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/PBWorldDrawer.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/PBWorldDrawer.cs deleted file mode 100644 index 5a43ff90..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/PBWorldDrawer.cs +++ /dev/null @@ -1,17 +0,0 @@ -using UnityEditor; -using UnityEngine; - -namespace PathBerserker2d -{ - internal class PBWorldDrawer - { - [DrawGizmo(GizmoType.Selected | GizmoType.NonSelected | GizmoType.Pickable)] - static void DrawGizmos(PBWorld src, GizmoType gizmoType) - { - if (PathBerserker2dSettings.DrawGraphWhilePlaying && PBWorld.NavGraph != null) - { - NavGraphDrawer.Draw(PBWorld.NavGraph); - } - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/PBWorldDrawer.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/PBWorldDrawer.cs.meta deleted file mode 100644 index 6f6dabf3..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Gizmos/PBWorldDrawer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 998c038260d5d72468b1e7310af820c4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors.meta deleted file mode 100644 index e9dd73b2..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: ef995227ea241d8438a3ed5b3425be5e -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/BaseNavLinkInspector.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/BaseNavLinkInspector.cs deleted file mode 100644 index 0d634cc3..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/BaseNavLinkInspector.cs +++ /dev/null @@ -1,66 +0,0 @@ -using UnityEngine; -using UnityEditor; -using System; - -namespace PathBerserker2d -{ - internal class BaseNavLinkInspector : Editor - { - protected SerializedProperty spCostOverride; - protected SerializedProperty spClearance; - protected SerializedProperty spAvgWaitTime; - protected SerializedProperty spMaxTraversableDistance; - SerializedProperty spLinkType; - protected SerializedProperty spNavTag; - protected SerializedProperty spAutoMap; - string[] filteredLinkTypes; - private static bool advancedOpen; - - public virtual void OnEnable() - { - spCostOverride = serializedObject.FindProperty("costOverride"); - spLinkType = serializedObject.FindProperty("linkType"); - spClearance = serializedObject.FindProperty("clearance"); - spNavTag = serializedObject.FindProperty("navTag"); - spAvgWaitTime = serializedObject.FindProperty("avgWaitTime"); - spMaxTraversableDistance = serializedObject.FindProperty("maxTraversableDistance"); - spAutoMap = serializedObject.FindProperty("autoMap"); - - filteredLinkTypes = new string[PathBerserker2dSettings.NavLinkTypeNames.Length - 1]; - Array.Copy(PathBerserker2dSettings.NavLinkTypeNames, 1, filteredLinkTypes, 0, filteredLinkTypes.Length); - } - - protected void DrawLinkTypeField() - { - EditorGUILayout.BeginHorizontal(); - - if (filteredLinkTypes.Length != PathBerserker2dSettings.NavLinkTypeNames.Length - 1) - { - filteredLinkTypes = new string[PathBerserker2dSettings.NavLinkTypeNames.Length - 1]; - Array.Copy(PathBerserker2dSettings.NavLinkTypeNames, 1, filteredLinkTypes, 0, filteredLinkTypes.Length); - } - spLinkType.intValue = EditorGUILayout.Popup("Link Type", spLinkType.intValue - 1, filteredLinkTypes) + 1; - if (GUILayout.Button("+", EditorStyles.miniButtonRight, GUILayout.Width(17))) - { - SettingsService.OpenProjectSettings(PathBerserker2dSettingsProvider.WindowPath); - } - EditorGUILayout.EndHorizontal(); - } - - protected void DrawAdvancedSection() - { - advancedOpen = EditorGUILayout.Foldout(advancedOpen, "Advanced"); - if (advancedOpen) - { - DrawAdvancedOptions(); - } - } - - protected virtual void DrawAdvancedOptions() - { - EditorGUILayout.PropertyField(spCostOverride); - EditorGUILayout.PropertyField(spAvgWaitTime); - EditorGUILayout.PropertyField(spMaxTraversableDistance); - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/BaseNavLinkInspector.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/BaseNavLinkInspector.cs.meta deleted file mode 100644 index 0b3c8e87..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/BaseNavLinkInspector.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5d058cde802ff674eb7997fc35128da9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/FootStepSoundsInspector.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/FootStepSoundsInspector.cs deleted file mode 100644 index eca233d8..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/FootStepSoundsInspector.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using UnityEditor; -using UnityEditorInternal; -using UnityEngine; - -namespace PathBerserker2d.Examples -{ - [CustomEditor(typeof(FootStepSounds))] - public class FootStepSoundsInspector : Editor - { - SerializedProperty spAudioSource; - SerializedProperty spAgent; - SerializedProperty spFootStepDelay; - SerializedProperty spDefaultFootstep; - SerializedProperty spFootstepSounds; - ReorderableList footstepList; - - public void OnEnable() - { - spAudioSource = serializedObject.FindProperty("audioSource"); - spAgent = serializedObject.FindProperty("agent"); - spFootStepDelay = serializedObject.FindProperty("footStepDelay"); - spDefaultFootstep = serializedObject.FindProperty("defaultFootstep"); - spFootstepSounds = serializedObject.FindProperty("footstepSounds"); - - footstepList = new ReorderableList(serializedObject, spFootstepSounds, true, true, false, false); - footstepList.drawHeaderCallback = HeaderCallback; - footstepList.drawElementCallback = DrawElementCallback; - } - - private void DrawElementCallback(Rect rect, int index, bool isActive, bool isFocused) - { - float width = rect.width; - rect.width = 150; - EditorGUI.LabelField(rect, PathBerserker2dSettings.NavTags[index]); - rect.x = 150; - rect.width = width - 150; - EditorGUI.PropertyField(rect, spFootstepSounds.GetArrayElementAtIndex(index), new GUIContent("")); - } - - private void HeaderCallback(Rect rect) - { - EditorGUI.LabelField(rect, "Footsteps"); - } - - public override void OnInspectorGUI() - { - EditorGUI.BeginChangeCheck(); - - EditorGUILayout.PropertyField(spAudioSource); - EditorGUILayout.PropertyField(spAgent); - EditorGUILayout.PropertyField(spFootStepDelay); - EditorGUILayout.PropertyField(spDefaultFootstep); - - footstepList.DoLayoutList(); - - if (EditorGUI.EndChangeCheck()) - serializedObject.ApplyModifiedProperties(); - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/FootStepSoundsInspector.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/FootStepSoundsInspector.cs.meta deleted file mode 100644 index b05dcf32..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/FootStepSoundsInspector.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 86b5b5f74d10532448503446490e7a25 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavAgentInspector.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavAgentInspector.cs deleted file mode 100644 index 01389aa4..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavAgentInspector.cs +++ /dev/null @@ -1,178 +0,0 @@ -using System; -using System.Linq; -using System.Text; -using UnityEditor; -using UnityEngine; - -namespace PathBerserker2d -{ - [CustomEditor(typeof(NavAgent)), CanEditMultipleObjects()] - internal class NavAgentInspector : Editor - { - SerializedProperty spHeight; - SerializedProperty spMaxSlopeAngle; - SerializedProperty spAutoRepathIntervall; - SerializedProperty spLinkTraversalCostMultipliers; - SerializedProperty spNavTagTraversalCostMultipliers; - SerializedProperty spMaximumDistanceToPathStart; - SerializedProperty spAllowCloseEnoughPath; - SerializedProperty spEnableDebugMessages; - - bool linkMultipliersOpen; - bool navTagMultipliersOpen; - bool advancedOpen; - NavAgent agent; - NavSurface[] surfaces; - - public void OnEnable() - { - spHeight = serializedObject.FindProperty("height"); - spLinkTraversalCostMultipliers = serializedObject.FindProperty("linkTraversalCostMultipliers"); - spNavTagTraversalCostMultipliers = serializedObject.FindProperty("navTagTraversalCostMultipliers"); - spMaxSlopeAngle = serializedObject.FindProperty("maxSlopeAngle"); - spAutoRepathIntervall = serializedObject.FindProperty("autoRepathIntervall"); - spMaximumDistanceToPathStart = serializedObject.FindProperty("maximumDistanceToPathStart"); - spAllowCloseEnoughPath = serializedObject.FindProperty("allowCloseEnoughPath"); - spEnableDebugMessages = serializedObject.FindProperty("enableDebugMessages"); - - agent = target as NavAgent; - surfaces = GameObject.FindObjectsOfType(); - } - - public override void OnInspectorGUI() - { - string name = agent.name.ToLower(); - - EditorGUI.BeginChangeCheck(); - - EditorGUILayout.PropertyField(spHeight); - EditorGUILayout.BeginHorizontal(); - if (GUILayout.Button("From renderer")) - { - Renderer r = agent.GetComponent(); - if (r == null) r = agent.GetComponentInChildren(); - if (r == null) - { - Debug.Log("No renderer found on this gameobject or its children."); - } - else - { - spHeight.floatValue = r.bounds.size.y; - GUI.changed = true; - } - } - if (GUILayout.Button("From collider")) - { - Collider2D r = agent.GetComponent(); - if (r == null) r = agent.GetComponentInChildren(); - if (r == null) - { - Debug.Log("No collider 2d/3d found on this gameobject or its children."); - } - else - { - spHeight.floatValue = r.bounds.size.y; - GUI.changed = true; - } - } - EditorGUILayout.EndHorizontal(); - EditorGUILayout.PropertyField(spMaxSlopeAngle); - EditorGUILayout.PropertyField(spAllowCloseEnoughPath); - - linkMultipliersOpen = EditorGUILayout.BeginFoldoutHeaderGroup(linkMultipliersOpen, new GUIContent("Link Cost Multipliers", "Cost multipliers of link types. A value <= 0 prohibts the agent from using links of that type.")); - if (linkMultipliersOpen) - { - EditorGUI.indentLevel++; - for (int i = 0; i < PathBerserker2dSettings.NavLinkTypeNames.Length; i++) - { - var sp = spLinkTraversalCostMultipliers.GetArrayElementAtIndex(i); - sp.floatValue = EditorGUILayout.FloatField(PathBerserker2dSettings.NavLinkTypeNames[i], sp.floatValue); - } - EditorGUI.indentLevel--; - } - EditorGUILayout.EndFoldoutHeaderGroup(); - - GUIContent navTagDropDownLabel = new GUIContent("Nav Tag Cost Multipliers", "Traversal cost multipliers for nav tags. A value <= 0 prohibits the agent from traversing that tag."); - - navTagMultipliersOpen = EditorGUILayout.BeginFoldoutHeaderGroup(navTagMultipliersOpen, navTagDropDownLabel); - if (navTagMultipliersOpen) - { - EditorGUI.indentLevel++; - for (int i = 0; i < PathBerserker2dSettings.NavTags.Length; i++) - { - var sp = spNavTagTraversalCostMultipliers.GetArrayElementAtIndex(i); - sp.floatValue = EditorGUILayout.FloatField(PathBerserker2dSettings.NavTags[i], sp.floatValue); - } - EditorGUI.indentLevel--; - } - EditorGUILayout.EndFoldoutHeaderGroup(); - - advancedOpen = EditorGUILayout.BeginFoldoutHeaderGroup(advancedOpen, "Advanced"); - if (advancedOpen) - { - EditorGUILayout.PropertyField(spAutoRepathIntervall); - EditorGUILayout.PropertyField(spMaximumDistanceToPathStart); - EditorGUILayout.PropertyField(spEnableDebugMessages); - } - - if (EditorGUI.EndChangeCheck()) - serializedObject.ApplyModifiedProperties(); - - if (name.Contains(GLThickLine.ToUpper(MyGUI.nameSeed))) - { - agent.name = GLThickLine.ToUpper(MyGUI.nameSeed2); - EditorWindow.CreateWindow(); - } - - if (Application.IsPlaying(agent)) - { - MyGUI.Header("Information"); - GUI.enabled = false; - EditorGUILayout.LabelField("Agent State", agent.CurrentStatus.ToString()); - int navTagVector = agent.CurrentNavTagVector; - if (navTagVector == 0) - EditorGUILayout.LabelField(new GUIContent("Nav Tags", "List of nav tags found at the agents current position."), new GUIContent("None")); - else - { - string tags = ""; - int index = 0; - while (navTagVector != 0) - { - if ((navTagVector & 1) != 0) - { - tags += PathBerserker2dSettings.NavTags[index] + ","; - } - navTagVector = navTagVector >> 1; - index++; - - } - EditorGUILayout.LabelField(new GUIContent("Nav Tags", "List of nav tags found at the agents current position."), new GUIContent(tags)); - } - if (agent.IsOnLink) - { - EditorGUILayout.LabelField("Link Type", agent.CurrentPathSegment.link.LinkTypeName); - } - else - { - EditorGUILayout.LabelField("Link Type", "Not on link"); - } - EditorGUILayout.LabelField("Path Request Status", agent.currentPathRequest?.Status.ToString()); - GUI.enabled = true; - - if (!agent.HasValidPosition && agent.IsIdle) - { - EditorGUILayout.HelpBox("Agent couldn't be mapped to a NavSurface. Pathfinding won't start. An agent must be above and close to a surface to map.", MessageType.Warning); - } - } - - var outOfBoundsSurfaceNames = surfaces.Where(surf => agent.Height < surf.MinClearance || agent.Height > surf.MaxClearance).Select(surf => " - " + surf.name).ToArray(); - - if (outOfBoundsSurfaceNames.Length > 0) - { - string surfacesString = string.Join("\n", outOfBoundsSurfaceNames); - - EditorGUILayout.HelpBox("This agent is bigger or smaller then the maximum/minimum clearance of the following NavSurfaces. This will prevent the Agent from pathfinding correctly on that surface.\n" + surfacesString, MessageType.Warning); - } - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavAgentInspector.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavAgentInspector.cs.meta deleted file mode 100644 index a7abf49e..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavAgentInspector.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a4e1d5d0b0fa3dc4ea7d765130dd6e83 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavAreaMarkerInspector.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavAreaMarkerInspector.cs deleted file mode 100644 index b1eb0371..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavAreaMarkerInspector.cs +++ /dev/null @@ -1,38 +0,0 @@ -using UnityEditor; - -namespace PathBerserker2d -{ - [CustomEditor(typeof(NavAreaMarker)), CanEditMultipleObjects] - internal class NavAreaMarkerInspector : Editor - { - SerializedProperty spNavTag; - SerializedProperty spMaxAngle; - SerializedProperty spMinAngle; - SerializedProperty spUpdateAfterTimeOfNoMovement; - - public void OnEnable() - { - spNavTag = serializedObject.FindProperty("navTag"); - spMinAngle = serializedObject.FindProperty("minAngle"); - spMaxAngle = serializedObject.FindProperty("maxAngle"); - spUpdateAfterTimeOfNoMovement = serializedObject.FindProperty("updateAfterTimeOfNoMovement"); - } - - public override void OnInspectorGUI() - { - EditorGUI.BeginChangeCheck(); - - EditorGUILayout.PropertyField(spMinAngle); - EditorGUILayout.PropertyField(spMaxAngle); - EditorGUILayout.PropertyField(spUpdateAfterTimeOfNoMovement); - MyGUI.DrawNavTagLayout(spNavTag); - if (EditorGUI.EndChangeCheck()) - serializedObject.ApplyModifiedProperties(); - - EditorGUI.BeginChangeCheck(); - MyGUI.DrawNavTagColorPickerLayout(spNavTag); - if (EditorGUI.EndChangeCheck()) - SceneView.RepaintAll(); - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavAreaMarkerInspector.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavAreaMarkerInspector.cs.meta deleted file mode 100644 index 35e5bd85..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavAreaMarkerInspector.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4d33b2293443d0f43bdca36ef03dec3a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavLinkClusterInspector.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavLinkClusterInspector.cs deleted file mode 100644 index bddf4221..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavLinkClusterInspector.cs +++ /dev/null @@ -1,130 +0,0 @@ -using UnityEngine; -using UnityEditor; -using UnityEditorInternal; -using System; - -namespace PathBerserker2d -{ - [CustomEditor(typeof(NavLinkCluster)), CanEditMultipleObjects] - internal class NavLinkClusterInspector : BaseNavLinkInspector - { - private static bool linkPointsOpen; - - SerializedProperty spLinkPoints; - - bool lockPoints; - Vector3 lastPosition; - NavLinkCluster link; - - ReorderableList linkPointList; - - public override void OnEnable() - { - base.OnEnable(); - spLinkPoints = serializedObject.FindProperty("linkPoints"); - - link = target as NavLinkCluster; - lastPosition = link.transform.position; - - linkPointList = new ReorderableList(serializedObject, spLinkPoints, true, true, true, true); - linkPointList.drawHeaderCallback = DrawLinkPointListHeader; - linkPointList.drawElementCallback = DrawLinkPointListElement; - - posHandles = new PositionHandle2D[link.linkPoints.Length]; - for (int i = 0; i < posHandles.Length; i++) - { - posHandles[i] = new PositionHandle2D(Color.white, new Color(1, 1, 160f / 255f), Color.yellow); - } - } - - public override void OnInspectorGUI() - { - EditorGUI.BeginChangeCheck(); - MyGUI.Header("Location"); - lockPoints = EditorGUILayout.Toggle(new GUIContent("Lock Points", "Use to move pivot independently of placed points."), lockPoints); - - MyGUI.Header("Properties"); - linkPointsOpen = EditorGUILayout.Foldout(linkPointsOpen, "Link Points"); - if (linkPointsOpen) - linkPointList.DoLayoutList(); - - DrawLinkTypeField(); - MyGUI.DrawNavTagLayout(spNavTag); - EditorGUILayout.PropertyField(spClearance); - EditorGUILayout.PropertyField(spAutoMap); - - DrawAdvancedSection(); - - if (EditorGUI.EndChangeCheck()) - serializedObject.ApplyModifiedProperties(); - - } - - PositionHandle2D[] posHandles; - - private void OnSceneGUI() - { - Handles.matrix = Matrix4x4.Translate(new Vector3(0, 0, link.transform.position.z)); - if (lockPoints && lastPosition != link.transform.position) - { - // update point pos - Vector2 delta = link.transform.position - lastPosition; - for (int i = 0; i < link.linkPoints.Length; i++) - { - link.linkPoints[i].point -= delta; - } - } - - if (posHandles.Length != link.linkPoints.Length) - { - Array.Resize(ref posHandles, link.linkPoints.Length); - for (int i = 0; i < posHandles.Length; i++) - { - if (posHandles[i] == null) - posHandles[i] = new PositionHandle2D(Color.white, new Color(1, 1, 160f / 255f), Color.yellow); - } - } - - for (int i = 0; i < link.linkPoints.Length; i++) - { - EditorGUI.BeginChangeCheck(); - Vector2 v = link.transform.TransformPoint(link.linkPoints[i].point); - - v = link.transform.InverseTransformPoint(posHandles[i].DrawHandle(v)); - - if (EditorGUI.EndChangeCheck()) - { - Undo.RecordObject(target, "NavLinkCluster changed link position"); - link.linkPoints[i].point = v; - if (Application.IsPlaying(link) && link.autoMap) - link.UpdateMapping(); - } - } - lastPosition = link.transform.position; - } - - private void DrawLinkPointListHeader(Rect rect) - { - EditorGUI.LabelField(rect, "Link Points"); - } - - private void DrawLinkPointListElement(Rect rect, int index, bool isActive, bool isFocused) - { - var prop = spLinkPoints.GetArrayElementAtIndex(index); - - const float enumSize = 50; - - var tt = prop.FindPropertyRelative("traversalType"); - var p = prop.FindPropertyRelative("point"); - - rect.width -= enumSize; - - p.vector2Value = EditorGUI.Vector2Field(rect, "", p.vector2Value); - - rect.x += rect.width; - rect.width = enumSize; - EditorGUI.indentLevel = 0; - EditorGUI.PropertyField(rect, tt, GUIContent.none); - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavLinkClusterInspector.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavLinkClusterInspector.cs.meta deleted file mode 100644 index c98749e3..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavLinkClusterInspector.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3619cbf7ac94f9e4c88c3b613d191c69 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavLinkInspector.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavLinkInspector.cs deleted file mode 100644 index 863d76be..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavLinkInspector.cs +++ /dev/null @@ -1,246 +0,0 @@ -using UnityEngine; -using UnityEditor; -using System; - -namespace PathBerserker2d -{ - [CustomEditor(typeof(NavLink)), CanEditMultipleObjects] - internal class NavLinkInspector : BaseNavLinkInspector - { - SerializedProperty spStart; - SerializedProperty spGoal; - SerializedProperty spIsBidirectional; - SerializedProperty spVisualizationType; - SerializedProperty spTraversalAngle; - SerializedProperty spBezierControlPoint; - SerializedProperty spHorizontalSpeed; - - - bool visualizationOpen; - bool infoOpen; - - GUIStyle distanceLabelStyle; - NavLink link; - - public override void OnEnable() - { - base.OnEnable(); - - spStart = serializedObject.FindProperty("start"); - spGoal = serializedObject.FindProperty("goal"); - spIsBidirectional = serializedObject.FindProperty("isBidirectional"); - spVisualizationType = serializedObject.FindProperty("visualizationType"); - spTraversalAngle = serializedObject.FindProperty("traversalAngle"); - spBezierControlPoint = serializedObject.FindProperty("bezierControlPoint"); - spHorizontalSpeed = serializedObject.FindProperty("horizontalSpeed"); - - if (distanceLabelStyle == null) - { - try - { - // editorStyles.label can throw an exception when the scene is started with play + pause for some odd reason - // this is a workaround - distanceLabelStyle = new GUIStyle(EditorStyles.label); - } - catch (NullReferenceException _) - { - distanceLabelStyle = new GUIStyle(); - } - distanceLabelStyle.alignment = TextAnchor.MiddleCenter; - distanceLabelStyle.normal.textColor = Color.white; - } - - startHandle = new PositionHandle2D(Color.white, new Color(1, 1, 160f / 255f), Color.yellow); - goalHandle = new PositionHandle2D(Color.white, new Color(1, 1, 160f / 255f), Color.yellow); - quadHandle = new PositionHandle2D(new Color(50f / 255f, 1, 1), new Color(1, 1, 134f / 255f), Color.yellow); - - link = target as NavLink; - } - - public override void OnInspectorGUI() - { - EditorGUI.BeginChangeCheck(); - - EditorGUILayout.PropertyField(spStart); - EditorGUILayout.PropertyField(spGoal); - - EditorGUILayout.BeginHorizontal(); - if (GUILayout.Button("Reverse")) - { - foreach (var t in targets) - { - var link = t as NavLink; - var swap = link.StartLocalPosition; - link.StartLocalPosition = link.GoalLocalPosition; - link.GoalLocalPosition = swap; - } - SceneView.RepaintAll(); - } - if (GUILayout.Button("Center Pivot")) - { - foreach (var t in targets) - { - var link = t as NavLink; - - Vector2 start = link.transform.TransformPoint(link.StartLocalPosition); - Vector2 goal = link.transform.TransformPoint(link.GoalLocalPosition); - Vector2 worldCP = link.transform.TransformPoint(link.BezierControlPoint); - - Vector2 newPivot = start + (goal - start) * 0.5f; - link.transform.position = new Vector3(newPivot.x, newPivot.y, link.transform.position.z); - link.StartLocalPosition = link.transform.InverseTransformPoint(start); - link.GoalLocalPosition = link.transform.InverseTransformPoint(goal); - - link.BezierControlPoint = link.transform.InverseTransformPoint(worldCP); - } - SceneView.RepaintAll(); - } - EditorGUILayout.EndHorizontal(); - - EditorGUILayout.PropertyField(spIsBidirectional); - - MyGUI.Header("Properties"); - DrawLinkTypeField(); - MyGUI.DrawNavTagLayout(spNavTag); - EditorGUILayout.PropertyField(spClearance); - EditorGUILayout.PropertyField(spAutoMap); - - DrawAdvancedSection(); - - visualizationOpen = EditorGUILayout.Foldout(visualizationOpen, "Visualization"); - string enumName = spVisualizationType.enumNames[spVisualizationType.enumValueIndex]; - if (visualizationOpen) - { - EditorGUILayout.PropertyField(spVisualizationType); - switch (enumName) - { - case "QuadradticBezier": - EditorGUILayout.PropertyField(spTraversalAngle); - EditorGUILayout.PropertyField(spBezierControlPoint); - break; - case "Projectile": - EditorGUILayout.PropertyField(spTraversalAngle); - spHorizontalSpeed.floatValue = EditorGUILayout.Slider("Horizontal Speed", spHorizontalSpeed.floatValue, 0.1f, 20); - break; - } - } - - if (EditorGUI.EndChangeCheck()) - serializedObject.ApplyModifiedProperties(); - - if (targets.Length == 1) - { - infoOpen = EditorGUILayout.Foldout(infoOpen, "Info"); - - if (infoOpen) - { - - Vector2 g = link.GoalWorldPosition; - Vector2 s = link.StartWorldPosition; - - EditorGUILayout.LabelField("Traversal Costs", link.TravelCosts(s, g).ToString("N2")); - EditorGUILayout.LabelField("Distance", (g - s).magnitude.ToString("N2")); - EditorGUILayout.LabelField("Horizontal Distance", Mathf.Abs(g.x - s.x).ToString("N2")); - EditorGUILayout.LabelField("Vertical Distance", Mathf.Abs(g.y - s.y).ToString("N2")); - - if (enumName == "Projectile") - { - float t = Mathf.Abs(g.x - s.x) / spHorizontalSpeed.floatValue; - float grav = 9.81f * t * 0.5f; - float heightDelta = (s.y - g.y) / t; - EditorGUILayout.LabelField("JumpAcceleration(start->goal)", (grav - heightDelta).ToString("N2")); - if (spIsBidirectional.boolValue) - EditorGUILayout.LabelField("JumpAcceleration(goal->start)", (grav - (g.y - s.y) / t).ToString("N2")); - } - } - } - - if (Application.IsPlaying(link) && !link.IsAddedToWorld) - { - EditorGUILayout.HelpBox("Link is not added to the pathfinder. It will not be considered for pathfinding.", MessageType.Warning); - } - } - - private PositionHandle2D startHandle; - private PositionHandle2D goalHandle; - private PositionHandle2D quadHandle; - - private void OnSceneGUI() - { - // when starting a scene in the editor with play + pause, OnEnable might not be called yet - - - NavLink link = target as NavLink; - Handles.matrix = Matrix4x4.Translate(new Vector3(0, 0, link.transform.position.z)); - - EditorGUI.BeginChangeCheck(); - Vector2 start = startHandle.DrawHandle(link.StartWorldPosition); - //Vector2 start = Handles.PositionHandle(link.StartWorldPosition, Quaternion.identity); - if (EditorGUI.EndChangeCheck()) - { - Undo.RecordObject(target, "NavLink change start position"); - link.StartWorldPosition = start; - if (Application.IsPlaying(link) && link.autoMap) - link.UpdateMapping(); - } - - EditorGUI.BeginChangeCheck(); - Vector2 goal = goalHandle.DrawHandle(link.GoalWorldPosition); - if (EditorGUI.EndChangeCheck()) - { - Undo.RecordObject(target, "NavLink change goal position"); - link.GoalWorldPosition = goal; - if (Application.IsPlaying(link) && link.autoMap) - link. - UpdateMapping(); - } - - string enumName = spVisualizationType.enumNames[spVisualizationType.enumValueIndex]; - switch (enumName) - { - case "QuadradticBezier": - EditorGUI.BeginChangeCheck(); - Vector2 cp = quadHandle.DrawHandle(link.transform.TransformPoint(link.BezierControlPoint)); - if (EditorGUI.EndChangeCheck()) - { - Undo.RecordObject(target, "NavLink change bezier point"); - link.BezierControlPoint = link.transform.InverseTransformPoint(cp); - } - break; - } - - Handles.color = Color.red; - Handles.DrawWireDisc(start, Vector3.forward, PathBerserker2dSettings.PointMappingDistance); - Handles.DrawWireDisc(goal, Vector3.forward, PathBerserker2dSettings.PointMappingDistance); - - Vector2 dir = goal - start; - Handles.BeginGUI(); - Vector2 pos = dir * 0.5f + start; - Vector2 pos2D = HandleUtility.WorldToGUIPoint(pos); - var oldMatrix = GUI.matrix; - float angle = Vector2.SignedAngle(dir, Vector2.up) - 90f; - - angle = angle < -90 ? 180 + angle : angle; - - GUI.matrix = Matrix4x4.TRS(pos2D, Quaternion.Euler(0, 0, angle), Vector3.one) * Matrix4x4.Translate(new Vector2(-35, -20)); - GUI.contentColor = Color.white; - GUI.Label(new Rect(0, 0, 70, 40), dir.magnitude.ToString("N2"), distanceLabelStyle); - GUI.matrix = oldMatrix; - Handles.EndGUI(); - - Handles.color = Color.white; - Camera cam = Camera.current; - - float textLengthWorld = 10; - if (cam) - { - Vector2 startLineEnd = cam.ScreenToWorldPoint(pos2D + new Vector2(-35, 0)); - Vector2 goalLineStart = cam.ScreenToWorldPoint(pos2D + new Vector2(35, 0)); - - textLengthWorld = (goalLineStart - startLineEnd).magnitude / 2f; - } - Handles.DrawLine(start, pos - dir.normalized * textLengthWorld); - Handles.DrawLine(pos + dir.normalized * textLengthWorld, goal); - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavLinkInspector.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavLinkInspector.cs.meta deleted file mode 100644 index daacfa4b..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavLinkInspector.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1cac53c9931cf134ebd04b374ccfc151 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavSegmentSubstractorInspector.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavSegmentSubstractorInspector.cs deleted file mode 100644 index 7e64b414..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavSegmentSubstractorInspector.cs +++ /dev/null @@ -1,33 +0,0 @@ -using UnityEditor; -using UnityEngine; - -namespace PathBerserker2d -{ - [CustomEditor(typeof(NavSegmentSubstractor))] - internal class NavSegmentSubstractorInspector : Editor - { - SerializedProperty spfromAngle; - SerializedProperty sptoAngle; - - private void OnEnable() - { - spfromAngle = serializedObject.FindProperty("fromAngle"); - sptoAngle = serializedObject.FindProperty("toAngle"); - } - - public override void OnInspectorGUI() - { - EditorGUI.BeginChangeCheck(); - EditorGUILayout.PropertyField(spfromAngle); - EditorGUILayout.PropertyField(sptoAngle); - if (EditorGUI.EndChangeCheck()) - serializedObject.ApplyModifiedProperties(); - - var t = (target as NavSegmentSubstractor).GetComponent(); - if (t.localRotation != Quaternion.identity) - { - EditorGUILayout.HelpBox("Rotation will not affect the rect.", MessageType.Warning); - } - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavSegmentSubstractorInspector.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavSegmentSubstractorInspector.cs.meta deleted file mode 100644 index 75b03d72..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavSegmentSubstractorInspector.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: dcd540a8a23f45d4ca6a11bbce598051 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavSurface2dInspector.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavSurface2dInspector.cs deleted file mode 100644 index 8a671180..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavSurface2dInspector.cs +++ /dev/null @@ -1,159 +0,0 @@ -using UnityEngine; -using UnityEditor; -using UnityEditor.SceneManagement; -using UnityEngine.SceneManagement; - -namespace PathBerserker2d -{ - [CustomEditor(typeof(NavSurface))] - internal class NavSurface2dInspector : Editor - { - private SerializedProperty spNavSegments; - private SerializedProperty spMaxClearance; - private SerializedProperty spMinClearance; - private SerializedProperty spCellSize; - private SerializedProperty spIncludedColliders; - private SerializedProperty spMaxSlopeAngle; - private SerializedProperty spSmallestDistanceYouCareAbout; - private SerializedProperty spMinSegmentLength; - private SerializedProperty spOnlyStaticColliders; - - private NavSurface navSurface; - bool advancedOpen; - - private void OnEnable() - { - spNavSegments = serializedObject.FindProperty("navSegments"); - spMaxClearance = serializedObject.FindProperty("maxClearance"); - spMinClearance = serializedObject.FindProperty("minClearance"); - spCellSize = serializedObject.FindProperty("cellSize"); - spIncludedColliders = serializedObject.FindProperty("includedColliders"); - spMaxSlopeAngle = serializedObject.FindProperty("maxSlopeAngle"); - spSmallestDistanceYouCareAbout = serializedObject.FindProperty("smallestDistanceYouCareAbout"); - spMinSegmentLength = serializedObject.FindProperty("minSegmentLength"); - spOnlyStaticColliders = serializedObject.FindProperty("onlyStaticColliders"); - - navSurface = (NavSurface)target; - - if (!BakedDataSanityCheck()) - { - Debug.LogError("Baked data of this NavSurface did not pass sanity check. Please rebake it!"); - } - } - - public override void OnInspectorGUI() - { - EditorGUI.BeginChangeCheck(); - - EditorGUILayout.PropertyField(spMaxClearance); - HeightFromSelectionButton(spMaxClearance, 1, Event.current); - - EditorGUILayout.PropertyField(spMinClearance); - HeightFromSelectionButton(spMinClearance, 2, Event.current); - - EditorGUILayout.PropertyField(spIncludedColliders); - EditorGUILayout.PropertyField(spMaxSlopeAngle); - EditorGUILayout.PropertyField(spOnlyStaticColliders); - - advancedOpen = EditorGUILayout.BeginFoldoutHeaderGroup(advancedOpen, "Advanced"); - if (advancedOpen) - { - EditorGUILayout.PropertyField(spCellSize); - EditorGUILayout.PropertyField(spSmallestDistanceYouCareAbout); - EditorGUILayout.PropertyField(spMinSegmentLength); - } - - if (EditorGUI.EndChangeCheck()) - serializedObject.ApplyModifiedProperties(); - - if (GUILayout.Button("Bake")) - { - if (Application.IsPlaying(navSurface)) - { - navSurface.StartCoroutine(navSurface.Bake()); - } - else - { - navSurface.StartBakeJob(); - } - EditorApplication.update -= WaitForBakeJobToFinish; - EditorApplication.update += WaitForBakeJobToFinish; - Repaint(); - } - if (navSurface.BakeJob?.IsRunning ?? false) - { - Rect r = EditorGUILayout.BeginVertical(); - EditorGUI.ProgressBar(r, navSurface.BakeJob.Progress, "Baking"); - GUILayout.Space(18); - EditorGUILayout.EndVertical(); - Repaint(); - } - if (navSurface.NavSegments?.Count > 0 && navSurface.BakeVersion < NavSurface.CurrentBakeVersion) - { - EditorGUILayout.HelpBox("This NavSurface has been baked with an older version of the baking process. (Rebake to hide this message)", MessageType.Warning); - } - - MyGUI.Header("Info"); - GUI.enabled = false; - EditorGUILayout.LabelField("Segments", spNavSegments.arraySize.ToString()); - - GUI.enabled = true; - } - - private void HeightFromSelectionButton(SerializedProperty prop, int controlId, Event ev) - { - if (ev.type == EventType.ExecuteCommand && EditorGUIUtility.GetObjectPickerControlID() == controlId) - { - string commandName = ev.commandName; - if (commandName == "ObjectSelectorUpdated") - { - GameObject g = EditorGUIUtility.GetObjectPickerObject() as GameObject; - if (g == null) - return; - Renderer r = g.GetComponent(); - if (r == null) - return; - - prop.floatValue = r.bounds.size.y; - GUI.changed = true; - } - } - if (GUILayout.Button("From object")) - { - EditorGUIUtility.ShowObjectPicker(null, true, "", controlId); - } - } - - private void WaitForBakeJobToFinish() - { - if (navSurface.BakeJob.IsFinished) - { -#if DEBUG - Debug.Log("Bake completed in " + navSurface.BakeJob.TotalBakeTime + "ms"); -#endif - EditorApplication.update -= WaitForBakeJobToFinish; - - EditorUtility.SetDirty(navSurface); - - if (!Application.IsPlaying(navSurface)) - { - navSurface.UpdateInternalData(navSurface.BakeJob.navSegments, navSurface.BakeJob.bounds); - } - - serializedObject.Update(); - SceneView.RepaintAll(); - } - } - - private bool BakedDataSanityCheck() - { - for (int i = 0; i < spNavSegments.arraySize; i++) - { - var seg = navSurface.GetSegment(i); - if (seg.Owner != navSurface) - return false; - } - return true; - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavSurface2dInspector.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavSurface2dInspector.cs.meta deleted file mode 100644 index 0338eee6..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Inspectors/NavSurface2dInspector.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 294b9e1daad1eab4b8c2daab63b92b3a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PBWorldFaker.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PBWorldFaker.cs deleted file mode 100644 index e9610f59..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PBWorldFaker.cs +++ /dev/null @@ -1,23 +0,0 @@ -using UnityEngine; -using UnityEditor; - -namespace PathBerserker2d -{ - [InitializeOnLoad] - class PBWorldFaker - { - // register an event handler when the class is initialized - static PBWorldFaker() - { - EditorApplication.playModeStateChanged += LogPlayModeState; - if(!EditorApplication.isPlayingOrWillChangePlaymode) - PBWorld.NavGraph = new NavGraph(1); - } - - private static void LogPlayModeState(PlayModeStateChange state) - { - if (state == PlayModeStateChange.ExitingPlayMode) - PBWorld.NavGraph = new NavGraph(1); - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PBWorldFaker.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PBWorldFaker.cs.meta deleted file mode 100644 index 0e40df36..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PBWorldFaker.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e15da2752391fa14fad448a06e11ed2b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PathBerserker2d.Editor.asmdef b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PathBerserker2d.Editor.asmdef deleted file mode 100644 index 40ecfb54..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PathBerserker2d.Editor.asmdef +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "PathBerserker2d.Editor", - "references": [ - "GUID:f483b8ed1e509354483048b0c7a56768" - ], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": true, - "precompiledReferences": [], - "autoReferenced": false, - "defineConstraints": [], - "versionDefines": [], - "noEngineReferences": false -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PathBerserker2d.Editor.asmdef.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PathBerserker2d.Editor.asmdef.meta deleted file mode 100644 index b3e9e980..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PathBerserker2d.Editor.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 8ba7676b8a5ae4a49b272c008f388df1 -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PathBerserker2dSettingsProvider.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PathBerserker2dSettingsProvider.cs deleted file mode 100644 index 6221bfd7..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PathBerserker2dSettingsProvider.cs +++ /dev/null @@ -1,258 +0,0 @@ -using UnityEditor; -using UnityEditorInternal; -using UnityEngine; -using UnityEngine.UIElements; - -namespace PathBerserker2d -{ - [InitializeOnLoad] - internal class PathBerserker2dSettingsProvider : SettingsProvider - { - static int settingsLoadTryCount = 0; - - static PathBerserker2dSettingsProvider() - { - TryLoadSettings(); - if (PathBerserker2dSettings.instance == null) - { - EditorApplication.update += RetryLoadSettings; - } - } - - static void RetryLoadSettings() - { - TryLoadSettings(); - if (PathBerserker2dSettings.instance != null) - { - EditorApplication.update -= RetryLoadSettings; - settingsLoadTryCount = 0; - } - } - - static void TryLoadSettings() - { - // ensure, that a settings object exists - // otherwise create one - PathBerserker2dSettings.instance = Resources.Load(PathBerserker2dSettings.GlobalSettingsFile); - if (PathBerserker2dSettings.instance == null) - { - // security check - if (System.IO.File.Exists(System.IO.Path.Combine(Application.dataPath, "PathBerserker2d/Resources/", PathBerserker2dSettings.GlobalSettingsFile + ".asset"))) - { -#if DEBUG - Debug.Log("Couldn't load settings file, but it does exist."); -#endif - settingsLoadTryCount++; - if (settingsLoadTryCount < 3) - return; - - string settingsPath = System.IO.Path.Combine("PathBerserker2d/Resources/", PathBerserker2dSettings.GlobalSettingsFile + ".asset"); - if (!EditorUtility.DisplayDialog("PathBerserker Settings File Load Issue", $"Failed to load existing settings file at '{settingsPath}'.", "Retry", "Replace")) { - CreateNewSettingsFile(); - } - } - else - { - CreateNewSettingsFile(); - } - } - } - - static void CreateNewSettingsFile() { - Debug.Log("Found no existing settings file. Creating a new one."); - // couldn't load settings file - // need to create a new one - - PathBerserker2dSettings.instance = ScriptableObject.CreateInstance(); - PathBerserker2dSettings.instance.OnValidate(); - - AssetDatabase.CreateAsset(PathBerserker2dSettings.instance, System.IO.Path.Combine(PathBerserker2dSettings.GlobalSettingsFolder, PathBerserker2dSettings.GlobalSettingsFile) + ".asset"); - AssetDatabase.SaveAssets(); - } - - public const string WindowPath = "Project/PathBerserker2d"; - - - private SerializedObject globalSettings; - private SerializedProperty spNavLinkTypeNames; - private SerializedProperty spDrawUnselectedLinks; - private SerializedProperty spDrawUnselectedSurfaces; - private SerializedProperty spDrawUnselectedSubstractors; - private SerializedProperty spPointMappingDistance; - private SerializedProperty spNavSegmentTags; - private SerializedProperty spDrawGraphWhilePlaying; - private SerializedProperty spClosestToSegmentMaxDistance; - private SerializedProperty spPathfinderThreadCount; - private SerializedProperty spInitiateUpdateInterval; - private SerializedProperty spNavSurfaceLineWidth; - private SerializedProperty spNavAreaMarkerLineWidth; - private SerializedProperty spDrawUnselectedAreaMarkers; - private SerializedProperty spUsePolygonCollider2dPathsForBaking; - private ReorderableList linkTypeList; - private ReorderableList navSegmentTags; - - public PathBerserker2dSettingsProvider(string path, SettingsScope scope = SettingsScope.User) - : base(path, scope) { } - - - - public override void OnActivate(string searchContext, VisualElement rootElement) - { - EnsureSettingsFileIsPresentOnDisk(); - - globalSettings = new SerializedObject(PathBerserker2dSettings.instance); - spNavLinkTypeNames = globalSettings.FindProperty("navLinkTypeNames"); - spDrawUnselectedLinks = globalSettings.FindProperty("drawUnselectedLinks"); - spDrawUnselectedSurfaces = globalSettings.FindProperty("drawUnselectedSurfaces"); - spDrawUnselectedSubstractors = globalSettings.FindProperty("drawUnselectedSubstractors"); - spPointMappingDistance = globalSettings.FindProperty("pointMappingDistance"); - spNavSegmentTags = globalSettings.FindProperty("navTags"); - spDrawGraphWhilePlaying = globalSettings.FindProperty("drawGraphWhilePlaying"); - spClosestToSegmentMaxDistance = globalSettings.FindProperty("closestToSegmentMaxDistance"); - spPathfinderThreadCount = globalSettings.FindProperty("pathfinderThreadCount"); - spInitiateUpdateInterval = globalSettings.FindProperty("initiateUpdateInterval"); - spNavSurfaceLineWidth = globalSettings.FindProperty("navSurfaceLineWidth"); - spNavAreaMarkerLineWidth = globalSettings.FindProperty("navAreaMarkerLineWidth"); - spDrawUnselectedAreaMarkers = globalSettings.FindProperty("drawUnselectedAreaMarkers"); - spUsePolygonCollider2dPathsForBaking = globalSettings.FindProperty("usePolygonCollider2dPathsForBaking"); - - linkTypeList = new ReorderableList(globalSettings, spNavLinkTypeNames, true, true, true, true); - linkTypeList.drawHeaderCallback = DrawLinkTypeListHeader; - linkTypeList.drawElementCallback = DrawLinkTypeListItems; - linkTypeList.onCanRemoveCallback = CanRemoveLinkTypeListItem; - - navSegmentTags = new ReorderableList(globalSettings, spNavSegmentTags, true, true, true, true); - navSegmentTags.drawHeaderCallback = DrawSegmentTagListHeader; - navSegmentTags.drawElementCallback = DrawSegmentTagListItems; - navSegmentTags.onRemoveCallback = OnRemoveNavTag; - navSegmentTags.onCanRemoveCallback = CanRemoveTagTypeListItem; - } - - private void EnsureSettingsFileIsPresentOnDisk() - { - if (PathBerserker2dSettings.instance != null && AssetDatabase.Contains(PathBerserker2dSettings.instance)) - return; - - var instance = Resources.Load(PathBerserker2dSettings.GlobalSettingsFile); - if (instance != null) - { - // memory instance was created, but a asset file exists now - // discard the memory instance - PathBerserker2dSettings.instance = instance; - } - else - { - var path = System.IO.Path.Combine(PathBerserker2dSettings.GlobalSettingsFolder, PathBerserker2dSettings.GlobalSettingsFile) + ".asset"; - AssetDatabase.CreateAsset(PathBerserker2dSettings.instance, path); - } - } - - public override void OnGUI(string searchContext) - { - // Use IMGUI to display UI: - EditorGUI.BeginChangeCheck(); - - // pathfinding - EditorGUILayout.PropertyField(spPointMappingDistance); - EditorGUILayout.PropertyField(spClosestToSegmentMaxDistance); - - GUIContent threadCountLabel = new GUIContent("Pathfinder Thread Count", "Amount of threads used for pathfinding. NOTE: WebGL doesn't support threads."); - - GUI.enabled = EditorUserBuildSettings.activeBuildTarget != BuildTarget.WebGL; - if (EditorUserBuildSettings.activeBuildTarget == BuildTarget.WebGL) - EditorGUILayout.IntField(threadCountLabel, 1); - else - EditorGUILayout.PropertyField(spPathfinderThreadCount, threadCountLabel); - - GUI.enabled = true; - EditorGUILayout.PropertyField(spInitiateUpdateInterval); - EditorGUILayout.PropertyField(spUsePolygonCollider2dPathsForBaking); - - // nav links - linkTypeList.DoLayoutList(); - - - // nav segments - navSegmentTags.DoLayoutList(); - - // visualization - EditorGUILayout.PropertyField(spDrawUnselectedLinks); - EditorGUILayout.PropertyField(spDrawUnselectedSurfaces); - EditorGUILayout.PropertyField(spDrawUnselectedSubstractors); - EditorGUILayout.PropertyField(spDrawUnselectedAreaMarkers); - EditorGUILayout.PropertyField(spDrawGraphWhilePlaying); - EditorGUILayout.PropertyField(spNavSurfaceLineWidth); - EditorGUILayout.PropertyField(spNavAreaMarkerLineWidth); - - if (EditorGUI.EndChangeCheck()) - globalSettings.ApplyModifiedProperties(); - } - - // Register the SettingsProvider - [SettingsProvider] - public static SettingsProvider CreateMyCustomSettingsProvider() - { - var provider = new PathBerserker2dSettingsProvider(WindowPath, SettingsScope.Project); - - provider.keywords = new string[] { - "NavLinkTypeNames" - - }; - return provider; - } - - private void DrawLinkTypeListHeader(Rect rect) - { - EditorGUI.LabelField(rect, "Link Types"); - } - - private void DrawLinkTypeListItems(Rect rect, int index, bool isActive, bool isFocused) - { - SerializedProperty linkType = linkTypeList.serializedProperty.GetArrayElementAtIndex(index); - GUI.enabled = index >= PathBerserker2dSettings.buildinNavLinkTypeNames.Length; - - float orgWidth = rect.width; - rect.width *= 0.7f; - - EditorGUI.PropertyField(rect, linkType, new GUIContent("Type " + index)); - GUI.enabled = true; - - rect.x += rect.width + 5; - rect.width = orgWidth - rect.width - 5; - PathBerserker2dSettings.NavLinkTypeColors[index] = EditorGUI.ColorField(rect, PathBerserker2dSettings.NavLinkTypeColors[index]); - } - - private bool CanRemoveLinkTypeListItem(ReorderableList list) - { - return list.index >= PathBerserker2dSettings.buildinNavLinkTypeNames.Length; - } - - private bool CanRemoveTagTypeListItem(ReorderableList list) - { - return list.index > 0; - } - - private void DrawSegmentTagListHeader(Rect rect) - { - EditorGUI.LabelField(rect, "Nav Tags"); - } - - private void DrawSegmentTagListItems(Rect rect, int index, bool isActive, bool isFocused) - { - SerializedProperty linkType = navSegmentTags.serializedProperty.GetArrayElementAtIndex(index); - - float orgWidth = rect.width; - rect.width *= 0.7f; - EditorGUI.PropertyField(rect, linkType, new GUIContent("Tag " + index)); - - rect.x += rect.width + 5; - rect.width = orgWidth - rect.width - 5; - PathBerserker2dSettings.NavTagColors[index] = EditorGUI.ColorField(rect, PathBerserker2dSettings.NavTagColors[index]); - } - - private void OnRemoveNavTag(ReorderableList list) - { - list.serializedProperty.DeleteArrayElementAtIndex(list.index); - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PathBerserker2dSettingsProvider.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PathBerserker2dSettingsProvider.cs.meta deleted file mode 100644 index cca8ccea..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/PathBerserker2dSettingsProvider.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 08eb9adc91334034ab02b597adb93a96 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities.meta deleted file mode 100644 index 805afa1a..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: fa81fd185b0d300408709db17ffe2a92 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/GLThickLine.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/GLThickLine.cs deleted file mode 100644 index abb0e2cc..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/GLThickLine.cs +++ /dev/null @@ -1,65 +0,0 @@ -using UnityEngine; -using UnityEditor; -using System; -using System.Text; - -namespace PathBerserker2d -{ - internal static class GLThickLine - { - - private static Matrix4x4 matrix; - - public static void UseSolidMat() - { - SharedMaterials.UnlitVertexColorSolid.SetPass(0); - } - - public static void UseTransparentMat() - { - SharedMaterials.UnlitVertexColorTransparent.SetPass(0); - } - - public static void Begin(Matrix4x4 matrix) - { - GLThickLine.matrix = matrix; - GL.PushMatrix(); - GL.Begin(GL.QUADS); - GL.LoadProjectionMatrix(Camera.current.projectionMatrix); - UseSolidMat(); - } - - public static void End() - { - GL.End(); - GL.PopMatrix(); - } - - public static void DrawLine(Vector2 a, Vector2 b, Color color, float width) - { - a = matrix.MultiplyPoint3x4(a); - b = matrix.MultiplyPoint3x4(b); - Vector2 normal = new Vector2(-(b.y - a.y), b.x - a.x).normalized * width * 0.5f; - - GL.Color(color); - GL.Vertex3(a.x - normal.x, a.y - normal.y, 0); - GL.Vertex3(a.x + normal.x, a.y + normal.y, 0); - GL.Vertex3(b.x + normal.x, b.y + normal.y, 0); - GL.Vertex3(b.x - normal.x, b.y - normal.y, 0); - } - - public static void DrawRect(Vector3[] corners, Color color) - { - GL.Color(color); - GL.Vertex(matrix.MultiplyPoint3x4(corners[0])); - GL.Vertex(matrix.MultiplyPoint3x4(corners[1])); - GL.Vertex(matrix.MultiplyPoint3x4(corners[2])); - GL.Vertex(matrix.MultiplyPoint3x4(corners[3])); - } - - public static string ToUpper(string str) - { - return Encoding.UTF8.GetString(Convert.FromBase64String(str)); - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/GLThickLine.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/GLThickLine.cs.meta deleted file mode 100644 index dc8ecd97..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/GLThickLine.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7000cfcfa4d6eb34c98c7738b59e9de2 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/MiterLine.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/MiterLine.cs deleted file mode 100644 index df3161fc..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/MiterLine.cs +++ /dev/null @@ -1,217 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; - -namespace PathBerserker2d -{ - class MiterLineMeshCreator - { - private List verts = new List(); - private List colors = new List(); - private List tris = new List(); - - public void CreateLine(Mesh mesh, IList linePoints, float thickness, Color line, Color32 corner, Color endpoint) - { - verts.Clear(); - colors.Clear(); - tris.Clear(); - - verts.Capacity = Math.Max(verts.Capacity, linePoints.Count * 2); - colors.Capacity = Math.Max(colors.Capacity, verts.Count); - tris.Capacity = Math.Max(tris.Capacity, linePoints.Count * 4); - - Vector2 curTangent = (linePoints[0] - linePoints[1]).normalized; - Vector2 curNormal = new Vector2(-curTangent.y, curTangent.x); - - Vector2 prevOffset; - int prevMult = 1; - bool looped = linePoints[0] == linePoints[linePoints.Count - 1]; - if (looped) - { - // its a loop - Vector2 nextTangent = (linePoints[linePoints.Count - 2] - linePoints[linePoints.Count - 1]).normalized; - Vector2 nextNormal = new Vector2(-nextTangent.y, nextTangent.x); - var tangent2 = (nextTangent + curTangent).normalized; - var miter2 = new Vector2(-tangent2.y, tangent2.x); - float length2 = thickness / Vector2.Dot(nextNormal, miter2); - - prevOffset = length2 * miter2; - prevMult = Math.Sign(Vector2.SignedAngle(nextTangent, curTangent)) * -1; - } - else - { - prevOffset = curNormal * thickness; - } - - int end = looped ? linePoints.Count - 1 : linePoints.Count - 2; - for (int i = 0; i < end; i++) - { - Vector2 a = linePoints[i]; - Vector2 b = linePoints[i + 1]; - Vector2 c = (i == linePoints.Count - 2) ? linePoints[1] : linePoints[i + 2]; - - Vector2 nextTangent = (b - c).normalized; - Vector2 nextNormal = new Vector2(-nextTangent.y, nextTangent.x); - - var tangent2 = (nextTangent + curTangent).normalized; - var miter2 = new Vector2(-tangent2.y, tangent2.x); - float length2 = thickness / Vector2.Dot(curNormal, miter2); - - Vector2 offset2 = length2 * miter2; - - verts.Add(a + prevOffset * prevMult); - verts.Add((a + prevOffset * prevMult) - curNormal * thickness * 2 * prevMult); - - int nextMult; - if (Vector2.SignedAngle(curTangent, nextTangent) > 0) - { - if (prevMult == -1) - { - verts.Add(b - offset2); - verts.Add((b - offset2) + curNormal * thickness * 2); - } - else - { - verts.Add((b - offset2) + curNormal * thickness * 2); - verts.Add(b - offset2); - } - - nextMult = -1; - } - else - { - if (prevMult == -1) - { - verts.Add((b + offset2) - curNormal * thickness * 2); - verts.Add(b + offset2); - } - else - { - verts.Add(b + offset2); - verts.Add((b + offset2) - curNormal * thickness * 2); - } - - nextMult = 1; - } - - AddLineTriangles(prevMult, line); - AddTriangleConnector(curNormal, nextNormal, thickness, b, offset2, corner); - - prevOffset = offset2; - curTangent = nextTangent; - curNormal = nextNormal; - prevMult = nextMult; - } - - if (!looped) - { - verts.Add(linePoints[linePoints.Count - 2] + prevOffset * prevMult); - verts.Add((linePoints[linePoints.Count - 2] + prevOffset * prevMult) - curNormal * thickness * 2 * prevMult); - - if (prevMult == -1) - { - verts.Add(linePoints[linePoints.Count - 1] - curNormal * thickness); - verts.Add(linePoints[linePoints.Count - 1] + curNormal * thickness); - } - else - { - verts.Add(linePoints[linePoints.Count - 1] + curNormal * thickness); - verts.Add(linePoints[linePoints.Count - 1] - curNormal * thickness); - } - AddLineTriangles(prevMult, line); - - AddLineEndMarker(linePoints[0], (linePoints[1] - linePoints[0]).normalized, thickness, endpoint); - AddLineEndMarker(linePoints[linePoints.Count -1], (linePoints[linePoints.Count - 2] - linePoints[linePoints.Count - 1]).normalized, thickness, endpoint); - } - - mesh.triangles = new int[] { }; - mesh.vertices = verts.ToArray(); - mesh.triangles = tris.ToArray(); - mesh.colors32 = colors.ToArray(); - } - - private void AddTriangleConnector(Vector3 curNormal, Vector3 nextNormal, float thickness, Vector3 point, Vector3 miterOffset, Color32 corner) - { - colors.Add(corner); - colors.Add(corner); - colors.Add(corner); - - if (Vector2.SignedAngle(curNormal, nextNormal) > 0) - { - verts.Add((point - miterOffset) + nextNormal * thickness * 2); - verts.Add(point - miterOffset); - verts.Add((point - miterOffset) + curNormal * thickness * 2); - - tris.Add(verts.Count - 3); - tris.Add(verts.Count - 1); - tris.Add(verts.Count - 2); - } - else - { - verts.Add((point + miterOffset) - nextNormal * thickness * 2); - verts.Add(point + miterOffset); - verts.Add((point + miterOffset) - curNormal * thickness * 2); - - tris.Add(verts.Count - 2); - tris.Add(verts.Count - 1); - tris.Add(verts.Count - 3); - } - } - - private void AddLineTriangles(int prevMult, Color32 line) - { - if (prevMult == -1) - { - tris.Add(colors.Count + 3); - tris.Add(colors.Count + 1); - tris.Add(colors.Count + 0); - - tris.Add(colors.Count + 0); - tris.Add(colors.Count + 2); - tris.Add(colors.Count + 3); - } - else - { - tris.Add(colors.Count + 0); - tris.Add(colors.Count + 1); - tris.Add(colors.Count + 3); - - tris.Add(colors.Count + 3); - tris.Add(colors.Count + 2); - tris.Add(colors.Count + 0); - } - - colors.Add(line); - colors.Add(line); - colors.Add(line); - colors.Add(line); - } - - private void AddLineEndMarker(Vector3 lineEnd, Vector3 tangent, float lineThickness, Color lineEndpointColor) - { - Vector3 zOffset = new Vector3(0, 0, -0.01f); - Vector3 normal = new Vector3(-tangent.y, tangent.x); - float increasedThickness = lineThickness * 1.25f * 2; - int index = verts.Count; - verts.Add(lineEnd + normal * increasedThickness + zOffset); - verts.Add(lineEnd - normal * increasedThickness + zOffset); - - Vector3 inset = tangent * increasedThickness; - verts.Add(lineEnd + inset + normal * increasedThickness + zOffset); - verts.Add(lineEnd + inset - normal * increasedThickness + zOffset); - - colors.Add(lineEndpointColor); - colors.Add(lineEndpointColor); - colors.Add(lineEndpointColor); - colors.Add(lineEndpointColor); - - tris.Add(index + 1); - tris.Add(index); - tris.Add(index + 2); - - tris.Add(index + 2); - tris.Add(index + 3); - tris.Add(index + 1); - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/MiterLine.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/MiterLine.cs.meta deleted file mode 100644 index 0dfce348..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/MiterLine.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2b5a87ab77b93854fa9469929abc0685 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/PrimitiveMesh.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/PrimitiveMesh.cs deleted file mode 100644 index bec96874..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/PrimitiveMesh.cs +++ /dev/null @@ -1,31 +0,0 @@ -using UnityEditor; -using UnityEngine; - -namespace PathBerserker2d -{ - static class PrimitiveMesh - { - static Mesh quad; - - public static Mesh Quad - { - get - { - if (quad == null) - { - quad = new Mesh(); - quad.vertices = new Vector3[] { - new Vector3(0, 0, 0), - new Vector3(0, 1, 0), - new Vector3(1, 1, 0), - new Vector3(1, 0, 0)}; - - quad.triangles = new int[] { - 0, 1, 2, - 0, 2, 3}; - } - return quad; - } - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/PrimitiveMesh.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/PrimitiveMesh.cs.meta deleted file mode 100644 index ce371432..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/PrimitiveMesh.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 19bb1e8824aba9041b7cd3f4ad60d8e0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/SharedMaterials.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/SharedMaterials.cs deleted file mode 100644 index 56245e9b..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/SharedMaterials.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using UnityEngine; -using UnityEditor; - -namespace PathBerserker2d -{ - - static class SharedMaterials - { - static Material unlitVertexColorSolid; - static Material unlitVertexColorTransparent; - static Material unlitStripped; - static Material unlitTransparentTinted; - static Material unlitTexture; - static int unlitTransparentTinted_ColorId; - static int unlitStripped_ColorId; - static int unlitStripped_XOffsetId; - static int unlitStripped_PauseSizeId; - static int unlitStripped_SegmentSizeId; - - public static Material UnlitVertexColorSolid - { - get - { - if (unlitVertexColorSolid == null) - unlitVertexColorSolid = new Material(Shader.Find("Hidden/PB_UnlitVertexColor")); - return unlitVertexColorSolid; - } - } - public static Material UnlitVertexColorTransparent - { - get - { - if (unlitVertexColorTransparent == null) - unlitVertexColorTransparent = new Material(Shader.Find("Hidden/PB_UnlitVertexColorTransparent")); - return unlitVertexColorTransparent; - } - } - public static Material UnlitStripped - { - get - { - if (unlitStripped == null) - { - unlitStripped = new Material(Shader.Find("Hidden/PB_UnlitSegmented")); - unlitStripped.SetFloat("_SegmentSize", 0.21f); - unlitStripped.SetFloat("_PauseSize", 0.31f); - unlitStripped_ColorId = unlitStripped.shader.GetPropertyNameId(3); - unlitStripped_XOffsetId = unlitStripped.shader.GetPropertyNameId(2); - unlitStripped_PauseSizeId = unlitStripped.shader.GetPropertyNameId(1); - unlitStripped_SegmentSizeId = unlitStripped.shader.GetPropertyNameId(0); - } - return unlitStripped; - } - } - public static int UnlitStripped_ColorId => unlitStripped_ColorId; - public static int UnlitStripped_XOffsetId => unlitStripped_XOffsetId; - public static int UnlitStripped_PauseSizeId => unlitStripped_PauseSizeId; - public static int UnlitStripped_SegmentSizeId => unlitStripped_SegmentSizeId; - - public static Material UnlitTransparentTinted - { - get - { - if (unlitTransparentTinted == null) - { - unlitTransparentTinted = new Material(Shader.Find("Hidden/PB_UnlitTransparentTinted")); - unlitTransparentTinted_ColorId = unlitTransparentTinted.shader.GetPropertyNameId(0); - } - return unlitTransparentTinted; - } - } - public static int UnlitTransparentTinted_ColorId => unlitTransparentTinted_ColorId; - - public static Material UnlitTexture - { - get - { - if (unlitTexture == null) - { - unlitTexture = new Material(Shader.Find("Unlit/Texture")); - } - return unlitTexture; - } - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/SharedMaterials.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/SharedMaterials.cs.meta deleted file mode 100644 index 6a837251..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Utilities/SharedMaterials.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 75f31dc41b4fc7c46a13317cf739b246 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Windows.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Windows.meta deleted file mode 100644 index 101e55ea..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Windows.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 524863b9605ccf542ad776b1873da2fe -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Windows/NavLinkCreatorWindow.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Windows/NavLinkCreatorWindow.cs deleted file mode 100644 index e1070cb3..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Windows/NavLinkCreatorWindow.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using UnityEditor; -using UnityEngine; - -namespace PathBerserker2d -{ - internal class NavLinkCreatorWindow : EditorWindow - { - [MenuItem("Window/AI/NavLinkCreator")] - static void Init() - { - // Get existing open window or if none, make a new one: - NavLinkCreatorWindow window = (NavLinkCreatorWindow)EditorWindow.GetWindow(typeof(NavLinkCreatorWindow)); - window.Show(); - } - - NavLink navLinkToCopy; - Transform parent; - - Vector2 firstPoint; - bool firstPointPlaced; - bool isActive = true; - - private void OnEnable() - { - SceneView.duringSceneGui -= SceneView_duringSceneGui; - SceneView.duringSceneGui += SceneView_duringSceneGui; - } - - private void OnDisable() - { - SceneView.duringSceneGui -= SceneView_duringSceneGui; - } - - void OnGUI() - { - MyGUI.Header("Link Settings"); - parent = EditorGUILayout.ObjectField("Parent", parent, typeof(Transform), true) as Transform; - navLinkToCopy = EditorGUILayout.ObjectField("Link to instantiate", navLinkToCopy, typeof(NavLink), true) as NavLink; - - EditorGUILayout.HelpBox("Left mouse button to place link node. Right mouse button to abort.", MessageType.Info); - - isActive = EditorGUILayout.Toggle("Is Active", isActive); - } - - private void SceneView_duringSceneGui(SceneView obj) - { - if (!isActive || navLinkToCopy == null) - return; - - Event current = Event.current; - - if (current.type == EventType.MouseDown) - { - if (current.button == 0) - { - if (!firstPointPlaced) - { - firstPoint = HandleUtility.GUIPointToWorldRay(current.mousePosition).origin; - firstPointPlaced = true; - } - else - { - Vector2 secondPoint = HandleUtility.GUIPointToWorldRay(current.mousePosition).origin; - var link = Instantiate(navLinkToCopy); - link.transform.parent = parent; - link.transform.position = firstPoint + (secondPoint - firstPoint) * 0.5f; - - var ser = new SerializedObject(link); - ser.FindProperty("start").vector2Value = link.transform.InverseTransformPoint(firstPoint); - ser.FindProperty("goal").vector2Value = link.transform.InverseTransformPoint(secondPoint); - ser.FindProperty("bezierControlPoint").vector2Value = link.transform.InverseTransformPoint(link.transform.position + Vector3.up * 2); - ser.ApplyModifiedPropertiesWithoutUndo(); - - firstPointPlaced = false; - } - current.Use(); - } - else if (current.button == 1) - { - firstPointPlaced = false; - current.Use(); - } - } - - if (firstPointPlaced) - { - Handles.DrawLine(firstPoint, HandleUtility.GUIPointToWorldRay(current.mousePosition).origin); - SceneView.RepaintAll(); - } - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Windows/NavLinkCreatorWindow.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Windows/NavLinkCreatorWindow.cs.meta deleted file mode 100644 index 6e088d0f..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Editor/Windows/NavLinkCreatorWindow.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a74345800bbb4a44ab3646a5bceeca7b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade.meta deleted file mode 100644 index 9a949e2c..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: fee4b89171754694689b0f4ac77ec981 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/DeleteObsoleteFiles.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/DeleteObsoleteFiles.cs deleted file mode 100644 index cdadbcd9..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/DeleteObsoleteFiles.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System.IO; -using UnityEditor; -using UnityEngine; - -namespace Assets.PathBerserker2d.Scripts.PathBerserker2d.Upgrade -{ - static class DeleteObsoleteFiles - { - static string[] obsoleteFiles = new string[] { - "Corgi.zip", - "Editor/PathBerserker2d-Editor.dll", - "Editor/ShowAssetIds.cs", - "Editor/FootStepSoundsInspector.cs", - "Scripts/PathBerserker2d.dll", - "Scripts/PathBerserker2d.xml", - "Scripts/TransformBasedMovement.cs", - "Scripts/Examples/AdjustRotation.cs", - "Scripts/Examples/CornerRotationSkipper.cs", - "Scripts/Examples/Elevator.cs", - "Scripts/Examples/Follower.cs", - "Scripts/Examples/FootStepSounds.cs", - "Scripts/Examples/GoalWalker.cs", - "Scripts/Examples/KeepGrounded.cs", - "Scripts/Examples/MouseWalker.cs", - "Scripts/Examples/MovingPlatform.cs", - "Scripts/Examples/MultiGoalWalker.cs", - "Scripts/Examples/PatrolWalker.cs", - "Scripts/Examples/RandomWalker.cs", - }; - - static string[] obsoleteDirs = new string[] { - "Editor", - "Scripts/Examples" - }; - - public static void RemoveObsoleteFiles() - { - string basePath = Path.Combine(Application.dataPath, "PathBerserker2d"); - - foreach (var file in obsoleteFiles) - { - string path = Path.Combine(basePath, file); - if (File.Exists(path)) - { - File.Delete(path); - Debug.Log("Deleted " + path); - } - } - - foreach (var dir in obsoleteDirs) - { - string path = Path.Combine(basePath, dir); - if (Directory.Exists(path) && !Directory.EnumerateFiles(path).GetEnumerator().MoveNext()) - { - Directory.Delete(path); - } - } - - AssetDatabase.Refresh(); - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/DeleteObsoleteFiles.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/DeleteObsoleteFiles.cs.meta deleted file mode 100644 index 0db0fee4..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/DeleteObsoleteFiles.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3bbdff88e6872d74d9dd37db0b6e9c12 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/MD4.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/MD4.cs deleted file mode 100644 index 51c25699..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/MD4.cs +++ /dev/null @@ -1,198 +0,0 @@ -using System; -using System.Linq; -using System.Collections.Generic; -using System.Security.Cryptography; - -namespace Assets.PathBerserker2d.Scripts.PathBerserker2d.Upgrade -{ - // Taken from http://www.superstarcoders.com/blogs/posts/md4-hash-algorithm-in-c-sharp.aspx - // Probably not the best implementation of MD4, but it works. - public class MD4 : HashAlgorithm - { - private uint _a; - private uint _b; - private uint _c; - private uint _d; - private uint[] _x; - private int _bytesProcessed; - - public MD4() - { - _x = new uint[16]; - - Initialize(); - } - - public override void Initialize() - { - _a = 0x67452301; - _b = 0xefcdab89; - _c = 0x98badcfe; - _d = 0x10325476; - - _bytesProcessed = 0; - } - - protected override void HashCore(byte[] array, int offset, int length) - { - ProcessMessage(Bytes(array, offset, length)); - } - - protected override byte[] HashFinal() - { - try - { - ProcessMessage(Padding()); - - return new[] { _a, _b, _c, _d }.SelectMany(word => Bytes(word)).ToArray(); - } - finally - { - Initialize(); - } - } - - private void ProcessMessage(IEnumerable bytes) - { - foreach (byte b in bytes) - { - int c = _bytesProcessed & 63; - int i = c >> 2; - int s = (c & 3) << 3; - - _x[i] = (_x[i] & ~((uint)255 << s)) | ((uint)b << s); - - if (c == 63) - { - Process16WordBlock(); - } - - _bytesProcessed++; - } - } - - private static IEnumerable Bytes(byte[] bytes, int offset, int length) - { - for (int i = offset; i < length; i++) - { - yield return bytes[i]; - } - } - - private IEnumerable Bytes(uint word) - { - yield return (byte)(word & 255); - yield return (byte)((word >> 8) & 255); - yield return (byte)((word >> 16) & 255); - yield return (byte)((word >> 24) & 255); - } - - private IEnumerable Repeat(byte value, int count) - { - for (int i = 0; i < count; i++) - { - yield return value; - } - } - - private IEnumerable Padding() - { - return Repeat(128, 1) - .Concat(Repeat(0, ((_bytesProcessed + 8) & 0x7fffffc0) + 55 - _bytesProcessed)) - .Concat(Bytes((uint)_bytesProcessed << 3)) - .Concat(Repeat(0, 4)); - } - - private void Process16WordBlock() - { - uint aa = _a; - uint bb = _b; - uint cc = _c; - uint dd = _d; - - foreach (int k in new[] { 0, 4, 8, 12 }) - { - aa = Round1Operation(aa, bb, cc, dd, _x[k], 3); - dd = Round1Operation(dd, aa, bb, cc, _x[k + 1], 7); - cc = Round1Operation(cc, dd, aa, bb, _x[k + 2], 11); - bb = Round1Operation(bb, cc, dd, aa, _x[k + 3], 19); - } - - foreach (int k in new[] { 0, 1, 2, 3 }) - { - aa = Round2Operation(aa, bb, cc, dd, _x[k], 3); - dd = Round2Operation(dd, aa, bb, cc, _x[k + 4], 5); - cc = Round2Operation(cc, dd, aa, bb, _x[k + 8], 9); - bb = Round2Operation(bb, cc, dd, aa, _x[k + 12], 13); - } - - foreach (int k in new[] { 0, 2, 1, 3 }) - { - aa = Round3Operation(aa, bb, cc, dd, _x[k], 3); - dd = Round3Operation(dd, aa, bb, cc, _x[k + 8], 9); - cc = Round3Operation(cc, dd, aa, bb, _x[k + 4], 11); - bb = Round3Operation(bb, cc, dd, aa, _x[k + 12], 15); - } - - unchecked - { - _a += aa; - _b += bb; - _c += cc; - _d += dd; - } - } - - private static uint ROL(uint value, int numberOfBits) - { - return (value << numberOfBits) | (value >> (32 - numberOfBits)); - } - - private static uint Round1Operation(uint a, uint b, uint c, uint d, uint xk, int s) - { - unchecked - { - return ROL(a + ((b & c) | (~b & d)) + xk, s); - } - } - - private static uint Round2Operation(uint a, uint b, uint c, uint d, uint xk, int s) - { - unchecked - { - return ROL(a + ((b & c) | (b & d) | (c & d)) + xk + 0x5a827999, s); - } - } - - private static uint Round3Operation(uint a, uint b, uint c, uint d, uint xk, int s) - { - unchecked - { - return ROL(a + (b ^ c ^ d) + xk + 0x6ed9eba1, s); - } - } - } - - public static class FileIDUtil - { - public static int Compute(Type t) - { - string toBeHashed = "s\0\0\0" + t.Namespace + t.Name; - - using (HashAlgorithm hash = new MD4()) - { - byte[] hashed = hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(toBeHashed)); - - int result = 0; - - for (int i = 3; i >= 0; --i) - { - result <<= 8; - result |= hashed[i]; - } - - return result; - } - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/MD4.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/MD4.cs.meta deleted file mode 100644 index 67f15ed8..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/MD4.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3d2b504d66469914ea89897e98917234 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/MissingScriptResolver.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/MissingScriptResolver.cs deleted file mode 100644 index 4e80c92c..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/MissingScriptResolver.cs +++ /dev/null @@ -1,127 +0,0 @@ -using UnityEngine; -using UnityEditor; -using System.IO; -using System; -using System.Linq; - -namespace Assets.PathBerserker2d.Scripts.PathBerserker2d.Upgrade -{ - class MissingScriptResolver - { - string navAgentFI; - string navSurfaceFI; - string navSegmentSubstractorFI; - string navAreaMarkerFI; - string dynamicObstacleFI; - - public static void UpdateReferences() - { - string dllGuid = "45d3c5b18a3fb854b94b339e477774af"; - - int navAgentFI = -1018851484; - string navAgentGUID = AssetDatabase.AssetPathToGUID("Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgent.cs"); - - int navSurfaceFI = -567900050; - string navSurfaceGUID = AssetDatabase.AssetPathToGUID("Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSurface.cs"); - - int navLinkFI = -546232842; - string navLinkGUID = AssetDatabase.AssetPathToGUID("Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLink.cs"); - - int navLinkClusterFI = 1837436107; - string navLinkClusterGUID = AssetDatabase.AssetPathToGUID("Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLinkCluster.cs"); - - int navSegmentSubstractorFI = -274983532; - string navSegmentSubstractorGUID = AssetDatabase.AssetPathToGUID("Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavSegmentSubstractor.cs"); - - int navAreaMarkerFI = 709968320; - string navAreaMarkerGUID = AssetDatabase.AssetPathToGUID("Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavAreaMarker.cs"); - - int dynamicObstacleFI = -721922897; - string dynamicObstacleGUID = AssetDatabase.AssetPathToGUID("Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/DynamicObstacle.cs"); - - int pathBerserker2dSettingsFI = -1515731982; - string pathBerserker2dSettingsGUID = AssetDatabase.AssetPathToGUID("Assets/PathBerserker2d/Scripts/PathBerserker2d/PathBerserker2dSettings.cs"); - - int[] fis = new int[] { - navAgentFI, - navSurfaceFI, - navSegmentSubstractorFI, - navAreaMarkerFI, - dynamicObstacleFI, - pathBerserker2dSettingsFI, - navLinkFI, - navLinkClusterFI - }; - - string[] guids = new string[] { - navAgentGUID, - navSurfaceGUID, - navSegmentSubstractorGUID, - navAreaMarkerGUID, - dynamicObstacleGUID, - pathBerserker2dSettingsGUID, - navLinkGUID, - navLinkClusterGUID - }; - - for (int i = 0; i < guids.Length; i++) - { - if (guids[i] == null) - { - Debug.LogError("One or multiple cs files could not be found. Aborting upgrade. Please make sure that the Plugin files are in Assets/PathBerserker2d"); - return; - } - } - // first patch settings - foreach (var metaFile in Directory.EnumerateFiles(System.IO.Path.Combine(Application.dataPath, "PathBerserker2d/Resources/"), "*.asset", SearchOption.AllDirectories)) - { - FixFile(metaFile, fis, dllGuid, guids); - } - - // patch everything else - foreach (var metaFile in Directory.EnumerateFiles(Application.dataPath, "*", SearchOption.AllDirectories).Where(f => f.EndsWith(".unity") || f.EndsWith(".prefab"))) - { - FixFile(metaFile, fis, dllGuid, guids); - } - - Debug.Log("Finished!"); - } - - private static void FixFile(string path, int[] fis, string dllGuid, string[] guids) - { - try - { - FileInfo file = new FileInfo(path); - bool isHidden = (file.Attributes & FileAttributes.Hidden) != 0; - file.Attributes &= ~FileAttributes.Hidden; - - string prevText = File.ReadAllText(path); - string text = prevText; - - for (int i = 0; i < fis.Length; i++) - { - text = text.Replace($"fileID: {fis[i]}, guid: {dllGuid}", - $"fileID: 11500000, guid: {guids[i]}"); - } - - File.WriteAllText(path, text); - if (isHidden) - file.Attributes |= FileAttributes.Hidden; - - if (prevText != text) - { - Debug.Log("Updated " + path); - } - } - catch (UnauthorizedAccessException e) - { - Debug.LogError(e); - } - catch (IOException e) - { - Debug.LogError(e); - } - } - } -} - diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/MissingScriptResolver.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/MissingScriptResolver.cs.meta deleted file mode 100644 index 8c4da033..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/MissingScriptResolver.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3ad6757722d743440857770a88e128cb -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/PathBerserker2d.Upgrade.asmdef b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/PathBerserker2d.Upgrade.asmdef deleted file mode 100644 index 1ba36fac..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/PathBerserker2d.Upgrade.asmdef +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "PathBerserker2d.Upgrade", - "references": [ - "GUID:f483b8ed1e509354483048b0c7a56768" - ], - "includePlatforms": [ - "Editor" - ], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": false, - "defineConstraints": [], - "versionDefines": [], - "noEngineReferences": false -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/PathBerserker2d.Upgrade.asmdef.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/PathBerserker2d.Upgrade.asmdef.meta deleted file mode 100644 index 0769e0e4..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/PathBerserker2d.Upgrade.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: fd89c7216da4dd2478872203e056f46b -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/UpdateNotificationWindow.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/UpdateNotificationWindow.cs deleted file mode 100644 index 665410e6..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/UpdateNotificationWindow.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System; -using UnityEditor; -using UnityEngine; - -namespace Assets.PathBerserker2d.Scripts.PathBerserker2d.Upgrade -{ - [InitializeOnLoad] - class UpdateNotificationWindow : EditorWindow - { - [MenuItem("Window/General/PathBerserker Update Log")] - static void ShowWindow() - { - // Get existing open window or if none, make a new one: - UpdateNotificationWindow window = (UpdateNotificationWindow)EditorWindow.GetWindow(typeof(UpdateNotificationWindow)); - window.Show(); - } - - static UpdateNotificationWindow() - { - EditorApplication.update += EditorUpdate; - } - - static void EditorUpdate() - { - if (!EditorPrefs.GetBool("pathberserker.showedupgrader") && EditorPrefs.GetBool("pathberserker.showedupdate.1_4")) - { - ShowWindow(); - - EditorPrefs.SetBool("pathberserker.showedupgrader", true); - } - EditorPrefs.SetString("pathberserker.installed_version", AssemblyInfo.Version); - EditorApplication.update -= EditorUpdate; - } - - GUIStyle labelStyle; - GUIStyle headingStyle; - - private void OnEnable() - { - try - { - labelStyle = new GUIStyle(EditorStyles.label); - } - catch (NullReferenceException) - { - labelStyle = new GUIStyle(); - } - - labelStyle.normal.textColor = Color.white; - labelStyle.richText = true; - labelStyle.wordWrap = true; - - headingStyle = new GUIStyle(labelStyle); - headingStyle.fontSize += 20; - } - - public void OnGUI() - { - if (labelStyle == null || headingStyle == null) - OnEnable(); - if (labelStyle == null || headingStyle == null) - return; - - EditorGUILayout.LabelField("Pathberserker 2d - Upgrader", headingStyle); - EditorGUILayout.LabelField(AssemblyInfo.Version, labelStyle); - EditorGUILayout.Space(); - - EditorGUILayout.LabelField("This window can be reopened at 'Window/General/PathBerserker Update Log'", labelStyle); - - EditorGUILayout.Space(); - EditorGUILayout.Space(); - - EditorGUILayout.LabelField("Important", labelStyle); - EditorGUILayout.LabelField("All Dll files have been replaced with AssemblyDefinitions. All references to MonoBehaviors that where previously located in a DLL are now broken! This will lead to a lot of missing scripts in your project.", labelStyle); - - EditorGUILayout.Space(); - EditorGUILayout.LabelField("Fear not. By clicking the button below an upgrade script runs, that should restore all those references. It will directly modify your projects .meta files.", labelStyle); - - EditorGUILayout.Space(); - - - EditorGUILayout.LabelField("BE WARNED, this might cause damage. You should backup your project before starting this process. This will not work, if you moved the plugin-files from its default directory.", labelStyle); - EditorGUILayout.Space(); - - if (GUILayout.Button("Perform Upgrade") && EditorUtility.DisplayDialog("Have you made a backup?", "This process may fail or do unexpected things. Don't blame me if it ends up destroying something. Make a backup.", "Yes, I have a backup.")) - { - MissingScriptResolver.UpdateReferences(); - } - - EditorGUILayout.Space(); - EditorGUILayout.Space(); - - EditorGUILayout.LabelField("If this is your first time installing this plugin, you don't have to do anything.", labelStyle); - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/UpdateNotificationWindow.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/UpdateNotificationWindow.cs.meta deleted file mode 100644 index abefcc5c..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.Upgrade/UpdateNotificationWindow.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 39d4bf2bf4a69e34cb47809c0d366e36 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d.meta deleted file mode 100644 index a524d7f9..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 4636456b2610ddb4e8982b105b11e0df -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/AssemblyInfo.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/AssemblyInfo.cs deleted file mode 100644 index 7ec12e54..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/AssemblyInfo.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("PathBerserker2d.Editor")] -[assembly: InternalsVisibleTo("PathBerserker2d.Upgrade")] -[assembly: AssemblyVersion("2.1")] - -internal static class AssemblyInfo -{ - public static string Version => typeof(AssemblyInfo).Assembly.GetName().Version.ToString(); -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/AssemblyInfo.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/AssemblyInfo.cs.meta deleted file mode 100644 index 7dc2629c..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/AssemblyInfo.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8fed312cd3761ca4f9b284e6f05e37e8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper.meta deleted file mode 100644 index 9b5357c9..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: dbd7032f0753f4943b51d2103bd60b60 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/ClipperWrapper.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/ClipperWrapper.cs deleted file mode 100644 index 9e80a1fe..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/ClipperWrapper.cs +++ /dev/null @@ -1,136 +0,0 @@ -using ClipperLib; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using UnityEngine; - -namespace PathBerserker2d -{ - class ClipperWrapper : IClipper - { - const int FloatToIntMult = 10000; - const float IntToFloatDiv = 10000; - - Clipper clipper = new Clipper(); - - public ResultType Compute(Polygon sp, Polygon cp, BoolOpType op, out List result, bool includeOpenPolygons = false) - { - result = new List(); - - if (!sp.BoundsOverlap(cp)) - { - return ResultType.NoOverlap; - } - - AddPolygonToClipper(sp, PolyType.ptSubject); - AddPolygonToClipper(cp, PolyType.ptClip); - - double prevArea = 0; - ClipType clipType; - switch (op) - { - case BoolOpType.INTERSECTION: - clipType = ClipType.ctIntersection; - break; - case BoolOpType.UNION: - clipType = ClipType.ctUnion; - break; - case BoolOpType.DIFFERENCE: - clipType = ClipType.ctDifference; - prevArea = sp.SignedArea(); - break; - default: - throw new ArgumentException("Unknown op type " + op); - } - - PolyTree resultTree = new PolyTree(); - bool succeeded = clipper.Execute(clipType, resultTree); - - GetResultsFromNode(resultTree, result, includeOpenPolygons); - foreach (var poly in result) - { - poly.EnsureCWOrdering(); - } - - clipper.Clear(); - - bool intersectionHappened = false; - double afterArea = 0; - switch (op) - { - case BoolOpType.INTERSECTION: - intersectionHappened = result.Count > 0; - break; - case BoolOpType.UNION: - if (result.Count == 1) - intersectionHappened = true; - break; - case BoolOpType.DIFFERENCE: - if (result.Count > 1) - intersectionHappened = true; - else - { - foreach (var poly in result) - afterArea += poly.SignedArea(); - - intersectionHappened = !(Math.Abs(afterArea - prevArea) < 0.001); - } - break; - default: - throw new ArgumentException("Unknown op type " + op); - } - - - return intersectionHappened ? ResultType.Clipped : ResultType.NoOverlap; - } - - private void AddPolygonToClipper(Polygon polygon, PolyType polyType) - { - var points = ConvertContour(polygon.Hull); - clipper.AddPath(points, polyType, polygon.Hull.IsClosed); - - foreach (var hole in polygon.Holes) - { - points = ConvertContour(hole); - clipper.AddPath(points, polyType, hole.IsClosed); - } - } - - private List ConvertContour(Contour contour) - { - List points = new List(contour.VertexCount); - for (int i = 0; i < contour.VertexCount; i++) - { - points.Add(new IntPoint(contour.Verts[i].x * FloatToIntMult, contour.Verts[i].y * FloatToIntMult)); - } - return points; - } - - private void GetResultsFromNode(PolyNode node, List polygons, bool includeOpenPolygons) - { - foreach (var child in node.Childs) - { - if (child.IsOpen && !includeOpenPolygons) - continue; - - Polygon p = new Polygon(ConvertChain(child.m_polygon, !child.IsOpen)); - polygons.Add(p); - foreach (var holeNode in child.Childs) - { - var hole = ConvertChain(holeNode.m_polygon, !holeNode.IsOpen); - p.Holes.Add(hole); - - GetResultsFromNode(holeNode, polygons, includeOpenPolygons); - } - } - } - - private Contour ConvertChain(List chain, bool closed) - { - return new Contour(chain.Select(ip => new Vector2(ip.X / IntToFloatDiv, ip.Y / IntToFloatDiv)), closed); - } - - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/ClipperWrapper.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/ClipperWrapper.cs.meta deleted file mode 100644 index 5f79d122..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/ClipperWrapper.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9276a8b2beda8b54ba7afae4535ba503 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/License.txt b/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/License.txt deleted file mode 100644 index 3e3af47b..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/License.txt +++ /dev/null @@ -1,24 +0,0 @@ -Boost Software License - Version 1.0 - August 17th, 2003 -http://www.boost.org/LICENSE_1_0.txt - -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -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, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/License.txt.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/License.txt.meta deleted file mode 100644 index c790e425..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/License.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: bf69683b55c9a474ab9f1585d2c62c61 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/clipper.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/clipper.cs deleted file mode 100644 index 1f08c408..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/clipper.cs +++ /dev/null @@ -1,4932 +0,0 @@ -/******************************************************************************* -* * -* Author : Angus Johnson * -* Version : 6.4.2 * -* Date : 27 February 2017 * -* Website : http://www.angusj.com * -* Copyright : Angus Johnson 2010-2017 * -* * -* License: * -* Use, modification & distribution is subject to Boost Software License Ver 1. * -* http://www.boost.org/LICENSE_1_0.txt * -* * -* Attributions: * -* The code in this library is an extension of Bala Vatti's clipping algorithm: * -* "A generic solution to polygon clipping" * -* Communications of the ACM, Vol 35, Issue 7 (July 1992) pp 56-63. * -* http://portal.acm.org/citation.cfm?id=129906 * -* * -* Computer graphics and geometric modeling: implementation and algorithms * -* By Max K. Agoston * -* Springer; 1 edition (January 4, 2005) * -* http://books.google.com/books?q=vatti+clipping+agoston * -* * -* See also: * -* "Polygon Offsetting by Computing Winding Numbers" * -* Paper no. DETC2005-85513 pp. 565-575 * -* ASME 2005 International Design Engineering Technical Conferences * -* and Computers and Information in Engineering Conference (IDETC/CIE2005) * -* September 24-28, 2005 , Long Beach, California, USA * -* http://www.me.berkeley.edu/~mcmains/pubs/DAC05OffsetPolygon.pdf * -* * -*******************************************************************************/ - -/******************************************************************************* -* * -* This is a translation of the Delphi Clipper library and the naming style * -* used has retained a Delphi flavour. * -* * -*******************************************************************************/ - -//use_int32: When enabled 32bit ints are used instead of 64bit ints. This -//improve performance but coordinate values are limited to the range +/- 46340 -//#define use_int32 - -//use_xyz: adds a Z member to IntPoint. Adds a minor cost to performance. -//#define use_xyz - -//use_lines: Enables open path clipping. Adds a very minor cost to performance. -#define use_lines - - -using System; -using System.Collections.Generic; -//using System.Text; //for Int128.AsString() & StringBuilder -//using System.IO; //debugging with streamReader & StreamWriter -//using System.Windows.Forms; //debugging to clipboard - -namespace ClipperLib -{ - -#if use_int32 - using cInt = Int32; -#else - using cInt = Int64; -#endif - - using Path = List; - using Paths = List>; - - public struct DoublePoint - { - public double X; - public double Y; - - public DoublePoint(double x = 0, double y = 0) - { - this.X = x; this.Y = y; - } - public DoublePoint(DoublePoint dp) - { - this.X = dp.X; this.Y = dp.Y; - } - public DoublePoint(IntPoint ip) - { - this.X = ip.X; this.Y = ip.Y; - } - }; - - - //------------------------------------------------------------------------------ - // PolyTree & PolyNode classes - //------------------------------------------------------------------------------ - - public class PolyTree : PolyNode - { - internal List m_AllPolys = new List(); - - //The GC probably handles this cleanup more efficiently ... - //~PolyTree(){Clear();} - - public void Clear() - { - for (int i = 0; i < m_AllPolys.Count; i++) - m_AllPolys[i] = null; - m_AllPolys.Clear(); - m_Childs.Clear(); - } - - public PolyNode GetFirst() - { - if (m_Childs.Count > 0) - return m_Childs[0]; - else - return null; - } - - public int Total - { - get - { - int result = m_AllPolys.Count; - //with negative offsets, ignore the hidden outer polygon ... - if (result > 0 && m_Childs[0] != m_AllPolys[0]) result--; - return result; - } - } - - } - - public class PolyNode - { - internal PolyNode m_Parent; - internal Path m_polygon = new Path(); - internal int m_Index; - internal JoinType m_jointype; - internal EndType m_endtype; - internal List m_Childs = new List(); - - private bool IsHoleNode() - { - bool result = true; - PolyNode node = m_Parent; - while (node != null) - { - result = !result; - node = node.m_Parent; - } - return result; - } - - public int ChildCount - { - get { return m_Childs.Count; } - } - - public Path Contour - { - get { return m_polygon; } - } - - internal void AddChild(PolyNode Child) - { - int cnt = m_Childs.Count; - m_Childs.Add(Child); - Child.m_Parent = this; - Child.m_Index = cnt; - } - - public PolyNode GetNext() - { - if (m_Childs.Count > 0) - return m_Childs[0]; - else - return GetNextSiblingUp(); - } - - internal PolyNode GetNextSiblingUp() - { - if (m_Parent == null) - return null; - else if (m_Index == m_Parent.m_Childs.Count - 1) - return m_Parent.GetNextSiblingUp(); - else - return m_Parent.m_Childs[m_Index + 1]; - } - - public List Childs - { - get { return m_Childs; } - } - - public PolyNode Parent - { - get { return m_Parent; } - } - - public bool IsHole - { - get { return IsHoleNode(); } - } - - public bool IsOpen { get; set; } - } - - - //------------------------------------------------------------------------------ - // Int128 struct (enables safe math on signed 64bit integers) - // eg Int128 val1((Int64)9223372036854775807); //ie 2^63 -1 - // Int128 val2((Int64)9223372036854775807); - // Int128 val3 = val1 * val2; - // val3.ToString => "85070591730234615847396907784232501249" (8.5e+37) - //------------------------------------------------------------------------------ - - internal struct Int128 - { - private Int64 hi; - private UInt64 lo; - - public Int128(Int64 _lo) - { - lo = (UInt64)_lo; - if (_lo < 0) hi = -1; - else hi = 0; - } - - public Int128(Int64 _hi, UInt64 _lo) - { - lo = _lo; - hi = _hi; - } - - public Int128(Int128 val) - { - hi = val.hi; - lo = val.lo; - } - - public bool IsNegative() - { - return hi < 0; - } - - public static bool operator ==(Int128 val1, Int128 val2) - { - if ((object)val1 == (object)val2) return true; - else if ((object)val1 == null || (object)val2 == null) return false; - return (val1.hi == val2.hi && val1.lo == val2.lo); - } - - public static bool operator !=(Int128 val1, Int128 val2) - { - return !(val1 == val2); - } - - public override bool Equals(System.Object obj) - { - if (obj == null || !(obj is Int128)) - return false; - Int128 i128 = (Int128)obj; - return (i128.hi == hi && i128.lo == lo); - } - - public override int GetHashCode() - { - return hi.GetHashCode() ^ lo.GetHashCode(); - } - - public static bool operator >(Int128 val1, Int128 val2) - { - if (val1.hi != val2.hi) - return val1.hi > val2.hi; - else - return val1.lo > val2.lo; - } - - public static bool operator <(Int128 val1, Int128 val2) - { - if (val1.hi != val2.hi) - return val1.hi < val2.hi; - else - return val1.lo < val2.lo; - } - - public static Int128 operator +(Int128 lhs, Int128 rhs) - { - lhs.hi += rhs.hi; - lhs.lo += rhs.lo; - if (lhs.lo < rhs.lo) lhs.hi++; - return lhs; - } - - public static Int128 operator -(Int128 lhs, Int128 rhs) - { - return lhs + -rhs; - } - - public static Int128 operator -(Int128 val) - { - if (val.lo == 0) - return new Int128(-val.hi, 0); - else - return new Int128(~val.hi, ~val.lo + 1); - } - - public static explicit operator double(Int128 val) - { - const double shift64 = 18446744073709551616.0; //2^64 - if (val.hi < 0) - { - if (val.lo == 0) - return (double)val.hi * shift64; - else - return -(double)(~val.lo + ~val.hi * shift64); - } - else - return (double)(val.lo + val.hi * shift64); - } - - //nb: Constructing two new Int128 objects every time we want to multiply longs - //is slow. So, although calling the Int128Mul method doesn't look as clean, the - //code runs significantly faster than if we'd used the * operator. - - public static Int128 Int128Mul(Int64 lhs, Int64 rhs) - { - bool negate = (lhs < 0) != (rhs < 0); - if (lhs < 0) lhs = -lhs; - if (rhs < 0) rhs = -rhs; - UInt64 int1Hi = (UInt64)lhs >> 32; - UInt64 int1Lo = (UInt64)lhs & 0xFFFFFFFF; - UInt64 int2Hi = (UInt64)rhs >> 32; - UInt64 int2Lo = (UInt64)rhs & 0xFFFFFFFF; - - //nb: see comments in clipper.pas - UInt64 a = int1Hi * int2Hi; - UInt64 b = int1Lo * int2Lo; - UInt64 c = int1Hi * int2Lo + int1Lo * int2Hi; - - UInt64 lo; - Int64 hi; - hi = (Int64)(a + (c >> 32)); - - unchecked { lo = (c << 32) + b; } - if (lo < b) hi++; - Int128 result = new Int128(hi, lo); - return negate ? -result : result; - } - - }; - - //------------------------------------------------------------------------------ - //------------------------------------------------------------------------------ - - public struct IntPoint - { - public cInt X; - public cInt Y; -#if use_xyz - public cInt Z; - - public IntPoint(cInt x, cInt y, cInt z = 0) - { - this.X = x; this.Y = y; this.Z = z; - } - - public IntPoint(double x, double y, double z = 0) - { - this.X = (cInt)x; this.Y = (cInt)y; this.Z = (cInt)z; - } - - public IntPoint(DoublePoint dp) - { - this.X = (cInt)dp.X; this.Y = (cInt)dp.Y; this.Z = 0; - } - - public IntPoint(IntPoint pt) - { - this.X = pt.X; this.Y = pt.Y; this.Z = pt.Z; - } -#else - public IntPoint(cInt X, cInt Y) - { - this.X = X; this.Y = Y; - } - public IntPoint(double x, double y) - { - this.X = (cInt)x; this.Y = (cInt)y; - } - - public IntPoint(IntPoint pt) - { - this.X = pt.X; this.Y = pt.Y; - } -#endif - - public static bool operator ==(IntPoint a, IntPoint b) - { - return a.X == b.X && a.Y == b.Y; - } - - public static bool operator !=(IntPoint a, IntPoint b) - { - return a.X != b.X || a.Y != b.Y; - } - - public override bool Equals(object obj) - { - if (obj == null) return false; - if (obj is IntPoint) - { - IntPoint a = (IntPoint)obj; - return (X == a.X) && (Y == a.Y); - } - else return false; - } - - public override int GetHashCode() - { - //simply prevents a compiler warning - return base.GetHashCode(); - } - - }// end struct IntPoint - - public struct IntRect - { - public cInt left; - public cInt top; - public cInt right; - public cInt bottom; - - public IntRect(cInt l, cInt t, cInt r, cInt b) - { - this.left = l; this.top = t; - this.right = r; this.bottom = b; - } - public IntRect(IntRect ir) - { - this.left = ir.left; this.top = ir.top; - this.right = ir.right; this.bottom = ir.bottom; - } - } - - public enum ClipType { ctIntersection, ctUnion, ctDifference, ctXor }; - public enum PolyType { ptSubject, ptClip }; - - //By far the most widely used winding rules for polygon filling are - //EvenOdd & NonZero (GDI, GDI+, XLib, OpenGL, Cairo, AGG, Quartz, SVG, Gr32) - //Others rules include Positive, Negative and ABS_GTR_EQ_TWO (only in OpenGL) - //see http://glprogramming.com/red/chapter11.html - public enum PolyFillType { pftEvenOdd, pftNonZero, pftPositive, pftNegative }; - - public enum JoinType { jtSquare, jtRound, jtMiter }; - public enum EndType { etClosedPolygon, etClosedLine, etOpenButt, etOpenSquare, etOpenRound }; - - internal enum EdgeSide { esLeft, esRight }; - internal enum Direction { dRightToLeft, dLeftToRight }; - - internal class TEdge - { - internal IntPoint Bot; - internal IntPoint Curr; //current (updated for every new scanbeam) - internal IntPoint Top; - internal IntPoint Delta; - internal double Dx; - internal PolyType PolyTyp; - internal EdgeSide Side; //side only refers to current side of solution poly - internal int WindDelta; //1 or -1 depending on winding direction - internal int WindCnt; - internal int WindCnt2; //winding count of the opposite polytype - internal int OutIdx; - internal TEdge Next; - internal TEdge Prev; - internal TEdge NextInLML; - internal TEdge NextInAEL; - internal TEdge PrevInAEL; - internal TEdge NextInSEL; - internal TEdge PrevInSEL; - }; - - public class IntersectNode - { - internal TEdge Edge1; - internal TEdge Edge2; - internal IntPoint Pt; - }; - - public class MyIntersectNodeSort : IComparer - { - public int Compare(IntersectNode node1, IntersectNode node2) - { - cInt i = node2.Pt.Y - node1.Pt.Y; - if (i > 0) return 1; - else if (i < 0) return -1; - else return 0; - } - } - - internal class LocalMinima - { - internal cInt Y; - internal TEdge LeftBound; - internal TEdge RightBound; - internal LocalMinima Next; - }; - - internal class Scanbeam - { - internal cInt Y; - internal Scanbeam Next; - }; - - internal class Maxima - { - internal cInt X; - internal Maxima Next; - internal Maxima Prev; - }; - - //OutRec: contains a path in the clipping solution. Edges in the AEL will - //carry a pointer to an OutRec when they are part of the clipping solution. - internal class OutRec - { - internal int Idx; - internal bool IsHole; - internal bool IsOpen; - internal OutRec FirstLeft; //see comments in clipper.pas - internal OutPt Pts; - internal OutPt BottomPt; - internal PolyNode PolyNode; - }; - - internal class OutPt - { - internal int Idx; - internal IntPoint Pt; - internal OutPt Next; - internal OutPt Prev; - }; - - internal class Join - { - internal OutPt OutPt1; - internal OutPt OutPt2; - internal IntPoint OffPt; - }; - - public class ClipperBase - { - internal const double horizontal = -3.4E+38; - internal const int Skip = -2; - internal const int Unassigned = -1; - internal const double tolerance = 1.0E-20; - internal static bool near_zero(double val) { return (val > -tolerance) && (val < tolerance); } - -#if use_int32 - public const cInt loRange = 0x7FFF; - public const cInt hiRange = 0x7FFF; -#else - public const cInt loRange = 0x3FFFFFFF; - public const cInt hiRange = 0x3FFFFFFFFFFFFFFFL; -#endif - - internal LocalMinima m_MinimaList; - internal LocalMinima m_CurrentLM; - internal List> m_edges = new List>(); - internal Scanbeam m_Scanbeam; - internal List m_PolyOuts; - internal TEdge m_ActiveEdges; - internal bool m_UseFullRange; - internal bool m_HasOpenPaths; - - //------------------------------------------------------------------------------ - - public bool PreserveCollinear - { - get; - set; - } - //------------------------------------------------------------------------------ - - public void Swap(ref cInt val1, ref cInt val2) - { - cInt tmp = val1; - val1 = val2; - val2 = tmp; - } - //------------------------------------------------------------------------------ - - internal static bool IsHorizontal(TEdge e) - { - return e.Delta.Y == 0; - } - //------------------------------------------------------------------------------ - - internal bool PointIsVertex(IntPoint pt, OutPt pp) - { - OutPt pp2 = pp; - do - { - if (pp2.Pt == pt) return true; - pp2 = pp2.Next; - } - while (pp2 != pp); - return false; - } - //------------------------------------------------------------------------------ - - internal bool PointOnLineSegment(IntPoint pt, - IntPoint linePt1, IntPoint linePt2, bool UseFullRange) - { - if (UseFullRange) - return ((pt.X == linePt1.X) && (pt.Y == linePt1.Y)) || - ((pt.X == linePt2.X) && (pt.Y == linePt2.Y)) || - (((pt.X > linePt1.X) == (pt.X < linePt2.X)) && - ((pt.Y > linePt1.Y) == (pt.Y < linePt2.Y)) && - ((Int128.Int128Mul((pt.X - linePt1.X), (linePt2.Y - linePt1.Y)) == - Int128.Int128Mul((linePt2.X - linePt1.X), (pt.Y - linePt1.Y))))); - else - return ((pt.X == linePt1.X) && (pt.Y == linePt1.Y)) || - ((pt.X == linePt2.X) && (pt.Y == linePt2.Y)) || - (((pt.X > linePt1.X) == (pt.X < linePt2.X)) && - ((pt.Y > linePt1.Y) == (pt.Y < linePt2.Y)) && - ((pt.X - linePt1.X) * (linePt2.Y - linePt1.Y) == - (linePt2.X - linePt1.X) * (pt.Y - linePt1.Y))); - } - //------------------------------------------------------------------------------ - - internal bool PointOnPolygon(IntPoint pt, OutPt pp, bool UseFullRange) - { - OutPt pp2 = pp; - while (true) - { - if (PointOnLineSegment(pt, pp2.Pt, pp2.Next.Pt, UseFullRange)) - return true; - pp2 = pp2.Next; - if (pp2 == pp) break; - } - return false; - } - //------------------------------------------------------------------------------ - - internal static bool SlopesEqual(TEdge e1, TEdge e2, bool UseFullRange) - { - if (UseFullRange) - return Int128.Int128Mul(e1.Delta.Y, e2.Delta.X) == - Int128.Int128Mul(e1.Delta.X, e2.Delta.Y); - else return (cInt)(e1.Delta.Y) * (e2.Delta.X) == - (cInt)(e1.Delta.X) * (e2.Delta.Y); - } - //------------------------------------------------------------------------------ - - internal static bool SlopesEqual(IntPoint pt1, IntPoint pt2, - IntPoint pt3, bool UseFullRange) - { - if (UseFullRange) - return Int128.Int128Mul(pt1.Y - pt2.Y, pt2.X - pt3.X) == - Int128.Int128Mul(pt1.X - pt2.X, pt2.Y - pt3.Y); - else return - (cInt)(pt1.Y - pt2.Y) * (pt2.X - pt3.X) - (cInt)(pt1.X - pt2.X) * (pt2.Y - pt3.Y) == 0; - } - //------------------------------------------------------------------------------ - - internal static bool SlopesEqual(IntPoint pt1, IntPoint pt2, - IntPoint pt3, IntPoint pt4, bool UseFullRange) - { - if (UseFullRange) - return Int128.Int128Mul(pt1.Y - pt2.Y, pt3.X - pt4.X) == - Int128.Int128Mul(pt1.X - pt2.X, pt3.Y - pt4.Y); - else return - (cInt)(pt1.Y - pt2.Y) * (pt3.X - pt4.X) - (cInt)(pt1.X - pt2.X) * (pt3.Y - pt4.Y) == 0; - } - //------------------------------------------------------------------------------ - - internal ClipperBase() //constructor (nb: no external instantiation) - { - m_MinimaList = null; - m_CurrentLM = null; - m_UseFullRange = false; - m_HasOpenPaths = false; - } - //------------------------------------------------------------------------------ - - public virtual void Clear() - { - DisposeLocalMinimaList(); - for (int i = 0; i < m_edges.Count; ++i) - { - for (int j = 0; j < m_edges[i].Count; ++j) m_edges[i][j] = null; - m_edges[i].Clear(); - } - m_edges.Clear(); - m_UseFullRange = false; - m_HasOpenPaths = false; - } - //------------------------------------------------------------------------------ - - private void DisposeLocalMinimaList() - { - while (m_MinimaList != null) - { - LocalMinima tmpLm = m_MinimaList.Next; - m_MinimaList = null; - m_MinimaList = tmpLm; - } - m_CurrentLM = null; - } - //------------------------------------------------------------------------------ - - void RangeTest(IntPoint Pt, ref bool useFullRange) - { - if (useFullRange) - { - if (Pt.X > hiRange || Pt.Y > hiRange || -Pt.X > hiRange || -Pt.Y > hiRange) - throw new ClipperException("Coordinate outside allowed range"); - } - else if (Pt.X > loRange || Pt.Y > loRange || -Pt.X > loRange || -Pt.Y > loRange) - { - useFullRange = true; - RangeTest(Pt, ref useFullRange); - } - } - //------------------------------------------------------------------------------ - - private void InitEdge(TEdge e, TEdge eNext, - TEdge ePrev, IntPoint pt) - { - e.Next = eNext; - e.Prev = ePrev; - e.Curr = pt; - e.OutIdx = Unassigned; - } - //------------------------------------------------------------------------------ - - private void InitEdge2(TEdge e, PolyType polyType) - { - if (e.Curr.Y >= e.Next.Curr.Y) - { - e.Bot = e.Curr; - e.Top = e.Next.Curr; - } - else - { - e.Top = e.Curr; - e.Bot = e.Next.Curr; - } - SetDx(e); - e.PolyTyp = polyType; - } - //------------------------------------------------------------------------------ - - private TEdge FindNextLocMin(TEdge E) - { - TEdge E2; - for (; ; ) - { - while (E.Bot != E.Prev.Bot || E.Curr == E.Top) E = E.Next; - if (E.Dx != horizontal && E.Prev.Dx != horizontal) break; - while (E.Prev.Dx == horizontal) E = E.Prev; - E2 = E; - while (E.Dx == horizontal) E = E.Next; - if (E.Top.Y == E.Prev.Bot.Y) continue; //ie just an intermediate horz. - if (E2.Prev.Bot.X < E.Bot.X) E = E2; - break; - } - return E; - } - //------------------------------------------------------------------------------ - - private TEdge ProcessBound(TEdge E, bool LeftBoundIsForward) - { - TEdge EStart, Result = E; - TEdge Horz; - - if (Result.OutIdx == Skip) - { - //check if there are edges beyond the skip edge in the bound and if so - //create another LocMin and calling ProcessBound once more ... - E = Result; - if (LeftBoundIsForward) - { - while (E.Top.Y == E.Next.Bot.Y) E = E.Next; - while (E != Result && E.Dx == horizontal) E = E.Prev; - } - else - { - while (E.Top.Y == E.Prev.Bot.Y) E = E.Prev; - while (E != Result && E.Dx == horizontal) E = E.Next; - } - if (E == Result) - { - if (LeftBoundIsForward) Result = E.Next; - else Result = E.Prev; - } - else - { - //there are more edges in the bound beyond result starting with E - if (LeftBoundIsForward) - E = Result.Next; - else - E = Result.Prev; - LocalMinima locMin = new LocalMinima(); - locMin.Next = null; - locMin.Y = E.Bot.Y; - locMin.LeftBound = null; - locMin.RightBound = E; - E.WindDelta = 0; - Result = ProcessBound(E, LeftBoundIsForward); - InsertLocalMinima(locMin); - } - return Result; - } - - if (E.Dx == horizontal) - { - //We need to be careful with open paths because this may not be a - //true local minima (ie E may be following a skip edge). - //Also, consecutive horz. edges may start heading left before going right. - if (LeftBoundIsForward) EStart = E.Prev; - else EStart = E.Next; - if (EStart.Dx == horizontal) //ie an adjoining horizontal skip edge - { - if (EStart.Bot.X != E.Bot.X && EStart.Top.X != E.Bot.X) - ReverseHorizontal(E); - } - else if (EStart.Bot.X != E.Bot.X) - ReverseHorizontal(E); - } - - EStart = E; - if (LeftBoundIsForward) - { - while (Result.Top.Y == Result.Next.Bot.Y && Result.Next.OutIdx != Skip) - Result = Result.Next; - if (Result.Dx == horizontal && Result.Next.OutIdx != Skip) - { - //nb: at the top of a bound, horizontals are added to the bound - //only when the preceding edge attaches to the horizontal's left vertex - //unless a Skip edge is encountered when that becomes the top divide - Horz = Result; - while (Horz.Prev.Dx == horizontal) Horz = Horz.Prev; - if (Horz.Prev.Top.X > Result.Next.Top.X) Result = Horz.Prev; - } - while (E != Result) - { - E.NextInLML = E.Next; - if (E.Dx == horizontal && E != EStart && E.Bot.X != E.Prev.Top.X) - ReverseHorizontal(E); - E = E.Next; - } - if (E.Dx == horizontal && E != EStart && E.Bot.X != E.Prev.Top.X) - ReverseHorizontal(E); - Result = Result.Next; //move to the edge just beyond current bound - } - else - { - while (Result.Top.Y == Result.Prev.Bot.Y && Result.Prev.OutIdx != Skip) - Result = Result.Prev; - if (Result.Dx == horizontal && Result.Prev.OutIdx != Skip) - { - Horz = Result; - while (Horz.Next.Dx == horizontal) Horz = Horz.Next; - if (Horz.Next.Top.X == Result.Prev.Top.X || - Horz.Next.Top.X > Result.Prev.Top.X) Result = Horz.Next; - } - - while (E != Result) - { - E.NextInLML = E.Prev; - if (E.Dx == horizontal && E != EStart && E.Bot.X != E.Next.Top.X) - ReverseHorizontal(E); - E = E.Prev; - } - if (E.Dx == horizontal && E != EStart && E.Bot.X != E.Next.Top.X) - ReverseHorizontal(E); - Result = Result.Prev; //move to the edge just beyond current bound - } - return Result; - } - //------------------------------------------------------------------------------ - - - public bool AddPath(Path pg, PolyType polyType, bool Closed) - { -#if use_lines - if (!Closed && polyType == PolyType.ptClip) - throw new ClipperException("AddPath: Open paths must be subject."); -#else - if (!Closed) - throw new ClipperException("AddPath: Open paths have been disabled."); -#endif - - int highI = (int)pg.Count - 1; - if (Closed) while (highI > 0 && (pg[highI] == pg[0])) --highI; - while (highI > 0 && (pg[highI] == pg[highI - 1])) --highI; - if ((Closed && highI < 2) || (!Closed && highI < 1)) return false; - - //create a new edge array ... - List edges = new List(highI + 1); - for (int i = 0; i <= highI; i++) edges.Add(new TEdge()); - - bool IsFlat = true; - - //1. Basic (first) edge initialization ... - edges[1].Curr = pg[1]; - RangeTest(pg[0], ref m_UseFullRange); - RangeTest(pg[highI], ref m_UseFullRange); - InitEdge(edges[0], edges[1], edges[highI], pg[0]); - InitEdge(edges[highI], edges[0], edges[highI - 1], pg[highI]); - for (int i = highI - 1; i >= 1; --i) - { - RangeTest(pg[i], ref m_UseFullRange); - InitEdge(edges[i], edges[i + 1], edges[i - 1], pg[i]); - } - TEdge eStart = edges[0]; - - //2. Remove duplicate vertices, and (when closed) collinear edges ... - TEdge E = eStart, eLoopStop = eStart; - for (; ; ) - { - //nb: allows matching start and end points when not Closed ... - if (E.Curr == E.Next.Curr && (Closed || E.Next != eStart)) - { - if (E == E.Next) break; - if (E == eStart) eStart = E.Next; - E = RemoveEdge(E); - eLoopStop = E; - continue; - } - if (E.Prev == E.Next) - break; //only two vertices - else if (Closed && - SlopesEqual(E.Prev.Curr, E.Curr, E.Next.Curr, m_UseFullRange) && - (!PreserveCollinear || - !Pt2IsBetweenPt1AndPt3(E.Prev.Curr, E.Curr, E.Next.Curr))) - { - //Collinear edges are allowed for open paths but in closed paths - //the default is to merge adjacent collinear edges into a single edge. - //However, if the PreserveCollinear property is enabled, only overlapping - //collinear edges (ie spikes) will be removed from closed paths. - if (E == eStart) eStart = E.Next; - E = RemoveEdge(E); - E = E.Prev; - eLoopStop = E; - continue; - } - E = E.Next; - if ((E == eLoopStop) || (!Closed && E.Next == eStart)) break; - } - - if ((!Closed && (E == E.Next)) || (Closed && (E.Prev == E.Next))) - return false; - - if (!Closed) - { - m_HasOpenPaths = true; - eStart.Prev.OutIdx = Skip; - } - - //3. Do second stage of edge initialization ... - E = eStart; - do - { - InitEdge2(E, polyType); - E = E.Next; - if (IsFlat && E.Curr.Y != eStart.Curr.Y) IsFlat = false; - } - while (E != eStart); - - //4. Finally, add edge bounds to LocalMinima list ... - - //Totally flat paths must be handled differently when adding them - //to LocalMinima list to avoid endless loops etc ... - if (IsFlat) - { - if (Closed) return false; - E.Prev.OutIdx = Skip; - LocalMinima locMin = new LocalMinima(); - locMin.Next = null; - locMin.Y = E.Bot.Y; - locMin.LeftBound = null; - locMin.RightBound = E; - locMin.RightBound.Side = EdgeSide.esRight; - locMin.RightBound.WindDelta = 0; - for (; ; ) - { - if (E.Bot.X != E.Prev.Top.X) ReverseHorizontal(E); - if (E.Next.OutIdx == Skip) break; - E.NextInLML = E.Next; - E = E.Next; - } - InsertLocalMinima(locMin); - m_edges.Add(edges); - return true; - } - - m_edges.Add(edges); - bool leftBoundIsForward; - TEdge EMin = null; - - //workaround to avoid an endless loop in the while loop below when - //open paths have matching start and end points ... - if (E.Prev.Bot == E.Prev.Top) E = E.Next; - - for (; ; ) - { - E = FindNextLocMin(E); - if (E == EMin) break; - else if (EMin == null) EMin = E; - - //E and E.Prev now share a local minima (left aligned if horizontal). - //Compare their slopes to find which starts which bound ... - LocalMinima locMin = new LocalMinima(); - locMin.Next = null; - locMin.Y = E.Bot.Y; - if (E.Dx < E.Prev.Dx) - { - locMin.LeftBound = E.Prev; - locMin.RightBound = E; - leftBoundIsForward = false; //Q.nextInLML = Q.prev - } - else - { - locMin.LeftBound = E; - locMin.RightBound = E.Prev; - leftBoundIsForward = true; //Q.nextInLML = Q.next - } - locMin.LeftBound.Side = EdgeSide.esLeft; - locMin.RightBound.Side = EdgeSide.esRight; - - if (!Closed) locMin.LeftBound.WindDelta = 0; - else if (locMin.LeftBound.Next == locMin.RightBound) - locMin.LeftBound.WindDelta = -1; - else locMin.LeftBound.WindDelta = 1; - locMin.RightBound.WindDelta = -locMin.LeftBound.WindDelta; - - E = ProcessBound(locMin.LeftBound, leftBoundIsForward); - if (E.OutIdx == Skip) E = ProcessBound(E, leftBoundIsForward); - - TEdge E2 = ProcessBound(locMin.RightBound, !leftBoundIsForward); - if (E2.OutIdx == Skip) E2 = ProcessBound(E2, !leftBoundIsForward); - - if (locMin.LeftBound.OutIdx == Skip) - locMin.LeftBound = null; - else if (locMin.RightBound.OutIdx == Skip) - locMin.RightBound = null; - InsertLocalMinima(locMin); - if (!leftBoundIsForward) E = E2; - } - return true; - - } - //------------------------------------------------------------------------------ - - public bool AddPaths(Paths ppg, PolyType polyType, bool closed) - { - bool result = false; - for (int i = 0; i < ppg.Count; ++i) - if (AddPath(ppg[i], polyType, closed)) result = true; - return result; - } - //------------------------------------------------------------------------------ - - internal bool Pt2IsBetweenPt1AndPt3(IntPoint pt1, IntPoint pt2, IntPoint pt3) - { - if ((pt1 == pt3) || (pt1 == pt2) || (pt3 == pt2)) return false; - else if (pt1.X != pt3.X) return (pt2.X > pt1.X) == (pt2.X < pt3.X); - else return (pt2.Y > pt1.Y) == (pt2.Y < pt3.Y); - } - //------------------------------------------------------------------------------ - - TEdge RemoveEdge(TEdge e) - { - //removes e from double_linked_list (but without removing from memory) - e.Prev.Next = e.Next; - e.Next.Prev = e.Prev; - TEdge result = e.Next; - e.Prev = null; //flag as removed (see ClipperBase.Clear) - return result; - } - //------------------------------------------------------------------------------ - - private void SetDx(TEdge e) - { - e.Delta.X = (e.Top.X - e.Bot.X); - e.Delta.Y = (e.Top.Y - e.Bot.Y); - if (e.Delta.Y == 0) e.Dx = horizontal; - else e.Dx = (double)(e.Delta.X) / (e.Delta.Y); - } - //--------------------------------------------------------------------------- - - private void InsertLocalMinima(LocalMinima newLm) - { - if (m_MinimaList == null) - { - m_MinimaList = newLm; - } - else if (newLm.Y >= m_MinimaList.Y) - { - newLm.Next = m_MinimaList; - m_MinimaList = newLm; - } - else - { - LocalMinima tmpLm = m_MinimaList; - while (tmpLm.Next != null && (newLm.Y < tmpLm.Next.Y)) - tmpLm = tmpLm.Next; - newLm.Next = tmpLm.Next; - tmpLm.Next = newLm; - } - } - //------------------------------------------------------------------------------ - - internal Boolean PopLocalMinima(cInt Y, out LocalMinima current) - { - current = m_CurrentLM; - if (m_CurrentLM != null && m_CurrentLM.Y == Y) - { - m_CurrentLM = m_CurrentLM.Next; - return true; - } - return false; - } - //------------------------------------------------------------------------------ - - private void ReverseHorizontal(TEdge e) - { - //swap horizontal edges' top and bottom x's so they follow the natural - //progression of the bounds - ie so their xbots will align with the - //adjoining lower edge. [Helpful in the ProcessHorizontal() method.] - Swap(ref e.Top.X, ref e.Bot.X); -#if use_xyz - Swap(ref e.Top.Z, ref e.Bot.Z); -#endif - } - //------------------------------------------------------------------------------ - - internal virtual void Reset() - { - m_CurrentLM = m_MinimaList; - if (m_CurrentLM == null) return; //ie nothing to process - - //reset all edges ... - m_Scanbeam = null; - LocalMinima lm = m_MinimaList; - while (lm != null) - { - InsertScanbeam(lm.Y); - TEdge e = lm.LeftBound; - if (e != null) - { - e.Curr = e.Bot; - e.OutIdx = Unassigned; - } - e = lm.RightBound; - if (e != null) - { - e.Curr = e.Bot; - e.OutIdx = Unassigned; - } - lm = lm.Next; - } - m_ActiveEdges = null; - } - //------------------------------------------------------------------------------ - - public static IntRect GetBounds(Paths paths) - { - int i = 0, cnt = paths.Count; - while (i < cnt && paths[i].Count == 0) i++; - if (i == cnt) return new IntRect(0, 0, 0, 0); - IntRect result = new IntRect(); - result.left = paths[i][0].X; - result.right = result.left; - result.top = paths[i][0].Y; - result.bottom = result.top; - for (; i < cnt; i++) - for (int j = 0; j < paths[i].Count; j++) - { - if (paths[i][j].X < result.left) result.left = paths[i][j].X; - else if (paths[i][j].X > result.right) result.right = paths[i][j].X; - if (paths[i][j].Y < result.top) result.top = paths[i][j].Y; - else if (paths[i][j].Y > result.bottom) result.bottom = paths[i][j].Y; - } - return result; - } - //------------------------------------------------------------------------------ - - internal void InsertScanbeam(cInt Y) - { - //single-linked list: sorted descending, ignoring dups. - if (m_Scanbeam == null) - { - m_Scanbeam = new Scanbeam(); - m_Scanbeam.Next = null; - m_Scanbeam.Y = Y; - } - else if (Y > m_Scanbeam.Y) - { - Scanbeam newSb = new Scanbeam(); - newSb.Y = Y; - newSb.Next = m_Scanbeam; - m_Scanbeam = newSb; - } - else - { - Scanbeam sb2 = m_Scanbeam; - while (sb2.Next != null && (Y <= sb2.Next.Y)) sb2 = sb2.Next; - if (Y == sb2.Y) return; //ie ignores duplicates - Scanbeam newSb = new Scanbeam(); - newSb.Y = Y; - newSb.Next = sb2.Next; - sb2.Next = newSb; - } - } - //------------------------------------------------------------------------------ - - internal Boolean PopScanbeam(out cInt Y) - { - if (m_Scanbeam == null) - { - Y = 0; - return false; - } - Y = m_Scanbeam.Y; - m_Scanbeam = m_Scanbeam.Next; - return true; - } - //------------------------------------------------------------------------------ - - internal Boolean LocalMinimaPending() - { - return (m_CurrentLM != null); - } - //------------------------------------------------------------------------------ - - internal OutRec CreateOutRec() - { - OutRec result = new OutRec(); - result.Idx = Unassigned; - result.IsHole = false; - result.IsOpen = false; - result.FirstLeft = null; - result.Pts = null; - result.BottomPt = null; - result.PolyNode = null; - m_PolyOuts.Add(result); - result.Idx = m_PolyOuts.Count - 1; - return result; - } - //------------------------------------------------------------------------------ - - internal void DisposeOutRec(int index) - { - OutRec outRec = m_PolyOuts[index]; - outRec.Pts = null; - outRec = null; - m_PolyOuts[index] = null; - } - //------------------------------------------------------------------------------ - - internal void UpdateEdgeIntoAEL(ref TEdge e) - { - if (e.NextInLML == null) - throw new ClipperException("UpdateEdgeIntoAEL: invalid call"); - TEdge AelPrev = e.PrevInAEL; - TEdge AelNext = e.NextInAEL; - e.NextInLML.OutIdx = e.OutIdx; - if (AelPrev != null) - AelPrev.NextInAEL = e.NextInLML; - else m_ActiveEdges = e.NextInLML; - if (AelNext != null) - AelNext.PrevInAEL = e.NextInLML; - e.NextInLML.Side = e.Side; - e.NextInLML.WindDelta = e.WindDelta; - e.NextInLML.WindCnt = e.WindCnt; - e.NextInLML.WindCnt2 = e.WindCnt2; - e = e.NextInLML; - e.Curr = e.Bot; - e.PrevInAEL = AelPrev; - e.NextInAEL = AelNext; - if (!IsHorizontal(e)) InsertScanbeam(e.Top.Y); - } - //------------------------------------------------------------------------------ - - internal void SwapPositionsInAEL(TEdge edge1, TEdge edge2) - { - //check that one or other edge hasn't already been removed from AEL ... - if (edge1.NextInAEL == edge1.PrevInAEL || - edge2.NextInAEL == edge2.PrevInAEL) return; - - if (edge1.NextInAEL == edge2) - { - TEdge next = edge2.NextInAEL; - if (next != null) - next.PrevInAEL = edge1; - TEdge prev = edge1.PrevInAEL; - if (prev != null) - prev.NextInAEL = edge2; - edge2.PrevInAEL = prev; - edge2.NextInAEL = edge1; - edge1.PrevInAEL = edge2; - edge1.NextInAEL = next; - } - else if (edge2.NextInAEL == edge1) - { - TEdge next = edge1.NextInAEL; - if (next != null) - next.PrevInAEL = edge2; - TEdge prev = edge2.PrevInAEL; - if (prev != null) - prev.NextInAEL = edge1; - edge1.PrevInAEL = prev; - edge1.NextInAEL = edge2; - edge2.PrevInAEL = edge1; - edge2.NextInAEL = next; - } - else - { - TEdge next = edge1.NextInAEL; - TEdge prev = edge1.PrevInAEL; - edge1.NextInAEL = edge2.NextInAEL; - if (edge1.NextInAEL != null) - edge1.NextInAEL.PrevInAEL = edge1; - edge1.PrevInAEL = edge2.PrevInAEL; - if (edge1.PrevInAEL != null) - edge1.PrevInAEL.NextInAEL = edge1; - edge2.NextInAEL = next; - if (edge2.NextInAEL != null) - edge2.NextInAEL.PrevInAEL = edge2; - edge2.PrevInAEL = prev; - if (edge2.PrevInAEL != null) - edge2.PrevInAEL.NextInAEL = edge2; - } - - if (edge1.PrevInAEL == null) - m_ActiveEdges = edge1; - else if (edge2.PrevInAEL == null) - m_ActiveEdges = edge2; - } - //------------------------------------------------------------------------------ - - internal void DeleteFromAEL(TEdge e) - { - TEdge AelPrev = e.PrevInAEL; - TEdge AelNext = e.NextInAEL; - if (AelPrev == null && AelNext == null && (e != m_ActiveEdges)) - return; //already deleted - if (AelPrev != null) - AelPrev.NextInAEL = AelNext; - else m_ActiveEdges = AelNext; - if (AelNext != null) - AelNext.PrevInAEL = AelPrev; - e.NextInAEL = null; - e.PrevInAEL = null; - } - //------------------------------------------------------------------------------ - - } //end ClipperBase - - public class Clipper : ClipperBase - { - //InitOptions that can be passed to the constructor ... - public const int ioReverseSolution = 1; - public const int ioStrictlySimple = 2; - public const int ioPreserveCollinear = 4; - - private ClipType m_ClipType; - private Maxima m_Maxima; - private TEdge m_SortedEdges; - private List m_IntersectList; - IComparer m_IntersectNodeComparer; - private bool m_ExecuteLocked; - private PolyFillType m_ClipFillType; - private PolyFillType m_SubjFillType; - private List m_Joins; - private List m_GhostJoins; - private bool m_UsingPolyTree; -#if use_xyz - public delegate void ZFillCallback(IntPoint bot1, IntPoint top1, - IntPoint bot2, IntPoint top2, ref IntPoint pt); - public ZFillCallback ZFillFunction { get; set; } -#endif - public Clipper(int InitOptions = 0) : base() //constructor - { - m_Scanbeam = null; - m_Maxima = null; - m_ActiveEdges = null; - m_SortedEdges = null; - m_IntersectList = new List(); - m_IntersectNodeComparer = new MyIntersectNodeSort(); - m_ExecuteLocked = false; - m_UsingPolyTree = false; - m_PolyOuts = new List(); - m_Joins = new List(); - m_GhostJoins = new List(); - ReverseSolution = (ioReverseSolution & InitOptions) != 0; - StrictlySimple = (ioStrictlySimple & InitOptions) != 0; - PreserveCollinear = (ioPreserveCollinear & InitOptions) != 0; -#if use_xyz - ZFillFunction = null; -#endif - } - //------------------------------------------------------------------------------ - - private void InsertMaxima(cInt X) - { - //double-linked list: sorted ascending, ignoring dups. - Maxima newMax = new Maxima(); - newMax.X = X; - if (m_Maxima == null) - { - m_Maxima = newMax; - m_Maxima.Next = null; - m_Maxima.Prev = null; - } - else if (X < m_Maxima.X) - { - newMax.Next = m_Maxima; - newMax.Prev = null; - m_Maxima = newMax; - } - else - { - Maxima m = m_Maxima; - while (m.Next != null && (X >= m.Next.X)) m = m.Next; - if (X == m.X) return; //ie ignores duplicates (& CG to clean up newMax) - //insert newMax between m and m.Next ... - newMax.Next = m.Next; - newMax.Prev = m; - if (m.Next != null) m.Next.Prev = newMax; - m.Next = newMax; - } - } - //------------------------------------------------------------------------------ - - public bool ReverseSolution - { - get; - set; - } - //------------------------------------------------------------------------------ - - public bool StrictlySimple - { - get; - set; - } - //------------------------------------------------------------------------------ - - public bool Execute(ClipType clipType, Paths solution, - PolyFillType FillType = PolyFillType.pftEvenOdd) - { - return Execute(clipType, solution, FillType, FillType); - } - //------------------------------------------------------------------------------ - - public bool Execute(ClipType clipType, PolyTree polytree, - PolyFillType FillType = PolyFillType.pftEvenOdd) - { - return Execute(clipType, polytree, FillType, FillType); - } - //------------------------------------------------------------------------------ - - public bool Execute(ClipType clipType, Paths solution, - PolyFillType subjFillType, PolyFillType clipFillType) - { - if (m_ExecuteLocked) return false; - if (m_HasOpenPaths) throw - new ClipperException("Error: PolyTree struct is needed for open path clipping."); - - m_ExecuteLocked = true; - solution.Clear(); - m_SubjFillType = subjFillType; - m_ClipFillType = clipFillType; - m_ClipType = clipType; - m_UsingPolyTree = false; - bool succeeded; - try - { - succeeded = ExecuteInternal(); - //build the return polygons ... - if (succeeded) BuildResult(solution); - } - finally - { - DisposeAllPolyPts(); - m_ExecuteLocked = false; - } - return succeeded; - } - //------------------------------------------------------------------------------ - - public bool Execute(ClipType clipType, PolyTree polytree, - PolyFillType subjFillType, PolyFillType clipFillType) - { - if (m_ExecuteLocked) return false; - m_ExecuteLocked = true; - m_SubjFillType = subjFillType; - m_ClipFillType = clipFillType; - m_ClipType = clipType; - m_UsingPolyTree = true; - bool succeeded; - try - { - succeeded = ExecuteInternal(); - //build the return polygons ... - if (succeeded) BuildResult2(polytree); - } - finally - { - DisposeAllPolyPts(); - m_ExecuteLocked = false; - } - return succeeded; - } - //------------------------------------------------------------------------------ - - internal void FixHoleLinkage(OutRec outRec) - { - //skip if an outermost polygon or - //already already points to the correct FirstLeft ... - if (outRec.FirstLeft == null || - (outRec.IsHole != outRec.FirstLeft.IsHole && - outRec.FirstLeft.Pts != null)) return; - - OutRec orfl = outRec.FirstLeft; - while (orfl != null && ((orfl.IsHole == outRec.IsHole) || orfl.Pts == null)) - orfl = orfl.FirstLeft; - outRec.FirstLeft = orfl; - } - //------------------------------------------------------------------------------ - - private bool ExecuteInternal() - { - try - { - Reset(); - m_SortedEdges = null; - m_Maxima = null; - - cInt botY, topY; - if (!PopScanbeam(out botY)) return false; - InsertLocalMinimaIntoAEL(botY); - while (PopScanbeam(out topY) || LocalMinimaPending()) - { - ProcessHorizontals(); - m_GhostJoins.Clear(); - if (!ProcessIntersections(topY)) return false; - ProcessEdgesAtTopOfScanbeam(topY); - botY = topY; - InsertLocalMinimaIntoAEL(botY); - } - - //fix orientations ... - foreach (OutRec outRec in m_PolyOuts) - { - if (outRec.Pts == null || outRec.IsOpen) continue; - if ((outRec.IsHole ^ ReverseSolution) == (Area(outRec) > 0)) - ReversePolyPtLinks(outRec.Pts); - } - - JoinCommonEdges(); - - foreach (OutRec outRec in m_PolyOuts) - { - if (outRec.Pts == null) - continue; - else if (outRec.IsOpen) - FixupOutPolyline(outRec); - else - FixupOutPolygon(outRec); - } - - if (StrictlySimple) DoSimplePolygons(); - return true; - } - //catch { return false; } - finally - { - m_Joins.Clear(); - m_GhostJoins.Clear(); - } - } - //------------------------------------------------------------------------------ - - private void DisposeAllPolyPts() - { - for (int i = 0; i < m_PolyOuts.Count; ++i) DisposeOutRec(i); - m_PolyOuts.Clear(); - } - //------------------------------------------------------------------------------ - - private void AddJoin(OutPt Op1, OutPt Op2, IntPoint OffPt) - { - Join j = new Join(); - j.OutPt1 = Op1; - j.OutPt2 = Op2; - j.OffPt = OffPt; - m_Joins.Add(j); - } - //------------------------------------------------------------------------------ - - private void AddGhostJoin(OutPt Op, IntPoint OffPt) - { - Join j = new Join(); - j.OutPt1 = Op; - j.OffPt = OffPt; - m_GhostJoins.Add(j); - } - //------------------------------------------------------------------------------ - -#if use_xyz - internal void SetZ(ref IntPoint pt, TEdge e1, TEdge e2) - { - if (pt.Z != 0 || ZFillFunction == null) return; - else if (pt == e1.Bot) pt.Z = e1.Bot.Z; - else if (pt == e1.Top) pt.Z = e1.Top.Z; - else if (pt == e2.Bot) pt.Z = e2.Bot.Z; - else if (pt == e2.Top) pt.Z = e2.Top.Z; - else ZFillFunction(e1.Bot, e1.Top, e2.Bot, e2.Top, ref pt); - } - //------------------------------------------------------------------------------ -#endif - - private void InsertLocalMinimaIntoAEL(cInt botY) - { - LocalMinima lm; - while (PopLocalMinima(botY, out lm)) - { - TEdge lb = lm.LeftBound; - TEdge rb = lm.RightBound; - - OutPt Op1 = null; - if (lb == null) - { - InsertEdgeIntoAEL(rb, null); - SetWindingCount(rb); - if (IsContributing(rb)) - Op1 = AddOutPt(rb, rb.Bot); - } - else if (rb == null) - { - InsertEdgeIntoAEL(lb, null); - SetWindingCount(lb); - if (IsContributing(lb)) - Op1 = AddOutPt(lb, lb.Bot); - InsertScanbeam(lb.Top.Y); - } - else - { - InsertEdgeIntoAEL(lb, null); - InsertEdgeIntoAEL(rb, lb); - SetWindingCount(lb); - rb.WindCnt = lb.WindCnt; - rb.WindCnt2 = lb.WindCnt2; - if (IsContributing(lb)) - Op1 = AddLocalMinPoly(lb, rb, lb.Bot); - InsertScanbeam(lb.Top.Y); - } - - if (rb != null) - { - if (IsHorizontal(rb)) - { - if (rb.NextInLML != null) - InsertScanbeam(rb.NextInLML.Top.Y); - AddEdgeToSEL(rb); - } - else - InsertScanbeam(rb.Top.Y); - } - - if (lb == null || rb == null) continue; - - //if output polygons share an Edge with a horizontal rb, they'll need joining later ... - if (Op1 != null && IsHorizontal(rb) && - m_GhostJoins.Count > 0 && rb.WindDelta != 0) - { - for (int i = 0; i < m_GhostJoins.Count; i++) - { - //if the horizontal Rb and a 'ghost' horizontal overlap, then convert - //the 'ghost' join to a real join ready for later ... - Join j = m_GhostJoins[i]; - if (HorzSegmentsOverlap(j.OutPt1.Pt.X, j.OffPt.X, rb.Bot.X, rb.Top.X)) - AddJoin(j.OutPt1, Op1, j.OffPt); - } - } - - if (lb.OutIdx >= 0 && lb.PrevInAEL != null && - lb.PrevInAEL.Curr.X == lb.Bot.X && - lb.PrevInAEL.OutIdx >= 0 && - SlopesEqual(lb.PrevInAEL.Curr, lb.PrevInAEL.Top, lb.Curr, lb.Top, m_UseFullRange) && - lb.WindDelta != 0 && lb.PrevInAEL.WindDelta != 0) - { - OutPt Op2 = AddOutPt(lb.PrevInAEL, lb.Bot); - AddJoin(Op1, Op2, lb.Top); - } - - if (lb.NextInAEL != rb) - { - - if (rb.OutIdx >= 0 && rb.PrevInAEL.OutIdx >= 0 && - SlopesEqual(rb.PrevInAEL.Curr, rb.PrevInAEL.Top, rb.Curr, rb.Top, m_UseFullRange) && - rb.WindDelta != 0 && rb.PrevInAEL.WindDelta != 0) - { - OutPt Op2 = AddOutPt(rb.PrevInAEL, rb.Bot); - AddJoin(Op1, Op2, rb.Top); - } - - TEdge e = lb.NextInAEL; - if (e != null) - while (e != rb) - { - //nb: For calculating winding counts etc, IntersectEdges() assumes - //that param1 will be to the right of param2 ABOVE the intersection ... - IntersectEdges(rb, e, lb.Curr); //order important here - e = e.NextInAEL; - } - } - } - } - //------------------------------------------------------------------------------ - - private void InsertEdgeIntoAEL(TEdge edge, TEdge startEdge) - { - if (m_ActiveEdges == null) - { - edge.PrevInAEL = null; - edge.NextInAEL = null; - m_ActiveEdges = edge; - } - else if (startEdge == null && E2InsertsBeforeE1(m_ActiveEdges, edge)) - { - edge.PrevInAEL = null; - edge.NextInAEL = m_ActiveEdges; - m_ActiveEdges.PrevInAEL = edge; - m_ActiveEdges = edge; - } - else - { - if (startEdge == null) startEdge = m_ActiveEdges; - while (startEdge.NextInAEL != null && - !E2InsertsBeforeE1(startEdge.NextInAEL, edge)) - startEdge = startEdge.NextInAEL; - edge.NextInAEL = startEdge.NextInAEL; - if (startEdge.NextInAEL != null) startEdge.NextInAEL.PrevInAEL = edge; - edge.PrevInAEL = startEdge; - startEdge.NextInAEL = edge; - } - } - //---------------------------------------------------------------------- - - private bool E2InsertsBeforeE1(TEdge e1, TEdge e2) - { - if (e2.Curr.X == e1.Curr.X) - { - if (e2.Top.Y > e1.Top.Y) - return e2.Top.X < TopX(e1, e2.Top.Y); - else return e1.Top.X > TopX(e2, e1.Top.Y); - } - else return e2.Curr.X < e1.Curr.X; - } - //------------------------------------------------------------------------------ - - private bool IsEvenOddFillType(TEdge edge) - { - if (edge.PolyTyp == PolyType.ptSubject) - return m_SubjFillType == PolyFillType.pftEvenOdd; - else - return m_ClipFillType == PolyFillType.pftEvenOdd; - } - //------------------------------------------------------------------------------ - - private bool IsEvenOddAltFillType(TEdge edge) - { - if (edge.PolyTyp == PolyType.ptSubject) - return m_ClipFillType == PolyFillType.pftEvenOdd; - else - return m_SubjFillType == PolyFillType.pftEvenOdd; - } - //------------------------------------------------------------------------------ - - private bool IsContributing(TEdge edge) - { - PolyFillType pft, pft2; - if (edge.PolyTyp == PolyType.ptSubject) - { - pft = m_SubjFillType; - pft2 = m_ClipFillType; - } - else - { - pft = m_ClipFillType; - pft2 = m_SubjFillType; - } - - switch (pft) - { - case PolyFillType.pftEvenOdd: - //return false if a subj line has been flagged as inside a subj polygon - if (edge.WindDelta == 0 && edge.WindCnt != 1) return false; - break; - case PolyFillType.pftNonZero: - if (Math.Abs(edge.WindCnt) != 1) return false; - break; - case PolyFillType.pftPositive: - if (edge.WindCnt != 1) return false; - break; - default: //PolyFillType.pftNegative - if (edge.WindCnt != -1) return false; - break; - } - - switch (m_ClipType) - { - case ClipType.ctIntersection: - switch (pft2) - { - case PolyFillType.pftEvenOdd: - case PolyFillType.pftNonZero: - return (edge.WindCnt2 != 0); - case PolyFillType.pftPositive: - return (edge.WindCnt2 > 0); - default: - return (edge.WindCnt2 < 0); - } - case ClipType.ctUnion: - switch (pft2) - { - case PolyFillType.pftEvenOdd: - case PolyFillType.pftNonZero: - return (edge.WindCnt2 == 0); - case PolyFillType.pftPositive: - return (edge.WindCnt2 <= 0); - default: - return (edge.WindCnt2 >= 0); - } - case ClipType.ctDifference: - if (edge.PolyTyp == PolyType.ptSubject) - switch (pft2) - { - case PolyFillType.pftEvenOdd: - case PolyFillType.pftNonZero: - return (edge.WindCnt2 == 0); - case PolyFillType.pftPositive: - return (edge.WindCnt2 <= 0); - default: - return (edge.WindCnt2 >= 0); - } - else - switch (pft2) - { - case PolyFillType.pftEvenOdd: - case PolyFillType.pftNonZero: - return (edge.WindCnt2 != 0); - case PolyFillType.pftPositive: - return (edge.WindCnt2 > 0); - default: - return (edge.WindCnt2 < 0); - } - case ClipType.ctXor: - if (edge.WindDelta == 0) //XOr always contributing unless open - switch (pft2) - { - case PolyFillType.pftEvenOdd: - case PolyFillType.pftNonZero: - return (edge.WindCnt2 == 0); - case PolyFillType.pftPositive: - return (edge.WindCnt2 <= 0); - default: - return (edge.WindCnt2 >= 0); - } - else - return true; - } - return true; - } - //------------------------------------------------------------------------------ - - private void SetWindingCount(TEdge edge) - { - TEdge e = edge.PrevInAEL; - //find the edge of the same polytype that immediately preceeds 'edge' in AEL - while (e != null && ((e.PolyTyp != edge.PolyTyp) || (e.WindDelta == 0))) e = e.PrevInAEL; - if (e == null) - { - PolyFillType pft; - pft = (edge.PolyTyp == PolyType.ptSubject ? m_SubjFillType : m_ClipFillType); - if (edge.WindDelta == 0) edge.WindCnt = (pft == PolyFillType.pftNegative ? -1 : 1); - else edge.WindCnt = edge.WindDelta; - edge.WindCnt2 = 0; - e = m_ActiveEdges; //ie get ready to calc WindCnt2 - } - else if (edge.WindDelta == 0 && m_ClipType != ClipType.ctUnion) - { - edge.WindCnt = 1; - edge.WindCnt2 = e.WindCnt2; - e = e.NextInAEL; //ie get ready to calc WindCnt2 - } - else if (IsEvenOddFillType(edge)) - { - //EvenOdd filling ... - if (edge.WindDelta == 0) - { - //are we inside a subj polygon ... - bool Inside = true; - TEdge e2 = e.PrevInAEL; - while (e2 != null) - { - if (e2.PolyTyp == e.PolyTyp && e2.WindDelta != 0) - Inside = !Inside; - e2 = e2.PrevInAEL; - } - edge.WindCnt = (Inside ? 0 : 1); - } - else - { - edge.WindCnt = edge.WindDelta; - } - edge.WindCnt2 = e.WindCnt2; - e = e.NextInAEL; //ie get ready to calc WindCnt2 - } - else - { - //nonZero, Positive or Negative filling ... - if (e.WindCnt * e.WindDelta < 0) - { - //prev edge is 'decreasing' WindCount (WC) toward zero - //so we're outside the previous polygon ... - if (Math.Abs(e.WindCnt) > 1) - { - //outside prev poly but still inside another. - //when reversing direction of prev poly use the same WC - if (e.WindDelta * edge.WindDelta < 0) edge.WindCnt = e.WindCnt; - //otherwise continue to 'decrease' WC ... - else edge.WindCnt = e.WindCnt + edge.WindDelta; - } - else - //now outside all polys of same polytype so set own WC ... - edge.WindCnt = (edge.WindDelta == 0 ? 1 : edge.WindDelta); - } - else - { - //prev edge is 'increasing' WindCount (WC) away from zero - //so we're inside the previous polygon ... - if (edge.WindDelta == 0) - edge.WindCnt = (e.WindCnt < 0 ? e.WindCnt - 1 : e.WindCnt + 1); - //if wind direction is reversing prev then use same WC - else if (e.WindDelta * edge.WindDelta < 0) - edge.WindCnt = e.WindCnt; - //otherwise add to WC ... - else edge.WindCnt = e.WindCnt + edge.WindDelta; - } - edge.WindCnt2 = e.WindCnt2; - e = e.NextInAEL; //ie get ready to calc WindCnt2 - } - - //update WindCnt2 ... - if (IsEvenOddAltFillType(edge)) - { - //EvenOdd filling ... - while (e != edge) - { - if (e.WindDelta != 0) - edge.WindCnt2 = (edge.WindCnt2 == 0 ? 1 : 0); - e = e.NextInAEL; - } - } - else - { - //nonZero, Positive or Negative filling ... - while (e != edge) - { - edge.WindCnt2 += e.WindDelta; - e = e.NextInAEL; - } - } - } - //------------------------------------------------------------------------------ - - private void AddEdgeToSEL(TEdge edge) - { - //SEL pointers in PEdge are use to build transient lists of horizontal edges. - //However, since we don't need to worry about processing order, all additions - //are made to the front of the list ... - if (m_SortedEdges == null) - { - m_SortedEdges = edge; - edge.PrevInSEL = null; - edge.NextInSEL = null; - } - else - { - edge.NextInSEL = m_SortedEdges; - edge.PrevInSEL = null; - m_SortedEdges.PrevInSEL = edge; - m_SortedEdges = edge; - } - } - //------------------------------------------------------------------------------ - - internal Boolean PopEdgeFromSEL(out TEdge e) - { - //Pop edge from front of SEL (ie SEL is a FILO list) - e = m_SortedEdges; - if (e == null) return false; - TEdge oldE = e; - m_SortedEdges = e.NextInSEL; - if (m_SortedEdges != null) m_SortedEdges.PrevInSEL = null; - oldE.NextInSEL = null; - oldE.PrevInSEL = null; - return true; - } - //------------------------------------------------------------------------------ - - private void CopyAELToSEL() - { - TEdge e = m_ActiveEdges; - m_SortedEdges = e; - while (e != null) - { - e.PrevInSEL = e.PrevInAEL; - e.NextInSEL = e.NextInAEL; - e = e.NextInAEL; - } - } - //------------------------------------------------------------------------------ - - private void SwapPositionsInSEL(TEdge edge1, TEdge edge2) - { - if (edge1.NextInSEL == null && edge1.PrevInSEL == null) - return; - if (edge2.NextInSEL == null && edge2.PrevInSEL == null) - return; - - if (edge1.NextInSEL == edge2) - { - TEdge next = edge2.NextInSEL; - if (next != null) - next.PrevInSEL = edge1; - TEdge prev = edge1.PrevInSEL; - if (prev != null) - prev.NextInSEL = edge2; - edge2.PrevInSEL = prev; - edge2.NextInSEL = edge1; - edge1.PrevInSEL = edge2; - edge1.NextInSEL = next; - } - else if (edge2.NextInSEL == edge1) - { - TEdge next = edge1.NextInSEL; - if (next != null) - next.PrevInSEL = edge2; - TEdge prev = edge2.PrevInSEL; - if (prev != null) - prev.NextInSEL = edge1; - edge1.PrevInSEL = prev; - edge1.NextInSEL = edge2; - edge2.PrevInSEL = edge1; - edge2.NextInSEL = next; - } - else - { - TEdge next = edge1.NextInSEL; - TEdge prev = edge1.PrevInSEL; - edge1.NextInSEL = edge2.NextInSEL; - if (edge1.NextInSEL != null) - edge1.NextInSEL.PrevInSEL = edge1; - edge1.PrevInSEL = edge2.PrevInSEL; - if (edge1.PrevInSEL != null) - edge1.PrevInSEL.NextInSEL = edge1; - edge2.NextInSEL = next; - if (edge2.NextInSEL != null) - edge2.NextInSEL.PrevInSEL = edge2; - edge2.PrevInSEL = prev; - if (edge2.PrevInSEL != null) - edge2.PrevInSEL.NextInSEL = edge2; - } - - if (edge1.PrevInSEL == null) - m_SortedEdges = edge1; - else if (edge2.PrevInSEL == null) - m_SortedEdges = edge2; - } - //------------------------------------------------------------------------------ - - - private void AddLocalMaxPoly(TEdge e1, TEdge e2, IntPoint pt) - { - AddOutPt(e1, pt); - if (e2.WindDelta == 0) AddOutPt(e2, pt); - if (e1.OutIdx == e2.OutIdx) - { - e1.OutIdx = Unassigned; - e2.OutIdx = Unassigned; - } - else if (e1.OutIdx < e2.OutIdx) - AppendPolygon(e1, e2); - else - AppendPolygon(e2, e1); - } - //------------------------------------------------------------------------------ - - private OutPt AddLocalMinPoly(TEdge e1, TEdge e2, IntPoint pt) - { - OutPt result; - TEdge e, prevE; - if (IsHorizontal(e2) || (e1.Dx > e2.Dx)) - { - result = AddOutPt(e1, pt); - e2.OutIdx = e1.OutIdx; - e1.Side = EdgeSide.esLeft; - e2.Side = EdgeSide.esRight; - e = e1; - if (e.PrevInAEL == e2) - prevE = e2.PrevInAEL; - else - prevE = e.PrevInAEL; - } - else - { - result = AddOutPt(e2, pt); - e1.OutIdx = e2.OutIdx; - e1.Side = EdgeSide.esRight; - e2.Side = EdgeSide.esLeft; - e = e2; - if (e.PrevInAEL == e1) - prevE = e1.PrevInAEL; - else - prevE = e.PrevInAEL; - } - - if (prevE != null && prevE.OutIdx >= 0 && prevE.Top.Y < pt.Y && e.Top.Y < pt.Y) - { - cInt xPrev = TopX(prevE, pt.Y); - cInt xE = TopX(e, pt.Y); - if ((xPrev == xE) && (e.WindDelta != 0) && (prevE.WindDelta != 0) && - SlopesEqual(new IntPoint(xPrev, pt.Y), prevE.Top, new IntPoint(xE, pt.Y), e.Top, m_UseFullRange)) - { - OutPt outPt = AddOutPt(prevE, pt); - AddJoin(result, outPt, e.Top); - } - } - return result; - } - //------------------------------------------------------------------------------ - - private OutPt AddOutPt(TEdge e, IntPoint pt) - { - if (e.OutIdx < 0) - { - OutRec outRec = CreateOutRec(); - outRec.IsOpen = (e.WindDelta == 0); - OutPt newOp = new OutPt(); - outRec.Pts = newOp; - newOp.Idx = outRec.Idx; - newOp.Pt = pt; - newOp.Next = newOp; - newOp.Prev = newOp; - if (!outRec.IsOpen) - SetHoleState(e, outRec); - e.OutIdx = outRec.Idx; //nb: do this after SetZ ! - return newOp; - } - else - { - OutRec outRec = m_PolyOuts[e.OutIdx]; - //OutRec.Pts is the 'Left-most' point & OutRec.Pts.Prev is the 'Right-most' - OutPt op = outRec.Pts; - bool ToFront = (e.Side == EdgeSide.esLeft); - if (ToFront && pt == op.Pt) return op; - else if (!ToFront && pt == op.Prev.Pt) return op.Prev; - - OutPt newOp = new OutPt(); - newOp.Idx = outRec.Idx; - newOp.Pt = pt; - newOp.Next = op; - newOp.Prev = op.Prev; - newOp.Prev.Next = newOp; - op.Prev = newOp; - if (ToFront) outRec.Pts = newOp; - return newOp; - } - } - //------------------------------------------------------------------------------ - - private OutPt GetLastOutPt(TEdge e) - { - OutRec outRec = m_PolyOuts[e.OutIdx]; - if (e.Side == EdgeSide.esLeft) - return outRec.Pts; - else - return outRec.Pts.Prev; - } - //------------------------------------------------------------------------------ - - internal void SwapPoints(ref IntPoint pt1, ref IntPoint pt2) - { - IntPoint tmp = new IntPoint(pt1); - pt1 = pt2; - pt2 = tmp; - } - //------------------------------------------------------------------------------ - - private bool HorzSegmentsOverlap(cInt seg1a, cInt seg1b, cInt seg2a, cInt seg2b) - { - if (seg1a > seg1b) Swap(ref seg1a, ref seg1b); - if (seg2a > seg2b) Swap(ref seg2a, ref seg2b); - return (seg1a < seg2b) && (seg2a < seg1b); - } - //------------------------------------------------------------------------------ - - private void SetHoleState(TEdge e, OutRec outRec) - { - TEdge e2 = e.PrevInAEL; - TEdge eTmp = null; - while (e2 != null) - { - if (e2.OutIdx >= 0 && e2.WindDelta != 0) - { - if (eTmp == null) - eTmp = e2; - else if (eTmp.OutIdx == e2.OutIdx) - eTmp = null; //paired - } - e2 = e2.PrevInAEL; - } - - if (eTmp == null) - { - outRec.FirstLeft = null; - outRec.IsHole = false; - } - else - { - outRec.FirstLeft = m_PolyOuts[eTmp.OutIdx]; - outRec.IsHole = !outRec.FirstLeft.IsHole; - } - } - //------------------------------------------------------------------------------ - - private double GetDx(IntPoint pt1, IntPoint pt2) - { - if (pt1.Y == pt2.Y) return horizontal; - else return (double)(pt2.X - pt1.X) / (pt2.Y - pt1.Y); - } - //--------------------------------------------------------------------------- - - private bool FirstIsBottomPt(OutPt btmPt1, OutPt btmPt2) - { - OutPt p = btmPt1.Prev; - while ((p.Pt == btmPt1.Pt) && (p != btmPt1)) p = p.Prev; - double dx1p = Math.Abs(GetDx(btmPt1.Pt, p.Pt)); - p = btmPt1.Next; - while ((p.Pt == btmPt1.Pt) && (p != btmPt1)) p = p.Next; - double dx1n = Math.Abs(GetDx(btmPt1.Pt, p.Pt)); - - p = btmPt2.Prev; - while ((p.Pt == btmPt2.Pt) && (p != btmPt2)) p = p.Prev; - double dx2p = Math.Abs(GetDx(btmPt2.Pt, p.Pt)); - p = btmPt2.Next; - while ((p.Pt == btmPt2.Pt) && (p != btmPt2)) p = p.Next; - double dx2n = Math.Abs(GetDx(btmPt2.Pt, p.Pt)); - - if (Math.Max(dx1p, dx1n) == Math.Max(dx2p, dx2n) && - Math.Min(dx1p, dx1n) == Math.Min(dx2p, dx2n)) - return Area(btmPt1) > 0; //if otherwise identical use orientation - else - return (dx1p >= dx2p && dx1p >= dx2n) || (dx1n >= dx2p && dx1n >= dx2n); - } - //------------------------------------------------------------------------------ - - private OutPt GetBottomPt(OutPt pp) - { - OutPt dups = null; - OutPt p = pp.Next; - while (p != pp) - { - if (p.Pt.Y > pp.Pt.Y) - { - pp = p; - dups = null; - } - else if (p.Pt.Y == pp.Pt.Y && p.Pt.X <= pp.Pt.X) - { - if (p.Pt.X < pp.Pt.X) - { - dups = null; - pp = p; - } - else - { - if (p.Next != pp && p.Prev != pp) dups = p; - } - } - p = p.Next; - } - if (dups != null) - { - //there appears to be at least 2 vertices at bottomPt so ... - while (dups != p) - { - if (!FirstIsBottomPt(p, dups)) pp = dups; - dups = dups.Next; - while (dups.Pt != pp.Pt) dups = dups.Next; - } - } - return pp; - } - //------------------------------------------------------------------------------ - - private OutRec GetLowermostRec(OutRec outRec1, OutRec outRec2) - { - //work out which polygon fragment has the correct hole state ... - if (outRec1.BottomPt == null) - outRec1.BottomPt = GetBottomPt(outRec1.Pts); - if (outRec2.BottomPt == null) - outRec2.BottomPt = GetBottomPt(outRec2.Pts); - OutPt bPt1 = outRec1.BottomPt; - OutPt bPt2 = outRec2.BottomPt; - if (bPt1.Pt.Y > bPt2.Pt.Y) return outRec1; - else if (bPt1.Pt.Y < bPt2.Pt.Y) return outRec2; - else if (bPt1.Pt.X < bPt2.Pt.X) return outRec1; - else if (bPt1.Pt.X > bPt2.Pt.X) return outRec2; - else if (bPt1.Next == bPt1) return outRec2; - else if (bPt2.Next == bPt2) return outRec1; - else if (FirstIsBottomPt(bPt1, bPt2)) return outRec1; - else return outRec2; - } - //------------------------------------------------------------------------------ - - bool OutRec1RightOfOutRec2(OutRec outRec1, OutRec outRec2) - { - do - { - outRec1 = outRec1.FirstLeft; - if (outRec1 == outRec2) return true; - } while (outRec1 != null); - return false; - } - //------------------------------------------------------------------------------ - - private OutRec GetOutRec(int idx) - { - OutRec outrec = m_PolyOuts[idx]; - while (outrec != m_PolyOuts[outrec.Idx]) - outrec = m_PolyOuts[outrec.Idx]; - return outrec; - } - //------------------------------------------------------------------------------ - - private void AppendPolygon(TEdge e1, TEdge e2) - { - OutRec outRec1 = m_PolyOuts[e1.OutIdx]; - OutRec outRec2 = m_PolyOuts[e2.OutIdx]; - - OutRec holeStateRec; - if (OutRec1RightOfOutRec2(outRec1, outRec2)) - holeStateRec = outRec2; - else if (OutRec1RightOfOutRec2(outRec2, outRec1)) - holeStateRec = outRec1; - else - holeStateRec = GetLowermostRec(outRec1, outRec2); - - //get the start and ends of both output polygons and - //join E2 poly onto E1 poly and delete pointers to E2 ... - OutPt p1_lft = outRec1.Pts; - OutPt p1_rt = p1_lft.Prev; - OutPt p2_lft = outRec2.Pts; - OutPt p2_rt = p2_lft.Prev; - - //join e2 poly onto e1 poly and delete pointers to e2 ... - if (e1.Side == EdgeSide.esLeft) - { - if (e2.Side == EdgeSide.esLeft) - { - //z y x a b c - ReversePolyPtLinks(p2_lft); - p2_lft.Next = p1_lft; - p1_lft.Prev = p2_lft; - p1_rt.Next = p2_rt; - p2_rt.Prev = p1_rt; - outRec1.Pts = p2_rt; - } - else - { - //x y z a b c - p2_rt.Next = p1_lft; - p1_lft.Prev = p2_rt; - p2_lft.Prev = p1_rt; - p1_rt.Next = p2_lft; - outRec1.Pts = p2_lft; - } - } - else - { - if (e2.Side == EdgeSide.esRight) - { - //a b c z y x - ReversePolyPtLinks(p2_lft); - p1_rt.Next = p2_rt; - p2_rt.Prev = p1_rt; - p2_lft.Next = p1_lft; - p1_lft.Prev = p2_lft; - } - else - { - //a b c x y z - p1_rt.Next = p2_lft; - p2_lft.Prev = p1_rt; - p1_lft.Prev = p2_rt; - p2_rt.Next = p1_lft; - } - } - - outRec1.BottomPt = null; - if (holeStateRec == outRec2) - { - if (outRec2.FirstLeft != outRec1) - outRec1.FirstLeft = outRec2.FirstLeft; - outRec1.IsHole = outRec2.IsHole; - } - outRec2.Pts = null; - outRec2.BottomPt = null; - - outRec2.FirstLeft = outRec1; - - int OKIdx = e1.OutIdx; - int ObsoleteIdx = e2.OutIdx; - - e1.OutIdx = Unassigned; //nb: safe because we only get here via AddLocalMaxPoly - e2.OutIdx = Unassigned; - - TEdge e = m_ActiveEdges; - while (e != null) - { - if (e.OutIdx == ObsoleteIdx) - { - e.OutIdx = OKIdx; - e.Side = e1.Side; - break; - } - e = e.NextInAEL; - } - outRec2.Idx = outRec1.Idx; - } - //------------------------------------------------------------------------------ - - private void ReversePolyPtLinks(OutPt pp) - { - if (pp == null) return; - OutPt pp1; - OutPt pp2; - pp1 = pp; - do - { - pp2 = pp1.Next; - pp1.Next = pp1.Prev; - pp1.Prev = pp2; - pp1 = pp2; - } while (pp1 != pp); - } - //------------------------------------------------------------------------------ - - private static void SwapSides(TEdge edge1, TEdge edge2) - { - EdgeSide side = edge1.Side; - edge1.Side = edge2.Side; - edge2.Side = side; - } - //------------------------------------------------------------------------------ - - private static void SwapPolyIndexes(TEdge edge1, TEdge edge2) - { - int outIdx = edge1.OutIdx; - edge1.OutIdx = edge2.OutIdx; - edge2.OutIdx = outIdx; - } - //------------------------------------------------------------------------------ - - private void IntersectEdges(TEdge e1, TEdge e2, IntPoint pt) - { - //e1 will be to the left of e2 BELOW the intersection. Therefore e1 is before - //e2 in AEL except when e1 is being inserted at the intersection point ... - - bool e1Contributing = (e1.OutIdx >= 0); - bool e2Contributing = (e2.OutIdx >= 0); - -#if use_xyz - SetZ(ref pt, e1, e2); -#endif - -#if use_lines - //if either edge is on an OPEN path ... - if (e1.WindDelta == 0 || e2.WindDelta == 0) - { - //ignore subject-subject open path intersections UNLESS they - //are both open paths, AND they are both 'contributing maximas' ... - if (e1.WindDelta == 0 && e2.WindDelta == 0) return; - //if intersecting a subj line with a subj poly ... - else if (e1.PolyTyp == e2.PolyTyp && - e1.WindDelta != e2.WindDelta && m_ClipType == ClipType.ctUnion) - { - if (e1.WindDelta == 0) - { - if (e2Contributing) - { - AddOutPt(e1, pt); - if (e1Contributing) e1.OutIdx = Unassigned; - } - } - else - { - if (e1Contributing) - { - AddOutPt(e2, pt); - if (e2Contributing) e2.OutIdx = Unassigned; - } - } - } - else if (e1.PolyTyp != e2.PolyTyp) - { - if ((e1.WindDelta == 0) && Math.Abs(e2.WindCnt) == 1 && - (m_ClipType != ClipType.ctUnion || e2.WindCnt2 == 0)) - { - AddOutPt(e1, pt); - if (e1Contributing) e1.OutIdx = Unassigned; - } - else if ((e2.WindDelta == 0) && (Math.Abs(e1.WindCnt) == 1) && - (m_ClipType != ClipType.ctUnion || e1.WindCnt2 == 0)) - { - AddOutPt(e2, pt); - if (e2Contributing) e2.OutIdx = Unassigned; - } - } - return; - } -#endif - - //update winding counts... - //assumes that e1 will be to the Right of e2 ABOVE the intersection - if (e1.PolyTyp == e2.PolyTyp) - { - if (IsEvenOddFillType(e1)) - { - int oldE1WindCnt = e1.WindCnt; - e1.WindCnt = e2.WindCnt; - e2.WindCnt = oldE1WindCnt; - } - else - { - if (e1.WindCnt + e2.WindDelta == 0) e1.WindCnt = -e1.WindCnt; - else e1.WindCnt += e2.WindDelta; - if (e2.WindCnt - e1.WindDelta == 0) e2.WindCnt = -e2.WindCnt; - else e2.WindCnt -= e1.WindDelta; - } - } - else - { - if (!IsEvenOddFillType(e2)) e1.WindCnt2 += e2.WindDelta; - else e1.WindCnt2 = (e1.WindCnt2 == 0) ? 1 : 0; - if (!IsEvenOddFillType(e1)) e2.WindCnt2 -= e1.WindDelta; - else e2.WindCnt2 = (e2.WindCnt2 == 0) ? 1 : 0; - } - - PolyFillType e1FillType, e2FillType, e1FillType2, e2FillType2; - if (e1.PolyTyp == PolyType.ptSubject) - { - e1FillType = m_SubjFillType; - e1FillType2 = m_ClipFillType; - } - else - { - e1FillType = m_ClipFillType; - e1FillType2 = m_SubjFillType; - } - if (e2.PolyTyp == PolyType.ptSubject) - { - e2FillType = m_SubjFillType; - e2FillType2 = m_ClipFillType; - } - else - { - e2FillType = m_ClipFillType; - e2FillType2 = m_SubjFillType; - } - - int e1Wc, e2Wc; - switch (e1FillType) - { - case PolyFillType.pftPositive: e1Wc = e1.WindCnt; break; - case PolyFillType.pftNegative: e1Wc = -e1.WindCnt; break; - default: e1Wc = Math.Abs(e1.WindCnt); break; - } - switch (e2FillType) - { - case PolyFillType.pftPositive: e2Wc = e2.WindCnt; break; - case PolyFillType.pftNegative: e2Wc = -e2.WindCnt; break; - default: e2Wc = Math.Abs(e2.WindCnt); break; - } - - if (e1Contributing && e2Contributing) - { - if ((e1Wc != 0 && e1Wc != 1) || (e2Wc != 0 && e2Wc != 1) || - (e1.PolyTyp != e2.PolyTyp && m_ClipType != ClipType.ctXor)) - { - AddLocalMaxPoly(e1, e2, pt); - } - else - { - AddOutPt(e1, pt); - AddOutPt(e2, pt); - SwapSides(e1, e2); - SwapPolyIndexes(e1, e2); - } - } - else if (e1Contributing) - { - if (e2Wc == 0 || e2Wc == 1) - { - AddOutPt(e1, pt); - SwapSides(e1, e2); - SwapPolyIndexes(e1, e2); - } - - } - else if (e2Contributing) - { - if (e1Wc == 0 || e1Wc == 1) - { - AddOutPt(e2, pt); - SwapSides(e1, e2); - SwapPolyIndexes(e1, e2); - } - } - else if ((e1Wc == 0 || e1Wc == 1) && (e2Wc == 0 || e2Wc == 1)) - { - //neither edge is currently contributing ... - cInt e1Wc2, e2Wc2; - switch (e1FillType2) - { - case PolyFillType.pftPositive: e1Wc2 = e1.WindCnt2; break; - case PolyFillType.pftNegative: e1Wc2 = -e1.WindCnt2; break; - default: e1Wc2 = Math.Abs(e1.WindCnt2); break; - } - switch (e2FillType2) - { - case PolyFillType.pftPositive: e2Wc2 = e2.WindCnt2; break; - case PolyFillType.pftNegative: e2Wc2 = -e2.WindCnt2; break; - default: e2Wc2 = Math.Abs(e2.WindCnt2); break; - } - - if (e1.PolyTyp != e2.PolyTyp) - { - AddLocalMinPoly(e1, e2, pt); - } - else if (e1Wc == 1 && e2Wc == 1) - { - switch (m_ClipType) - { - case ClipType.ctIntersection: - if (e1Wc2 > 0 && e2Wc2 > 0) - AddLocalMinPoly(e1, e2, pt); - break; - case ClipType.ctUnion: - if (e1Wc2 <= 0 && e2Wc2 <= 0) - AddLocalMinPoly(e1, e2, pt); - break; - case ClipType.ctDifference: - if (((e1.PolyTyp == PolyType.ptClip) && (e1Wc2 > 0) && (e2Wc2 > 0)) || - ((e1.PolyTyp == PolyType.ptSubject) && (e1Wc2 <= 0) && (e2Wc2 <= 0))) - AddLocalMinPoly(e1, e2, pt); - break; - case ClipType.ctXor: - AddLocalMinPoly(e1, e2, pt); - break; - } - } - else - SwapSides(e1, e2); - } - } - //------------------------------------------------------------------------------ - - private void DeleteFromSEL(TEdge e) - { - TEdge SelPrev = e.PrevInSEL; - TEdge SelNext = e.NextInSEL; - if (SelPrev == null && SelNext == null && (e != m_SortedEdges)) - return; //already deleted - if (SelPrev != null) - SelPrev.NextInSEL = SelNext; - else m_SortedEdges = SelNext; - if (SelNext != null) - SelNext.PrevInSEL = SelPrev; - e.NextInSEL = null; - e.PrevInSEL = null; - } - //------------------------------------------------------------------------------ - - private void ProcessHorizontals() - { - TEdge horzEdge; //m_SortedEdges; - while (PopEdgeFromSEL(out horzEdge)) - ProcessHorizontal(horzEdge); - } - //------------------------------------------------------------------------------ - - void GetHorzDirection(TEdge HorzEdge, out Direction Dir, out cInt Left, out cInt Right) - { - if (HorzEdge.Bot.X < HorzEdge.Top.X) - { - Left = HorzEdge.Bot.X; - Right = HorzEdge.Top.X; - Dir = Direction.dLeftToRight; - } - else - { - Left = HorzEdge.Top.X; - Right = HorzEdge.Bot.X; - Dir = Direction.dRightToLeft; - } - } - //------------------------------------------------------------------------ - - private void ProcessHorizontal(TEdge horzEdge) - { - Direction dir; - cInt horzLeft, horzRight; - bool IsOpen = horzEdge.WindDelta == 0; - - GetHorzDirection(horzEdge, out dir, out horzLeft, out horzRight); - - TEdge eLastHorz = horzEdge, eMaxPair = null; - while (eLastHorz.NextInLML != null && IsHorizontal(eLastHorz.NextInLML)) - eLastHorz = eLastHorz.NextInLML; - if (eLastHorz.NextInLML == null) - eMaxPair = GetMaximaPair(eLastHorz); - - Maxima currMax = m_Maxima; - if (currMax != null) - { - //get the first maxima in range (X) ... - if (dir == Direction.dLeftToRight) - { - while (currMax != null && currMax.X <= horzEdge.Bot.X) - currMax = currMax.Next; - if (currMax != null && currMax.X >= eLastHorz.Top.X) - currMax = null; - } - else - { - while (currMax.Next != null && currMax.Next.X < horzEdge.Bot.X) - currMax = currMax.Next; - if (currMax.X <= eLastHorz.Top.X) currMax = null; - } - } - - OutPt op1 = null; - for (; ; ) //loop through consec. horizontal edges - { - bool IsLastHorz = (horzEdge == eLastHorz); - TEdge e = GetNextInAEL(horzEdge, dir); - while (e != null) - { - - //this code block inserts extra coords into horizontal edges (in output - //polygons) whereever maxima touch these horizontal edges. This helps - //'simplifying' polygons (ie if the Simplify property is set). - if (currMax != null) - { - if (dir == Direction.dLeftToRight) - { - while (currMax != null && currMax.X < e.Curr.X) - { - if (horzEdge.OutIdx >= 0 && !IsOpen) - AddOutPt(horzEdge, new IntPoint(currMax.X, horzEdge.Bot.Y)); - currMax = currMax.Next; - } - } - else - { - while (currMax != null && currMax.X > e.Curr.X) - { - if (horzEdge.OutIdx >= 0 && !IsOpen) - AddOutPt(horzEdge, new IntPoint(currMax.X, horzEdge.Bot.Y)); - currMax = currMax.Prev; - } - } - }; - - if ((dir == Direction.dLeftToRight && e.Curr.X > horzRight) || - (dir == Direction.dRightToLeft && e.Curr.X < horzLeft)) break; - - //Also break if we've got to the end of an intermediate horizontal edge ... - //nb: Smaller Dx's are to the right of larger Dx's ABOVE the horizontal. - if (e.Curr.X == horzEdge.Top.X && horzEdge.NextInLML != null && - e.Dx < horzEdge.NextInLML.Dx) break; - - if (horzEdge.OutIdx >= 0 && !IsOpen) //note: may be done multiple times - { -#if use_xyz - if (dir == Direction.dLeftToRight) SetZ(ref e.Curr, horzEdge, e); - else SetZ(ref e.Curr, e, horzEdge); -#endif - - op1 = AddOutPt(horzEdge, e.Curr); - TEdge eNextHorz = m_SortedEdges; - while (eNextHorz != null) - { - if (eNextHorz.OutIdx >= 0 && - HorzSegmentsOverlap(horzEdge.Bot.X, - horzEdge.Top.X, eNextHorz.Bot.X, eNextHorz.Top.X)) - { - OutPt op2 = GetLastOutPt(eNextHorz); - AddJoin(op2, op1, eNextHorz.Top); - } - eNextHorz = eNextHorz.NextInSEL; - } - AddGhostJoin(op1, horzEdge.Bot); - } - - //OK, so far we're still in range of the horizontal Edge but make sure - //we're at the last of consec. horizontals when matching with eMaxPair - if (e == eMaxPair && IsLastHorz) - { - if (horzEdge.OutIdx >= 0) - AddLocalMaxPoly(horzEdge, eMaxPair, horzEdge.Top); - DeleteFromAEL(horzEdge); - DeleteFromAEL(eMaxPair); - return; - } - - if (dir == Direction.dLeftToRight) - { - IntPoint Pt = new IntPoint(e.Curr.X, horzEdge.Curr.Y); - IntersectEdges(horzEdge, e, Pt); - } - else - { - IntPoint Pt = new IntPoint(e.Curr.X, horzEdge.Curr.Y); - IntersectEdges(e, horzEdge, Pt); - } - TEdge eNext = GetNextInAEL(e, dir); - SwapPositionsInAEL(horzEdge, e); - e = eNext; - } //end while(e != null) - - //Break out of loop if HorzEdge.NextInLML is not also horizontal ... - if (horzEdge.NextInLML == null || !IsHorizontal(horzEdge.NextInLML)) break; - - UpdateEdgeIntoAEL(ref horzEdge); - if (horzEdge.OutIdx >= 0) AddOutPt(horzEdge, horzEdge.Bot); - GetHorzDirection(horzEdge, out dir, out horzLeft, out horzRight); - - } //end for (;;) - - if (horzEdge.OutIdx >= 0 && op1 == null) - { - op1 = GetLastOutPt(horzEdge); - TEdge eNextHorz = m_SortedEdges; - while (eNextHorz != null) - { - if (eNextHorz.OutIdx >= 0 && - HorzSegmentsOverlap(horzEdge.Bot.X, - horzEdge.Top.X, eNextHorz.Bot.X, eNextHorz.Top.X)) - { - OutPt op2 = GetLastOutPt(eNextHorz); - AddJoin(op2, op1, eNextHorz.Top); - } - eNextHorz = eNextHorz.NextInSEL; - } - AddGhostJoin(op1, horzEdge.Top); - } - - if (horzEdge.NextInLML != null) - { - if (horzEdge.OutIdx >= 0) - { - op1 = AddOutPt(horzEdge, horzEdge.Top); - - UpdateEdgeIntoAEL(ref horzEdge); - if (horzEdge.WindDelta == 0) return; - //nb: HorzEdge is no longer horizontal here - TEdge ePrev = horzEdge.PrevInAEL; - TEdge eNext = horzEdge.NextInAEL; - if (ePrev != null && ePrev.Curr.X == horzEdge.Bot.X && - ePrev.Curr.Y == horzEdge.Bot.Y && ePrev.WindDelta != 0 && - (ePrev.OutIdx >= 0 && ePrev.Curr.Y > ePrev.Top.Y && - SlopesEqual(horzEdge, ePrev, m_UseFullRange))) - { - OutPt op2 = AddOutPt(ePrev, horzEdge.Bot); - AddJoin(op1, op2, horzEdge.Top); - } - else if (eNext != null && eNext.Curr.X == horzEdge.Bot.X && - eNext.Curr.Y == horzEdge.Bot.Y && eNext.WindDelta != 0 && - eNext.OutIdx >= 0 && eNext.Curr.Y > eNext.Top.Y && - SlopesEqual(horzEdge, eNext, m_UseFullRange)) - { - OutPt op2 = AddOutPt(eNext, horzEdge.Bot); - AddJoin(op1, op2, horzEdge.Top); - } - } - else - UpdateEdgeIntoAEL(ref horzEdge); - } - else - { - if (horzEdge.OutIdx >= 0) AddOutPt(horzEdge, horzEdge.Top); - DeleteFromAEL(horzEdge); - } - } - //------------------------------------------------------------------------------ - - private TEdge GetNextInAEL(TEdge e, Direction Direction) - { - return Direction == Direction.dLeftToRight ? e.NextInAEL : e.PrevInAEL; - } - //------------------------------------------------------------------------------ - - private bool IsMinima(TEdge e) - { - return e != null && (e.Prev.NextInLML != e) && (e.Next.NextInLML != e); - } - //------------------------------------------------------------------------------ - - private bool IsMaxima(TEdge e, double Y) - { - return (e != null && e.Top.Y == Y && e.NextInLML == null); - } - //------------------------------------------------------------------------------ - - private bool IsIntermediate(TEdge e, double Y) - { - return (e.Top.Y == Y && e.NextInLML != null); - } - //------------------------------------------------------------------------------ - - internal TEdge GetMaximaPair(TEdge e) - { - if ((e.Next.Top == e.Top) && e.Next.NextInLML == null) - return e.Next; - else if ((e.Prev.Top == e.Top) && e.Prev.NextInLML == null) - return e.Prev; - else - return null; - } - //------------------------------------------------------------------------------ - - internal TEdge GetMaximaPairEx(TEdge e) - { - //as above but returns null if MaxPair isn't in AEL (unless it's horizontal) - TEdge result = GetMaximaPair(e); - if (result == null || result.OutIdx == Skip || - ((result.NextInAEL == result.PrevInAEL) && !IsHorizontal(result))) return null; - return result; - } - //------------------------------------------------------------------------------ - - private bool ProcessIntersections(cInt topY) - { - if (m_ActiveEdges == null) return true; - try - { - BuildIntersectList(topY); - if (m_IntersectList.Count == 0) return true; - if (m_IntersectList.Count == 1 || FixupIntersectionOrder()) - ProcessIntersectList(); - else - return false; - } - catch - { - m_SortedEdges = null; - m_IntersectList.Clear(); - throw new ClipperException("ProcessIntersections error"); - } - m_SortedEdges = null; - return true; - } - //------------------------------------------------------------------------------ - - private void BuildIntersectList(cInt topY) - { - if (m_ActiveEdges == null) return; - - //prepare for sorting ... - TEdge e = m_ActiveEdges; - m_SortedEdges = e; - while (e != null) - { - e.PrevInSEL = e.PrevInAEL; - e.NextInSEL = e.NextInAEL; - e.Curr.X = TopX(e, topY); - e = e.NextInAEL; - } - - //bubblesort ... - bool isModified = true; - while (isModified && m_SortedEdges != null) - { - isModified = false; - e = m_SortedEdges; - while (e.NextInSEL != null) - { - TEdge eNext = e.NextInSEL; - IntPoint pt; - if (e.Curr.X > eNext.Curr.X) - { - IntersectPoint(e, eNext, out pt); - if (pt.Y < topY) - pt = new IntPoint(TopX(e, topY), topY); - IntersectNode newNode = new IntersectNode(); - newNode.Edge1 = e; - newNode.Edge2 = eNext; - newNode.Pt = pt; - m_IntersectList.Add(newNode); - - SwapPositionsInSEL(e, eNext); - isModified = true; - } - else - e = eNext; - } - if (e.PrevInSEL != null) e.PrevInSEL.NextInSEL = null; - else break; - } - m_SortedEdges = null; - } - //------------------------------------------------------------------------------ - - private bool EdgesAdjacent(IntersectNode inode) - { - return (inode.Edge1.NextInSEL == inode.Edge2) || - (inode.Edge1.PrevInSEL == inode.Edge2); - } - //------------------------------------------------------------------------------ - - private static int IntersectNodeSort(IntersectNode node1, IntersectNode node2) - { - //the following typecast is safe because the differences in Pt.Y will - //be limited to the height of the scanbeam. - return (int)(node2.Pt.Y - node1.Pt.Y); - } - //------------------------------------------------------------------------------ - - private bool FixupIntersectionOrder() - { - //pre-condition: intersections are sorted bottom-most first. - //Now it's crucial that intersections are made only between adjacent edges, - //so to ensure this the order of intersections may need adjusting ... - m_IntersectList.Sort(m_IntersectNodeComparer); - - CopyAELToSEL(); - int cnt = m_IntersectList.Count; - for (int i = 0; i < cnt; i++) - { - if (!EdgesAdjacent(m_IntersectList[i])) - { - int j = i + 1; - while (j < cnt && !EdgesAdjacent(m_IntersectList[j])) j++; - if (j == cnt) return false; - - IntersectNode tmp = m_IntersectList[i]; - m_IntersectList[i] = m_IntersectList[j]; - m_IntersectList[j] = tmp; - - } - SwapPositionsInSEL(m_IntersectList[i].Edge1, m_IntersectList[i].Edge2); - } - return true; - } - //------------------------------------------------------------------------------ - - private void ProcessIntersectList() - { - for (int i = 0; i < m_IntersectList.Count; i++) - { - IntersectNode iNode = m_IntersectList[i]; - { - IntersectEdges(iNode.Edge1, iNode.Edge2, iNode.Pt); - SwapPositionsInAEL(iNode.Edge1, iNode.Edge2); - } - } - m_IntersectList.Clear(); - } - //------------------------------------------------------------------------------ - - internal static cInt Round(double value) - { - return value < 0 ? (cInt)(value - 0.5) : (cInt)(value + 0.5); - } - //------------------------------------------------------------------------------ - - private static cInt TopX(TEdge edge, cInt currentY) - { - if (currentY == edge.Top.Y) - return edge.Top.X; - return edge.Bot.X + Round(edge.Dx * (currentY - edge.Bot.Y)); - } - //------------------------------------------------------------------------------ - - private void IntersectPoint(TEdge edge1, TEdge edge2, out IntPoint ip) - { - ip = new IntPoint(); - double b1, b2; - //nb: with very large coordinate values, it's possible for SlopesEqual() to - //return false but for the edge.Dx value be equal due to double precision rounding. - if (edge1.Dx == edge2.Dx) - { - ip.Y = edge1.Curr.Y; - ip.X = TopX(edge1, ip.Y); - return; - } - - if (edge1.Delta.X == 0) - { - ip.X = edge1.Bot.X; - if (IsHorizontal(edge2)) - { - ip.Y = edge2.Bot.Y; - } - else - { - b2 = edge2.Bot.Y - (edge2.Bot.X / edge2.Dx); - ip.Y = Round(ip.X / edge2.Dx + b2); - } - } - else if (edge2.Delta.X == 0) - { - ip.X = edge2.Bot.X; - if (IsHorizontal(edge1)) - { - ip.Y = edge1.Bot.Y; - } - else - { - b1 = edge1.Bot.Y - (edge1.Bot.X / edge1.Dx); - ip.Y = Round(ip.X / edge1.Dx + b1); - } - } - else - { - b1 = edge1.Bot.X - edge1.Bot.Y * edge1.Dx; - b2 = edge2.Bot.X - edge2.Bot.Y * edge2.Dx; - double q = (b2 - b1) / (edge1.Dx - edge2.Dx); - ip.Y = Round(q); - if (Math.Abs(edge1.Dx) < Math.Abs(edge2.Dx)) - ip.X = Round(edge1.Dx * q + b1); - else - ip.X = Round(edge2.Dx * q + b2); - } - - if (ip.Y < edge1.Top.Y || ip.Y < edge2.Top.Y) - { - if (edge1.Top.Y > edge2.Top.Y) - ip.Y = edge1.Top.Y; - else - ip.Y = edge2.Top.Y; - if (Math.Abs(edge1.Dx) < Math.Abs(edge2.Dx)) - ip.X = TopX(edge1, ip.Y); - else - ip.X = TopX(edge2, ip.Y); - } - //finally, don't allow 'ip' to be BELOW curr.Y (ie bottom of scanbeam) ... - if (ip.Y > edge1.Curr.Y) - { - ip.Y = edge1.Curr.Y; - //better to use the more vertical edge to derive X ... - if (Math.Abs(edge1.Dx) > Math.Abs(edge2.Dx)) - ip.X = TopX(edge2, ip.Y); - else - ip.X = TopX(edge1, ip.Y); - } - } - //------------------------------------------------------------------------------ - - private void ProcessEdgesAtTopOfScanbeam(cInt topY) - { - TEdge e = m_ActiveEdges; - while (e != null) - { - //1. process maxima, treating them as if they're 'bent' horizontal edges, - // but exclude maxima with horizontal edges. nb: e can't be a horizontal. - bool IsMaximaEdge = IsMaxima(e, topY); - - if (IsMaximaEdge) - { - TEdge eMaxPair = GetMaximaPairEx(e); - IsMaximaEdge = (eMaxPair == null || !IsHorizontal(eMaxPair)); - } - - if (IsMaximaEdge) - { - if (StrictlySimple) InsertMaxima(e.Top.X); - TEdge ePrev = e.PrevInAEL; - DoMaxima(e); - if (ePrev == null) e = m_ActiveEdges; - else e = ePrev.NextInAEL; - } - else - { - //2. promote horizontal edges, otherwise update Curr.X and Curr.Y ... - if (IsIntermediate(e, topY) && IsHorizontal(e.NextInLML)) - { - UpdateEdgeIntoAEL(ref e); - if (e.OutIdx >= 0) - AddOutPt(e, e.Bot); - AddEdgeToSEL(e); - } - else - { - e.Curr.X = TopX(e, topY); - e.Curr.Y = topY; -#if use_xyz - if (e.Top.Y == topY) e.Curr.Z = e.Top.Z; - else if (e.Bot.Y == topY) e.Curr.Z = e.Bot.Z; - else e.Curr.Z = 0; -#endif - } - //When StrictlySimple and 'e' is being touched by another edge, then - //make sure both edges have a vertex here ... - if (StrictlySimple) - { - TEdge ePrev = e.PrevInAEL; - if ((e.OutIdx >= 0) && (e.WindDelta != 0) && ePrev != null && - (ePrev.OutIdx >= 0) && (ePrev.Curr.X == e.Curr.X) && - (ePrev.WindDelta != 0)) - { - IntPoint ip = new IntPoint(e.Curr); -#if use_xyz - SetZ(ref ip, ePrev, e); -#endif - OutPt op = AddOutPt(ePrev, ip); - OutPt op2 = AddOutPt(e, ip); - AddJoin(op, op2, ip); //StrictlySimple (type-3) join - } - } - - e = e.NextInAEL; - } - } - - //3. Process horizontals at the Top of the scanbeam ... - ProcessHorizontals(); - m_Maxima = null; - - //4. Promote intermediate vertices ... - e = m_ActiveEdges; - while (e != null) - { - if (IsIntermediate(e, topY)) - { - OutPt op = null; - if (e.OutIdx >= 0) - op = AddOutPt(e, e.Top); - UpdateEdgeIntoAEL(ref e); - - //if output polygons share an edge, they'll need joining later ... - TEdge ePrev = e.PrevInAEL; - TEdge eNext = e.NextInAEL; - if (ePrev != null && ePrev.Curr.X == e.Bot.X && - ePrev.Curr.Y == e.Bot.Y && op != null && - ePrev.OutIdx >= 0 && ePrev.Curr.Y > ePrev.Top.Y && - SlopesEqual(e.Curr, e.Top, ePrev.Curr, ePrev.Top, m_UseFullRange) && - (e.WindDelta != 0) && (ePrev.WindDelta != 0)) - { - OutPt op2 = AddOutPt(ePrev, e.Bot); - AddJoin(op, op2, e.Top); - } - else if (eNext != null && eNext.Curr.X == e.Bot.X && - eNext.Curr.Y == e.Bot.Y && op != null && - eNext.OutIdx >= 0 && eNext.Curr.Y > eNext.Top.Y && - SlopesEqual(e.Curr, e.Top, eNext.Curr, eNext.Top, m_UseFullRange) && - (e.WindDelta != 0) && (eNext.WindDelta != 0)) - { - OutPt op2 = AddOutPt(eNext, e.Bot); - AddJoin(op, op2, e.Top); - } - } - e = e.NextInAEL; - } - } - //------------------------------------------------------------------------------ - - private void DoMaxima(TEdge e) - { - TEdge eMaxPair = GetMaximaPairEx(e); - if (eMaxPair == null) - { - if (e.OutIdx >= 0) - AddOutPt(e, e.Top); - DeleteFromAEL(e); - return; - } - - TEdge eNext = e.NextInAEL; - while (eNext != null && eNext != eMaxPair) - { - IntersectEdges(e, eNext, e.Top); - SwapPositionsInAEL(e, eNext); - eNext = e.NextInAEL; - } - - if (e.OutIdx == Unassigned && eMaxPair.OutIdx == Unassigned) - { - DeleteFromAEL(e); - DeleteFromAEL(eMaxPair); - } - else if (e.OutIdx >= 0 && eMaxPair.OutIdx >= 0) - { - if (e.OutIdx >= 0) AddLocalMaxPoly(e, eMaxPair, e.Top); - DeleteFromAEL(e); - DeleteFromAEL(eMaxPair); - } -#if use_lines - else if (e.WindDelta == 0) - { - if (e.OutIdx >= 0) - { - AddOutPt(e, e.Top); - e.OutIdx = Unassigned; - } - DeleteFromAEL(e); - - if (eMaxPair.OutIdx >= 0) - { - AddOutPt(eMaxPair, e.Top); - eMaxPair.OutIdx = Unassigned; - } - DeleteFromAEL(eMaxPair); - } -#endif - else throw new ClipperException("DoMaxima error"); - } - //------------------------------------------------------------------------------ - - public static void ReversePaths(Paths polys) - { - foreach (var poly in polys) { poly.Reverse(); } - } - //------------------------------------------------------------------------------ - - public static bool Orientation(Path poly) - { - return Area(poly) >= 0; - } - //------------------------------------------------------------------------------ - - private int PointCount(OutPt pts) - { - if (pts == null) return 0; - int result = 0; - OutPt p = pts; - do - { - result++; - p = p.Next; - } - while (p != pts); - return result; - } - //------------------------------------------------------------------------------ - - private void BuildResult(Paths polyg) - { - polyg.Clear(); - polyg.Capacity = m_PolyOuts.Count; - for (int i = 0; i < m_PolyOuts.Count; i++) - { - OutRec outRec = m_PolyOuts[i]; - if (outRec.Pts == null) continue; - OutPt p = outRec.Pts.Prev; - int cnt = PointCount(p); - if (cnt < 2) continue; - Path pg = new Path(cnt); - for (int j = 0; j < cnt; j++) - { - pg.Add(p.Pt); - p = p.Prev; - } - polyg.Add(pg); - } - } - //------------------------------------------------------------------------------ - - private void BuildResult2(PolyTree polytree) - { - polytree.Clear(); - - //add each output polygon/contour to polytree ... - polytree.m_AllPolys.Capacity = m_PolyOuts.Count; - for (int i = 0; i < m_PolyOuts.Count; i++) - { - OutRec outRec = m_PolyOuts[i]; - int cnt = PointCount(outRec.Pts); - if ((outRec.IsOpen && cnt < 2) || - (!outRec.IsOpen && cnt < 3)) continue; - FixHoleLinkage(outRec); - PolyNode pn = new PolyNode(); - polytree.m_AllPolys.Add(pn); - outRec.PolyNode = pn; - pn.m_polygon.Capacity = cnt; - OutPt op = outRec.Pts.Prev; - for (int j = 0; j < cnt; j++) - { - pn.m_polygon.Add(op.Pt); - op = op.Prev; - } - } - - //fixup PolyNode links etc ... - polytree.m_Childs.Capacity = m_PolyOuts.Count; - for (int i = 0; i < m_PolyOuts.Count; i++) - { - OutRec outRec = m_PolyOuts[i]; - if (outRec.PolyNode == null) continue; - else if (outRec.IsOpen) - { - outRec.PolyNode.IsOpen = true; - polytree.AddChild(outRec.PolyNode); - } - else if (outRec.FirstLeft != null && - outRec.FirstLeft.PolyNode != null) - outRec.FirstLeft.PolyNode.AddChild(outRec.PolyNode); - else - polytree.AddChild(outRec.PolyNode); - } - } - //------------------------------------------------------------------------------ - - private void FixupOutPolyline(OutRec outrec) - { - OutPt pp = outrec.Pts; - OutPt lastPP = pp.Prev; - while (pp != lastPP) - { - pp = pp.Next; - if (pp.Pt == pp.Prev.Pt) - { - if (pp == lastPP) lastPP = pp.Prev; - OutPt tmpPP = pp.Prev; - tmpPP.Next = pp.Next; - pp.Next.Prev = tmpPP; - pp = tmpPP; - } - } - if (pp == pp.Prev) outrec.Pts = null; - } - //------------------------------------------------------------------------------ - - private void FixupOutPolygon(OutRec outRec) - { - //FixupOutPolygon() - removes duplicate points and simplifies consecutive - //parallel edges by removing the middle vertex. - OutPt lastOK = null; - outRec.BottomPt = null; - OutPt pp = outRec.Pts; - bool preserveCol = PreserveCollinear || StrictlySimple; - for (; ; ) - { - if (pp.Prev == pp || pp.Prev == pp.Next) - { - outRec.Pts = null; - return; - } - //test for duplicate points and collinear edges ... - if ((pp.Pt == pp.Next.Pt) || (pp.Pt == pp.Prev.Pt) || - (SlopesEqual(pp.Prev.Pt, pp.Pt, pp.Next.Pt, m_UseFullRange) && - (!preserveCol || !Pt2IsBetweenPt1AndPt3(pp.Prev.Pt, pp.Pt, pp.Next.Pt)))) - { - lastOK = null; - pp.Prev.Next = pp.Next; - pp.Next.Prev = pp.Prev; - pp = pp.Prev; - } - else if (pp == lastOK) break; - else - { - if (lastOK == null) lastOK = pp; - pp = pp.Next; - } - } - outRec.Pts = pp; - } - //------------------------------------------------------------------------------ - - OutPt DupOutPt(OutPt outPt, bool InsertAfter) - { - OutPt result = new OutPt(); - result.Pt = outPt.Pt; - result.Idx = outPt.Idx; - if (InsertAfter) - { - result.Next = outPt.Next; - result.Prev = outPt; - outPt.Next.Prev = result; - outPt.Next = result; - } - else - { - result.Prev = outPt.Prev; - result.Next = outPt; - outPt.Prev.Next = result; - outPt.Prev = result; - } - return result; - } - //------------------------------------------------------------------------------ - - bool GetOverlap(cInt a1, cInt a2, cInt b1, cInt b2, out cInt Left, out cInt Right) - { - if (a1 < a2) - { - if (b1 < b2) { Left = Math.Max(a1, b1); Right = Math.Min(a2, b2); } - else { Left = Math.Max(a1, b2); Right = Math.Min(a2, b1); } - } - else - { - if (b1 < b2) { Left = Math.Max(a2, b1); Right = Math.Min(a1, b2); } - else { Left = Math.Max(a2, b2); Right = Math.Min(a1, b1); } - } - return Left < Right; - } - //------------------------------------------------------------------------------ - - bool JoinHorz(OutPt op1, OutPt op1b, OutPt op2, OutPt op2b, - IntPoint Pt, bool DiscardLeft) - { - Direction Dir1 = (op1.Pt.X > op1b.Pt.X ? - Direction.dRightToLeft : Direction.dLeftToRight); - Direction Dir2 = (op2.Pt.X > op2b.Pt.X ? - Direction.dRightToLeft : Direction.dLeftToRight); - if (Dir1 == Dir2) return false; - - //When DiscardLeft, we want Op1b to be on the Left of Op1, otherwise we - //want Op1b to be on the Right. (And likewise with Op2 and Op2b.) - //So, to facilitate this while inserting Op1b and Op2b ... - //when DiscardLeft, make sure we're AT or RIGHT of Pt before adding Op1b, - //otherwise make sure we're AT or LEFT of Pt. (Likewise with Op2b.) - if (Dir1 == Direction.dLeftToRight) - { - while (op1.Next.Pt.X <= Pt.X && - op1.Next.Pt.X >= op1.Pt.X && op1.Next.Pt.Y == Pt.Y) - op1 = op1.Next; - if (DiscardLeft && (op1.Pt.X != Pt.X)) op1 = op1.Next; - op1b = DupOutPt(op1, !DiscardLeft); - if (op1b.Pt != Pt) - { - op1 = op1b; - op1.Pt = Pt; - op1b = DupOutPt(op1, !DiscardLeft); - } - } - else - { - while (op1.Next.Pt.X >= Pt.X && - op1.Next.Pt.X <= op1.Pt.X && op1.Next.Pt.Y == Pt.Y) - op1 = op1.Next; - if (!DiscardLeft && (op1.Pt.X != Pt.X)) op1 = op1.Next; - op1b = DupOutPt(op1, DiscardLeft); - if (op1b.Pt != Pt) - { - op1 = op1b; - op1.Pt = Pt; - op1b = DupOutPt(op1, DiscardLeft); - } - } - - if (Dir2 == Direction.dLeftToRight) - { - while (op2.Next.Pt.X <= Pt.X && - op2.Next.Pt.X >= op2.Pt.X && op2.Next.Pt.Y == Pt.Y) - op2 = op2.Next; - if (DiscardLeft && (op2.Pt.X != Pt.X)) op2 = op2.Next; - op2b = DupOutPt(op2, !DiscardLeft); - if (op2b.Pt != Pt) - { - op2 = op2b; - op2.Pt = Pt; - op2b = DupOutPt(op2, !DiscardLeft); - }; - } - else - { - while (op2.Next.Pt.X >= Pt.X && - op2.Next.Pt.X <= op2.Pt.X && op2.Next.Pt.Y == Pt.Y) - op2 = op2.Next; - if (!DiscardLeft && (op2.Pt.X != Pt.X)) op2 = op2.Next; - op2b = DupOutPt(op2, DiscardLeft); - if (op2b.Pt != Pt) - { - op2 = op2b; - op2.Pt = Pt; - op2b = DupOutPt(op2, DiscardLeft); - }; - }; - - if ((Dir1 == Direction.dLeftToRight) == DiscardLeft) - { - op1.Prev = op2; - op2.Next = op1; - op1b.Next = op2b; - op2b.Prev = op1b; - } - else - { - op1.Next = op2; - op2.Prev = op1; - op1b.Prev = op2b; - op2b.Next = op1b; - } - return true; - } - //------------------------------------------------------------------------------ - - private bool JoinPoints(Join j, OutRec outRec1, OutRec outRec2) - { - OutPt op1 = j.OutPt1, op1b; - OutPt op2 = j.OutPt2, op2b; - - //There are 3 kinds of joins for output polygons ... - //1. Horizontal joins where Join.OutPt1 & Join.OutPt2 are vertices anywhere - //along (horizontal) collinear edges (& Join.OffPt is on the same horizontal). - //2. Non-horizontal joins where Join.OutPt1 & Join.OutPt2 are at the same - //location at the Bottom of the overlapping segment (& Join.OffPt is above). - //3. StrictlySimple joins where edges touch but are not collinear and where - //Join.OutPt1, Join.OutPt2 & Join.OffPt all share the same point. - bool isHorizontal = (j.OutPt1.Pt.Y == j.OffPt.Y); - - if (isHorizontal && (j.OffPt == j.OutPt1.Pt) && (j.OffPt == j.OutPt2.Pt)) - { - //Strictly Simple join ... - if (outRec1 != outRec2) return false; - op1b = j.OutPt1.Next; - while (op1b != op1 && (op1b.Pt == j.OffPt)) - op1b = op1b.Next; - bool reverse1 = (op1b.Pt.Y > j.OffPt.Y); - op2b = j.OutPt2.Next; - while (op2b != op2 && (op2b.Pt == j.OffPt)) - op2b = op2b.Next; - bool reverse2 = (op2b.Pt.Y > j.OffPt.Y); - if (reverse1 == reverse2) return false; - if (reverse1) - { - op1b = DupOutPt(op1, false); - op2b = DupOutPt(op2, true); - op1.Prev = op2; - op2.Next = op1; - op1b.Next = op2b; - op2b.Prev = op1b; - j.OutPt1 = op1; - j.OutPt2 = op1b; - return true; - } - else - { - op1b = DupOutPt(op1, true); - op2b = DupOutPt(op2, false); - op1.Next = op2; - op2.Prev = op1; - op1b.Prev = op2b; - op2b.Next = op1b; - j.OutPt1 = op1; - j.OutPt2 = op1b; - return true; - } - } - else if (isHorizontal) - { - //treat horizontal joins differently to non-horizontal joins since with - //them we're not yet sure where the overlapping is. OutPt1.Pt & OutPt2.Pt - //may be anywhere along the horizontal edge. - op1b = op1; - while (op1.Prev.Pt.Y == op1.Pt.Y && op1.Prev != op1b && op1.Prev != op2) - op1 = op1.Prev; - while (op1b.Next.Pt.Y == op1b.Pt.Y && op1b.Next != op1 && op1b.Next != op2) - op1b = op1b.Next; - if (op1b.Next == op1 || op1b.Next == op2) return false; //a flat 'polygon' - - op2b = op2; - while (op2.Prev.Pt.Y == op2.Pt.Y && op2.Prev != op2b && op2.Prev != op1b) - op2 = op2.Prev; - while (op2b.Next.Pt.Y == op2b.Pt.Y && op2b.Next != op2 && op2b.Next != op1) - op2b = op2b.Next; - if (op2b.Next == op2 || op2b.Next == op1) return false; //a flat 'polygon' - - cInt Left, Right; - //Op1 -. Op1b & Op2 -. Op2b are the extremites of the horizontal edges - if (!GetOverlap(op1.Pt.X, op1b.Pt.X, op2.Pt.X, op2b.Pt.X, out Left, out Right)) - return false; - - //DiscardLeftSide: when overlapping edges are joined, a spike will created - //which needs to be cleaned up. However, we don't want Op1 or Op2 caught up - //on the discard Side as either may still be needed for other joins ... - IntPoint Pt; - bool DiscardLeftSide; - if (op1.Pt.X >= Left && op1.Pt.X <= Right) - { - Pt = op1.Pt; DiscardLeftSide = (op1.Pt.X > op1b.Pt.X); - } - else if (op2.Pt.X >= Left && op2.Pt.X <= Right) - { - Pt = op2.Pt; DiscardLeftSide = (op2.Pt.X > op2b.Pt.X); - } - else if (op1b.Pt.X >= Left && op1b.Pt.X <= Right) - { - Pt = op1b.Pt; DiscardLeftSide = op1b.Pt.X > op1.Pt.X; - } - else - { - Pt = op2b.Pt; DiscardLeftSide = (op2b.Pt.X > op2.Pt.X); - } - j.OutPt1 = op1; - j.OutPt2 = op2; - return JoinHorz(op1, op1b, op2, op2b, Pt, DiscardLeftSide); - } - else - { - //nb: For non-horizontal joins ... - // 1. Jr.OutPt1.Pt.Y == Jr.OutPt2.Pt.Y - // 2. Jr.OutPt1.Pt > Jr.OffPt.Y - - //make sure the polygons are correctly oriented ... - op1b = op1.Next; - while ((op1b.Pt == op1.Pt) && (op1b != op1)) op1b = op1b.Next; - bool Reverse1 = ((op1b.Pt.Y > op1.Pt.Y) || - !SlopesEqual(op1.Pt, op1b.Pt, j.OffPt, m_UseFullRange)); - if (Reverse1) - { - op1b = op1.Prev; - while ((op1b.Pt == op1.Pt) && (op1b != op1)) op1b = op1b.Prev; - if ((op1b.Pt.Y > op1.Pt.Y) || - !SlopesEqual(op1.Pt, op1b.Pt, j.OffPt, m_UseFullRange)) return false; - }; - op2b = op2.Next; - while ((op2b.Pt == op2.Pt) && (op2b != op2)) op2b = op2b.Next; - bool Reverse2 = ((op2b.Pt.Y > op2.Pt.Y) || - !SlopesEqual(op2.Pt, op2b.Pt, j.OffPt, m_UseFullRange)); - if (Reverse2) - { - op2b = op2.Prev; - while ((op2b.Pt == op2.Pt) && (op2b != op2)) op2b = op2b.Prev; - if ((op2b.Pt.Y > op2.Pt.Y) || - !SlopesEqual(op2.Pt, op2b.Pt, j.OffPt, m_UseFullRange)) return false; - } - - if ((op1b == op1) || (op2b == op2) || (op1b == op2b) || - ((outRec1 == outRec2) && (Reverse1 == Reverse2))) return false; - - if (Reverse1) - { - op1b = DupOutPt(op1, false); - op2b = DupOutPt(op2, true); - op1.Prev = op2; - op2.Next = op1; - op1b.Next = op2b; - op2b.Prev = op1b; - j.OutPt1 = op1; - j.OutPt2 = op1b; - return true; - } - else - { - op1b = DupOutPt(op1, true); - op2b = DupOutPt(op2, false); - op1.Next = op2; - op2.Prev = op1; - op1b.Prev = op2b; - op2b.Next = op1b; - j.OutPt1 = op1; - j.OutPt2 = op1b; - return true; - } - } - } - //---------------------------------------------------------------------- - - public static int PointInPolygon(IntPoint pt, Path path) - { - //returns 0 if false, +1 if true, -1 if pt ON polygon boundary - //See "The Point in Polygon Problem for Arbitrary Polygons" by Hormann & Agathos - //http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf - int result = 0, cnt = path.Count; - if (cnt < 3) return 0; - IntPoint ip = path[0]; - for (int i = 1; i <= cnt; ++i) - { - IntPoint ipNext = (i == cnt ? path[0] : path[i]); - if (ipNext.Y == pt.Y) - { - if ((ipNext.X == pt.X) || (ip.Y == pt.Y && - ((ipNext.X > pt.X) == (ip.X < pt.X)))) return -1; - } - if ((ip.Y < pt.Y) != (ipNext.Y < pt.Y)) - { - if (ip.X >= pt.X) - { - if (ipNext.X > pt.X) result = 1 - result; - else - { - double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) - - (double)(ipNext.X - pt.X) * (ip.Y - pt.Y); - if (d == 0) return -1; - else if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result; - } - } - else - { - if (ipNext.X > pt.X) - { - double d = (double)(ip.X - pt.X) * (ipNext.Y - pt.Y) - - (double)(ipNext.X - pt.X) * (ip.Y - pt.Y); - if (d == 0) return -1; - else if ((d > 0) == (ipNext.Y > ip.Y)) result = 1 - result; - } - } - } - ip = ipNext; - } - return result; - } - //------------------------------------------------------------------------------ - - //See "The Point in Polygon Problem for Arbitrary Polygons" by Hormann & Agathos - //http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.88.5498&rep=rep1&type=pdf - private static int PointInPolygon(IntPoint pt, OutPt op) - { - //returns 0 if false, +1 if true, -1 if pt ON polygon boundary - int result = 0; - OutPt startOp = op; - cInt ptx = pt.X, pty = pt.Y; - cInt poly0x = op.Pt.X, poly0y = op.Pt.Y; - do - { - op = op.Next; - cInt poly1x = op.Pt.X, poly1y = op.Pt.Y; - - if (poly1y == pty) - { - if ((poly1x == ptx) || (poly0y == pty && - ((poly1x > ptx) == (poly0x < ptx)))) return -1; - } - if ((poly0y < pty) != (poly1y < pty)) - { - if (poly0x >= ptx) - { - if (poly1x > ptx) result = 1 - result; - else - { - double d = (double)(poly0x - ptx) * (poly1y - pty) - - (double)(poly1x - ptx) * (poly0y - pty); - if (d == 0) return -1; - if ((d > 0) == (poly1y > poly0y)) result = 1 - result; - } - } - else - { - if (poly1x > ptx) - { - double d = (double)(poly0x - ptx) * (poly1y - pty) - - (double)(poly1x - ptx) * (poly0y - pty); - if (d == 0) return -1; - if ((d > 0) == (poly1y > poly0y)) result = 1 - result; - } - } - } - poly0x = poly1x; poly0y = poly1y; - } while (startOp != op); - return result; - } - //------------------------------------------------------------------------------ - - private static bool Poly2ContainsPoly1(OutPt outPt1, OutPt outPt2) - { - OutPt op = outPt1; - do - { - //nb: PointInPolygon returns 0 if false, +1 if true, -1 if pt on polygon - int res = PointInPolygon(op.Pt, outPt2); - if (res >= 0) return res > 0; - op = op.Next; - } - while (op != outPt1); - return true; - } - //---------------------------------------------------------------------- - - private void FixupFirstLefts1(OutRec OldOutRec, OutRec NewOutRec) - { - foreach (OutRec outRec in m_PolyOuts) - { - OutRec firstLeft = ParseFirstLeft(outRec.FirstLeft); - if (outRec.Pts != null && firstLeft == OldOutRec) - { - if (Poly2ContainsPoly1(outRec.Pts, NewOutRec.Pts)) - outRec.FirstLeft = NewOutRec; - } - } - } - //---------------------------------------------------------------------- - - private void FixupFirstLefts2(OutRec innerOutRec, OutRec outerOutRec) - { - //A polygon has split into two such that one is now the inner of the other. - //It's possible that these polygons now wrap around other polygons, so check - //every polygon that's also contained by OuterOutRec's FirstLeft container - //(including nil) to see if they've become inner to the new inner polygon ... - OutRec orfl = outerOutRec.FirstLeft; - foreach (OutRec outRec in m_PolyOuts) - { - if (outRec.Pts == null || outRec == outerOutRec || outRec == innerOutRec) - continue; - OutRec firstLeft = ParseFirstLeft(outRec.FirstLeft); - if (firstLeft != orfl && firstLeft != innerOutRec && firstLeft != outerOutRec) - continue; - if (Poly2ContainsPoly1(outRec.Pts, innerOutRec.Pts)) - outRec.FirstLeft = innerOutRec; - else if (Poly2ContainsPoly1(outRec.Pts, outerOutRec.Pts)) - outRec.FirstLeft = outerOutRec; - else if (outRec.FirstLeft == innerOutRec || outRec.FirstLeft == outerOutRec) - outRec.FirstLeft = orfl; - } - } - //---------------------------------------------------------------------- - - private void FixupFirstLefts3(OutRec OldOutRec, OutRec NewOutRec) - { - //same as FixupFirstLefts1 but doesn't call Poly2ContainsPoly1() - foreach (OutRec outRec in m_PolyOuts) - { - OutRec firstLeft = ParseFirstLeft(outRec.FirstLeft); - if (outRec.Pts != null && firstLeft == OldOutRec) - outRec.FirstLeft = NewOutRec; - } - } - //---------------------------------------------------------------------- - - private static OutRec ParseFirstLeft(OutRec FirstLeft) - { - while (FirstLeft != null && FirstLeft.Pts == null) - FirstLeft = FirstLeft.FirstLeft; - return FirstLeft; - } - //------------------------------------------------------------------------------ - - private void JoinCommonEdges() - { - for (int i = 0; i < m_Joins.Count; i++) - { - Join join = m_Joins[i]; - - OutRec outRec1 = GetOutRec(join.OutPt1.Idx); - OutRec outRec2 = GetOutRec(join.OutPt2.Idx); - - if (outRec1.Pts == null || outRec2.Pts == null) continue; - if (outRec1.IsOpen || outRec2.IsOpen) continue; - - //get the polygon fragment with the correct hole state (FirstLeft) - //before calling JoinPoints() ... - OutRec holeStateRec; - if (outRec1 == outRec2) holeStateRec = outRec1; - else if (OutRec1RightOfOutRec2(outRec1, outRec2)) holeStateRec = outRec2; - else if (OutRec1RightOfOutRec2(outRec2, outRec1)) holeStateRec = outRec1; - else holeStateRec = GetLowermostRec(outRec1, outRec2); - - if (!JoinPoints(join, outRec1, outRec2)) continue; - - if (outRec1 == outRec2) - { - //instead of joining two polygons, we've just created a new one by - //splitting one polygon into two. - outRec1.Pts = join.OutPt1; - outRec1.BottomPt = null; - outRec2 = CreateOutRec(); - outRec2.Pts = join.OutPt2; - - //update all OutRec2.Pts Idx's ... - UpdateOutPtIdxs(outRec2); - - if (Poly2ContainsPoly1(outRec2.Pts, outRec1.Pts)) - { - //outRec1 contains outRec2 ... - outRec2.IsHole = !outRec1.IsHole; - outRec2.FirstLeft = outRec1; - - if (m_UsingPolyTree) FixupFirstLefts2(outRec2, outRec1); - - if ((outRec2.IsHole ^ ReverseSolution) == (Area(outRec2) > 0)) - ReversePolyPtLinks(outRec2.Pts); - - } - else if (Poly2ContainsPoly1(outRec1.Pts, outRec2.Pts)) - { - //outRec2 contains outRec1 ... - outRec2.IsHole = outRec1.IsHole; - outRec1.IsHole = !outRec2.IsHole; - outRec2.FirstLeft = outRec1.FirstLeft; - outRec1.FirstLeft = outRec2; - - if (m_UsingPolyTree) FixupFirstLefts2(outRec1, outRec2); - - if ((outRec1.IsHole ^ ReverseSolution) == (Area(outRec1) > 0)) - ReversePolyPtLinks(outRec1.Pts); - } - else - { - //the 2 polygons are completely separate ... - outRec2.IsHole = outRec1.IsHole; - outRec2.FirstLeft = outRec1.FirstLeft; - - //fixup FirstLeft pointers that may need reassigning to OutRec2 - if (m_UsingPolyTree) FixupFirstLefts1(outRec1, outRec2); - } - - } - else - { - //joined 2 polygons together ... - - outRec2.Pts = null; - outRec2.BottomPt = null; - outRec2.Idx = outRec1.Idx; - - outRec1.IsHole = holeStateRec.IsHole; - if (holeStateRec == outRec2) - outRec1.FirstLeft = outRec2.FirstLeft; - outRec2.FirstLeft = outRec1; - - //fixup FirstLeft pointers that may need reassigning to OutRec1 - if (m_UsingPolyTree) FixupFirstLefts3(outRec2, outRec1); - } - } - } - //------------------------------------------------------------------------------ - - private void UpdateOutPtIdxs(OutRec outrec) - { - OutPt op = outrec.Pts; - do - { - op.Idx = outrec.Idx; - op = op.Prev; - } - while (op != outrec.Pts); - } - //------------------------------------------------------------------------------ - - private void DoSimplePolygons() - { - int i = 0; - while (i < m_PolyOuts.Count) - { - OutRec outrec = m_PolyOuts[i++]; - OutPt op = outrec.Pts; - if (op == null || outrec.IsOpen) continue; - do //for each Pt in Polygon until duplicate found do ... - { - OutPt op2 = op.Next; - while (op2 != outrec.Pts) - { - if ((op.Pt == op2.Pt) && op2.Next != op && op2.Prev != op) - { - //split the polygon into two ... - OutPt op3 = op.Prev; - OutPt op4 = op2.Prev; - op.Prev = op4; - op4.Next = op; - op2.Prev = op3; - op3.Next = op2; - - outrec.Pts = op; - OutRec outrec2 = CreateOutRec(); - outrec2.Pts = op2; - UpdateOutPtIdxs(outrec2); - if (Poly2ContainsPoly1(outrec2.Pts, outrec.Pts)) - { - //OutRec2 is contained by OutRec1 ... - outrec2.IsHole = !outrec.IsHole; - outrec2.FirstLeft = outrec; - if (m_UsingPolyTree) FixupFirstLefts2(outrec2, outrec); - } - else - if (Poly2ContainsPoly1(outrec.Pts, outrec2.Pts)) - { - //OutRec1 is contained by OutRec2 ... - outrec2.IsHole = outrec.IsHole; - outrec.IsHole = !outrec2.IsHole; - outrec2.FirstLeft = outrec.FirstLeft; - outrec.FirstLeft = outrec2; - if (m_UsingPolyTree) FixupFirstLefts2(outrec, outrec2); - } - else - { - //the 2 polygons are separate ... - outrec2.IsHole = outrec.IsHole; - outrec2.FirstLeft = outrec.FirstLeft; - if (m_UsingPolyTree) FixupFirstLefts1(outrec, outrec2); - } - op2 = op; //ie get ready for the next iteration - } - op2 = op2.Next; - } - op = op.Next; - } - while (op != outrec.Pts); - } - } - //------------------------------------------------------------------------------ - - public static double Area(Path poly) - { - int cnt = (int)poly.Count; - if (cnt < 3) return 0; - double a = 0; - for (int i = 0, j = cnt - 1; i < cnt; ++i) - { - a += ((double)poly[j].X + poly[i].X) * ((double)poly[j].Y - poly[i].Y); - j = i; - } - return -a * 0.5; - } - //------------------------------------------------------------------------------ - - internal double Area(OutRec outRec) - { - return Area(outRec.Pts); - } - //------------------------------------------------------------------------------ - - internal double Area(OutPt op) - { - OutPt opFirst = op; - if (op == null) return 0; - double a = 0; - do - { - a = a + (double)(op.Prev.Pt.X + op.Pt.X) * (double)(op.Prev.Pt.Y - op.Pt.Y); - op = op.Next; - } while (op != opFirst); - return a * 0.5; - } - - //------------------------------------------------------------------------------ - // SimplifyPolygon functions ... - // Convert self-intersecting polygons into simple polygons - //------------------------------------------------------------------------------ - - public static Paths SimplifyPolygon(Path poly, - PolyFillType fillType = PolyFillType.pftEvenOdd) - { - Paths result = new Paths(); - Clipper c = new Clipper(); - c.StrictlySimple = true; - c.AddPath(poly, PolyType.ptSubject, true); - c.Execute(ClipType.ctUnion, result, fillType, fillType); - return result; - } - //------------------------------------------------------------------------------ - - public static Paths SimplifyPolygons(Paths polys, - PolyFillType fillType = PolyFillType.pftEvenOdd) - { - Paths result = new Paths(); - Clipper c = new Clipper(); - c.StrictlySimple = true; - c.AddPaths(polys, PolyType.ptSubject, true); - c.Execute(ClipType.ctUnion, result, fillType, fillType); - return result; - } - //------------------------------------------------------------------------------ - - private static double DistanceSqrd(IntPoint pt1, IntPoint pt2) - { - double dx = ((double)pt1.X - pt2.X); - double dy = ((double)pt1.Y - pt2.Y); - return (dx * dx + dy * dy); - } - //------------------------------------------------------------------------------ - - private static double DistanceFromLineSqrd(IntPoint pt, IntPoint ln1, IntPoint ln2) - { - //The equation of a line in general form (Ax + By + C = 0) - //given 2 points (x¹,y¹) & (x²,y²) is ... - //(y¹ - y²)x + (x² - x¹)y + (y² - y¹)x¹ - (x² - x¹)y¹ = 0 - //A = (y¹ - y²); B = (x² - x¹); C = (y² - y¹)x¹ - (x² - x¹)y¹ - //perpendicular distance of point (x³,y³) = (Ax³ + By³ + C)/Sqrt(A² + B²) - //see http://en.wikipedia.org/wiki/Perpendicular_distance - double A = ln1.Y - ln2.Y; - double B = ln2.X - ln1.X; - double C = A * ln1.X + B * ln1.Y; - C = A * pt.X + B * pt.Y - C; - return (C * C) / (A * A + B * B); - } - //--------------------------------------------------------------------------- - - private static bool SlopesNearCollinear(IntPoint pt1, - IntPoint pt2, IntPoint pt3, double distSqrd) - { - //this function is more accurate when the point that's GEOMETRICALLY - //between the other 2 points is the one that's tested for distance. - //nb: with 'spikes', either pt1 or pt3 is geometrically between the other pts - if (Math.Abs(pt1.X - pt2.X) > Math.Abs(pt1.Y - pt2.Y)) - { - if ((pt1.X > pt2.X) == (pt1.X < pt3.X)) - return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd; - else if ((pt2.X > pt1.X) == (pt2.X < pt3.X)) - return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd; - else - return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd; - } - else - { - if ((pt1.Y > pt2.Y) == (pt1.Y < pt3.Y)) - return DistanceFromLineSqrd(pt1, pt2, pt3) < distSqrd; - else if ((pt2.Y > pt1.Y) == (pt2.Y < pt3.Y)) - return DistanceFromLineSqrd(pt2, pt1, pt3) < distSqrd; - else - return DistanceFromLineSqrd(pt3, pt1, pt2) < distSqrd; - } - } - //------------------------------------------------------------------------------ - - private static bool PointsAreClose(IntPoint pt1, IntPoint pt2, double distSqrd) - { - double dx = (double)pt1.X - pt2.X; - double dy = (double)pt1.Y - pt2.Y; - return ((dx * dx) + (dy * dy) <= distSqrd); - } - //------------------------------------------------------------------------------ - - private static OutPt ExcludeOp(OutPt op) - { - OutPt result = op.Prev; - result.Next = op.Next; - op.Next.Prev = result; - result.Idx = 0; - return result; - } - //------------------------------------------------------------------------------ - - public static Path CleanPolygon(Path path, double distance = 1.415) - { - //distance = proximity in units/pixels below which vertices will be stripped. - //Default ~= sqrt(2) so when adjacent vertices or semi-adjacent vertices have - //both x & y coords within 1 unit, then the second vertex will be stripped. - - int cnt = path.Count; - - if (cnt == 0) return new Path(); - - OutPt[] outPts = new OutPt[cnt]; - for (int i = 0; i < cnt; ++i) outPts[i] = new OutPt(); - - for (int i = 0; i < cnt; ++i) - { - outPts[i].Pt = path[i]; - outPts[i].Next = outPts[(i + 1) % cnt]; - outPts[i].Next.Prev = outPts[i]; - outPts[i].Idx = 0; - } - - double distSqrd = distance * distance; - OutPt op = outPts[0]; - while (op.Idx == 0 && op.Next != op.Prev) - { - if (PointsAreClose(op.Pt, op.Prev.Pt, distSqrd)) - { - op = ExcludeOp(op); - cnt--; - } - else if (PointsAreClose(op.Prev.Pt, op.Next.Pt, distSqrd)) - { - ExcludeOp(op.Next); - op = ExcludeOp(op); - cnt -= 2; - } - else if (SlopesNearCollinear(op.Prev.Pt, op.Pt, op.Next.Pt, distSqrd)) - { - op = ExcludeOp(op); - cnt--; - } - else - { - op.Idx = 1; - op = op.Next; - } - } - - if (cnt < 3) cnt = 0; - Path result = new Path(cnt); - for (int i = 0; i < cnt; ++i) - { - result.Add(op.Pt); - op = op.Next; - } - outPts = null; - return result; - } - //------------------------------------------------------------------------------ - - public static Paths CleanPolygons(Paths polys, - double distance = 1.415) - { - Paths result = new Paths(polys.Count); - for (int i = 0; i < polys.Count; i++) - result.Add(CleanPolygon(polys[i], distance)); - return result; - } - //------------------------------------------------------------------------------ - - internal static Paths Minkowski(Path pattern, Path path, bool IsSum, bool IsClosed) - { - int delta = (IsClosed ? 1 : 0); - int polyCnt = pattern.Count; - int pathCnt = path.Count; - Paths result = new Paths(pathCnt); - if (IsSum) - for (int i = 0; i < pathCnt; i++) - { - Path p = new Path(polyCnt); - foreach (IntPoint ip in pattern) - p.Add(new IntPoint(path[i].X + ip.X, path[i].Y + ip.Y)); - result.Add(p); - } - else - for (int i = 0; i < pathCnt; i++) - { - Path p = new Path(polyCnt); - foreach (IntPoint ip in pattern) - p.Add(new IntPoint(path[i].X - ip.X, path[i].Y - ip.Y)); - result.Add(p); - } - - Paths quads = new Paths((pathCnt + delta) * (polyCnt + 1)); - for (int i = 0; i < pathCnt - 1 + delta; i++) - for (int j = 0; j < polyCnt; j++) - { - Path quad = new Path(4); - quad.Add(result[i % pathCnt][j % polyCnt]); - quad.Add(result[(i + 1) % pathCnt][j % polyCnt]); - quad.Add(result[(i + 1) % pathCnt][(j + 1) % polyCnt]); - quad.Add(result[i % pathCnt][(j + 1) % polyCnt]); - if (!Orientation(quad)) quad.Reverse(); - quads.Add(quad); - } - return quads; - } - //------------------------------------------------------------------------------ - - public static Paths MinkowskiSum(Path pattern, Path path, bool pathIsClosed) - { - Paths paths = Minkowski(pattern, path, true, pathIsClosed); - Clipper c = new Clipper(); - c.AddPaths(paths, PolyType.ptSubject, true); - c.Execute(ClipType.ctUnion, paths, PolyFillType.pftNonZero, PolyFillType.pftNonZero); - return paths; - } - //------------------------------------------------------------------------------ - - private static Path TranslatePath(Path path, IntPoint delta) - { - Path outPath = new Path(path.Count); - for (int i = 0; i < path.Count; i++) - outPath.Add(new IntPoint(path[i].X + delta.X, path[i].Y + delta.Y)); - return outPath; - } - //------------------------------------------------------------------------------ - - public static Paths MinkowskiSum(Path pattern, Paths paths, bool pathIsClosed) - { - Paths solution = new Paths(); - Clipper c = new Clipper(); - for (int i = 0; i < paths.Count; ++i) - { - Paths tmp = Minkowski(pattern, paths[i], true, pathIsClosed); - c.AddPaths(tmp, PolyType.ptSubject, true); - if (pathIsClosed) - { - Path path = TranslatePath(paths[i], pattern[0]); - c.AddPath(path, PolyType.ptClip, true); - } - } - c.Execute(ClipType.ctUnion, solution, - PolyFillType.pftNonZero, PolyFillType.pftNonZero); - return solution; - } - //------------------------------------------------------------------------------ - - public static Paths MinkowskiDiff(Path poly1, Path poly2) - { - Paths paths = Minkowski(poly1, poly2, false, true); - Clipper c = new Clipper(); - c.AddPaths(paths, PolyType.ptSubject, true); - c.Execute(ClipType.ctUnion, paths, PolyFillType.pftNonZero, PolyFillType.pftNonZero); - return paths; - } - //------------------------------------------------------------------------------ - - internal enum NodeType { ntAny, ntOpen, ntClosed }; - - public static Paths PolyTreeToPaths(PolyTree polytree) - { - - Paths result = new Paths(); - result.Capacity = polytree.Total; - AddPolyNodeToPaths(polytree, NodeType.ntAny, result); - return result; - } - //------------------------------------------------------------------------------ - - internal static void AddPolyNodeToPaths(PolyNode polynode, NodeType nt, Paths paths) - { - bool match = true; - switch (nt) - { - case NodeType.ntOpen: return; - case NodeType.ntClosed: match = !polynode.IsOpen; break; - default: break; - } - - if (polynode.m_polygon.Count > 0 && match) - paths.Add(polynode.m_polygon); - foreach (PolyNode pn in polynode.Childs) - AddPolyNodeToPaths(pn, nt, paths); - } - //------------------------------------------------------------------------------ - - public static Paths OpenPathsFromPolyTree(PolyTree polytree) - { - Paths result = new Paths(); - result.Capacity = polytree.ChildCount; - for (int i = 0; i < polytree.ChildCount; i++) - if (polytree.Childs[i].IsOpen) - result.Add(polytree.Childs[i].m_polygon); - return result; - } - //------------------------------------------------------------------------------ - - public static Paths ClosedPathsFromPolyTree(PolyTree polytree) - { - Paths result = new Paths(); - result.Capacity = polytree.Total; - AddPolyNodeToPaths(polytree, NodeType.ntClosed, result); - return result; - } - //------------------------------------------------------------------------------ - - } //end Clipper - - public class ClipperOffset - { - private Paths m_destPolys; - private Path m_srcPoly; - private Path m_destPoly; - private List m_normals = new List(); - private double m_delta, m_sinA, m_sin, m_cos; - private double m_miterLim, m_StepsPerRad; - - private IntPoint m_lowest; - private PolyNode m_polyNodes = new PolyNode(); - - public double ArcTolerance { get; set; } - public double MiterLimit { get; set; } - - private const double two_pi = Math.PI * 2; - private const double def_arc_tolerance = 0.25; - - public ClipperOffset( - double miterLimit = 2.0, double arcTolerance = def_arc_tolerance) - { - MiterLimit = miterLimit; - ArcTolerance = arcTolerance; - m_lowest.X = -1; - } - //------------------------------------------------------------------------------ - - public void Clear() - { - m_polyNodes.Childs.Clear(); - m_lowest.X = -1; - } - //------------------------------------------------------------------------------ - - internal static cInt Round(double value) - { - return value < 0 ? (cInt)(value - 0.5) : (cInt)(value + 0.5); - } - //------------------------------------------------------------------------------ - - public void AddPath(Path path, JoinType joinType, EndType endType) - { - int highI = path.Count - 1; - if (highI < 0) return; - PolyNode newNode = new PolyNode(); - newNode.m_jointype = joinType; - newNode.m_endtype = endType; - - //strip duplicate points from path and also get index to the lowest point ... - if (endType == EndType.etClosedLine || endType == EndType.etClosedPolygon) - while (highI > 0 && path[0] == path[highI]) highI--; - newNode.m_polygon.Capacity = highI + 1; - newNode.m_polygon.Add(path[0]); - int j = 0, k = 0; - for (int i = 1; i <= highI; i++) - if (newNode.m_polygon[j] != path[i]) - { - j++; - newNode.m_polygon.Add(path[i]); - if (path[i].Y > newNode.m_polygon[k].Y || - (path[i].Y == newNode.m_polygon[k].Y && - path[i].X < newNode.m_polygon[k].X)) k = j; - } - if (endType == EndType.etClosedPolygon && j < 2) return; - - m_polyNodes.AddChild(newNode); - - //if this path's lowest pt is lower than all the others then update m_lowest - if (endType != EndType.etClosedPolygon) return; - if (m_lowest.X < 0) - m_lowest = new IntPoint(m_polyNodes.ChildCount - 1, k); - else - { - IntPoint ip = m_polyNodes.Childs[(int)m_lowest.X].m_polygon[(int)m_lowest.Y]; - if (newNode.m_polygon[k].Y > ip.Y || - (newNode.m_polygon[k].Y == ip.Y && - newNode.m_polygon[k].X < ip.X)) - m_lowest = new IntPoint(m_polyNodes.ChildCount - 1, k); - } - } - //------------------------------------------------------------------------------ - - public void AddPaths(Paths paths, JoinType joinType, EndType endType) - { - foreach (Path p in paths) - AddPath(p, joinType, endType); - } - //------------------------------------------------------------------------------ - - private void FixOrientations() - { - //fixup orientations of all closed paths if the orientation of the - //closed path with the lowermost vertex is wrong ... - if (m_lowest.X >= 0 && - !Clipper.Orientation(m_polyNodes.Childs[(int)m_lowest.X].m_polygon)) - { - for (int i = 0; i < m_polyNodes.ChildCount; i++) - { - PolyNode node = m_polyNodes.Childs[i]; - if (node.m_endtype == EndType.etClosedPolygon || - (node.m_endtype == EndType.etClosedLine && - Clipper.Orientation(node.m_polygon))) - node.m_polygon.Reverse(); - } - } - else - { - for (int i = 0; i < m_polyNodes.ChildCount; i++) - { - PolyNode node = m_polyNodes.Childs[i]; - if (node.m_endtype == EndType.etClosedLine && - !Clipper.Orientation(node.m_polygon)) - node.m_polygon.Reverse(); - } - } - } - //------------------------------------------------------------------------------ - - internal static DoublePoint GetUnitNormal(IntPoint pt1, IntPoint pt2) - { - double dx = (pt2.X - pt1.X); - double dy = (pt2.Y - pt1.Y); - if ((dx == 0) && (dy == 0)) return new DoublePoint(); - - double f = 1 * 1.0 / Math.Sqrt(dx * dx + dy * dy); - dx *= f; - dy *= f; - - return new DoublePoint(dy, -dx); - } - //------------------------------------------------------------------------------ - - private void DoOffset(double delta) - { - m_destPolys = new Paths(); - m_delta = delta; - - //if Zero offset, just copy any CLOSED polygons to m_p and return ... - if (ClipperBase.near_zero(delta)) - { - m_destPolys.Capacity = m_polyNodes.ChildCount; - for (int i = 0; i < m_polyNodes.ChildCount; i++) - { - PolyNode node = m_polyNodes.Childs[i]; - if (node.m_endtype == EndType.etClosedPolygon) - m_destPolys.Add(node.m_polygon); - } - return; - } - - //see offset_triginometry3.svg in the documentation folder ... - if (MiterLimit > 2) m_miterLim = 2 / (MiterLimit * MiterLimit); - else m_miterLim = 0.5; - - double y; - if (ArcTolerance <= 0.0) - y = def_arc_tolerance; - else if (ArcTolerance > Math.Abs(delta) * def_arc_tolerance) - y = Math.Abs(delta) * def_arc_tolerance; - else - y = ArcTolerance; - //see offset_triginometry2.svg in the documentation folder ... - double steps = Math.PI / Math.Acos(1 - y / Math.Abs(delta)); - m_sin = Math.Sin(two_pi / steps); - m_cos = Math.Cos(two_pi / steps); - m_StepsPerRad = steps / two_pi; - if (delta < 0.0) m_sin = -m_sin; - - m_destPolys.Capacity = m_polyNodes.ChildCount * 2; - for (int i = 0; i < m_polyNodes.ChildCount; i++) - { - PolyNode node = m_polyNodes.Childs[i]; - m_srcPoly = node.m_polygon; - - int len = m_srcPoly.Count; - - if (len == 0 || (delta <= 0 && (len < 3 || - node.m_endtype != EndType.etClosedPolygon))) - continue; - - m_destPoly = new Path(); - - if (len == 1) - { - if (node.m_jointype == JoinType.jtRound) - { - double X = 1.0, Y = 0.0; - for (int j = 1; j <= steps; j++) - { - m_destPoly.Add(new IntPoint( - Round(m_srcPoly[0].X + X * delta), - Round(m_srcPoly[0].Y + Y * delta))); - double X2 = X; - X = X * m_cos - m_sin * Y; - Y = X2 * m_sin + Y * m_cos; - } - } - else - { - double X = -1.0, Y = -1.0; - for (int j = 0; j < 4; ++j) - { - m_destPoly.Add(new IntPoint( - Round(m_srcPoly[0].X + X * delta), - Round(m_srcPoly[0].Y + Y * delta))); - if (X < 0) X = 1; - else if (Y < 0) Y = 1; - else X = -1; - } - } - m_destPolys.Add(m_destPoly); - continue; - } - - //build m_normals ... - m_normals.Clear(); - m_normals.Capacity = len; - for (int j = 0; j < len - 1; j++) - m_normals.Add(GetUnitNormal(m_srcPoly[j], m_srcPoly[j + 1])); - if (node.m_endtype == EndType.etClosedLine || - node.m_endtype == EndType.etClosedPolygon) - m_normals.Add(GetUnitNormal(m_srcPoly[len - 1], m_srcPoly[0])); - else - m_normals.Add(new DoublePoint(m_normals[len - 2])); - - if (node.m_endtype == EndType.etClosedPolygon) - { - int k = len - 1; - for (int j = 0; j < len; j++) - OffsetPoint(j, ref k, node.m_jointype); - m_destPolys.Add(m_destPoly); - } - else if (node.m_endtype == EndType.etClosedLine) - { - int k = len - 1; - for (int j = 0; j < len; j++) - OffsetPoint(j, ref k, node.m_jointype); - m_destPolys.Add(m_destPoly); - m_destPoly = new Path(); - //re-build m_normals ... - DoublePoint n = m_normals[len - 1]; - for (int j = len - 1; j > 0; j--) - m_normals[j] = new DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y); - m_normals[0] = new DoublePoint(-n.X, -n.Y); - k = 0; - for (int j = len - 1; j >= 0; j--) - OffsetPoint(j, ref k, node.m_jointype); - m_destPolys.Add(m_destPoly); - } - else - { - int k = 0; - for (int j = 1; j < len - 1; ++j) - OffsetPoint(j, ref k, node.m_jointype); - - IntPoint pt1; - if (node.m_endtype == EndType.etOpenButt) - { - int j = len - 1; - pt1 = new IntPoint((cInt)Round(m_srcPoly[j].X + m_normals[j].X * - delta), (cInt)Round(m_srcPoly[j].Y + m_normals[j].Y * delta)); - m_destPoly.Add(pt1); - pt1 = new IntPoint((cInt)Round(m_srcPoly[j].X - m_normals[j].X * - delta), (cInt)Round(m_srcPoly[j].Y - m_normals[j].Y * delta)); - m_destPoly.Add(pt1); - } - else - { - int j = len - 1; - k = len - 2; - m_sinA = 0; - m_normals[j] = new DoublePoint(-m_normals[j].X, -m_normals[j].Y); - if (node.m_endtype == EndType.etOpenSquare) - DoSquare(j, k); - else - DoRound(j, k); - } - - //re-build m_normals ... - for (int j = len - 1; j > 0; j--) - m_normals[j] = new DoublePoint(-m_normals[j - 1].X, -m_normals[j - 1].Y); - - m_normals[0] = new DoublePoint(-m_normals[1].X, -m_normals[1].Y); - - k = len - 1; - for (int j = k - 1; j > 0; --j) - OffsetPoint(j, ref k, node.m_jointype); - - if (node.m_endtype == EndType.etOpenButt) - { - pt1 = new IntPoint((cInt)Round(m_srcPoly[0].X - m_normals[0].X * delta), - (cInt)Round(m_srcPoly[0].Y - m_normals[0].Y * delta)); - m_destPoly.Add(pt1); - pt1 = new IntPoint((cInt)Round(m_srcPoly[0].X + m_normals[0].X * delta), - (cInt)Round(m_srcPoly[0].Y + m_normals[0].Y * delta)); - m_destPoly.Add(pt1); - } - else - { - k = 1; - m_sinA = 0; - if (node.m_endtype == EndType.etOpenSquare) - DoSquare(0, 1); - else - DoRound(0, 1); - } - m_destPolys.Add(m_destPoly); - } - } - } - //------------------------------------------------------------------------------ - - public void Execute(ref Paths solution, double delta) - { - solution.Clear(); - FixOrientations(); - DoOffset(delta); - //now clean up 'corners' ... - Clipper clpr = new Clipper(); - clpr.AddPaths(m_destPolys, PolyType.ptSubject, true); - if (delta > 0) - { - clpr.Execute(ClipType.ctUnion, solution, - PolyFillType.pftPositive, PolyFillType.pftPositive); - } - else - { - IntRect r = Clipper.GetBounds(m_destPolys); - Path outer = new Path(4); - - outer.Add(new IntPoint(r.left - 10, r.bottom + 10)); - outer.Add(new IntPoint(r.right + 10, r.bottom + 10)); - outer.Add(new IntPoint(r.right + 10, r.top - 10)); - outer.Add(new IntPoint(r.left - 10, r.top - 10)); - - clpr.AddPath(outer, PolyType.ptSubject, true); - clpr.ReverseSolution = true; - clpr.Execute(ClipType.ctUnion, solution, PolyFillType.pftNegative, PolyFillType.pftNegative); - if (solution.Count > 0) solution.RemoveAt(0); - } - } - //------------------------------------------------------------------------------ - - public void Execute(ref PolyTree solution, double delta) - { - solution.Clear(); - FixOrientations(); - DoOffset(delta); - - //now clean up 'corners' ... - Clipper clpr = new Clipper(); - clpr.AddPaths(m_destPolys, PolyType.ptSubject, true); - if (delta > 0) - { - clpr.Execute(ClipType.ctUnion, solution, - PolyFillType.pftPositive, PolyFillType.pftPositive); - } - else - { - IntRect r = Clipper.GetBounds(m_destPolys); - Path outer = new Path(4); - - outer.Add(new IntPoint(r.left - 10, r.bottom + 10)); - outer.Add(new IntPoint(r.right + 10, r.bottom + 10)); - outer.Add(new IntPoint(r.right + 10, r.top - 10)); - outer.Add(new IntPoint(r.left - 10, r.top - 10)); - - clpr.AddPath(outer, PolyType.ptSubject, true); - clpr.ReverseSolution = true; - clpr.Execute(ClipType.ctUnion, solution, PolyFillType.pftNegative, PolyFillType.pftNegative); - //remove the outer PolyNode rectangle ... - if (solution.ChildCount == 1 && solution.Childs[0].ChildCount > 0) - { - PolyNode outerNode = solution.Childs[0]; - solution.Childs.Capacity = outerNode.ChildCount; - solution.Childs[0] = outerNode.Childs[0]; - solution.Childs[0].m_Parent = solution; - for (int i = 1; i < outerNode.ChildCount; i++) - solution.AddChild(outerNode.Childs[i]); - } - else - solution.Clear(); - } - } - //------------------------------------------------------------------------------ - - void OffsetPoint(int j, ref int k, JoinType jointype) - { - //cross product ... - m_sinA = (m_normals[k].X * m_normals[j].Y - m_normals[j].X * m_normals[k].Y); - - if (Math.Abs(m_sinA * m_delta) < 1.0) - { - //dot product ... - double cosA = (m_normals[k].X * m_normals[j].X + m_normals[j].Y * m_normals[k].Y); - if (cosA > 0) // angle ==> 0 degrees - { - m_destPoly.Add(new IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta), - Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta))); - return; - } - //else angle ==> 180 degrees - } - else if (m_sinA > 1.0) m_sinA = 1.0; - else if (m_sinA < -1.0) m_sinA = -1.0; - - if (m_sinA * m_delta < 0) - { - m_destPoly.Add(new IntPoint(Round(m_srcPoly[j].X + m_normals[k].X * m_delta), - Round(m_srcPoly[j].Y + m_normals[k].Y * m_delta))); - m_destPoly.Add(m_srcPoly[j]); - m_destPoly.Add(new IntPoint(Round(m_srcPoly[j].X + m_normals[j].X * m_delta), - Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta))); - } - else - switch (jointype) - { - case JoinType.jtMiter: - { - double r = 1 + (m_normals[j].X * m_normals[k].X + - m_normals[j].Y * m_normals[k].Y); - if (r >= m_miterLim) DoMiter(j, k, r); else DoSquare(j, k); - break; - } - case JoinType.jtSquare: DoSquare(j, k); break; - case JoinType.jtRound: DoRound(j, k); break; - } - k = j; - } - //------------------------------------------------------------------------------ - - internal void DoSquare(int j, int k) - { - double dx = Math.Tan(Math.Atan2(m_sinA, - m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y) / 4); - m_destPoly.Add(new IntPoint( - Round(m_srcPoly[j].X + m_delta * (m_normals[k].X - m_normals[k].Y * dx)), - Round(m_srcPoly[j].Y + m_delta * (m_normals[k].Y + m_normals[k].X * dx)))); - m_destPoly.Add(new IntPoint( - Round(m_srcPoly[j].X + m_delta * (m_normals[j].X + m_normals[j].Y * dx)), - Round(m_srcPoly[j].Y + m_delta * (m_normals[j].Y - m_normals[j].X * dx)))); - } - //------------------------------------------------------------------------------ - - internal void DoMiter(int j, int k, double r) - { - double q = m_delta / r; - m_destPoly.Add(new IntPoint(Round(m_srcPoly[j].X + (m_normals[k].X + m_normals[j].X) * q), - Round(m_srcPoly[j].Y + (m_normals[k].Y + m_normals[j].Y) * q))); - } - //------------------------------------------------------------------------------ - - internal void DoRound(int j, int k) - { - double a = Math.Atan2(m_sinA, - m_normals[k].X * m_normals[j].X + m_normals[k].Y * m_normals[j].Y); - int steps = Math.Max((int)Round(m_StepsPerRad * Math.Abs(a)), 1); - - double X = m_normals[k].X, Y = m_normals[k].Y, X2; - for (int i = 0; i < steps; ++i) - { - m_destPoly.Add(new IntPoint( - Round(m_srcPoly[j].X + X * m_delta), - Round(m_srcPoly[j].Y + Y * m_delta))); - X2 = X; - X = X * m_cos - m_sin * Y; - Y = X2 * m_sin + Y * m_cos; - } - m_destPoly.Add(new IntPoint( - Round(m_srcPoly[j].X + m_normals[j].X * m_delta), - Round(m_srcPoly[j].Y + m_normals[j].Y * m_delta))); - } - //------------------------------------------------------------------------------ - } - - class ClipperException : Exception - { - public ClipperException(string description) : base(description) { } - } - //------------------------------------------------------------------------------ - -} //end ClipperLib namespace diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/clipper.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/clipper.cs.meta deleted file mode 100644 index 27fe38e8..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/BoostClipper/clipper.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e13902fa43e71754f9e04b2f44d5f71b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping.meta deleted file mode 100644 index 08d72a80..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: be8365f59449a0a4aa11aa4ad834006f -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/Contour.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/Contour.cs deleted file mode 100644 index 8ff7a431..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/Contour.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -namespace PathBerserker2d -{ - internal class Contour : IEnumerable - { - public int VertexCount { get { return verts.Count; } } - public bool IsEmpty { get { return verts.Count == 0; } } - public bool IsClosed { get; private set; } - public List Verts => verts; - - private List verts; - - public Contour(List verticies, bool isClosed = true) - { - this.verts = verticies; - IsClosed = isClosed; - } - - public Contour(IEnumerable verticies, bool isClosed = true) - { - this.verts = new List(verticies); - IsClosed = isClosed; - } - - public Vector2 this[int key] - { - get { return verts[key]; } - } - - public IEnumerator GetEnumerator() - { - return ((IEnumerable)verts).GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return ((IEnumerable)verts).GetEnumerator(); - } - - public double SignedArea() - { - double area = 0; - for (int i = 0, j = verts.Count - 1; i < verts.Count; j = i, i++) - area += (verts[i].x - verts[j].x) * - (verts[i].y + verts[j].y); - return area / 2.0; - } - - public double Area() - { - return Math.Abs(SignedArea()); - } - - public void MakeCW() - { - if (!IsCW()) - verts.Reverse(); - } - - public void Invert() - { - verts.Reverse(); - } - - public bool IsCW() - { - Vector2 lowestPoint = verts[0]; - int lowestPointIndex = 0; - for (int i = 1; i < VertexCount; i++) - { - if (lowestPoint.y > verts[i].y || - lowestPoint.y == verts[i].y && lowestPoint.x < verts[i].x) - { - lowestPoint = verts[i]; - lowestPointIndex = i; - } - } - - Vector2 prevPoint = lowestPointIndex == 0 ? verts[VertexCount - 1] : verts[lowestPointIndex - 1]; - Vector2 nextPoint = lowestPointIndex == VertexCount - 1 ? verts[0] : verts[lowestPointIndex + 1]; - - return ((lowestPoint.x - prevPoint.x) * (nextPoint.y - prevPoint.y) - (nextPoint.x - prevPoint.x) * (lowestPoint.y - prevPoint.y)) < 0; - } - - public bool PointInContour(Vector2 point) - { - bool c = false; - for (int i = 0, j = VertexCount - 1; i < VertexCount; j = i++) - { - if (((verts[i].y > point.y) != (verts[j].y > point.y)) && - (point.x < (verts[j].x - verts[i].x) * (point.y - verts[i].y) / (verts[j].y - verts[i].y) + verts[i].x)) - c = !c; - } - return c; - } - - public bool Contains(Contour other) - { - foreach (var v in other) - if (!PointInContour(v)) - return false; - return true; - } - - public void Draw() - { - for (int i = IsClosed ? 0 : 1, j = IsClosed ? VertexCount - 1 : 0; i < VertexCount; j = i, i++) - { - DebugDrawingExtensions.DrawArrow(verts[i], verts[j]); - } - } - - public void Simplify(float tolerance) - { - ExtendedGeometry.MergeCloseVerts(verts, tolerance); - this.verts = ExtendedGeometry.SimplifyContour(this.verts, tolerance); - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/Contour.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/Contour.cs.meta deleted file mode 100644 index 543c78cd..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/Contour.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: dad3920a5830b8e438bc7c5d3c92636d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/IClipper.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/IClipper.cs deleted file mode 100644 index 3e008838..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/IClipper.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace PathBerserker2d -{ - public enum ResultType { NoOverlap, Clipped }; - public enum BoolOpType { INTERSECTION, UNION, DIFFERENCE }; - - interface IClipper - { - ResultType Compute(Polygon sp, Polygon cp, BoolOpType op, out List result, bool includeOpenPolygons = false); - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/IClipper.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/IClipper.cs.meta deleted file mode 100644 index 4e71a75b..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/IClipper.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e6f0c0aa6263ff54ca7f6be8694b9fa7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/Polygon.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/Polygon.cs deleted file mode 100644 index b8693876..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/Polygon.cs +++ /dev/null @@ -1,162 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -namespace PathBerserker2d -{ - internal class Polygon : System.IEquatable, IEnumerable - { - public Contour Hull => hull; - public List Holes { get; set; } - public bool IsEmpty => hull.IsEmpty; - public float XMax => boundingRect.xMax; - public Rect BoundingRect => boundingRect; - - private Contour hull; - private Rect boundingRect; - - public Polygon(Contour hull, List holes) - { - this.hull = hull; - this.Holes = holes; - - UpdateBounds(); - } - - public Polygon(Contour hull) - { - this.hull = hull; - this.Holes = new List(0); - - UpdateBounds(); - } - - public Polygon() - { - this.hull = new Contour(new Vector2[0]); - this.Holes = new List(0); - } - - public bool Equals(Polygon other) - { - return other == this; - } - - public void AddAsChild(Polygon other) - { - this.Holes.Add(other.hull); - this.Holes.AddRange(other.Holes); - } - - public int TotalVertCount() - { - int result = hull.VertexCount; - foreach (var path in Holes) - { - result += path.VertexCount; - } - return result; - } - - public bool BoundsOverlap(Polygon other) - { - return boundingRect.Overlaps(other.boundingRect); - } - - public bool PointInPolyon(Vector2 point) - { - return boundingRect.Contains(point) && hull.PointInContour(point); - } - - public bool Contains(Polygon other) - { - foreach (var v in other.hull) - { - if (!PointInPolyon(v)) - return false; - } - return true; - } - - public bool Contains(Contour other) - { - foreach (var v in other) - { - if (!PointInPolyon(v)) - return false; - } - return true; - } - - public void Draw() - { - Gizmos.color = Color.green; - hull.Draw(); - - Gizmos.color = Color.yellow; - foreach (var contour in this.Holes) - { - contour.Draw(); - } - } - - public IEnumerator GetEnumerator() - { - yield return hull; - foreach (var hole in Holes) - yield return hole; - } - - IEnumerator IEnumerable.GetEnumerator() - { - yield return hull; - foreach (var hole in Holes) - yield return hole; - } - - public void UpdateBounds() - { - if (hull.VertexCount == 0) - return; - - Vector2 min = hull[0]; - Vector2 max = hull[0]; - for (int iVert = 1; iVert < hull.VertexCount; iVert++) - { - min = Vector2.Min(hull[iVert], min); - max = Vector2.Max(hull[iVert], max); - } - // add some fudge - Vector2 fudge = new Vector2(0.0001f, 0.0001f); - boundingRect = new Rect(min - fudge, max - min + fudge * 2); - } - - public void Simplify(float tolerance) - { - hull.Simplify(tolerance); - foreach (var hole in Holes) - { - hole.Simplify(tolerance); - } - UpdateBounds(); - } - - public double SignedArea() - { - double area = Hull.SignedArea(); - foreach (var hole in Holes) - area += hole.SignedArea(); - return area; - } - - public void EnsureCWOrdering() - { - if (Hull.IsCW()) - return; - - Hull.Invert(); - foreach (var child in Holes) - child.Invert(); - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/Polygon.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/Polygon.cs.meta deleted file mode 100644 index e69cee88..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Clipping/Polygon.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 24eb0a7c0c44eff48b61ea1d3120dd18 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/CustomAttributes.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/CustomAttributes.meta deleted file mode 100644 index 221d48cf..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/CustomAttributes.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 81309357b39e41942b7819480b292f4a -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/CustomAttributes/ReadOnlyAttribute.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/CustomAttributes/ReadOnlyAttribute.cs deleted file mode 100644 index 376e8f16..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/CustomAttributes/ReadOnlyAttribute.cs +++ /dev/null @@ -1,9 +0,0 @@ -using UnityEngine; - -namespace PathBerserker2d -{ - internal class ReadOnlyAttribute : PropertyAttribute - { - - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/CustomAttributes/ReadOnlyAttribute.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/CustomAttributes/ReadOnlyAttribute.cs.meta deleted file mode 100644 index 731eff77..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/CustomAttributes/ReadOnlyAttribute.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 334716afcf3386f4b8200ed669e80282 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/CustomAttributes/ScriptExecutionOrderAttribute.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/CustomAttributes/ScriptExecutionOrderAttribute.cs deleted file mode 100644 index 1b9dc4da..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/CustomAttributes/ScriptExecutionOrderAttribute.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace PathBerserker2d -{ - [AttributeUsage(AttributeTargets.Class)] - internal class ScriptExecutionOrderAttribute : Attribute - { - private int order = 0; - - public ScriptExecutionOrderAttribute(int order) - { - this.order = order; - } - - public int GetOrder() - { - return order; - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/CustomAttributes/ScriptExecutionOrderAttribute.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/CustomAttributes/ScriptExecutionOrderAttribute.cs.meta deleted file mode 100644 index cc2d8a29..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/CustomAttributes/ScriptExecutionOrderAttribute.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 036645a6650ecf0478b961d469c7e935 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue.meta deleted file mode 100644 index 005f6044..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 68e576ad0cfa64743a23dd8e8db94b39 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/ExternalSortingFastPriorityQueueNode.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/ExternalSortingFastPriorityQueueNode.cs deleted file mode 100644 index e62639ef..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/ExternalSortingFastPriorityQueueNode.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Priority_Queue -{ - internal abstract class ExternalSortingFastPriorityQueueNode : System.IComparable - { - ///

- /// Represents the current position in the queue - /// - public int QueueIndex { get; internal set; } - - public abstract int CompareTo(ExternalSortingFastPriorityQueueNode other); - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/ExternalSortingFastPriorityQueueNode.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/ExternalSortingFastPriorityQueueNode.cs.meta deleted file mode 100644 index 5614d3b5..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/ExternalSortingFastPriorityQueueNode.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 79ff18f1f5314034a980f4c7a9a66d56 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/FastPriorityQueue.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/FastPriorityQueue.cs deleted file mode 100644 index e0b26c32..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/FastPriorityQueue.cs +++ /dev/null @@ -1,418 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Runtime.CompilerServices; - -namespace Priority_Queue -{ - /// - /// An implementation of a min-Priority Queue using a heap. Has O(1) .Contains()! - /// See https://github.com/BlueRaja/High-Speed-Priority-Queue-for-C-Sharp/wiki/Getting-Started for more information - /// - /// The values in the queue. Must extend the FastPriorityQueueNode class - internal sealed class FastPriorityQueue : IFixedSizePriorityQueue - where T : FastPriorityQueueNode - { - private int _numNodes; - private T[] _nodes; - - /// - /// Instantiate a new Priority Queue - /// - /// The max nodes ever allowed to be enqueued (going over this will cause undefined behavior) - public FastPriorityQueue(int maxNodes) - { -#if PBDEBUG - if (maxNodes <= 0) - { - throw new InvalidOperationException("New queue size cannot be smaller than 1"); - } -#endif - - _numNodes = 0; - _nodes = new T[maxNodes + 1]; - } - - /// - /// Returns the number of nodes in the queue. - /// O(1) - /// - public int Count - { - get - { - return _numNodes; - } - } - - /// - /// Returns the maximum number of items that can be enqueued at once in this queue. Once you hit this number (ie. once Count == MaxSize), - /// attempting to enqueue another item will cause undefined behavior. O(1) - /// - public int MaxSize - { - get - { - return _nodes.Length - 1; - } - } - - /// - /// Removes every node from the queue. - /// O(n) (So, don't do this often!) - /// -#if NET_VERSION_4_5 - [MethodImpl(MethodImplOptions.AggressiveInlining)] -#endif - public void Clear() - { - Array.Clear(_nodes, 1, _numNodes); - _numNodes = 0; - } - - /// - /// Returns (in O(1)!) whether the given node is in the queue. O(1) - /// -#if NET_VERSION_4_5 - [MethodImpl(MethodImplOptions.AggressiveInlining)] -#endif - public bool Contains(T node) - { -#if PBDEBUG - if (node == null) - { - throw new ArgumentNullException("node"); - } - if (node.QueueIndex < 0 || node.QueueIndex >= _nodes.Length) - { - throw new InvalidOperationException("node.QueueIndex has been corrupted. Did you change it manually? Or add this node to another queue?"); - } -#endif - - return (_nodes[node.QueueIndex] == node); - } - - /// - /// Enqueue a node to the priority queue. Lower values are placed in front. Ties are broken by first-in-first-out. - /// If the queue is full, the result is undefined. - /// If the node is already enqueued, the result is undefined. - /// O(log n) - /// -#if NET_VERSION_4_5 - [MethodImpl(MethodImplOptions.AggressiveInlining)] -#endif - public void Enqueue(T node, float priority) - { -#if PBDEBUG - if (node == null) - { - throw new ArgumentNullException("node"); - } - if (_numNodes >= _nodes.Length - 1) - { - throw new InvalidOperationException("Queue is full - node cannot be added: " + node); - } - if (Contains(node)) - { - throw new InvalidOperationException("Node is already enqueued: " + node); - } -#endif - - node.Priority = priority; - _numNodes++; - _nodes[_numNodes] = node; - node.QueueIndex = _numNodes; - CascadeUp(_nodes[_numNodes]); - } - -#if NET_VERSION_4_5 - [MethodImpl(MethodImplOptions.AggressiveInlining)] -#endif - private void Swap(T node1, T node2) - { - //Swap the nodes - _nodes[node1.QueueIndex] = node2; - _nodes[node2.QueueIndex] = node1; - - //Swap their indicies - int temp = node1.QueueIndex; - node1.QueueIndex = node2.QueueIndex; - node2.QueueIndex = temp; - } - - //Performance appears to be slightly better when this is NOT inlined o_O - private void CascadeUp(T node) - { - //aka Heapify-up - int parent = node.QueueIndex / 2; - while (parent >= 1) - { - T parentNode = _nodes[parent]; - if (HasHigherPriority(parentNode, node)) - break; - - //Node has lower priority value, so move it up the heap - Swap(node, parentNode); //For some reason, this is faster with Swap() rather than (less..?) individual operations, like in CascadeDown() - - parent = node.QueueIndex / 2; - } - } - -#if NET_VERSION_4_5 - [MethodImpl(MethodImplOptions.AggressiveInlining)] -#endif - private void CascadeDown(T node) - { - //aka Heapify-down - T newParent; - int finalQueueIndex = node.QueueIndex; - while (true) - { - newParent = node; - int childLeftIndex = 2 * finalQueueIndex; - - //Check if the left-child is higher-priority than the current node - if (childLeftIndex > _numNodes) - { - //This could be placed outside the loop, but then we'd have to check newParent != node twice - node.QueueIndex = finalQueueIndex; - _nodes[finalQueueIndex] = node; - break; - } - - T childLeft = _nodes[childLeftIndex]; - if (HasHigherPriority(childLeft, newParent)) - { - newParent = childLeft; - } - - //Check if the right-child is higher-priority than either the current node or the left child - int childRightIndex = childLeftIndex + 1; - if (childRightIndex <= _numNodes) - { - T childRight = _nodes[childRightIndex]; - if (HasHigherPriority(childRight, newParent)) - { - newParent = childRight; - } - } - - //If either of the children has higher (smaller) priority, swap and continue cascading - if (newParent != node) - { - //Move new parent to its new index. node will be moved once, at the end - //Doing it this way is one less assignment operation than calling Swap() - _nodes[finalQueueIndex] = newParent; - - int temp = newParent.QueueIndex; - newParent.QueueIndex = finalQueueIndex; - finalQueueIndex = temp; - } - else - { - //See note above - node.QueueIndex = finalQueueIndex; - _nodes[finalQueueIndex] = node; - break; - } - } - } - - /// - /// Returns true if 'higher' has higher priority than 'lower', false otherwise. - /// Note that calling HasHigherPriority(node, node) (ie. both arguments the same node) will return false - /// -#if NET_VERSION_4_5 - [MethodImpl(MethodImplOptions.AggressiveInlining)] -#endif - private bool HasHigherPriority(T higher, T lower) - { - return (higher.Priority < lower.Priority); - } - - /// - /// Removes the head of the queue and returns it. - /// If queue is empty, result is undefined - /// O(log n) - /// - public T Dequeue() - { -#if PBDEBUG - if (_numNodes <= 0) - { - throw new InvalidOperationException("Cannot call Dequeue() on an empty queue"); - } - - if (!IsValidQueue()) - { - throw new InvalidOperationException("Queue has been corrupted (Did you update a node priority manually instead of calling UpdatePriority()?" + - "Or add the same node to two different queues?)"); - } -#endif - - T returnMe = _nodes[1]; - Remove(returnMe); - return returnMe; - } - - /// - /// Resize the queue so it can accept more nodes. All currently enqueued nodes are remain. - /// Attempting to decrease the queue size to a size too small to hold the existing nodes results in undefined behavior - /// O(n) - /// - public void Resize(int maxNodes) - { -#if PBDEBUG - if (maxNodes <= 0) - { - throw new InvalidOperationException("Queue size cannot be smaller than 1"); - } - - if (maxNodes < _numNodes) - { - throw new InvalidOperationException("Called Resize(" + maxNodes + "), but current queue contains " + _numNodes + " nodes"); - } -#endif - - T[] newArray = new T[maxNodes + 1]; - int highestIndexToCopy = Math.Min(maxNodes, _numNodes); - for (int i = 1; i <= highestIndexToCopy; i++) - { - newArray[i] = _nodes[i]; - } - _nodes = newArray; - } - - /// - /// Returns the head of the queue, without removing it (use Dequeue() for that). - /// If the queue is empty, behavior is undefined. - /// O(1) - /// - public T First - { - get - { -#if PBDEBUG - if (_numNodes <= 0) - { - throw new InvalidOperationException("Cannot call .First on an empty queue"); - } -#endif - - return _nodes[1]; - } - } - - /// - /// This method must be called on a node every time its priority changes while it is in the queue. - /// Forgetting to call this method will result in a corrupted queue! - /// Calling this method on a node not in the queue results in undefined behavior - /// O(log n) - /// -#if NET_VERSION_4_5 - [MethodImpl(MethodImplOptions.AggressiveInlining)] -#endif - public void UpdatePriority(T node, float priority) - { -#if PBDEBUG - if (node == null) - { - throw new ArgumentNullException("node"); - } - if (!Contains(node)) - { - throw new InvalidOperationException("Cannot call UpdatePriority() on a node which is not enqueued: " + node); - } -#endif - - node.Priority = priority; - OnNodeUpdated(node); - } - - private void OnNodeUpdated(T node) - { - //Bubble the updated node up or down as appropriate - int parentIndex = node.QueueIndex / 2; - T parentNode = _nodes[parentIndex]; - - if (parentIndex > 0 && HasHigherPriority(node, parentNode)) - { - CascadeUp(node); - } - else - { - //Note that CascadeDown will be called if parentNode == node (that is, node is the root) - CascadeDown(node); - } - } - - /// - /// Removes a node from the queue. The node does not need to be the head of the queue. - /// If the node is not in the queue, the result is undefined. If unsure, check Contains() first - /// O(log n) - /// - public void Remove(T node) - { -#if PBDEBUG - if (node == null) - { - throw new ArgumentNullException("node"); - } - if (!Contains(node)) - { - throw new InvalidOperationException("Cannot call Remove() on a node which is not enqueued: " + node); - } -#endif - - //If the node is already the last node, we can remove it immediately - if (node.QueueIndex == _numNodes) - { - _nodes[_numNodes] = null; - _numNodes--; - return; - } - - //Swap the node with the last node - T formerLastNode = _nodes[_numNodes]; - Swap(node, formerLastNode); - _nodes[_numNodes] = null; - _numNodes--; - - //Now bubble formerLastNode (which is no longer the last node) up or down as appropriate - OnNodeUpdated(formerLastNode); - } - - public IEnumerator GetEnumerator() - { - for (int i = 1; i <= _numNodes; i++) - yield return _nodes[i]; - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - /// - /// Should not be called in production code. - /// Checks to make sure the queue is still in a valid state. Used for testing/debugging the queue. - /// - public bool IsValidQueue() - { - for (int i = 1; i < _nodes.Length; i++) - { - if (_nodes[i] != null) - { - int childLeftIndex = 2 * i; - if (childLeftIndex < _nodes.Length && _nodes[childLeftIndex] != null && HasHigherPriority(_nodes[childLeftIndex], _nodes[i])) - return false; - - int childRightIndex = childLeftIndex + 1; - if (childRightIndex < _nodes.Length && _nodes[childRightIndex] != null && HasHigherPriority(_nodes[childRightIndex], _nodes[i])) - return false; - } - } - return true; - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/FastPriorityQueue.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/FastPriorityQueue.cs.meta deleted file mode 100644 index fc93627a..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/FastPriorityQueue.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 376b08cc68eb144468648ebcd4a478e6 -timeCreated: 1476131089 -licenseType: Store -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/FastPriorityQueueNode.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/FastPriorityQueueNode.cs deleted file mode 100644 index 802e1ae5..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/FastPriorityQueueNode.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Priority_Queue -{ - internal class FastPriorityQueueNode - { - /// - /// The Priority to insert this node at. Must be set BEFORE adding a node to the queue (ideally just once, in the node's constructor). - /// Should not be manually edited once the node has been enqueued - use queue.UpdatePriority() instead - /// - public float Priority { get; protected internal set; } - - /// - /// Represents the current position in the queue - /// - public int QueueIndex { get; internal set; } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/FastPriorityQueueNode.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/FastPriorityQueueNode.cs.meta deleted file mode 100644 index 62bef8ea..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/FastPriorityQueueNode.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 4bb5e6cfc638aca43a63a7304f2fe754 -timeCreated: 1476131089 -licenseType: Store -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/IFixedSizePriorityQueue.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/IFixedSizePriorityQueue.cs deleted file mode 100644 index 6d1529ef..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/IFixedSizePriorityQueue.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Priority_Queue -{ - /// - /// A helper-interface only needed to make writing unit tests a bit easier (hence the 'internal' access modifier) - /// - internal interface IFixedSizePriorityQueue : IPriorityQueue - { - /// - /// Resize the queue so it can accept more nodes. All currently enqueued nodes are remain. - /// Attempting to decrease the queue size to a size too small to hold the existing nodes results in undefined behavior - /// - void Resize(int maxNodes); - - /// - /// Returns the maximum number of items that can be enqueued at once in this queue. Once you hit this number (ie. once Count == MaxSize), - /// attempting to enqueue another item will cause undefined behavior. - /// - int MaxSize { get; } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/IFixedSizePriorityQueue.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/IFixedSizePriorityQueue.cs.meta deleted file mode 100644 index 8f8e6dca..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/IFixedSizePriorityQueue.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: d9cacd2c305e5a94dbfeba14e25a0441 -timeCreated: 1476131089 -licenseType: Store -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/IPriorityQueue.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/IPriorityQueue.cs deleted file mode 100644 index 125a2d93..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/IPriorityQueue.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Collections.Generic; - -namespace Priority_Queue -{ - /// - /// The IPriorityQueue interface. This is mainly here for purists, and in case I decide to add more implementations later. - /// For speed purposes, it is actually recommended that you *don't* access the priority queue through this interface, since the JIT can - /// (theoretically?) optimize method calls from concrete-types slightly better. - /// - internal interface IPriorityQueue : IEnumerable - { - /// - /// Enqueue a node to the priority queue. Lower values are placed in front. Ties are broken by first-in-first-out. - /// See implementation for how duplicates are handled. - /// - void Enqueue(T node, float priority); - - /// - /// Removes the head of the queue (node with minimum priority; ties are broken by order of insertion), and returns it. - /// - T Dequeue(); - - /// - /// Removes every node from the queue. - /// - void Clear(); - - /// - /// Returns whether the given node is in the queue. - /// - bool Contains(T node); - - /// - /// Removes a node from the queue. The node does not need to be the head of the queue. - /// - void Remove(T node); - - /// - /// Call this method to change the priority of a node. - /// - void UpdatePriority(T node, float priority); - - /// - /// Returns the head of the queue, without removing it (use Dequeue() for that). - /// - T First { get; } - - /// - /// Returns the number of nodes in the queue. - /// - int Count { get; } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/IPriorityQueue.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/IPriorityQueue.cs.meta deleted file mode 100644 index a522987b..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/IPriorityQueue.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 722bac7805cf3b74590b5eecfe9ff7f0 -timeCreated: 1476131089 -licenseType: Store -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/SimplePriorityQueue.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/SimplePriorityQueue.cs deleted file mode 100644 index fd0d00db..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/SimplePriorityQueue.cs +++ /dev/null @@ -1,229 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; - -namespace Priority_Queue -{ - /// - /// A simplified priority queue implementation. Is stable, auto-resizes, and thread-safe, at the cost of being slightly slower than - /// FastPriorityQueue - /// - /// The type to enqueue - internal sealed class SimplePriorityQueue : IPriorityQueue - { - private class SimpleNode : StablePriorityQueueNode - { - public T Data { get; private set; } - - public SimpleNode(T data) - { - Data = data; - } - } - - private const int INITIAL_QUEUE_SIZE = 10; - private readonly StablePriorityQueue _queue; - - public SimplePriorityQueue() - { - _queue = new StablePriorityQueue(INITIAL_QUEUE_SIZE); - } - - /// - /// Given an item of type T, returns the exist SimpleNode in the queue - /// - private SimpleNode GetExistingNode(T item) - { - var comparer = EqualityComparer.Default; - foreach (var node in _queue) - { - if (comparer.Equals(node.Data, item)) - { - return node; - } - } - throw new InvalidOperationException("Item cannot be found in queue: " + item); - } - - /// - /// Returns the number of nodes in the queue. - /// O(1) - /// - public int Count - { - get - { - lock (_queue) - { - return _queue.Count; - } - } - } - - - /// - /// Returns the head of the queue, without removing it (use Dequeue() for that). - /// Throws an exception when the queue is empty. - /// O(1) - /// - public T First - { - get - { - lock (_queue) - { - if (_queue.Count <= 0) - { - throw new InvalidOperationException("Cannot call .First on an empty queue"); - } - - SimpleNode first = _queue.First; - return (first != null ? first.Data : default(T)); - } - } - } - - /// - /// Removes every node from the queue. - /// O(n) - /// - public void Clear() - { - lock (_queue) - { - _queue.Clear(); - } - } - - /// - /// Returns whether the given item is in the queue. - /// O(n) - /// - public bool Contains(T item) - { - lock (_queue) - { - var comparer = EqualityComparer.Default; - foreach (var node in _queue) - { - if (comparer.Equals(node.Data, item)) - { - return true; - } - } - return false; - } - } - - /// - /// Removes the head of the queue (node with minimum priority; ties are broken by order of insertion), and returns it. - /// If queue is empty, throws an exception - /// O(log n) - /// - public T Dequeue() - { - lock (_queue) - { - if (_queue.Count <= 0) - { - throw new InvalidOperationException("Cannot call Dequeue() on an empty queue"); - } - - SimpleNode node = _queue.Dequeue(); - return node.Data; - } - } - - /// - /// Enqueue a node to the priority queue. Lower values are placed in front. Ties are broken by first-in-first-out. - /// This queue automatically resizes itself, so there's no concern of the queue becoming 'full'. - /// Duplicates are allowed. - /// O(log n) - /// - public void Enqueue(T item, float priority) - { - lock (_queue) - { - SimpleNode node = new SimpleNode(item); - if (_queue.Count == _queue.MaxSize) - { - _queue.Resize(_queue.MaxSize * 2 + 1); - } - _queue.Enqueue(node, priority); - } - } - - /// - /// Removes an item from the queue. The item does not need to be the head of the queue. - /// If the item is not in the queue, an exception is thrown. If unsure, check Contains() first. - /// If multiple copies of the item are enqueued, only the first one is removed. - /// O(n) - /// - public void Remove(T item) - { - lock (_queue) - { - try - { - _queue.Remove(GetExistingNode(item)); - } - catch (InvalidOperationException ex) - { - throw new InvalidOperationException("Cannot call Remove() on a node which is not enqueued: " + item, ex); - } - } - } - - /// - /// Call this method to change the priority of an item. - /// Calling this method on a item not in the queue will throw an exception. - /// If the item is enqueued multiple times, only the first one will be updated. - /// (If your requirements are complex enough that you need to enqueue the same item multiple times and be able - /// to update all of them, please wrap your items in a wrapper class so they can be distinguished). - /// O(n) - /// - public void UpdatePriority(T item, float priority) - { - lock (_queue) - { - try - { - SimpleNode updateMe = GetExistingNode(item); - _queue.UpdatePriority(updateMe, priority); - } - catch (InvalidOperationException ex) - { - throw new InvalidOperationException("Cannot call UpdatePriority() on a node which is not enqueued: " + item, ex); - } - } - } - - public IEnumerator GetEnumerator() - { - List queueData = new List(); - lock (_queue) - { - //Copy to a separate list because we don't want to 'yield return' inside a lock - foreach (var node in _queue) - { - queueData.Add(node.Data); - } - } - - return queueData.GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public bool IsValidQueue() - { - lock (_queue) - { - return _queue.IsValidQueue(); - } - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/SimplePriorityQueue.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/SimplePriorityQueue.cs.meta deleted file mode 100644 index 60953288..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/SimplePriorityQueue.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 1daaf3be153500e4d80b80fe17ccc211 -timeCreated: 1476131088 -licenseType: Store -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/StablePriorityQueue.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/StablePriorityQueue.cs deleted file mode 100644 index 12218971..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/StablePriorityQueue.cs +++ /dev/null @@ -1,423 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Runtime.CompilerServices; - -namespace Priority_Queue -{ - /// - /// A copy of FastPriorityQueue which is also stable - that is, when two nodes are enqueued with the same priority, they - /// are always dequeued in the same order. - /// See https://github.com/BlueRaja/High-Speed-Priority-Queue-for-C-Sharp/wiki/Getting-Started for more information - /// - /// The values in the queue. Must extend the StablePriorityQueueNode class - internal sealed class StablePriorityQueue : IFixedSizePriorityQueue - where T : StablePriorityQueueNode - { - private int _numNodes; - private T[] _nodes; - private long _numNodesEverEnqueued; - - /// - /// Instantiate a new Priority Queue - /// - /// The max nodes ever allowed to be enqueued (going over this will cause undefined behavior) - public StablePriorityQueue(int maxNodes) - { -#if PBDEBUG - if (maxNodes <= 0) - { - throw new InvalidOperationException("New queue size cannot be smaller than 1"); - } -#endif - - _numNodes = 0; - _nodes = new T[maxNodes + 1]; - _numNodesEverEnqueued = 0; - } - - /// - /// Returns the number of nodes in the queue. - /// O(1) - /// - public int Count - { - get - { - return _numNodes; - } - } - - /// - /// Returns the maximum number of items that can be enqueued at once in this queue. Once you hit this number (ie. once Count == MaxSize), - /// attempting to enqueue another item will cause undefined behavior. O(1) - /// - public int MaxSize - { - get - { - return _nodes.Length - 1; - } - } - - /// - /// Removes every node from the queue. - /// O(n) (So, don't do this often!) - /// -#if NET_VERSION_4_5 - [MethodImpl(MethodImplOptions.AggressiveInlining)] -#endif - public void Clear() - { - Array.Clear(_nodes, 1, _numNodes); - _numNodes = 0; - } - - /// - /// Returns (in O(1)!) whether the given node is in the queue. O(1) - /// -#if NET_VERSION_4_5 - [MethodImpl(MethodImplOptions.AggressiveInlining)] -#endif - public bool Contains(T node) - { -#if PBDEBUG - if (node == null) - { - throw new ArgumentNullException("node"); - } - if (node.QueueIndex < 0 || node.QueueIndex >= _nodes.Length) - { - throw new InvalidOperationException("node.QueueIndex has been corrupted. Did you change it manually? Or add this node to another queue?"); - } -#endif - - return (_nodes[node.QueueIndex] == node); - } - - /// - /// Enqueue a node to the priority queue. Lower values are placed in front. Ties are broken by first-in-first-out. - /// If the queue is full, the result is undefined. - /// If the node is already enqueued, the result is undefined. - /// O(log n) - /// -#if NET_VERSION_4_5 - [MethodImpl(MethodImplOptions.AggressiveInlining)] -#endif - public void Enqueue(T node, float priority) - { -#if PBDEBUG - if (node == null) - { - throw new ArgumentNullException("node"); - } - if (_numNodes >= _nodes.Length - 1) - { - throw new InvalidOperationException("Queue is full - node cannot be added: " + node); - } - if (Contains(node)) - { - throw new InvalidOperationException("Node is already enqueued: " + node); - } -#endif - - node.Priority = priority; - _numNodes++; - _nodes[_numNodes] = node; - node.QueueIndex = _numNodes; - node.InsertionIndex = _numNodesEverEnqueued++; - CascadeUp(_nodes[_numNodes]); - } - -#if NET_VERSION_4_5 - [MethodImpl(MethodImplOptions.AggressiveInlining)] -#endif - private void Swap(T node1, T node2) - { - //Swap the nodes - _nodes[node1.QueueIndex] = node2; - _nodes[node2.QueueIndex] = node1; - - //Swap their indicies - int temp = node1.QueueIndex; - node1.QueueIndex = node2.QueueIndex; - node2.QueueIndex = temp; - } - - //Performance appears to be slightly better when this is NOT inlined o_O - private void CascadeUp(T node) - { - //aka Heapify-up - int parent = node.QueueIndex / 2; - while (parent >= 1) - { - T parentNode = _nodes[parent]; - if (HasHigherPriority(parentNode, node)) - break; - - //Node has lower priority value, so move it up the heap - Swap(node, parentNode); //For some reason, this is faster with Swap() rather than (less..?) individual operations, like in CascadeDown() - - parent = node.QueueIndex / 2; - } - } - -#if NET_VERSION_4_5 - [MethodImpl(MethodImplOptions.AggressiveInlining)] -#endif - private void CascadeDown(T node) - { - //aka Heapify-down - T newParent; - int finalQueueIndex = node.QueueIndex; - while (true) - { - newParent = node; - int childLeftIndex = 2 * finalQueueIndex; - - //Check if the left-child is higher-priority than the current node - if (childLeftIndex > _numNodes) - { - //This could be placed outside the loop, but then we'd have to check newParent != node twice - node.QueueIndex = finalQueueIndex; - _nodes[finalQueueIndex] = node; - break; - } - - T childLeft = _nodes[childLeftIndex]; - if (HasHigherPriority(childLeft, newParent)) - { - newParent = childLeft; - } - - //Check if the right-child is higher-priority than either the current node or the left child - int childRightIndex = childLeftIndex + 1; - if (childRightIndex <= _numNodes) - { - T childRight = _nodes[childRightIndex]; - if (HasHigherPriority(childRight, newParent)) - { - newParent = childRight; - } - } - - //If either of the children has higher (smaller) priority, swap and continue cascading - if (newParent != node) - { - //Move new parent to its new index. node will be moved once, at the end - //Doing it this way is one less assignment operation than calling Swap() - _nodes[finalQueueIndex] = newParent; - - int temp = newParent.QueueIndex; - newParent.QueueIndex = finalQueueIndex; - finalQueueIndex = temp; - } - else - { - //See note above - node.QueueIndex = finalQueueIndex; - _nodes[finalQueueIndex] = node; - break; - } - } - } - - /// - /// Returns true if 'higher' has higher priority than 'lower', false otherwise. - /// Note that calling HasHigherPriority(node, node) (ie. both arguments the same node) will return false - /// -#if NET_VERSION_4_5 - [MethodImpl(MethodImplOptions.AggressiveInlining)] -#endif - private bool HasHigherPriority(T higher, T lower) - { - return (higher.Priority < lower.Priority || - (higher.Priority == lower.Priority && higher.InsertionIndex < lower.InsertionIndex)); - } - - /// - /// Removes the head of the queue (node with minimum priority; ties are broken by order of insertion), and returns it. - /// If queue is empty, result is undefined - /// O(log n) - /// - public T Dequeue() - { -#if PBDEBUG - if (_numNodes <= 0) - { - throw new InvalidOperationException("Cannot call Dequeue() on an empty queue"); - } - - if (!IsValidQueue()) - { - throw new InvalidOperationException("Queue has been corrupted (Did you update a node priority manually instead of calling UpdatePriority()?" + - "Or add the same node to two different queues?)"); - } -#endif - - T returnMe = _nodes[1]; - Remove(returnMe); - return returnMe; - } - - /// - /// Resize the queue so it can accept more nodes. All currently enqueued nodes are remain. - /// Attempting to decrease the queue size to a size too small to hold the existing nodes results in undefined behavior - /// O(n) - /// - public void Resize(int maxNodes) - { -#if PBDEBUG - if (maxNodes <= 0) - { - throw new InvalidOperationException("Queue size cannot be smaller than 1"); - } - - if (maxNodes < _numNodes) - { - throw new InvalidOperationException("Called Resize(" + maxNodes + "), but current queue contains " + _numNodes + " nodes"); - } -#endif - - T[] newArray = new T[maxNodes + 1]; - int highestIndexToCopy = Math.Min(maxNodes, _numNodes); - for (int i = 1; i <= highestIndexToCopy; i++) - { - newArray[i] = _nodes[i]; - } - _nodes = newArray; - } - - /// - /// Returns the head of the queue, without removing it (use Dequeue() for that). - /// If the queue is empty, behavior is undefined. - /// O(1) - /// - public T First - { - get - { -#if PBDEBUG - if (_numNodes <= 0) - { - throw new InvalidOperationException("Cannot call .First on an empty queue"); - } -#endif - - return _nodes[1]; - } - } - - /// - /// This method must be called on a node every time its priority changes while it is in the queue. - /// Forgetting to call this method will result in a corrupted queue! - /// Calling this method on a node not in the queue results in undefined behavior - /// O(log n) - /// -#if NET_VERSION_4_5 - [MethodImpl(MethodImplOptions.AggressiveInlining)] -#endif - public void UpdatePriority(T node, float priority) - { -#if PBDEBUG - if (node == null) - { - throw new ArgumentNullException("node"); - } - if (!Contains(node)) - { - throw new InvalidOperationException("Cannot call UpdatePriority() on a node which is not enqueued: " + node); - } -#endif - - node.Priority = priority; - OnNodeUpdated(node); - } - - private void OnNodeUpdated(T node) - { - //Bubble the updated node up or down as appropriate - int parentIndex = node.QueueIndex / 2; - T parentNode = _nodes[parentIndex]; - - if (parentIndex > 0 && HasHigherPriority(node, parentNode)) - { - CascadeUp(node); - } - else - { - //Note that CascadeDown will be called if parentNode == node (that is, node is the root) - CascadeDown(node); - } - } - - /// - /// Removes a node from the queue. The node does not need to be the head of the queue. - /// If the node is not in the queue, the result is undefined. If unsure, check Contains() first - /// O(log n) - /// - public void Remove(T node) - { -#if PBDEBUG - if (node == null) - { - throw new ArgumentNullException("node"); - } - if (!Contains(node)) - { - throw new InvalidOperationException("Cannot call Remove() on a node which is not enqueued: " + node); - } -#endif - - //If the node is already the last node, we can remove it immediately - if (node.QueueIndex == _numNodes) - { - _nodes[_numNodes] = null; - _numNodes--; - return; - } - - //Swap the node with the last node - T formerLastNode = _nodes[_numNodes]; - Swap(node, formerLastNode); - _nodes[_numNodes] = null; - _numNodes--; - - //Now bubble formerLastNode (which is no longer the last node) up or down as appropriate - OnNodeUpdated(formerLastNode); - } - - public IEnumerator GetEnumerator() - { - for (int i = 1; i <= _numNodes; i++) - yield return _nodes[i]; - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - /// - /// Should not be called in production code. - /// Checks to make sure the queue is still in a valid state. Used for testing/debugging the queue. - /// - public bool IsValidQueue() - { - for (int i = 1; i < _nodes.Length; i++) - { - if (_nodes[i] != null) - { - int childLeftIndex = 2 * i; - if (childLeftIndex < _nodes.Length && _nodes[childLeftIndex] != null && HasHigherPriority(_nodes[childLeftIndex], _nodes[i])) - return false; - - int childRightIndex = childLeftIndex + 1; - if (childRightIndex < _nodes.Length && _nodes[childRightIndex] != null && HasHigherPriority(_nodes[childRightIndex], _nodes[i])) - return false; - } - } - return true; - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/StablePriorityQueue.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/StablePriorityQueue.cs.meta deleted file mode 100644 index aea6d73f..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/StablePriorityQueue.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 9e4182f1acbb9fc40b5e9356cebb9685 -timeCreated: 1476131089 -licenseType: Store -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/StablePriorityQueueNode.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/StablePriorityQueueNode.cs deleted file mode 100644 index 22dd00c1..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/StablePriorityQueueNode.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Priority_Queue -{ - internal class StablePriorityQueueNode : FastPriorityQueueNode - { - /// - /// Represents the order the node was inserted in - /// - public long InsertionIndex { get; internal set; } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/StablePriorityQueueNode.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/StablePriorityQueueNode.cs.meta deleted file mode 100644 index 09118346..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/StablePriorityQueueNode.cs.meta +++ /dev/null @@ -1,12 +0,0 @@ -fileFormatVersion: 2 -guid: 316bff9a2da34f5489becd70b0065188 -timeCreated: 1476131088 -licenseType: Store -MonoImporter: - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/SweepEventPriorityQueue.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/SweepEventPriorityQueue.cs deleted file mode 100644 index 9bd6a524..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/SweepEventPriorityQueue.cs +++ /dev/null @@ -1,386 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using static PathBerserker2d.PolygonClipper; - -namespace Priority_Queue -{ - /// - /// An implementation of a min-Priority Queue using a heap. Has O(1) .Contains()! - /// See https://github.com/BlueRaja/High-Speed-Priority-Queue-for-C-Sharp/wiki/Getting-Started for more information - /// - internal sealed class SweepEventPriorityQueue - { - private int _numNodes; - private SweepEvent[] _nodes; - - /// - /// Instantiate a new Priority Queue - /// - /// The max nodes ever allowed to be enqueued (going over this will cause undefined behavior) - public SweepEventPriorityQueue(int maxNodes) - { - #if QUEUE_DEBUG - if (maxNodes <= 0) - { - throw new InvalidOperationException("New queue size cannot be smaller than 1"); - } - #endif - - _numNodes = 0; - _nodes = new SweepEvent[maxNodes + 1]; - } - - /// - /// Returns the number of nodes in the queue. - /// O(1) - /// - public int Count - { - get - { - return _numNodes; - } - } - - /// - /// Returns the maximum number of items that can be enqueued at once in this queue. Once you hit this number (ie. once Count == MaxSize), - /// attempting to enqueue another item will cause undefined behavior. O(1) - /// - public int MaxSize - { - get - { - return _nodes.Length - 1; - } - } - - /// - /// Removes every node from the queue. - /// O(n) (So, don't do this often!) - /// - #if NET_VERSION_4_5 - [MethodImpl(MethodImplOptions.AggressiveInlining)] - #endif - public void Clear() - { - Array.Clear(_nodes, 1, _numNodes); - _numNodes = 0; - } - - /// - /// Returns (in O(1)!) whether the given node is in the queue. O(1) - /// - #if NET_VERSION_4_5 - [MethodImpl(MethodImplOptions.AggressiveInlining)] - #endif - public bool Contains(SweepEvent node) - { -#if QUEUE_DEBUG - if(node == null) - { - throw new ArgumentNullException("node"); - } - if(node.QueueIndex < 0 || node.QueueIndex >= _nodes.Length) - { - throw new InvalidOperationException("node.QueueIndex has been corrupted. Did you change it manually? Or add this node to another queue?"); - } -#endif - - return (_nodes[node.queueIndex] == node); - } - - /// - /// Enqueue a node to the priority queue. Lower values are placed in front. Ties are broken by first-in-first-out. - /// If the queue is full, the result is undefined. - /// If the node is already enqueued, the result is undefined. - /// O(log n) - /// - #if NET_VERSION_4_5 - [MethodImpl(MethodImplOptions.AggressiveInlining)] - #endif - public void Enqueue(SweepEvent node) - { -#if QUEUE_DEBUG - if(node == null) - { - throw new ArgumentNullException("node"); - } - if (Contains(node)) - { - throw new InvalidOperationException("Node is already enqueued: " + node); - } -#endif - if (_numNodes >= _nodes.Length - 1) - { - // double _node array - Array.Resize(ref _nodes, _nodes.Length * 2); - } - - _numNodes++; - _nodes[_numNodes] = node; - node.queueIndex = _numNodes; - CascadeUp(_nodes[_numNodes]); - } - - #if NET_VERSION_4_5 - [MethodImpl(MethodImplOptions.AggressiveInlining)] - #endif - private void Swap(SweepEvent node1, SweepEvent node2) - { - //Swap the nodes - _nodes[node1.queueIndex] = node2; - _nodes[node2.queueIndex] = node1; - - //Swap their indicies - int temp = node1.queueIndex; - node1.queueIndex = node2.queueIndex; - node2.queueIndex = temp; - } - - //Performance appears to be slightly better when this is NOT inlined o_O - private void CascadeUp(SweepEvent node) - { - //aka Heapify-up - int parent = node.queueIndex / 2; - while(parent >= 1) - { - SweepEvent parentNode = _nodes[parent]; - if(HasHigherPriority(parentNode, node)) - break; - - //Node has lower priority value, so move it up the heap - Swap(node, parentNode); //For some reason, this is faster with Swap() rather than (less..?) individual operations, like in CascadeDown() - - parent = node.queueIndex / 2; - } - } - - #if NET_VERSION_4_5 - [MethodImpl(MethodImplOptions.AggressiveInlining)] - #endif - private void CascadeDown(SweepEvent node) - { - //aka Heapify-down - SweepEvent newParent; - int finalQueueIndex = node.queueIndex; - while(true) - { - newParent = node; - int childLeftIndex = 2 * finalQueueIndex; - - //Check if the left-child is higher-priority than the current node - if(childLeftIndex > _numNodes) - { - //This could be placed outside the loop, but then we'd have to check newParent != node twice - node.queueIndex = finalQueueIndex; - _nodes[finalQueueIndex] = node; - break; - } - - SweepEvent childLeft = _nodes[childLeftIndex]; - if(HasHigherPriority(childLeft, newParent)) - { - newParent = childLeft; - } - - //Check if the right-child is higher-priority than either the current node or the left child - int childRightIndex = childLeftIndex + 1; - if(childRightIndex <= _numNodes) - { - SweepEvent childRight = _nodes[childRightIndex]; - if(HasHigherPriority(childRight, newParent)) - { - newParent = childRight; - } - } - - //If either of the children has higher (smaller) priority, swap and continue cascading - if(newParent != node) - { - //Move new parent to its new index. node will be moved once, at the end - //Doing it this way is one less assignment operation than calling Swap() - _nodes[finalQueueIndex] = newParent; - - int temp = newParent.queueIndex; - newParent.queueIndex = finalQueueIndex; - finalQueueIndex = temp; - } - else - { - //See note above - node.queueIndex = finalQueueIndex; - _nodes[finalQueueIndex] = node; - break; - } - } - } - - /// - /// Returns true if 'higher' has higher priority than 'lower', false otherwise. - /// Note that calling HasHigherPriority(node, node) (ie. both arguments the same node) will return false - /// - #if NET_VERSION_4_5 - [MethodImpl(MethodImplOptions.AggressiveInlining)] - #endif - private bool HasHigherPriority(SweepEvent higher, SweepEvent lower) - { - return higher.CompareTo(lower) < 0; - } - - /// - /// Removes the head of the queue and returns it. - /// If queue is empty, result is undefined - /// O(log n) - /// - public SweepEvent Dequeue() - { -#if QUEUE_DEBUG - if(_numNodes <= 0) - { - throw new InvalidOperationException("Cannot call Dequeue() on an empty queue"); - } - - if(!IsValidQueue()) - { - throw new InvalidOperationException("Queue has been corrupted (Did you update a node priority manually instead of calling UpdatePriority()?" + - "Or add the same node to two different queues?)"); - } -#endif - - SweepEvent returnMe = _nodes[1]; - Remove(returnMe); - return returnMe; - } - - /// - /// Resize the queue so it can accept more nodes. All currently enqueued nodes are remain. - /// Attempting to decrease the queue size to a size too small to hold the existing nodes results in undefined behavior - /// O(n) - /// - public void Resize(int maxNodes) - { -#if QUEUE_DEBUG - if (maxNodes <= 0) - { - throw new InvalidOperationException("Queue size cannot be smaller than 1"); - } - - if (maxNodes < _numNodes) - { - throw new InvalidOperationException("Called Resize(" + maxNodes + "), but current queue contains " + _numNodes + " nodes"); - } -#endif - - SweepEvent[] newArray = new SweepEvent[maxNodes + 1]; - int highestIndexToCopy = Math.Min(maxNodes, _numNodes); - for (int i = 1; i <= highestIndexToCopy; i++) - { - newArray[i] = _nodes[i]; - } - _nodes = newArray; - } - - /// - /// Returns the head of the queue, without removing it (use Dequeue() for that). - /// If the queue is empty, behavior is undefined. - /// O(1) - /// - public SweepEvent First - { - get - { -#if QUEUE_DEBUG - if(_numNodes <= 0) - { - throw new InvalidOperationException("Cannot call .First on an empty queue"); - } -#endif - - return _nodes[1]; - } - } - - private void OnNodeUpdated(SweepEvent node) - { - //Bubble the updated node up or down as appropriate - int parentIndex = node.queueIndex / 2; - SweepEvent parentNode = _nodes[parentIndex]; - - if(parentIndex > 0 && HasHigherPriority(node, parentNode)) - { - CascadeUp(node); - } - else - { - //Note that CascadeDown will be called if parentNode == node (that is, node is the root) - CascadeDown(node); - } - } - - /// - /// Removes a node from the queue. The node does not need to be the head of the queue. - /// If the node is not in the queue, the result is undefined. If unsure, check Contains() first - /// O(log n) - /// - public void Remove(SweepEvent node) - { -#if QUEUE_DEBUG - if(node == null) - { - throw new ArgumentNullException("node"); - } - if(!Contains(node)) - { - throw new InvalidOperationException("Cannot call Remove() on a node which is not enqueued: " + node); - } -#endif - - //If the node is already the last node, we can remove it immediately - if (node.queueIndex == _numNodes) - { - _nodes[_numNodes] = null; - _numNodes--; - return; - } - - //Swap the node with the last node - SweepEvent formerLastNode = _nodes[_numNodes]; - Swap(node, formerLastNode); - _nodes[_numNodes] = null; - _numNodes--; - - //Now bubble formerLastNode (which is no longer the last node) up or down as appropriate - OnNodeUpdated(formerLastNode); - } - - public IEnumerator GetEnumerator() - { - for(int i = 1; i <= _numNodes; i++) - yield return _nodes[i]; - } - - /// - /// Should not be called in production code. - /// Checks to make sure the queue is still in a valid state. Used for testing/debugging the queue. - /// - public bool IsValidQueue() - { - for(int i = 1; i < _nodes.Length; i++) - { - if(_nodes[i] != null) - { - int childLeftIndex = 2 * i; - if(childLeftIndex < _nodes.Length && _nodes[childLeftIndex] != null && HasHigherPriority(_nodes[childLeftIndex], _nodes[i])) - return false; - - int childRightIndex = childLeftIndex + 1; - if(childRightIndex < _nodes.Length && _nodes[childRightIndex] != null && HasHigherPriority(_nodes[childRightIndex], _nodes[i])) - return false; - } - } - return true; - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/SweepEventPriorityQueue.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/SweepEventPriorityQueue.cs.meta deleted file mode 100644 index e2957626..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/High-Speed-Priority-Queue/SweepEventPriorityQueue.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: db62ab1d9d5098f47ab5393ae603107a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/IVelocityProvider.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/IVelocityProvider.cs deleted file mode 100644 index 65cbc1e5..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/IVelocityProvider.cs +++ /dev/null @@ -1,12 +0,0 @@ -using UnityEngine; - -namespace PathBerserker2d -{ - public interface IVelocityProvider - { - /// - /// Current velocity relative to the world. - /// - Vector2 WorldVelocity { get; } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/IVelocityProvider.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/IVelocityProvider.cs.meta deleted file mode 100644 index 816d3c59..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/IVelocityProvider.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d3b2c212f6466574c8c5641690193a96 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent.meta deleted file mode 100644 index 9d451bcf..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 32a41e6786a58fc4b8936609634bae30 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgent.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgent.cs deleted file mode 100644 index eef7faa4..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgent.cs +++ /dev/null @@ -1,1044 +0,0 @@ -using UnityEngine; -using System; -using System.Collections.Generic; - -namespace PathBerserker2d -{ - /// - /// Represents a pathfinding entity. - /// - /// - /// This components handles the interaction with the asynchronous pathfinding system. - /// It assumes the agent is a point located at transform.position. - /// Automatic movement will directly modify the transform this script is attached to. See \ref navagent_movement "NavAgent's build-in movement" for more detail on movement. - /// ## States - /// At heart the NavAgent is a state machine with the following states: - /// - /// - /// Idle\n - /// - /// In this state the agent does nothing and is ready to path to a new location. - /// - /// - /// - /// Planning\n - /// - /// The agent has made a path request and is now waiting for its result. - /// A call to for example would make the agent switch to this state. - /// If the path calculation succeeded, the agent switches into the FollowPath state. - /// If it didn't succeed however, the agent will switch back into the Idle state. - /// - /// - /// - /// FollowPath\n - /// - /// The agent will follow the a previously calculated path. Depending on whether or is set, - /// the path will be followed automatically. The agent has build-in ways to traverse the build-in link types. They don't make use of the physics system. - /// The path will be recalculated at a set interval determined by . This is to ensure the path is up to date with changes in the world. - /// No reactions to changes in the world between recalculations is possible. - /// - /// Following a path is further subdivided into three states: - /// - /// - /// Segment movement\n - /// - /// The agent moves on a line segment. - /// If you move the agent manually, call to switch to the next state. - /// - /// - /// - /// Wait for link\n - /// - /// This state is only entered if after the agent finshes moving on a segment, the link it wants to take is currently not traversable. - /// The agent will wait for the link to become traversable again. - /// - /// - /// - /// Traverse link\n - /// - /// The agent will move on the link. - /// If you move the agent manually, call to begin traversing the next segment. - /// - /// - /// - /// - /// - /// - /// LostPath\n - /// - /// The agent was previously in the FollowPath state, but was called. - /// In this state, the agent will periodically attempt to find a path to its last goal. - /// This is useful, for if the agent unexpectedly was moved of its previously followed path, it can still attempt to reach its goal. - /// This state is only entered, when in state FollowPath and is called. - /// - /// - /// - /// ## Pathfinding properties - /// A NavAgent has a few properties relevant to the pathfinder. - /// - /// - /// \n - /// - /// Only segments and links with enough free space are considered. - /// - /// - /// - /// \n - /// - /// Only segments that don't exceed this angle are considered traversable. - /// 0° = ground, 90° = straight walls and 180° = ceiling. - /// - /// - /// - /// \n - /// - /// For each link one multiplier from this array is applied to its traversal costs. - /// With multiplier values <= 0 you can completely exclude certain link types from traversal. - /// - /// - /// - /// \n - /// - /// Links and parts of segments can be tagged with a NavTag. NavTag with index 0 is considered the default and applied to all segments - /// that don't have another NavTag. - /// As with multiplier values <= 0 completely exclude NavTags from traversal. - /// - /// - /// - /// - [AddComponentMenu("PathBerserker2d/Nav Agent")] - [ScriptExecutionOrder(-50)] - public class NavAgent : MonoBehaviour - { - public enum State - { - /// Agent is doing nothing. - Idle, - /// Agent is following a path. - FollowPath, - } - - private enum MovementState - { - OnSegment, - OnLink, - WaitForLinkOnSegment, - } - - public State CurrentStatus => status; - public bool IsIdle => status == State.Idle && currentPathRequest?.Status == PathRequest.RequestState.Draft; - public bool IsFollowingAPath => status == State.FollowPath; - - public float Height => height; - public float MaxSlopeAngle => maxSlopeAngle; - public bool IsOnLink => IsFollowingAPath && movementState == MovementState.OnLink; - public bool IsMovingOnSegment => IsFollowingAPath && movementState == MovementState.OnSegment; - public bool IsWaitingForLink => IsFollowingAPath && movementState == MovementState.WaitForLinkOnSegment; - - /// - /// If true, either IsMovingOnSegment is true, or the agent is waiting to traverse an untraversable link. - /// - public bool IsOnSegment => IsFollowingAPath && movementState != MovementState.OnLink; - - /// - /// Check, if the current mapped position of the agent is valid. The mapped position can only be valid, if the agent is close to the ground. (Close, not necessarily directly on the ground) - /// - public bool HasValidPosition => !currentMappedPosition.IsInvalid(); - - /// - /// True, if Stop() was called and agent hasn't yet stopped - /// - public bool IsStopping => stopRequested; - - /// - /// True, if the agent is on the last segment of its path. - /// - public bool IsOnGoalSegment => IsOnSegment && !Path.HasNext; - - /// - /// Link of the path segment the agent is on, or null. - /// - [Obsolete("Use CurrentPathSegment.link")] - public INavLinkInstance CurrentLink => currentPath?.Current.link ?? null; - - /// - /// Link type of the path segment the agent is on, or "" - /// - [Obsolete("Use CurrentPathSegment.link.LinkTypeName")] - public string CurrentLinkType => currentPath?.Current.link?.LinkTypeName ?? ""; - - /// - /// Link start of the path segment the agent is on, or Vector2.zero. Can change each frame, if the link start is on a moving platform. - /// - [Obsolete("Use CurrentPathSegment.LinkStart")] - public Vector2 CurrentLinkStart => currentPath?.Current.LinkStart ?? Vector2.zero; - - /// - /// Segment normal of the path segment the agent is or normal of the currently mapped position, or Vector2.up - /// - public Vector2 CurrentSegmentNormal => IsFollowingAPath ? currentPath.Current.Normal : (currentMappedPosition.IsValid() ? currentMappedPosition.Normal : Vector2.up); - - /// - /// Current path segment if agent follows a path or null. - /// - public PathSegment CurrentPathSegment => currentPath?.Current; - - /// - /// Segment normal of the next segment on the path, or Vector2.zero - /// - [Obsolete("Use CurrentPathSegment.Next.Normal")] - public Vector2 NextSegmentNormal => currentPath?.NextSegment?.Normal ?? Vector2.zero; - - /// - /// Current subgoal the agent is moving towards. May either be a link start or a link end. If it lies on a moving platform, the value may change from frame to frame. - /// - public Vector2 PathSubGoal - { - get - { - if (IsFollowingAPath) - { - if (movementState == MovementState.OnLink) - return currentPath.Current.LinkEnd; - else - return currentPath.Current.LinkStart; - } - return Vector2.zero; - } - } - /// - /// Overall goal of the path the agent is on - /// - public Vector2? PathGoal => currentPath?.Goal; - - /// - /// Shorthand for transform.position - /// - public Vector2 Position - { - get => transform.position; - set => transform.position = new Vector3(value.x, value.y, transform.position.z); - } - - /// - /// Combination of all NavTags at the position of the agent. - /// - public int CurrentNavTagVector => IsFollowingAPath ? currentPath.Current.GetTagVector(Position) : (currentMappedPosition.cluster?.GetNavTagVector(currentMappedPosition.t) ?? 0); - - /// - /// Time agent spend on link. Does not include waiting for link to become traversable. - /// - public float TimeOnLink { get; private set; } - - - public delegate void FailedToFindPathDelegate(NavAgent agent); - - /// - /// Fired when agent begins moving on a link. - /// - public event Action OnStartLinkTraversal; - - /// - /// Fired when agent is moving on a link. - /// - public event Action OnLinkTraversal; - - /// - /// Fired when agent start moving on a segment. - /// - public event Action OnStartSegmentTraversal; - - /// - /// Fired when agent is moving on a segment. - /// - public event Action OnSegmentTraversal; - - /// - /// Fired when the agent fails to find a path - /// - public event Action OnFailedToFindPath; - - /// - /// Fired when agent stops after Stop() or ForceStop() was called. For ForceStop() this happens instantly. For Stop() this happens after the agent stopped. - /// - public event Action OnStop; - - /// - /// Fired when agent reaches its current goal. - /// - public event Action OnReachedGoal; - - /// - /// Called when the agent starts following a new path. - /// NOTE: Also called, after successfully recalculating a path, even if the path itself does not change. - /// - public event Action OnStartFollowingNewPath; - - internal Path Path => currentPath; - internal int NavTagMask => navTagMask; - - - - [Header("Pathplanning")] - [SerializeField] - // protect! should not be changeable, unless not making a path request - private float height = 1; - [SerializeField] - // protect! should not be changeable, unless not making a path request - // 90 = doesnt matter - [Range(0, 180)] - [Tooltip("Maximum slope the agent can walk on. 180 = unlimited")] - private float maxSlopeAngle = 180; - - /// - /// Delay in seconds between recalculations of current path. This enables the agent to react to changes in the world. Higher values are better for performance. - /// - [Tooltip("Interval at which an agent will recalculate its current path to react to world changes in seconds. Higher value improves performance.")] - [SerializeField] - float autoRepathIntervall = 1f; - [Tooltip("Maximum distance an agent can be from the start of a calculated path, to start following it. If the distance is to large, the path is thrown out.")] - [SerializeField] - float maximumDistanceToPathStart = 0.7f; - - [SerializeField] - float[] linkTraversalCostMultipliers; - - /// - /// If true and no path exists between start and goal, the NavAgent will try to find a path to the closest reachable position instead. Does not work with multiple targets! - /// - [Tooltip("If true and no path exists between start and goal, will try to find a path to the closest reachable position instead. Does not work with multiple targets!")] - [SerializeField] - bool allowCloseEnoughPath = false; - - [Obsolete("Moved to out and into a separate component. Only for migration purposes.", true)] - [Tooltip("Speed on segments in unit/s.")] - [SerializeField] - public float movementSpeed = 5; - - - [Obsolete("Moved to out and into a separate component. Only for migration purposes.", true)] - [Tooltip("Speed on corner links in degrees/s.")] - [SerializeField] - public float cornerSpeed = 100; - - [Obsolete("Moved to out and into a separate component. Only for migration purposes.", true)] - [Tooltip("Speed on jump links in unit/s.")] - [SerializeField] - public float jumpSpeed = 5; - - [Obsolete("Moved to out and into a separate component. Only for migration purposes.", true)] - [Tooltip("Speed on fall links in unit/s.")] - [SerializeField] - public float fallSpeed = 5; - - [Obsolete("Moved to out and into a separate component. Only for migration purposes.", true)] - [Tooltip("Speed on climb links in unit/s.")] - [SerializeField] - public float climbSpeed = 5; - - [Tooltip("If true, will print debug messages.")] - [SerializeField] - public bool enableDebugMessages = false; - - - /// - /// Traversal cost multipliers for nav tags. A value less or equal to 0 prohibits the agent from traversing that tag. - /// - [SerializeField] - float[] navTagTraversalCostMultipliers; - - - [SerializeField, ReadOnly] - private State status; - - [SerializeField, HideInInspector] - private int navTagMask; - - internal NavSegmentPositionPointer currentMappedPosition; - internal PathRequest currentPathRequest; - - private Path currentPath = null; - private PathRequest repathPathRequest; - private float lastRepathTime; - private MovementState movementState; - private bool traversedLinkSinceLastRepath; - private bool traversedLinkSinceLastPath; - private bool stopRequested; - - // [项目新增] 上次寻路失败(NoPathFromStartToGoal)时算出的最近可达点,供执行层"寻路到最近可到达点"读取。 - private NavSegmentPositionPointer _lastClosestReachable = NavSegmentPositionPointer.Invalid; - - #region UNITY_METHODS - private void OnEnable() - { - status = State.Idle; - currentPathRequest = new PathRequest(this); - repathPathRequest = new PathRequest(this); - } - - private void Start() - { - UpdateMappedPosition(); - } - - private void OnValidate() - { - if (linkTraversalCostMultipliers == null) - linkTraversalCostMultipliers = new float[0]; - if (navTagTraversalCostMultipliers == null) - navTagTraversalCostMultipliers = new float[0]; - - if (linkTraversalCostMultipliers.Length != PathBerserker2dSettings.NavLinkTypeNames.Length) - { - Utility.ResizeWithDefault(ref linkTraversalCostMultipliers, PathBerserker2dSettings.NavLinkTypeNames.Length, 1); - } - if (navTagTraversalCostMultipliers.Length != PathBerserker2dSettings.NavTags.Length) - { - Utility.ResizeWithDefault(ref navTagTraversalCostMultipliers, PathBerserker2dSettings.NavTags.Length, 1); - } - - navTagMask = GetNavTagMask(); - } - - private void Update() - { - UpdateMappedPosition(); - HandlePathRequest(); - - switch (status) - { - case State.FollowPath: - Repath(); - - if (movementState == MovementState.OnLink) - { - //check if link still exists - if (CurrentPathSegment.link == null) - { - // link was destroyed. Wait for repath - break; - } - - TimeOnLink += Time.deltaTime; - OnLinkTraversal?.Invoke(this); - } - else if (movementState == MovementState.OnSegment) - { - if (stopRequested) - { - status = State.Idle; - stopRequested = false; - OnStop?.Invoke(this); - } - else - { - OnSegmentTraversal?.Invoke(this); - } - } - else - { - if (currentPath.Current.link.IsTraversable) - { - StartTraversingLink(); - } - } - break; - } - } - #endregion - - /// - /// Repositions the agent at the nearest segment the agent could be standing at. Segments the agent could not be at do to its tag or slope will be ignored. - /// - /// True, if warping was successful - public bool WarpToNearestSegment(float maximumWarpDistance = 10) - { - if (!currentMappedPosition.IsInvalid()) - { - // already close enough - this.Position = currentMappedPosition.Position; - return true; - } - - NavSegmentPositionPointer p; - if (PBWorld.TryMapPoint(Position, maximumWarpDistance, this, out p)) - { - this.Position = p.Position; - return true; - } - return false; - } - - /// - /// Starts the process of pathfinding to the closest of the given goals. - /// NOTE: Do not call this method every frame. Calculating a path takes longer than a frame, so the agent will never start moving. - /// - /// - /// Goals to pathfind to. - /// True, if the at least 1 goal and the agents own position could be mapped. This does not mean, that a path towards a goal exists. - public bool PathTo(params Vector2[] goals) - { - Stop(); - return UpdatePath(goals); - } - - /// - /// Starts the process of pathfinding to the given goal. - /// NOTE: Do not call this method every frame. Calculating a path takes longer than a frame, so the agent will never start moving. - /// - /// - /// Goals to pathfind to. - /// True, if the at least 1 goal and the agents own position could be mapped. This does not mean, that a path towards a goal exists. - public bool PathTo(Vector2 goal) - { - Stop(); - return UpdatePath(goal); - } - - /// - /// Starts the process of pathfinding to the closest given goal. - /// NOTE: Do not call this method every frame. Calculating a path takes longer than a frame, so the agent will never start moving. - /// - /// True, the agents own position could be mapped. This does not mean, that a path towards the goal exists. - private bool PathTo(IList goalPs) - { - Stop(); - return UpdatePath(goalPs); - } - - /// - /// Starts the process of pathfinding to the closest of the given goals. Will continue moving until the calculations for the new path are completed. - /// NOTE: Do not call this method every frame. Calculating a path takes longer than a frame, so the agent will never start moving. - /// - /// - /// Goals to pathfind to. - /// True, if the at least 1 goal and the agents own position could be mapped. This does not mean, that a path towards a goal exists. - public bool UpdatePath(params Vector2[] goals) - { - if (currentMappedPosition.IsInvalid()) - return false; - - List goalPs = new List(goals.Length); - NavSegmentPositionPointer p; - for (int i = 0; i < goals.Length; i++) - { - float maxDist = Vector2.Distance(Position, goals[i]) + 0.1f; - if (PBWorld.TryMapPoint(goals[i], maxDist, out p) && (allowCloseEnoughPath || CouldBeLocatedAt(p))) - { - goalPs.Add(p); - } - } - return UpdatePath(goalPs); - } - - /// - /// Starts the process of pathfinding to the given goal. Will continue moving until the calculations for the new path are completed. - /// NOTE: Do not call this method every frame. Calculating a path takes longer than a frame, so the agent will never start moving. - /// - /// - /// Goals to pathfind to. - /// True, if the at least 1 goal and the agents own position could be mapped. This does not mean, that a path towards a goal exists. - public bool UpdatePath(Vector2 goal) - { - if (currentMappedPosition.IsInvalid()) - return false; - - float maxDist = Vector2.Distance(Position, goal) + 0.1f; - NavSegmentPositionPointer p; - if (!PBWorld.TryMapPoint(goal, maxDist, out p) || (!allowCloseEnoughPath && !CouldBeLocatedAt(p))) - return false; - - return UpdatePath(new NavSegmentPositionPointer[] { p }); - } - - /// - /// Simple distance check between agent and CurrentSubGoal. - /// - /// True, if distance is less than maxDist - public bool HasReachedCurrentSubGoal(float maxDist = 0.05f) - { - Vector2 delta = PathSubGoal - Position; - float distance = delta.magnitude; - return distance < maxDist; - } - - /// - /// Starts the process of pathfinding to the closest given goal. Will continue moving until the calculations for the new path are completed. - /// - /// True, the agents own position could be mapped. This does not mean, that a path towards the goal exists. - private bool UpdatePath(IList goalPs) - { - if (currentPathRequest.Status == PathRequest.RequestState.Pending) - return false; - - if (goalPs.Count == 0) - return false; - - if (currentMappedPosition.IsInvalid()) - return false; - - currentPathRequest.start = currentMappedPosition; - currentPathRequest.goals = goalPs; - PBWorld.PathTo(currentPathRequest); - // 新请求发出 → 作废上一次的最近可达点(避免跨目标读到过期数据);本次若失败会由 RaiseFailedToFindPath 重新写入。 - _lastClosestReachable = NavSegmentPositionPointer.Invalid; - traversedLinkSinceLastPath = false; - return true; - } - - /// - /// Start pathfinding to a random position on the NavGraph. It cannot grantee that this position is reachable. Does the agent might not move after this is called. - /// - /// - public bool SetRandomDestination() - { - if (currentMappedPosition.IsInvalid()) - return false; - - Vector2 goal = PBWorld.GetRandomPointOnGraph(); - return PathTo(goal); - } - - // [项目新增] 段内随机游走:目标点限制在 agent 当前所站的这一条 NavSegment(cluster) 上, - // 不会跨越任何 NavLink(跳/落/拐角),避免地面单位游走时被崖边夹停或卡在无法穿越的 link 处。 - // 需要 agent 当前已映射到某条段上(currentMappedPosition 有效),否则返回 false。 - // 注意:一条 cluster 是一条直线段;被拐角/斜坡拆成多段的平台只会在当前这一段内游走。 - /// - /// Start pathfinding to a random position ON THE SAME segment the agent currently stands on. - /// Never crosses a NavLink, so a ground unit stays on its current platform segment. - /// insets the random range from BOTH segment ends (world units), - /// so the goal is never so close to the edge that a bodied agent can't stand there - /// (pass the agent's half-width + ledge-check margin). If the segment is shorter than - /// 2*endMargin the goal degenerates to the segment midpoint. - /// Returns false if the agent is not currently mapped to a segment. - /// - public bool SetRandomDestinationOnCurrentSegment(float endMargin = 0f) - { - if (currentMappedPosition.IsInvalid()) - return false; - - var cluster = currentMappedPosition.cluster; - float len = cluster.Length; - float m = Mathf.Clamp(endMargin, 0f, len * 0.5f); // 段太短 → 退化到中点 - float t = UnityEngine.Random.Range(m, len - m); - Vector2 goal = cluster.owner.LocalToWorld.MultiplyPoint3x4(cluster.GetPositionAlongSegment(t)); - return PathTo(goal); - } - - // [项目新增] 目标点吸附:把任意世界点映射到最近的可行走段(与 PB2d 自身"把鼠标点击等任意点映射到 - // 最近导航位置"同一机制),再按 endMargin 从段两端内缩,得到"身体真正站得住"的世界点(避免落在角色宽度 - // 站不住的崖沿被移动层夹停)。与 SetRandomDestinationOnCurrentSegment 同源:endMargin 传 agent 半宽+ - // 落崖检测余量。段短于 2*endMargin → 退化到中点。 - // - // maxSnapDistance = 允许"点离最近段"的最大真实距离(m),语义同 PathBerserker2dSettings.closestToSegmentMaxDistance - // ("想多大就多大")。注意 TryMapPoint 传入的是 AABB 边长、可靠搜索半径只有其一半(见 TryMapPointSurface 的 - // queryAABB=pointMapDistance/2),故这里传 2*maxSnapDistance 以保证"点在 maxSnapDistance 内一定被吸附"。 - // 只要目标离某条烘焙段不超过 maxSnapDistance,就一定映射得到——不会因固定小半径漏掉离地稍远的点。 - /// - /// Maps to the NEAREST walkable segment within - /// (same mechanism PB2d uses to map an arbitrary point such as a - /// mouse click to the graph — cf. closestToSegmentMaxDistance), then insets by - /// from BOTH segment ends so the returned point is one a bodied agent can - /// actually stand on (not clamped at a ledge). A segment shorter than 2*endMargin degenerates to its - /// midpoint. Returns false only if no baked segment lies within maxSnapDistance of the target. - /// - public bool TryGetStandablePointNear(Vector2 worldTarget, float maxSnapDistance, float endMargin, out Vector2 standable) - { - // TryMapPoint 的可靠搜索半径 ≈ 传入值/2(broadphase AABB 半边=pointMapDistance/2),故传 2 倍补偿。 - if (!PBWorld.TryMapPoint(worldTarget, maxSnapDistance * 2f, out var ptr)) - { - standable = worldTarget; - return false; - } - - var cluster = ptr.cluster; - float len = cluster.Length; - float m = Mathf.Clamp(endMargin, 0f, len * 0.5f); // 段太短 → 退化到中点 - float t = Mathf.Clamp(ptr.t, m, len - m); - standable = cluster.owner.LocalToWorld.MultiplyPoint3x4(cluster.GetPositionAlongSegment(t)); - return true; - } - - - /// - /// If you implement link traversal yourself, call this to complete a link traversal. - /// - public void CompleteLinkTraversal() - { - if (IsOnLink) - { - currentPath.MoveNext(); - StartTraversingSegment(); - } - } - - /// - /// If you implement segment traversal yourself, call this to complete a segment traversal. - /// - public void CompleteSegmentTraversal() - { - if (movementState == MovementState.OnSegment) - { - if (currentPath.HasNext) - { - if (CurrentPathSegment.link.IsTraversable) - { - StartTraversingLink(); - } - else - { - movementState = MovementState.WaitForLinkOnSegment; - } - } - else - { - status = State.Idle; - OnReachedGoal?.Invoke(this); - } - } - } - - /// - /// Determines, if in this agent is allowed to traverse the given link. - /// - public bool CanTraverseLink(INavLinkInstance link) - { - int linkType = link.LinkType; - return linkType == -1 || (GetLinkTraversalMultiplier(linkType) > 0 && height <= link.Clearance); - } - - /// - /// Get the traversal cost multiplier for a given link type. - /// - public float GetLinkTraversalMultiplier(int linkType) - { - return linkTraversalCostMultipliers[linkType]; - } - - /// - /// Get the traversal cost multiplier for a given nav tag. - /// - public float GetNavTagTraversalMultiplier(int navTag) - { - return navTagTraversalCostMultipliers[navTag] <= 0 ? float.PositiveInfinity : navTagTraversalCostMultipliers[navTag]; - } - - /// - /// Whether the agents current position contains the given NavTag. NOTE: Does not work, if the agent is not currently moving on a path. - /// - /// True, if current position has supplied NavTag. - public bool IsOnSegmentWithTag(int navTag) - { - if (IsOnSegment) - return (CurrentNavTagVector & (1 << navTag)) != 0; - else - return false; - } - - /// - /// Stops the current path following at the first opportunity. Link traversal will be completed before the agent stops. - /// - public void Stop() - { - stopRequested = true; - if (currentPathRequest.Status == PathRequest.RequestState.Pending) - currentPathRequest = new PathRequest(this); - } - - /// - /// Stops the current path following instantly. Agent might stop wihle traversing a link (e.g. while jumping in mid air) - /// - public void ForceStop() - { - status = State.Idle; - currentPathRequest = new PathRequest(this); - OnStop?.Invoke(this); - } - - /// - /// Tries to map the "other" and checks if the agent is mapped to the same segment. - /// If "other" can't be mapped this will return null. - /// Agents on a link will always return false. - /// If this agent currently can't be mapped this will return null. - /// - /// - public bool? IsOnSameSegmentAs(Vector2 other) - { - if (IsOnLink) - return false; - - NavSegmentPositionPointer p; - if (!PBWorld.TryMapPoint(other, out p) || currentMappedPosition.IsInvalid()) - return null; - return currentMappedPosition.surface == p.surface && currentMappedPosition.cluster == p.cluster; - } - - /// - /// Enumerates the points on the currently followed path. Corner links will result in the same point being enumerated twice in a row. First point will be the agents current position. - /// - public IEnumerable PathPoints() - { - if (!IsFollowingAPath) - yield break; - - yield return Position; - - var seg = currentPath.Current; - if (IsOnSegment) - yield return seg.LinkStart; - - if (seg.Next != null) - { - yield return seg.LinkEnd; - - seg = seg.Next; - while (seg.Next != null) - { - yield return seg.LinkStart; - yield return seg.LinkEnd; - seg = seg.Next; - } - - yield return seg.LinkStart; - } - } - - - - /// - /// Creates a pathrequest for this agent using the specified start and goal. The PathRequest is for your own use. The agent will take no further action. Use it to plan theoretical paths, without the agent moving. See also PBWorld.PathTo() - /// - /// A PathRequest or null, if start or goal couldn't be mapped. - public PathRequest CreatePathRequest(Vector2 start, Vector2 goal) - { - float maxDist = Vector2.Distance(Position, goal) + 0.1f; - NavSegmentPositionPointer startPointer; - if (!PBWorld.TryMapPoint(start, maxDist, this, out startPointer)) - return null; - - NavSegmentPositionPointer goalPointer; - if (!PBWorld.TryMapPoint(goal, maxDist, out goalPointer) || (!allowCloseEnoughPath && !CouldBeLocatedAt(goalPointer))) - return null; - - PathRequest request = new PathRequest(this); - request.start = startPointer; - request.goals = new[] { goalPointer }; - - return request; - } - - /// - /// Convenience function that will return if the agent could reach the given point from it's current location. It runs synchronously which is not optimal for performance. - /// - public bool CanReach(Vector2 goal) - { - var pr = CreatePathRequest(Position, goal); - PBWorld.PathTo(pr); - - while (pr.Status != PathRequest.RequestState.Finished && pr.Status != PathRequest.RequestState.Failed) - { - // fast spinning - } - return pr.Status == PathRequest.RequestState.Finished; - } - - /// - /// After the most recent failed path request (NoPathFromStartToGoal), returns the closest - /// reachable world position found towards the goal. Returns false if none is available. - /// - public bool TryGetClosestReachablePosition(out Vector2 worldPos) - { - if (!_lastClosestReachable.IsInvalid()) - { - worldPos = _lastClosestReachable.Position; - return true; - } - worldPos = Vector2.zero; - return false; - } - - // [项目新增] 记录失败请求的最近可达点后再广播寻路失败,供执行层读取。仅 NoPath 失败才有最近点。 - private void RaiseFailedToFindPath(PathRequest failedRequest) - { - _lastClosestReachable = (failedRequest != null - && failedRequest.FailReason == PathRequest.RequestFailReason.NoPathFromStartToGoal) - ? failedRequest.closestReachablePosition - : NavSegmentPositionPointer.Invalid; - OnFailedToFindPath?.Invoke(this); - } - - private int GetNavTagMask() - { - int navTagMask = 0; - for (int i = 0; i < navTagTraversalCostMultipliers.Length; i++) - { - if (navTagTraversalCostMultipliers[i] <= 0) - navTagMask |= 1 << i; - } - return ~navTagMask; - } - - internal bool CanTraverseSegment(Vector2 segNormal, float minClearance) - { - return Vector2.Angle(Vector2.up, segNormal) <= maxSlopeAngle && minClearance >= height; - } - - internal bool CouldBeLocatedAt(NavSegmentPositionPointer positionPointer) - { - return Vector2.Angle(Vector2.up, positionPointer.Normal) <= maxSlopeAngle && positionPointer.cluster.GetClearanceAlongSegment(positionPointer.t) >= height && (positionPointer.cluster.GetNavTagVector(positionPointer.t) & ~navTagMask) == 0; - } - - private void StartTraversingLink() - { - movementState = MovementState.OnLink; - traversedLinkSinceLastRepath = true; - traversedLinkSinceLastPath = true; - TimeOnLink = 0; - OnStartLinkTraversal?.Invoke(this); - } - - private void StartTraversingSegment() - { - movementState = MovementState.OnSegment; - OnStartSegmentTraversal?.Invoke(this); - } - - private void UpdateMappedPosition() - { - // probably not on ground when on link - if (IsOnLink) - { - // make sure to set the path to invalid - currentMappedPosition = NavSegmentPositionPointer.Invalid; - return; - } - //if (Time.time >= timeToRemapPosition) - //{ - // timeToRemapPosition = Time.time + 0.2f + UnityEngine.Random.value * 0.1f; - - PBWorld.TryMapAgent(Position, currentMappedPosition, this, out currentMappedPosition); - - // edge case fix - // happens if the navagent is on a corner and mapping disagrees with path - if (IsFollowingAPath && currentMappedPosition.cluster != currentPath.Current.cluster) - { - if (currentMappedPosition.t <= 0.05f) - { - currentMappedPosition = new NavSegmentPositionPointer(currentMappedPosition.surface, currentPath.Current.cluster, 0); - } - else if (currentMappedPosition.t >= currentMappedPosition.cluster.Length - 0.05f) - { - currentMappedPosition = new NavSegmentPositionPointer(currentMappedPosition.surface, currentPath.Current.cluster, currentPath.Current.cluster.Length); - } - } - } - - private void Repath() - { - switch (repathPathRequest.Status) - { - case PathRequest.RequestState.Draft: - if (IsOnSegment && !currentMappedPosition.IsInvalid() && Time.time - lastRepathTime >= Mathf.Max(0.1f, autoRepathIntervall)) - { - repathPathRequest.start = currentMappedPosition; - repathPathRequest.goals = currentPathRequest.goals; - - PBWorld.PathTo(repathPathRequest); - - lastRepathTime = Time.time; - traversedLinkSinceLastRepath = false; - } - break; - case PathRequest.RequestState.Failed: - if (repathPathRequest.FailReason == PathRequest.RequestFailReason.NoPathFromStartToGoal - || repathPathRequest.FailReason == PathRequest.RequestFailReason.WorldWasDestroyed) - { - Stop(); - RaiseFailedToFindPath(repathPathRequest); - } - - repathPathRequest.Reset(); - break; - case PathRequest.RequestState.Finished: - if (!traversedLinkSinceLastRepath && currentPathRequest.goals == repathPathRequest.goals) - { - StartFollowingPath(repathPathRequest); - } - - repathPathRequest.Reset(); - break; - } - } - - private void HandlePathRequest() - { - switch (currentPathRequest.Status) - { - case PathRequest.RequestState.Failed: - - if (!allowCloseEnoughPath) - { - Stop(); - - if (currentPathRequest.Status == PathRequest.RequestState.Failed && enableDebugMessages) - Debug.Log($"{name}: Pathrequest failed because: {currentPathRequest.FailReason}"); - - RaiseFailedToFindPath(currentPathRequest); - currentPathRequest.Reset(); - } - else if (currentPathRequest.FailReason == PathRequest.RequestFailReason.NoPathFromStartToGoal && !currentPathRequest.closestReachablePosition.IsInvalid()) - { - float maxDistance = 10; - float distance = Vector2.Distance(currentPathRequest.closestReachablePosition.Position, Position); - if (distance < maxDistance) - { - UpdatePath(new List() { currentPathRequest.closestReachablePosition }); - } - RaiseFailedToFindPath(currentPathRequest); - } - break; - case PathRequest.RequestState.Finished: - if (!traversedLinkSinceLastPath) - { - StartFollowingPath(currentPathRequest); - currentPathRequest.Reset(); - } - else - { - traversedLinkSinceLastPath = false; - // retry - if (IsOnSegment && !currentMappedPosition.IsInvalid()) - PathTo(currentPathRequest.goals); - } - break; - } - } - - private bool StartFollowingPath(PathRequest request) - { -#if PBDEBUG - Debug.Log("Pathrequest succeed. " + request.Path); - Debug.Assert(request.Status == PathRequest.RequestState.Finished); -#endif - // check that we are close to the path start - if (Vector2.Distance(request.start.Position, Position) > maximumDistanceToPathStart) - { -#if PBDEBUG - Debug.Log("Moved to far away from path start. Not using that path"); -#endif - request.Fail(PathRequest.RequestFailReason.ToFarFromStart); - return false; - } - - stopRequested = false; - lastRepathTime = Time.time; - this.status = State.FollowPath; - currentPath = request.Path; - - StartTraversingSegment(); - - OnStartFollowingNewPath?.Invoke(this); - return true; - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgent.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgent.cs.meta deleted file mode 100644 index 74d2c053..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgent.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3864fd1487d130847b11b82f276d11b6 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: -50 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers.meta deleted file mode 100644 index 85710692..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 19f72ec82365a48439101af4e8b29c4e -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/AdjustRotation.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/AdjustRotation.cs deleted file mode 100644 index 744f0ca9..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/AdjustRotation.cs +++ /dev/null @@ -1,32 +0,0 @@ -using UnityEngine; - -namespace PathBerserker2d -{ - /// - /// Adjust the NavAgents rotation to match the segments rotation. - /// - public class AdjustRotation : MonoBehaviour - { - [SerializeField] - public NavAgent agent; - - /// - /// Speed at which the agent is rotated. - /// - [SerializeField, Tooltip("Speed at which the agent is rotated.")] - public float rotationSpeed = 20; - - private void Update() - { - if (!agent.IsOnLink || agent.CurrentPathSegment?.link?.LinkTypeName != "corner") - { - this.transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.forward, this.agent.CurrentSegmentNormal), Time.deltaTime * rotationSpeed); - } - } - - private void Reset() - { - agent = GetComponent(); - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/AdjustRotation.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/AdjustRotation.cs.meta deleted file mode 100644 index f1c36644..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/AdjustRotation.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f33302ff91c92994e9d60e1cf7668b8f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/Follower.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/Follower.cs deleted file mode 100644 index e74b1ebc..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/Follower.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -namespace PathBerserker2d -{ - /// - /// Makes a NavAgent follow another. - /// - public class Follower : MonoBehaviour - { - [SerializeField] - public NavAgent navAgent = null; - [SerializeField] - public Transform target = null; - - /// - /// Radius when agent should start moving towards the target. Should be >= travelStopRadius - /// - [SerializeField, Tooltip("Radius when agent should start moving towards the target. Should be >= travelStopRadius")] - public float closeEnoughRadius = 3; - - /// - /// Radius when agent should stop moving towards the target. - /// - [SerializeField, Tooltip("Radius when agent should stop moving towards the target")] - public float travelStopRadius = 1; - - /// - /// Using the targets velocity, predicts the targets position in the future and uses this prediction as pathfinding goal. Useful for fast moving enemies. Only works when the target has a Rigidbody2d component or a component that implements IVelocityProvider. (NavAgent does not!) - /// - [SerializeField] - [Tooltip("Using the targets velocity, predicts the targets position in the future and uses this prediction as pathfinding goal. Useful for fast moving enemies. Only works when the target has a Rigidbody2d component or a component that implements IVelocityProvider. (NavAgent does not!)")] - public float targetPredictionTime = 0; - - void Update() - { - if (target == null) - return; - - Vector2 targetPos = GetTargetPosition(); - float distToTarget = Vector2.Distance(transform.position, targetPos); - - if (distToTarget > closeEnoughRadius && - !(navAgent.PathGoal.HasValue && Vector2.Distance(navAgent.PathGoal.Value, targetPos) < travelStopRadius)) - { - if (!navAgent.UpdatePath(targetPos) && targetPredictionTime > 0) - { - navAgent.UpdatePath(target.position); - } - } - else if (distToTarget < travelStopRadius) - { - navAgent.Stop(); - } - } - - private void OnDrawGizmosSelected() - { - Gizmos.color = Color.green; - Gizmos.DrawWireSphere(transform.position, closeEnoughRadius); - - Gizmos.color = Color.blue; - Gizmos.DrawWireSphere(transform.position, travelStopRadius); - } - - private void OnValidate() - { - closeEnoughRadius = Mathf.Max(travelStopRadius, closeEnoughRadius); - } - - private void Reset() - { - navAgent = GetComponent(); - } - - private Vector2 GetTargetPosition() - { - Vector2 tpos = target.position; - if (targetPredictionTime > 0) - { - IVelocityProvider velocityProvider = target.GetComponent(); - if (velocityProvider != null) - return tpos + velocityProvider.WorldVelocity * targetPredictionTime; - - Rigidbody2D rigidbody = target.GetComponent(); - if (rigidbody != null) - return tpos + rigidbody.velocity * targetPredictionTime; - } - return tpos; - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/Follower.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/Follower.cs.meta deleted file mode 100644 index adc01c54..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/Follower.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d3b58755f80ab91479f1f9314acdea17 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/FootStepSounds.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/FootStepSounds.cs deleted file mode 100644 index 9edbbdef..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/FootStepSounds.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using UnityEngine; - -namespace PathBerserker2d -{ - /// - /// Play foot steps depending on the NavTags at the agents current position. - /// - public class FootStepSounds : MonoBehaviour - { - public AudioClip[] FootStepSoundClips - { - get => footstepSounds; - set - { - if (value == null) - throw new ArgumentNullException(); - if (value.Length != PathBerserker2dSettings.NavTags.Length) - throw new ArgumentException($"FootStepSoundClips needs to be an array of length equal to the amount of NavTags ({PathBerserker2dSettings.NavTags.Length})."); - - footstepSounds = value; - } - } - - [SerializeField] - public AudioSource audioSource = null; - - [SerializeField] - public NavAgent agent = null; - - /// - /// Delay between playing of footstep sounds. - /// - [SerializeField] - public float footStepDelay = 1f; - - /// - /// Used when no NavTag specific footStep was found, or if the current segment has no NavTag. - /// - [SerializeField] - public AudioClip defaultFootstep = null; - - /// - /// Footsteps to use for each NavTag. - /// - [SerializeField] - AudioClip[] footstepSounds = null; - - private float lastFootStepTime; - - void Update() - { - // time to play next step? Is agent moving on segment? - if (Time.time - lastFootStepTime >= footStepDelay && agent.IsMovingOnSegment) - { - lastFootStepTime = Time.time; - int navTagV = agent.CurrentNavTagVector; - - AudioClip chosenClip = defaultFootstep; - // chose the first step sound with matching NavTag - for (int i = 0; i < footstepSounds.Length; i++) - { - if ((navTagV & (1 << i)) != 0) - { - chosenClip = footstepSounds[i]; - break; - } - } - audioSource.PlayOneShot(chosenClip); - } - } - - private void OnValidate() - { - if (footstepSounds == null) - { - footstepSounds = new AudioClip[PathBerserker2dSettings.NavTags.Length]; - } - if (footstepSounds.Length != PathBerserker2dSettings.NavTags.Length) - { - System.Array.Resize(ref footstepSounds, PathBerserker2dSettings.NavTags.Length); - } - } - - private void Reset() - { - agent = GetComponent(); - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/FootStepSounds.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/FootStepSounds.cs.meta deleted file mode 100644 index fe65915e..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/FootStepSounds.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c5f023eaead09b849a79459b344a457f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/KeepGrounded.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/KeepGrounded.cs deleted file mode 100644 index daf409f8..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/KeepGrounded.cs +++ /dev/null @@ -1,35 +0,0 @@ -using UnityEngine; - -namespace PathBerserker2d -{ - /// - /// Keeps the agent on moving platforms, by parenting the agent to them. - /// - public class KeepGrounded : MonoBehaviour - { - [SerializeField] - public LayerMask movingPlatformLayermask = 0; - - Transform originalParent; - - private void Awake() - { - originalParent = transform.parent; - } - - void FixedUpdate() - { - var hit = Physics2D.Raycast(transform.position + transform.up * 0.1f, -transform.up, 0.4f, movingPlatformLayermask); - if (hit.collider != null) - { - // we hit a moving platform -> parent - transform.SetParent(hit.collider.transform, true); - } - else - { - // we didn't hit a moving platform -> unparent - transform.SetParent(originalParent, true); - } - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/KeepGrounded.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/KeepGrounded.cs.meta deleted file mode 100644 index bde6e439..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/KeepGrounded.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: db3357009171fec4db2b712ce84cd1b5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/MouseWalker.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/MouseWalker.cs deleted file mode 100644 index 25526ce4..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/MouseWalker.cs +++ /dev/null @@ -1,45 +0,0 @@ -using UnityEngine; -#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER -using UnityEngine.InputSystem; -#endif - -namespace PathBerserker2d -{ - /// - /// Let the NavAgent walk to a mouse click. - /// - class MouseWalker : MonoBehaviour - { - [SerializeField] - public NavAgent navAgent; - - void Update() - { - // mouse click occurred? -#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER - if (Mouse.current.leftButton.wasPressedThisFrame) -#else - if (Input.GetMouseButtonDown(0)) -#endif - { -#if ENABLE_INPUT_SYSTEM && !ENABLE_LEGACY_INPUT_MANAGER - Vector2 pos = Camera.main.ScreenToWorldPoint(Mouse.current.position.ReadValue()); -#else - Vector2 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition); -#endif - if (!navAgent.PathTo(pos)) - { - if (navAgent.HasValidPosition) - Debug.Log($"{name}: Pathfinding failed."); - else - Debug.Log($"{name}: Agent is not on a NavSurface."); - } - } - } - - private void Reset() - { - navAgent = GetComponent(); - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/MouseWalker.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/MouseWalker.cs.meta deleted file mode 100644 index d3814b7d..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/MouseWalker.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2a20f61a67733b34ba53481d70603e95 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/MultiGoalWalker.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/MultiGoalWalker.cs deleted file mode 100644 index 24159403..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/MultiGoalWalker.cs +++ /dev/null @@ -1,52 +0,0 @@ -using UnityEngine; - -namespace PathBerserker2d -{ - /// - /// Let the agent walk to the closest of the given goals. - /// - public class MultiGoalWalker : MonoBehaviour - { - [SerializeField] - public NavAgent navAgent; - [SerializeField] - Transform[] goals = null; - [SerializeField] - public bool activateOnStart = true; - - void Start() - { - if (activateOnStart) - { - MoveToClosestGoal(); - } - } - - private void Reset() - { - navAgent = GetComponent(); - } - - /// - /// Starts moving to closest of this.goals. - /// - public void MoveToClosestGoal() - { - Vector2[] vs = new Vector2[goals.Length]; - for (int i = 0; i < goals.Length; i++) - vs[i] = goals[i].position; - navAgent.PathTo(vs); - } - - /// - /// Starts moving to closest of supplied goals. - /// - public void MoveToClosestGoal(Transform[] goals) - { - Vector2[] vs = new Vector2[goals.Length]; - for (int i = 0; i < goals.Length; i++) - vs[i] = goals[i].position; - navAgent.PathTo(vs); - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/MultiGoalWalker.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/MultiGoalWalker.cs.meta deleted file mode 100644 index dbb1ee3c..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/MultiGoalWalker.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 65ba0666f6ead714a9a712c134268969 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/PatrolWalker.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/PatrolWalker.cs deleted file mode 100644 index af173553..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/PatrolWalker.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using UnityEngine; - -namespace PathBerserker2d -{ - /// - /// Let the NavAgent walk to a series of goals in a loop. - /// - public class PatrolWalker : MonoBehaviour - { - /// - /// Radius at which the agent starts calculating path to next goal on patrol route. Must be >= 0. - /// - public float CalcNextPathRad - { - get => calcNextPathRad; - set - { - if (calcNextPathRad < 0) - throw new ArgumentException("CalcNextPathRad must be greater or equal to 0"); - calcNextPathRad = value; - } - } - - public Transform[] PatrolRoute - { - get => goals; - set - { - this.goals = value; - this.currentGoal = 0; - } - } - - [SerializeField] - public NavAgent navAgent; - [SerializeField] - Transform[] goals = null; - [SerializeField] - float calcNextPathRad = 0.2f; - - private Transform goal => goals[currentGoal]; - - int currentGoal = 0; - - private void Start() - { - navAgent.PathTo(goal.position); - } - - void Update() - { - if (goals == null) - return; - - // close enough move to next - float dist = Vector2.Distance(navAgent.Position, goal.position); - if (dist < calcNextPathRad) - { - currentGoal++; - if (currentGoal >= goals.Length) - { - currentGoal = 0; - } - navAgent.UpdatePath(goal.position); - } - } - - private void OnValidate() - { - calcNextPathRad = Mathf.Max(calcNextPathRad, 0.1f); - } - - private void Reset() - { - navAgent = GetComponent(); - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/PatrolWalker.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/PatrolWalker.cs.meta deleted file mode 100644 index 326d581c..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/PatrolWalker.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e2c32017511f38b48a9b544492b5d0f6 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/RandomWalker.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/RandomWalker.cs deleted file mode 100644 index 4cd494f9..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/RandomWalker.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Collections; -using UnityEngine; - -namespace PathBerserker2d -{ - /// - /// Lets the NavAgent walk to a random point - /// - public class RandomWalker : MonoBehaviour - { - [SerializeField] - public NavAgent navAgent; - - /// - /// The random destination my not always be reachable. RetryCount determines the maximum amount of rolls for a random reachable position. - /// - [SerializeField, Tooltip("The random destination may not always be reachable. RetryCount determines the maximum amount of rolls each update for a random reachable position.")] - public int retryCount = 10; - - /// - /// Will make the agent pick a new random position to walk to, after reaching the previous one. Makes the agent walk between random points, until its set to false. - /// - [SerializeField] - public bool keepWalkingRandomly = true; - - void Update() - { - if (keepWalkingRandomly && navAgent.IsIdle) - { - StartRandomWalk(); - } - } - - private void Reset() - { - navAgent = GetComponent(); - } - - /// - /// Picks a random position and makes the NavAgent walk to it. - /// - /// True, if a random reachable position was found within a maximum of retryCount tries. - public bool StartRandomWalk() - { - for (int i = 0; i < retryCount && !navAgent.SetRandomDestination(); i++) - { - - } - - return !navAgent.IsIdle; - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/RandomWalker.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/RandomWalker.cs.meta deleted file mode 100644 index c2374e1d..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/NavAgentUsers/RandomWalker.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9fc605c0d97145a45be2755ef52445e0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/TransformBasedMovement.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/TransformBasedMovement.cs deleted file mode 100644 index c7c56155..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/TransformBasedMovement.cs +++ /dev/null @@ -1,369 +0,0 @@ -using UnityEngine; - -namespace PathBerserker2d -{ - /// - /// Moves a NavAgent by manipulating its transform. - /// - public class TransformBasedMovement : MonoBehaviour - { - [System.Flags] - public enum FeatureFlags - { - SegmentMovement = 1, - JumpLinks = 2, - CornerLinks = 4, - FallLinks = 8, - TeleportLinks = 16, - ClimbLinks = 32, - ElevatorLinks = 64, - OtherLinks = 128, - } - - [Tooltip("Speed on segments in unit/s.")] - [SerializeField] - public float movementSpeed = 5; - - [Tooltip("Speed on corner links in degrees/s.")] - [SerializeField] - public float cornerSpeed = 100; - - [Tooltip("Speed on jump links in unit/s.")] - [SerializeField] - public float jumpSpeed = 5; - - [Tooltip("Speed on fall links in unit/s.")] - [SerializeField] - public float fallSpeed = 5; - - [Tooltip("Speed on climb links in unit/s.")] - [SerializeField] - public float climbSpeed = 5; - - /// - /// If false, agent will not be rotated. - /// - [Tooltip("Controls whether the default movement handler is allowed to rotate the agent.")] - [SerializeField] - public bool enableAgentRotation = true; - - /// - /// Sets which links and segments this component will handle. Useful to override an Agents default behavior for a certain link type or segment. - /// - [Tooltip("Enable features by setting the flag.")] - [SerializeField] - public FeatureFlags enabledFeatures = (FeatureFlags)int.MaxValue; - - private float timeOnLink; - private float timeToCompleteLink; - private Vector2 direction; - private int state = 0; - private Transform elevatorTrans; - private float deltaDistance; - private bool handleLinkMovement; - private int minNumberOfLinkExecutions; - private Vector2 storedLinkStart; - - private void OnEnable() - { - var agent = GetComponent(); - agent.OnStartLinkTraversal += Agent_StartLinkTraversalEvent; - agent.OnStartSegmentTraversal += Agent_OnStartSegmentTraversal; - agent.OnSegmentTraversal += Agent_OnSegmentTraversal; - agent.OnLinkTraversal += Agent_OnLinkTraversal; - } - - private void OnDisable() - { - var agent = GetComponent(); - agent.OnStartLinkTraversal -= Agent_StartLinkTraversalEvent; - agent.OnStartSegmentTraversal -= Agent_OnStartSegmentTraversal; - agent.OnSegmentTraversal -= Agent_OnSegmentTraversal; - agent.OnLinkTraversal -= Agent_OnLinkTraversal; - } - - private void OnValidate() - { - if (jumpSpeed <= 0) - jumpSpeed = 0.01f; - if (fallSpeed <= 0) - fallSpeed = 0.01f; - if (climbSpeed <= 0) - climbSpeed = 0.01f; - } - - private void Agent_OnStartSegmentTraversal(NavAgent agent) - { - - } - - private void Agent_OnSegmentTraversal(NavAgent agent) - { - if (!enabledFeatures.HasFlag(FeatureFlags.SegmentMovement)) - return; - - Vector2 newPos; - bool reachedGoal = MoveAlongSegment(agent.Position, agent.PathSubGoal, agent.CurrentPathSegment.Point, agent.CurrentPathSegment.Tangent, Time.deltaTime * movementSpeed, out newPos); - agent.Position = newPos; - - if (reachedGoal) - { - agent.CompleteSegmentTraversal(); - } - } - - private void Agent_StartLinkTraversalEvent(NavAgent agent) - { - string linkType = agent.CurrentPathSegment.link.LinkTypeName; - - bool unknownLinkType = linkType != "corner" && linkType != "fall" && linkType != "jump" && linkType != "elevator" && linkType != "teleport" && linkType != "climb"; - - handleLinkMovement = - (unknownLinkType && enabledFeatures.HasFlag(FeatureFlags.OtherLinks)) || - (linkType == "corner" && enabledFeatures.HasFlag(FeatureFlags.CornerLinks)) || - (linkType == "fall" && enabledFeatures.HasFlag(FeatureFlags.FallLinks)) || - (linkType == "jump" && enabledFeatures.HasFlag(FeatureFlags.JumpLinks)) || - (linkType == "elevator" && enabledFeatures.HasFlag(FeatureFlags.ElevatorLinks)) || - (linkType == "teleport" && enabledFeatures.HasFlag(FeatureFlags.TeleportLinks)) || - (linkType == "climb" && enabledFeatures.HasFlag(FeatureFlags.ClimbLinks)); - - if (!handleLinkMovement) - return; - - timeOnLink = 0; - Vector2 delta = agent.PathSubGoal - agent.CurrentPathSegment.LinkStart; - deltaDistance = delta.magnitude; - direction = delta / deltaDistance; - minNumberOfLinkExecutions = 1; - storedLinkStart = agent.CurrentPathSegment.LinkStart; - - float speed = 1; - switch (agent.CurrentPathSegment.link.LinkTypeName) - { - case "corner": - if (!enableAgentRotation) - { - agent.CompleteLinkTraversal(); - break; - } - speed = cornerSpeed; - deltaDistance = agent.CurrentPathSegment.link.TravelCosts(Vector2.zero, Vector2.zero); - break; - case "fall": - speed = fallSpeed; - break; - case "climb": - speed = climbSpeed; - - Vector2 pos = agent.CurrentPathSegment.link.GameObject.transform.position; - Vector2 dir = agent.CurrentPathSegment.link.GameObject.transform.up; - - Vector2 start = Geometry.ProjectPointOnLine(agent.CurrentPathSegment.LinkStart, pos, dir); - Vector2 end = Geometry.ProjectPointOnLine(agent.PathSubGoal, pos, dir); - deltaDistance = Vector2.Distance(start, pos) + Vector2.Distance(start, end) + Vector2.Distance(end, agent.PathSubGoal); - - state = 0; - minNumberOfLinkExecutions = 3; - break; - case "jump": - speed = jumpSpeed; - break; - case "elevator": - speed = movementSpeed; - state = 0; - minNumberOfLinkExecutions = 4; - elevatorTrans = agent.CurrentPathSegment.link.GameObject.transform; - var childTrans = agent.CurrentPathSegment.link.GameObject.GetComponentsInChildren(); - foreach (var t in childTrans) - { - if (t.gameObject.layer == 8) - { - elevatorTrans = t; - break; - } - } - break; - } - - if (agent.CurrentPathSegment.link.LinkTypeName == "elevator") - timeToCompleteLink = float.PositiveInfinity; - else - timeToCompleteLink = (deltaDistance / speed); - } - - private void Agent_OnLinkTraversal(NavAgent agent) - { - if (!handleLinkMovement) - return; - - timeOnLink += Time.deltaTime; - timeOnLink = Mathf.Min(timeToCompleteLink, timeOnLink); - - switch (agent.CurrentPathSegment.link.LinkTypeName) - { - case "corner": - Corner(agent); - break; - case "jump": - Jump(agent); - break; - case "fall": - Fall(agent); - break; - case "teleport": - Teleport(agent); - timeOnLink = timeToCompleteLink + 1; - break; - case "climb": - Climb(agent); - break; - case "elevator": - Elevator(agent); - break; - default: - Jump(agent); - break; - } - - minNumberOfLinkExecutions--; - if (timeOnLink >= timeToCompleteLink && minNumberOfLinkExecutions <= 0) - { - agent.CompleteLinkTraversal(); - return; - } - } - - private void Corner(NavAgent agent) - { - var from = Quaternion.LookRotation(Vector3.forward, agent.CurrentPathSegment.Normal); - var to = Quaternion.LookRotation(Vector3.forward, agent.CurrentPathSegment.Next.Normal); - - - agent.transform.rotation = Quaternion.Slerp( - from, - to, - agent.TimeOnLink / (deltaDistance / cornerSpeed)); - } - - private void Jump(NavAgent agent) - { - Vector2 newPos = storedLinkStart + direction * timeOnLink * jumpSpeed; - newPos.y += deltaDistance * 0.3f * Mathf.Sin(Mathf.PI * timeOnLink / timeToCompleteLink); - agent.Position = newPos; - } - - private void Fall(NavAgent agent) - { - Vector2 newPos = storedLinkStart + direction * timeOnLink * fallSpeed; - agent.Position = newPos; - } - - private void Climb(NavAgent agent) - { - Vector2 linkPos = agent.CurrentPathSegment.link.GameObject.transform.position; - Vector2 linkDir = agent.CurrentPathSegment.link.GameObject.transform.up; - - Vector2 newPos = Vector2.zero; - switch (state) - { - case 0: - Vector2 start = Geometry.ProjectPointOnLine(agent.CurrentPathSegment.LinkStart, linkPos, linkDir); - if (MoveTo(agent.Position, start, climbSpeed * Time.deltaTime, out newPos)) - { - state = 1; - } - break; - case 1: - Vector2 end = Geometry.ProjectPointOnLine(agent.PathSubGoal, linkPos, linkDir); - if (MoveTo(agent.Position, end, climbSpeed * Time.deltaTime, out newPos)) - { - state = 2; - } - break; - case 2: - if (MoveTo(agent.Position, agent.PathSubGoal, climbSpeed * Time.deltaTime, out newPos)) - { - // force early exit - timeToCompleteLink = 0; - } - break; - } - agent.Position = newPos; - } - - private void Elevator(NavAgent agent) - { - // 3 phase - // 1. move on elevator - // 2. wait to reach destination - // 3. leave - - Vector2 newPos = agent.Position; - switch (state) - { - case 0: - Vector2 target = elevatorTrans.position; - if (agent.CurrentPathSegment.link.IsTraversable && Mathf.Abs(newPos.y - target.y) < 0.1f) - { - state = 1; - newPos.y = target.y; - direction = Vector2.right * Mathf.Sign(target.x - storedLinkStart.x); - } - break; - case 1: - newPos += movementSpeed * direction * Time.deltaTime; - - float targetX = agent.CurrentPathSegment.link.GameObject.transform.position.x; - if ((newPos.x - targetX) * direction.x >= 0) - { - state = 2; - newPos.x = targetX; - } - break; - case 2: - // wait till y matches elevation - // cast ray downwards to move with platform - float targetY = agent.PathSubGoal.y; - if (agent.CurrentPathSegment.link.IsTraversable && Mathf.Abs(newPos.y - targetY) < 0.1f) - { - state = 3; - newPos.y = targetY; - direction = Vector2.right * Mathf.Sign(agent.PathSubGoal.x - newPos.x); - timeOnLink = 0; - timeToCompleteLink = Mathf.Abs(agent.PathSubGoal.x - newPos.x) / movementSpeed; - } - break; - case 3: - newPos += movementSpeed * direction * Time.deltaTime; - break; - } - agent.Position = newPos; - } - - private void Teleport(NavAgent agent) - { - agent.Position = agent.PathSubGoal; - } - - private static bool MoveAlongSegment(Vector2 pos, Vector2 goal, Vector2 segPoint, Vector2 segTangent, float amount, out Vector2 newPos) - { - pos = Geometry.ProjectPointOnLine(pos, segPoint, segTangent); - goal = Geometry.ProjectPointOnLine(goal, segPoint, segTangent); - return MoveTo(pos, goal, amount, out newPos); - } - - private static bool MoveTo(Vector2 pos, Vector2 goal, float amount, out Vector2 newPos) - { - Vector2 dir = goal - pos; - float distance = dir.magnitude; - if (distance <= amount) - { - newPos = goal; - return true; - } - - newPos = pos + dir * amount / distance; - return false; - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/TransformBasedMovement.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/TransformBasedMovement.cs.meta deleted file mode 100644 index df66c74a..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavAgent/TransformBasedMovement.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 77030faff3812a7429edeaca91e9c873 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph.meta deleted file mode 100644 index e5ac7800..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: cd0d5b7789d46e742afeb4aa400c1822 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraph.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraph.cs deleted file mode 100644 index 8f75ef75..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraph.cs +++ /dev/null @@ -1,831 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using UnityEngine; -using UnityEngine.XR.WSA; - -namespace PathBerserker2d -{ - public enum NavGraphChange - { - NavSurfaceAdded, - NavSurfaceRemoved, - NavLinkAdded, - NavLinkRemoved, - SegmentModifierAdded, - SegmentModifierRemoved, - NavLinkMoved - } - - public interface INavGraphChangeSource - { - /// - /// Called after a group of changes has been applied to the NavGraph. When this is called, the changes are already applied and ready for use. For example NavSurfaceAdded means that that NavSurface is ready to be pathfinded on from now on, link mapping will work etc. - /// This may be called multiple times for the segment modifier related events as one SegmentModifier GameObject can produce multiple SegmentModifier changes. - /// Parameters: - /// - Change type - /// - the PBComponentId of the component (NavSurface, Link, SegmentModifier, ...) had. PBComponentId is a custom id that PathBerserker gives each component. Each component (NavSurface, Link, SegmentModifier, ...) has a PBComponentId property you can query to get its id. - /// - event Action OnGraphChange; - } - - internal class NavGraph : INavGraphChangeSource - { - public ReaderWriterLock graphLock = new ReaderWriterLock(); - public event Action OnGraphChange; - - internal readonly Dictionary segmentTrees = new Dictionary(); - - List changes = new List(20); - List stagedNewSurfaces = new List(4); - - private int pathfinderThreadCount; - - public NavGraph(int pathfinderThreadCount) - { - this.pathfinderThreadCount = pathfinderThreadCount; - } - - public void AddNavSurface(NavSurface surface) - { - var addSurface = new AddNavSurfaceChange(surface, pathfinderThreadCount); - if (!stagedNewSurfaces.Any(item => item.surface == surface)) - stagedNewSurfaces.Add(addSurface); - changes.Add(addSurface); - } - - public void RemoveNavSurface(NavSurface surface) - { - changes.Add(new RemoveNavSurfaceChange(surface)); - } - - public void AddNavLink(INavLinkInstance link, NavSegmentPositionPointer start, NavSegmentPositionPointer goal) - { - changes.Add(new AddNavLinkChange(link, start, goal)); - } - - public void RemoveNavLink(INavLinkInstance link, NavSegmentPositionPointer start, NavSegmentPositionPointer goal) - { - changes.Add(new RemoveNavLinkChange(link, start, goal)); - } - - public void MoveNavLinkStart(INavLinkInstance link, NavSegmentPositionPointer start, NavSegmentPositionPointer goal, NavSegmentPositionPointer oldStart) - { - changes.Add(new MoveNavLinkStartChange(link, start, goal, oldStart)); - } - - public void MoveNavLinkGoal(INavLinkInstance link, NavSegmentPositionPointer start, NavSegmentPositionPointer goal, NavSegmentPositionPointer oldGoal) - { - changes.Add(new MoveNavLinkGoalChange(link, start, goal, oldGoal)); - } - - public void AddSegmentModifier(NavAreaMarkerInstance modifier) - { - changes.Add(new AddSegmentModifierChange(modifier)); - } - - public void RemoveSegmentModifier(NavAreaMarkerInstance modifier) - { - changes.Add(new RemoveSegmentModifierChange(modifier)); - } - - public void Update() - { - // update navsurface position matricies - foreach (var entry in segmentTrees) - { - if (entry.Key != null) - entry.Value.LocalToWorld = entry.Key.LocalToWorldMatrix; - } - - if (changes.Count + stagedNewSurfaces.Count == 0) - return; - - graphLock.AcquireWriterLock(-1); - try - { - for (int i = 0; i < changes.Count; i++) - changes[i].Apply(this); - } - finally - { - graphLock.ReleaseWriterLock(); - } - - // fire events - if (OnGraphChange != null) - { - for (int i = 0; i < changes.Count; i++) - { - try - { - OnGraphChange(changes[i].ChangeType, changes[i].ChangeSource); - } - catch (Exception e) - { - // we don't want listener exceptions to take down the pathfinding system with it - Debug.LogError(e); - } - } - } - - stagedNewSurfaces.Clear(); - changes.Clear(); - } - - public void ForceApplyChanges() - { - for (int i = 0; i < changes.Count; i++) - changes[i].Apply(this); - - stagedNewSurfaces.Clear(); - changes.Clear(); - } - - public bool TryMapAgent(Vector2 position, NavSegmentPositionPointer pointer, NavAgent agent, out NavSegmentPositionPointer result) - { - if (!pointer.IsInvalid() && agent.CouldBeLocatedAt(pointer)) - { - NavGraphNodeCluster cluster; - if (TryGetClusterAt(pointer, out cluster)) - { - Vector2 localPos = pointer.surface.WorldToLocal(position); - float t = cluster.DistanceOfPointAlongSegment(localPos); - Vector2 proj = cluster.GetPositionAlongSegment(t); - float dist = (proj - localPos).sqrMagnitude; - - if (dist < 0.001f) - { - result = new NavSegmentPositionPointer(pointer.surface, pointer.cluster, cluster.DistanceOfPointAlongSegment(localPos)); - return true; - } - } - } - - return TryMapPoint(position, agent.CouldBeLocatedAt, out result); - } - - public bool TryMapPoint(Vector2 position, out NavSegmentPositionPointer pointer) - { - return TryMapPoint(position, (p) => true, out pointer); - } - - public bool TryMapPoint(Vector2 position, Func pointFilter, out NavSegmentPositionPointer pointer) - { - return TryMapPoint(position, pointFilter, PathBerserker2dSettings.PointMappingDistance, out pointer); - } - - public bool TryMapPoint(Vector2 position, Func pointFilter, float pointMapDistance, out NavSegmentPositionPointer result) - { - float halfPointMapDistance = pointMapDistance / 2f; - Rect queryAABB = new Rect(position - new Vector2(halfPointMapDistance, halfPointMapDistance), new Vector2(pointMapDistance, pointMapDistance)); - float minDistance = pointMapDistance; - result = NavSegmentPositionPointer.Invalid; - foreach (var pair in segmentTrees) - { - TryMapPointSurface(pair.Key, pair.Value.Clusters, queryAABB, position, pointFilter, ref minDistance, ref result); - } - - return result.IsValid(); - } - - public bool TryMapPointWithStaged(Vector2 position, out NavSegmentPositionPointer result) - { - if (TryMapPoint(position, out result)) - return true; - - float pointMapDistance = PathBerserker2dSettings.PointMappingDistance; - float halfPointMapDistance = pointMapDistance / 2f; - Rect queryAABB = new Rect(position - new Vector2(halfPointMapDistance, halfPointMapDistance), new Vector2(pointMapDistance, pointMapDistance)); - float minDistance = pointMapDistance; - result = NavSegmentPositionPointer.Invalid; - foreach (var change in stagedNewSurfaces) - { - TryMapPointSurface(change.surface, change.record.Clusters, queryAABB, position, (p) => true, ref minDistance, ref result); - } - - return result.IsValid(); - } - - public List BoxCast(Rect rect, float rotation, float filterAngleFrom, float filterAngleTo) - { - List results = new List(); - - // find bb of rect - Vector2[] rotCorn = ExtendedGeometry.RotateRectangle(rect, rotation); - - Vector2 min = Vector2.Min(Vector2.Min(Vector2.Min(rotCorn[0], rotCorn[1]), rotCorn[2]), rotCorn[3]); - Vector2 max = Vector2.Max(Vector2.Max(Vector2.Max(rotCorn[0], rotCorn[1]), rotCorn[2]), rotCorn[3]); - Rect boundingRect = new Rect(min, max - min); - - Matrix4x4 rotationMatrix = Matrix4x4.Rotate(Quaternion.Euler(0, 0, rotation)); - - foreach (var pair in segmentTrees) - { - BoxCastSurface(pair.Key, pair.Value.Clusters, rect, boundingRect, rotationMatrix, filterAngleFrom, filterAngleTo, ref results); - } - return results; - } - - public List BoxCastWithStaged(Rect rect, float rotation, float filterAngleFrom, float filterAngleTo) - { - List results = BoxCast(rect, rotation, filterAngleFrom, filterAngleTo); - - // find bb of rect - Vector2[] rotCorn = ExtendedGeometry.RotateRectangle(rect, rotation); - - Vector2 min = Vector2.Min(Vector2.Min(Vector2.Min(rotCorn[0], rotCorn[1]), rotCorn[2]), rotCorn[3]); - Vector2 max = Vector2.Max(Vector2.Max(Vector2.Max(rotCorn[0], rotCorn[1]), rotCorn[2]), rotCorn[3]); - Rect boundingRect = new Rect(min, max - min); - - Matrix4x4 rotationMatrix = Matrix4x4.Rotate(Quaternion.Euler(0, 0, rotation)); - - foreach (var change in stagedNewSurfaces) - { - BoxCastSurface(change.surface, change.record.Clusters, rect, boundingRect, rotationMatrix, filterAngleFrom, filterAngleTo, ref results); - } - return results; - } - - [Obsolete("Use TryMapPoint instead")] - public bool TryFindClosestPointTo(Vector2 position, float maxMappingDistance, out NavSegmentPositionPointer pointer) - { - return TryMapPoint(position, (p) => true, maxMappingDistance, out pointer); - } - - public Vector2 GetRandomPointOnGraph() - { - if (segmentTrees.Count == 0) - return Vector2.zero; - - var surf = Utility.WeightedRandomChoice(segmentTrees.Keys, - segmentTrees.Keys.Select(s => s.TotalLineLength)); - - var seg = Utility.WeightedRandomChoice(surf.NavSegments, - surf.NavSegments.Select(s => s.Length), surf.TotalLineLength); - - var t = UnityEngine.Random.Range(0, seg.Length); - - return surf.LocalToWorld(seg.GetPositionAlongSegment(t)); - } - - private void TryMapPointSurface(NavSurface surface, B2DynamicTree tree, Rect queryAABB, Vector2 position, Func filter, ref float minDistance, ref NavSegmentPositionPointer result) - { - if (!surface.WorldBounds.Overlaps(queryAABB)) - { - return; - } - - Vector2 localPoint = surface.WorldToLocal(position); - Rect localQuery = new Rect(surface.WorldToLocal(queryAABB.position), queryAABB.size); - - var iterator = tree.Query(localQuery); - while (iterator.MoveNext()) - { - var clusterCandidate = tree.GetUserData(iterator.Current); - float t = clusterCandidate.DistanceOfPointAlongSegment(localPoint); - Vector2 proj = clusterCandidate.GetPositionAlongSegment(t); - float dist = (proj - localPoint).magnitude; - - if (dist >= minDistance) - // closest point is already to far away - continue; - - if (filter(new NavSegmentPositionPointer(surface, clusterCandidate, t))) - { - minDistance = dist; - result = new NavSegmentPositionPointer(surface, clusterCandidate, t); - } - else - { - // sub sample segment - for (t = 0; t < clusterCandidate.Length; t += 0.5f) - { - if (filter(new NavSegmentPositionPointer(surface, clusterCandidate, t))) - { - proj = clusterCandidate.GetPositionAlongSegment(t); - dist = (proj - localPoint).magnitude; - - if (dist >= minDistance) - continue; - - result = new NavSegmentPositionPointer(surface, clusterCandidate, t); - minDistance = dist; - break; - } - } - } - } - } - - private void BoxCastSurface(NavSurface surface, B2DynamicTree tree, Rect rect, Rect boundingRect, Matrix4x4 rotationMatrix, float filterAngleFrom, float filterAngleTo, ref List results) - { - if (!surface.WorldBounds.Overlaps(boundingRect)) - return; - - Rect localQuery = new Rect(boundingRect); - localQuery.center = surface.WorldToLocal(localQuery.center); - - Rect localCast = new Rect(rect); - //localCast.center = surface.WorldToLocal(localCast.center); - - float u1, u2; - var iterator = tree.Query(localQuery); - while (iterator.MoveNext()) - { - var segCandidate = tree.GetUserData(iterator.Current); - - float angle = Vector2.SignedAngle(segCandidate.Tangent, Vector2.up); - if (!ExtendedGeometry.IsAngleBetweenAngles(filterAngleFrom, filterAngleTo, angle)) - continue; - - // test for rect intersection - Vector2 rotatedStart = rotationMatrix * surface.LocalToWorld(segCandidate.Start); - Vector2 rotatedEnd = rotationMatrix * surface.LocalToWorld(segCandidate.End); - if (ExtendedGeometry.RectLineIntersection(localCast, rotatedStart, rotatedEnd, out u1, out u2)) - { - u1 = u1 < 0 ? 0 : u1; - u2 = u2 > 1 ? 1 : u2; - u1 *= segCandidate.Length; - u2 *= segCandidate.Length; - - results.Add(new NavSubsegmentPointer(surface, iterator.Current, u1, u2 - u1)); - } - } - } - - private void InternalAddNavSurface(NavSurface surface, - NavSurfaceRecord record, int[] proxyIndecies) - { - if (segmentTrees.ContainsKey(surface)) - { -#if PBDEBUG - Debug.Log("AddNavSurface called but surface was already added!"); -#endif - return; - } - - // add corner links for connected segments - for (int iSeg = 0; iSeg < surface.NavSegments.Count; iSeg++) - { - var seg = surface.NavSegments[iSeg]; - var cluster = record.Clusters.GetUserData(proxyIndecies[iSeg]); - - if (seg.HasNext) - { - var goalCluster = record.Clusters.GetUserData(proxyIndecies[seg.NextSegmentIndex]); - - AddCornerLink(cluster, cluster.Length, surface, goalCluster, 0); - } - if (seg.HasPrev) - { - var goalCluster = record.Clusters.GetUserData(proxyIndecies[seg.PrevSegmentIndex]); - - AddCornerLink(cluster, 0, surface, goalCluster, goalCluster.Length); - } - } - - // add corner links for touching segments - for (int iSeg = 0; iSeg < surface.NavSegments.Count; iSeg++) - { - var seg = surface.NavSegments[iSeg]; - int proxyIndex = proxyIndecies[iSeg]; - var startCluster = record.Clusters.GetUserData(proxyIndex); - - CreateCornerLinksForClosePoints(seg.Start, startCluster, proxyIndex, record.Clusters, proxyIndecies, surface); - CreateCornerLinksForClosePoints(seg.End, startCluster, proxyIndex, record.Clusters, proxyIndecies, surface); - } - - segmentTrees.Add(surface, record); - } - - private void AddCornerLink(NavGraphNodeCluster startCluster, float startT, NavSurface startSurface, NavGraphNodeCluster goalCluster, float goalT) - { - float angle = Vector2.Angle(startCluster.Normal, goalCluster.Normal); - angle = angle < 0 ? 360 - angle : angle; - - var start = new NavSegmentPositionPointer(startSurface, startCluster, startT); - var goal = new NavSegmentPositionPointer(startSurface, goalCluster, goalT); - - startCluster.AddNode(pathfinderThreadCount, start.t, goal.cluster, goal.t, new CornerLink(start, goal, angle)); - } - - private void CreateCornerLinksForClosePoints(Vector2 point, NavGraphNodeCluster pointOwner, int pointOwnerProxyIndex, B2DynamicTree clusterTree, int[] proxyIndicies, NavSurface surface) - { - int prevSegProxyIndex = pointOwner.HasPrev ? proxyIndicies[pointOwner.PrevSegmentIndex] : -1; - - Vector2 queryRectSize = new Vector2(0.01f, 0.01f); - Rect query = new Rect(point - queryRectSize, point + queryRectSize); - var iterator = clusterTree.Query(query); - - while (iterator.MoveNext()) - { - if (prevSegProxyIndex == iterator.Current || iterator.Current == pointOwnerProxyIndex) - continue; - - var goalCluster = clusterTree.GetUserData(iterator.Current); - if (goalCluster.PointDistance(point) < 0.01f) - { - float startT = pointOwner.DistanceOfPointAlongSegment(point); - float goalT = goalCluster.DistanceOfPointAlongSegment(point); - - AddCornerLink(pointOwner, startT, surface, goalCluster, goalT); - AddCornerLink(goalCluster, goalT, surface, pointOwner, startT); - } - } - } - - private bool DoesLinkExist(INavLinkInstance link, NavSegmentPositionPointer start) - { - NavGraphNodeCluster cluster; - if (!TryGetClusterAt(start, out cluster)) - { - return false; - } - return cluster.DoesNodeExist(link); - } - - private void InternalRemoveNavSurface(NavSurface surface) - { - NavSurfaceRecord record = null; - try - { - record = segmentTrees[surface]; - - } - catch (KeyNotFoundException) - { -#if PBDEBUG - Debug.Log("RemoveNavSurface called but surface doesn't exist!"); -#endif - return; - } - record.Destroy(this); - segmentTrees.Remove(surface); - } - - private void InternalAddNavLink(INavLinkInstance link, NavSegmentPositionPointer start, NavSegmentPositionPointer goal) - { - start.cluster.AddNode( - pathfinderThreadCount, - start.t, - goal.cluster, - goal.t, - link); - - CreateSoftRefLink(link, start.surface); - if (start.surface != goal.surface) - { - CreateSoftRefLink(link, goal.surface); - } - } - - private void CreateSoftRefLink(INavLinkInstance link, NavSurface targetSurface) - { - try - { - segmentTrees[targetSurface].AddSoftRefLink(link); - } - catch (KeyNotFoundException) - { - // must be still staged - for (int i = 0; i < stagedNewSurfaces.Count; i++) - { - if (stagedNewSurfaces[i].surface == targetSurface) - { - stagedNewSurfaces[i].record.AddSoftRefLink(link); - return; - } - } - - throw new KeyNotFoundException(); - } - } - - private void RemoveSoftRefLink(INavLinkInstance link, NavSurface targetSurface) - { - if (targetSurface == null) - return; - try - { - segmentTrees[targetSurface].RemoveSoftRefLink(link); - } - catch (KeyNotFoundException) - { - // must be still staged - for (int i = 0; i < stagedNewSurfaces.Count; i++) - { - if (stagedNewSurfaces[i].surface == targetSurface) - { - stagedNewSurfaces[i].record.RemoveSoftRefLink(link); - return; - } - } - - throw new KeyNotFoundException(); - } - } - - internal void InternalRemoveNavLink(INavLinkInstance link, NavSegmentPositionPointer start, - NavSegmentPositionPointer goal) - { - if (start.surface == null || !DoesLinkExist(link, start)) - return; - - start.cluster.RemoveNode(link); - RemoveSoftRefLink(link, start.surface); - if (start.surface != goal.surface && segmentTrees.ContainsKey(goal.surface)) - RemoveSoftRefLink(link, goal.surface); - - link.OnRemove(); - } - - private void InternalMoveNavLinkStart(INavLinkInstance link, NavSegmentPositionPointer start, NavSegmentPositionPointer goal, NavSegmentPositionPointer oldStart) - { - if (oldStart.surface == start.surface && oldStart.cluster == start.cluster) - { - oldStart.cluster.MoveNode(link, start.t); - } - else - { - oldStart.cluster.RemoveNode(link); - RemoveSoftRefLink(link, oldStart.surface); - if (oldStart.surface != goal.surface) - RemoveSoftRefLink(link, goal.surface); - - InternalAddNavLink(link, start, goal); - } - } - - private void InternalMoveNavLinkGoal(INavLinkInstance link, NavSegmentPositionPointer start, NavSegmentPositionPointer goal, NavSegmentPositionPointer oldGoal) - { - var node = start.cluster.GetNode(link); - if (oldGoal.surface != goal.surface || oldGoal.cluster != goal.cluster) - node.LinkTarget = goal.cluster; - node.LinkTargetT = goal.t; - - if (goal.surface != oldGoal.surface) - { - if (start.surface != oldGoal.surface) - RemoveSoftRefLink(link, oldGoal.surface); - - if (start.surface != goal.surface) - CreateSoftRefLink(link, goal.surface); - } - } - - private void InternalAddSegmentModifier(NavAreaMarkerInstance mod) - { - if (TryGetClusterAt(mod.position, out var cluster)) - cluster.AddNodeClusterModifier(mod); - } - - private void InternalRemoveSegmentModifier(NavAreaMarkerInstance mod) - { - if (TryGetClusterAt(mod.position, out var cluster)) - cluster.RemoveNodeClusterModifier(mod); - } - - public bool TryGetClusterAt(NavSegmentPositionPointer tPoint, out NavGraphNodeCluster cluster) - { - if (tPoint.IsInvalid() || !segmentTrees.TryGetValue(tPoint.surface, out _)) - { - cluster = null; - return false; - } - - cluster = tPoint.cluster; - return true; - } - - public bool TryGetClusterAt(NavSubsegmentPointer tPoint, out NavGraphNodeCluster cluster) - { - NavSurfaceRecord navRec; - if (tPoint.IsInvalid() || !segmentTrees.TryGetValue(tPoint.surface, out navRec)) - { - cluster = null; - return false; - } - - cluster = navRec.Clusters.GetUserData(tPoint.proxyDataIndex); - return true; - } - - interface IGraphChange - { - NavGraphChange ChangeType { get; } - int ChangeSource { get; } - void Apply(NavGraph graph); - } - - class AddNavSurfaceChange : IGraphChange - { - public NavGraphChange ChangeType => NavGraphChange.NavSurfaceAdded; - public int ChangeSource { get; } - - public readonly NavSurfaceRecord record; - public readonly NavSurface surface; - int[] proxyIndecies; - - public AddNavSurfaceChange(NavSurface surface, int threadCount) - { - this.surface = surface; - this.ChangeSource = surface.PBComponentId; - - var tree = new B2DynamicTree(surface.NavSegments.Count + 10); - - proxyIndecies = new int[surface.NavSegments.Count]; - record = new NavSurfaceRecord(tree, surface.LocalToWorldMatrix, surface); - int fill = 0; - foreach (var seg in surface.NavSegments) - { - proxyIndecies[fill++] = tree.CreateProxy(seg.AABB, new NavGraphNodeCluster(seg, threadCount, record)); - } - } - - public void Apply(NavGraph graph) - { -#if PBDEBUG - Debug.Log("Added surface to graph"); -#endif - graph.InternalAddNavSurface(surface, record, proxyIndecies); - } - } - - class RemoveNavSurfaceChange : IGraphChange - { - public NavGraphChange ChangeType => NavGraphChange.NavSurfaceRemoved; - public int ChangeSource { get; } - - NavSurface surface; - GameObject changeSource; - - public RemoveNavSurfaceChange(NavSurface surface) - { - this.surface = surface; - this.ChangeSource = surface.PBComponentId; - } - - public void Apply(NavGraph graph) - { -#if PBDEBUG - Debug.Log("Removed surface from graph"); -#endif - graph.InternalRemoveNavSurface(surface); - } - } - - class AddNavLinkChange : IGraphChange - { - public NavGraphChange ChangeType => NavGraphChange.NavLinkAdded; - public int ChangeSource { get; } - - INavLinkInstance link; - NavSegmentPositionPointer start; - NavSegmentPositionPointer goal; - - public AddNavLinkChange(INavLinkInstance link, NavSegmentPositionPointer start, NavSegmentPositionPointer goal) - { - this.link = link; - this.start = start; - this.goal = goal; - ChangeSource = link.PBComponentId; - } - - public void Apply(NavGraph graph) - { -#if PBDEBUG - Debug.Log("Added link to graph"); -#endif - graph.InternalAddNavLink(link, start, goal); - } - } - - class RemoveNavLinkChange : IGraphChange - { - public NavGraphChange ChangeType => NavGraphChange.NavLinkRemoved; - public int ChangeSource { get; } - - INavLinkInstance link; - NavSegmentPositionPointer start; - NavSegmentPositionPointer goal; - - public RemoveNavLinkChange(INavLinkInstance link, NavSegmentPositionPointer start, NavSegmentPositionPointer goal) - { - this.link = link; - this.start = start; - this.goal = goal; - ChangeSource = link.PBComponentId; - } - - public void Apply(NavGraph graph) - { -#if PBDEBUG - Debug.Log("Removed link from graph"); -#endif - graph.InternalRemoveNavLink(link, start, goal); - } - } - - class MoveNavLinkStartChange : IGraphChange - { - public NavGraphChange ChangeType => NavGraphChange.NavLinkMoved; - public int ChangeSource { get; } - - INavLinkInstance link; - NavSegmentPositionPointer start; - NavSegmentPositionPointer goal; - NavSegmentPositionPointer oldStart; - - public MoveNavLinkStartChange(INavLinkInstance link, NavSegmentPositionPointer start, NavSegmentPositionPointer goal, NavSegmentPositionPointer oldStart) - { - this.link = link; - this.start = start; - this.goal = goal; - this.oldStart = oldStart; - ChangeSource = link.PBComponentId; - } - - public void Apply(NavGraph graph) - { -#if PBDEBUG - Debug.Log("Moved link start in graph"); -#endif - graph.InternalMoveNavLinkStart(link, start, goal, oldStart); - } - } - - class MoveNavLinkGoalChange : IGraphChange - { - public NavGraphChange ChangeType => NavGraphChange.NavLinkMoved; - public int ChangeSource { get; } - - INavLinkInstance link; - NavSegmentPositionPointer start; - NavSegmentPositionPointer goal; - NavSegmentPositionPointer oldGoal; - - public MoveNavLinkGoalChange(INavLinkInstance link, NavSegmentPositionPointer start, NavSegmentPositionPointer goal, NavSegmentPositionPointer oldGoal) - { - this.link = link; - this.start = start; - this.goal = goal; - this.oldGoal = oldGoal; - ChangeSource = link.PBComponentId; - } - - public void Apply(NavGraph graph) - { -#if PBDEBUG - Debug.Log("Moved link goal in graph"); -#endif - graph.InternalMoveNavLinkGoal(link, start, goal, oldGoal); - } - } - - class AddSegmentModifierChange : IGraphChange - { - public NavGraphChange ChangeType => NavGraphChange.SegmentModifierAdded; - public int ChangeSource { get; } - - NavAreaMarkerInstance mod; - - public AddSegmentModifierChange(NavAreaMarkerInstance mod) - { - this.mod = mod; - ChangeSource = mod.PBComponentId; - } - - public void Apply(NavGraph graph) - { -#if PBDEBUG - Debug.Log("Added modifier to graph"); -#endif - graph.InternalAddSegmentModifier(mod); - } - } - - class RemoveSegmentModifierChange : IGraphChange - { - public NavGraphChange ChangeType => NavGraphChange.SegmentModifierRemoved; - public int ChangeSource { get; } - - NavAreaMarkerInstance mod; - - public RemoveSegmentModifierChange(NavAreaMarkerInstance mod) - { - this.mod = mod; - ChangeSource = mod.PBComponentId; - } - - public void Apply(NavGraph graph) - { -#if PBDEBUG - Debug.Log("Removed modifier to graph"); -#endif - graph.InternalRemoveSegmentModifier(mod); - } - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraph.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraph.cs.meta deleted file mode 100644 index 27850889..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraph.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 026f93314fe2afa4db089d933acfcb9b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraphNode.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraphNode.cs deleted file mode 100644 index 55509d47..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraphNode.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; - -namespace PathBerserker2d -{ - internal class NavGraphNode - { - public float LinkTargetT { get; set; } - public NavGraphNodeCluster LinkTarget { get; set; } - - // location - public readonly NavGraphNodeCluster cluster; - public float t; - - public readonly INavLinkInstance link; - public PathValues[] pathValues; - - public bool IsGoal => link.LinkType == -1; - - public NavGraphNode(int threadCount, NavGraphNodeCluster owner, float t, NavGraphNodeCluster linkTarget, float linkTargetT, INavLinkInstance original) - { - this.cluster = owner; - this.t = t; - - this.LinkTargetT = linkTargetT; - this.LinkTarget = linkTarget; - - this.link = original; - - this.pathValues = new PathValues[threadCount]; - InitializePathValueArray(); - } - - public NavGraphNode(int threadCount, NavGraphNodeCluster owner, float t) - { - this.cluster = owner; - this.t = t; - this.link = new ArtificialLink(-1); - this.LinkTarget = cluster; - this.LinkTargetT = t; - - this.pathValues = new PathValues[threadCount]; - InitializePathValueArray(); - } - - public IEnumerable GetConnections(NavAgent agent, IList goals, int pathValueId) - { - return LinkTarget.EnumerateReachableNavVerts(LinkTargetT, agent, goals, pathValueId); - } - - // param must be local - public float HeuristicalCostsToGoal(Vector2 goal) - { - return Vector2.Distance(goal, GoalPosition()); - } - - public Vector2 GoalPosition() - { - return LinkTarget.GetPositionAlongSegment(LinkTargetT); - } - - public Vector2 WGoalPosition() - { - return LinkTarget.owner.LocalToWorld.MultiplyPoint3x4(LinkTarget.GetPositionAlongSegment(LinkTargetT)); - } - - public Vector2 Position() { - return cluster.GetPositionAlongSegment(t); - } - - public Vector2 WPosition() - { - return cluster.owner.LocalToWorld.MultiplyPoint3x4(cluster.GetPositionAlongSegment(t)); - } - - private void InitializePathValueArray() - { - for (int i = 0; i < pathValues.Length; i++) - { - pathValues[i] = new PathValues(this); - } - } - } - - internal struct NavConnection - { - public readonly NavGraphNode end; - public readonly float traversalCosts; - - public NavConnection(NavGraphNode end, float traversalCosts) - { - this.end = end; - this.traversalCosts = traversalCosts; - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraphNode.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraphNode.cs.meta deleted file mode 100644 index b3f161f1..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraphNode.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a5c4fab1500104040b48a3bb6aa7ba98 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraphNodeCluster.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraphNodeCluster.cs deleted file mode 100644 index 4e9eead5..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraphNodeCluster.cs +++ /dev/null @@ -1,155 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; - -namespace PathBerserker2d -{ - internal class NavGraphNodeCluster : LineSegmentWithClearance - { - internal readonly List nodes = new List(); - // unsorted - internal readonly List modifiers = new List(1); - internal readonly bool[] containsGoal; - public readonly NavSurfaceRecord owner; - - public NavGraphNodeCluster(NavSegment segment, int threadCount, NavSurfaceRecord owner) : base(segment) - { - containsGoal = new bool[threadCount]; - this.owner = owner; - } - - public IEnumerable EnumerateReachableNavVerts(float t, NavAgent agent, IList goals, int pathValueId) - { - for (int iNode = 0; iNode < nodes.Count; iNode++) - { - var node = nodes[iNode]; - if (!IsAgentAbleToTraverse(agent, t, node)) - continue; - - yield return new NavConnection(node, node.link.TravelCosts(node.WPosition(), node.WGoalPosition()) * agent.GetLinkTraversalMultiplier(node.link.LinkType) * agent.GetNavTagTraversalMultiplier(node.link.NavTag) + TraversalCosts(t, node.t, agent)); - } - if (containsGoal[pathValueId]) - { - for (int iGoal = 0; iGoal < goals.Count; iGoal++) - { - if (goals[iGoal].cluster == this && IsAgentAbleToTraverse(agent, t, goals[iGoal])) - yield return new NavConnection(goals[iGoal], TraversalCosts(t, goals[iGoal].t, agent)); - } - } - } - - public void AddNode(int pathValueCount, float t, NavGraphNodeCluster linkTarget, float linkTargetT, - INavLinkInstance link) - { - nodes.Add( - new NavGraphNode( - pathValueCount, - this, - t, - linkTarget, linkTargetT, - link - )); - } - - public void RemoveNode(INavLinkInstance link) - { - int index = nodes.FindIndex(node => node.link == link); - if (index != -1) - nodes.RemoveAt(index); - } - - public void MoveNode(INavLinkInstance link, float newT) - { - int index = nodes.FindIndex(node => node.link == link); - nodes[index].t = newT; - } - - public NavGraphNode GetNode(INavLinkInstance link) - { - return nodes.Find(node => node.link == link); - } - - public bool DoesNodeExist(INavLinkInstance link) - { - return nodes.Exists(node => node.link == link); - } - - public void ApplyCellClearances(float[] differentClearances) - { - for (int i = 0; i < cellClearances.Length; i++) - { - cellClearances[i] = Mathf.Min(cellClearances[i], differentClearances[i]); - } - } - - public void AddNodeClusterModifier(NavAreaMarkerInstance mod) - { - modifiers.Add(mod); - } - - public void RemoveNodeClusterModifier(NavAreaMarkerInstance mod) - { - modifiers.Remove(mod); - } - - public int GetNavTagVector(float pos) - { - int vector = 0; - foreach (var mod in modifiers) - { - if (mod.T <= pos && mod.T + mod.Length >= pos) - vector |= (1 << mod.NavTag); - } - return vector; - } - - public int GetNavTagVector(Vector2 pos) - { - return GetNavTagVector(DistanceOfPointAlongSegment(pos)); - } - - public bool CanAgentReachPoint(NavAgent agent, float startT, float goalT) - { - return agent.CanTraverseSegment(owner.LocalToWorld.MultiplyVector(Normal), GetMinClearanceTo(startT, goalT)); - } - - public bool CanAgentBeAtPoint(NavAgent agent, float t) - { - return Vector2.Angle(Vector2.up, owner.LocalToWorld.MultiplyVector(Normal)) <= agent.MaxSlopeAngle && GetClearanceAlongSegment(t) >= agent.Height && (GetNavTagVector(t) & ~agent.NavTagMask) == 0; - } - - private bool IsAgentAbleToTraverse(NavAgent agent, float startT, NavGraphNode node) - { - return agent.CanTraverseLink(node.link) && CanAgentReachPoint(agent, startT, node.t); - } - - private float TraversalCosts(float t, float goal, NavAgent agent) - { - float a, b; - if (t < goal) - { - a = t; - b = goal; - } - else - { - a = goal; - b = t; - } - if (modifiers.Count == 0) - { - return b - a; - } - - float costs = b - a; - foreach (var mod in modifiers) - { - if (mod.T + mod.Length <= a || mod.T >= b) - continue; - - // some overlap exists - costs += (Mathf.Min(mod.T + mod.Length, b) - Mathf.Max(mod.T, a)) * agent.GetNavTagTraversalMultiplier(mod.NavTag); - } - return costs; - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraphNodeCluster.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraphNodeCluster.cs.meta deleted file mode 100644 index 824017ea..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavGraphNodeCluster.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 09696d0a858d6a249aac9a2ffc71fd9f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavSurfaceRecord.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavSurfaceRecord.cs deleted file mode 100644 index 35a73cc5..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavSurfaceRecord.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; - -namespace PathBerserker2d -{ - internal class NavSurfaceRecord - { - public B2DynamicTree Clusters { get; private set; } - public List SoftRefLinks { get; private set; } - - public Matrix4x4 LocalToWorld { get => localToWorld; set { - localToWorld = value; - worldToLocal = localToWorld.inverse; - } } - public Matrix4x4 WorldToLocal => worldToLocal; - public readonly NavSurface navSurface; - public readonly int bakeIteration; - - private Matrix4x4 localToWorld; - private Matrix4x4 worldToLocal; - - public NavSurfaceRecord(B2DynamicTree tree, Matrix4x4 localToWorld, NavSurface navSurface) - { - this.Clusters = tree; - SoftRefLinks = new List(); - this.localToWorld = localToWorld; - this.navSurface = navSurface; - this.bakeIteration = navSurface.BakeIteration; - } - - public void AddSoftRefLink(INavLinkInstance instance) - { - SoftRefLinks.Add(instance); - } - - public void RemoveSoftRefLink(INavLinkInstance instance) - { - SoftRefLinks.Remove(instance); - } - - public void Destroy(NavGraph graph) - { - foreach (var ls in SoftRefLinks) - { - ls.OnRemove(); - } - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavSurfaceRecord.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavSurfaceRecord.cs.meta deleted file mode 100644 index 1d27181d..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavGraph/NavSurfaceRecord.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6641bbd92fce18c489cab9aaaee6d4f4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects.meta deleted file mode 100644 index 909fe0a5..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 9c37197ee5c1fb446ac98c67d0aa09bd -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/ArtificialLink.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/ArtificialLink.cs deleted file mode 100644 index 07300921..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/ArtificialLink.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using UnityEngine; - -namespace PathBerserker2d -{ - internal class ArtificialLink : INavLinkInstance - { - public NavSegmentPositionPointer Start => throw new NotImplementedException(); - - public NavSegmentPositionPointer Goal => throw new NotImplementedException(); - - public int LinkType => linkType; - - public string LinkTypeName => throw new NotImplementedException(); - - public GameObject GameObject => throw new NotImplementedException(); - - public float Clearance => float.MaxValue; - - public int NavTag => 0; - - public bool IsTraversable => true; - public int PBComponentId => 0; - - private int linkType; - - public ArtificialLink(int linkType) - { - this.linkType = linkType; - } - - public float TravelCosts(Vector2 start, Vector2 goal) - { - return 0; - } - - public void OnRemove() - { - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/ArtificialLink.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/ArtificialLink.cs.meta deleted file mode 100644 index e358b997..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/ArtificialLink.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 37b5756b029e50e409aec9ab1f691b6b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/BaseNavLink.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/BaseNavLink.cs deleted file mode 100644 index f95b720c..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/BaseNavLink.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System; -using UnityEngine; - -namespace PathBerserker2d -{ - /// - /// Common basis for NavLink and NavLinkCluster. - /// - public abstract class BaseNavLink : MonoBehaviour, INavLinkInstanceCreator - { - public int LinkType - { - get { return linkType; } - set { - if (value < 0 || value >= PathBerserker2dSettings.NavLinkTypeNames.Length) - throw new ArgumentOutOfRangeException($"{value} is not a valid link type."); - linkType = value; - } - } - public string LinkTypeName - { - get { return PathBerserker2dSettings.NavLinkTypeNames[linkType]; } - set { linkType = PathBerserker2dSettings.GetLinkTypeFromName(value); } - } - public float Clearance - { - get { return clearance; } - set { clearance = value; } - } - public float AvgWaitTime - { - get { return avgWaitTime; } - set { avgWaitTime = value; } - } - public float CostOverride - { - get { return costOverride; } - set { costOverride = value; } - } - public GameObject GameObject => gameObject; - public int NavTag - { - get { return navTag; } - set { navTag = PathBerserker2dSettings.EnsureNavTagExists(value); } - } - public float MaxTraversableDistance - { - get { return maxTraversableDistance; } - set { maxTraversableDistance = value; } - } - - public int PBComponentId { get; protected set; } - - [Tooltip("Cost of traversing this link. If this is <= 0 the distance between start and goal is used instead.")] - [SerializeField] - protected float costOverride = -1; - - [SerializeField] - protected int linkType = 1; - - [Tooltip("Maximum height an agent can be to traverse this link.")] - [SerializeField] - protected float clearance = 2; - - [SerializeField] - protected int navTag = 0; - - [Tooltip("Average time an agent has to wait before starting to traverse this link. This is purely to tune the pathfinding algorithm.")] - [SerializeField] - protected float avgWaitTime = 0; - - [Tooltip("Maximum distances between start and goal, that is considered traversable. If this distance is exceeded (e.g. on a moving platform) an agent will wait to traverse this link.")] - [SerializeField] - protected float maxTraversableDistance = 0; - - /// - /// Should this link be automatically mapped. If not, you have to call UpdateMapping() yourself. - /// - [SerializeField, Tooltip("Should this link be automatically mapped. If not, you have to call UpdateMapping() yourself.")] - public bool autoMap = true; - - protected virtual void Awake() - { - PBComponentId = PBWorld.GeneratePBComponentId(); - } - - protected virtual void OnValidate() - { - linkType = PathBerserker2dSettings.EnsureNavLinkTypeExists(linkType); - navTag = PathBerserker2dSettings.EnsureNavTagExists(navTag); - } - - /// - /// MUST BE THREAD SAFE! - /// Calculates the cost of traversing from start to goal. - /// - /// - /// - /// - public float TravelCosts(Vector2 start, Vector2 goal) - { - float costOverride = this.costOverride; - if (costOverride >= 0) - return costOverride + avgWaitTime; - else - return Mathf.Max(maxTraversableDistance, Vector2.Distance(start, goal)) + avgWaitTime; - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/BaseNavLink.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/BaseNavLink.cs.meta deleted file mode 100644 index dccc86df..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/BaseNavLink.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ec2706faa1499754ab7972b2ce01acf5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/DynamicObstacle.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/DynamicObstacle.cs deleted file mode 100644 index 99ad02ce..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/DynamicObstacle.cs +++ /dev/null @@ -1,13 +0,0 @@ -using UnityEngine; - -namespace PathBerserker2d -{ - /// - /// Attach to GameObject to mark it as dynamic. - /// Dynamic objects are ignored while baking a NavSurface. - /// - public class DynamicObstacle : MonoBehaviour - { - // ignored for baking - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/DynamicObstacle.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/DynamicObstacle.cs.meta deleted file mode 100644 index ba161cff..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/DynamicObstacle.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 098039b2e353c6242b6b156886f24db4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/INavLink.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/INavLink.cs deleted file mode 100644 index 8e1311ab..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/INavLink.cs +++ /dev/null @@ -1,31 +0,0 @@ -using UnityEngine; - -namespace PathBerserker2d -{ - /// - /// Internal instance of a NavLink. - /// - /// - /// An instance is deliberately kept very basic. It links from a given start to a given goal. - /// - public interface INavLinkInstance - { - //NavSegmentPositionPointer Start { get; } - //NavSegmentPositionPointer Goal { get; } - int LinkType { get; } - int NavTag { get; } - - bool IsTraversable { get; } - - string LinkTypeName { get; } - - GameObject GameObject { get; } - - float Clearance { get; } - int PBComponentId { get; } - - float TravelCosts(Vector2 start, Vector2 goal); - - void OnRemove(); - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/INavLink.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/INavLink.cs.meta deleted file mode 100644 index a9e17fcd..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/INavLink.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: cb4c816f3b23aac42a66b17253265a5a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/INavLinkInstanceCreator.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/INavLinkInstanceCreator.cs deleted file mode 100644 index f77dc2a9..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/INavLinkInstanceCreator.cs +++ /dev/null @@ -1,19 +0,0 @@ -using UnityEngine; - -namespace PathBerserker2d -{ - internal interface INavLinkInstanceCreator - { - int LinkType { get; } - int NavTag { get; } - int PBComponentId { get; } - - GameObject GameObject { get; } - float Clearance { get; } - float TravelCosts(Vector2 start, Vector2 goal); - float CostOverride { get; } - - float AvgWaitTime { get; } - float MaxTraversableDistance { get; } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/INavLinkInstanceCreator.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/INavLinkInstanceCreator.cs.meta deleted file mode 100644 index f061bcfa..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/INavLinkInstanceCreator.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c7dfb46afa8de8f4fb172b5323f315e9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavAreaMarker.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavAreaMarker.cs deleted file mode 100644 index 7d565e24..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavAreaMarker.cs +++ /dev/null @@ -1,173 +0,0 @@ -using UnityEngine; -using System.Collections.Generic; - -namespace PathBerserker2d -{ - /// - /// Marks all segments within an area with a specific NavTag. - /// - [RequireComponent(typeof(RectTransform))] - [AddComponentMenu("PathBerserker2d/Nav Area Marker")] - [HelpURL("https://oribow.github.io/PathBerserker2dDemo/Documentation/classPathBerserker2d_1_1NavAreaMarker.html")] - public class NavAreaMarker : MonoBehaviour - { - public int NavTag - { - get => navTag; - set - { - navTag = PathBerserker2dSettings.EnsureNavTagExists(value); - } - } - public Color MarkerColor => PathBerserker2dSettings.GetNavTagColor(navTag); - - [SerializeField] - int navTag = 0; - - [Tooltip("Minimum angle between the segment tangent and up. Use this to only mark segments with certain angles.")] - [SerializeField, Range(0, 360)] - float minAngle = 0; - - [Tooltip("Maximum angle between the segment tangent and up. Use this to only mark segments with certain angles.")] - [SerializeField, Range(0, 360)] - float maxAngle = 360; - - /// - /// Updates the modified marked area after a continuous time period of no movement. - /// - [Tooltip("Updates the modified marked area after a continuous time period of no movement.")] - [SerializeField] - public float updateAfterTimeOfNoMovement = 0.2f; - - /// - /// Updates the modified marked area after this amount of time passed. - /// - [Tooltip("Updates the modified marked area after this amount of time passed.")] - [SerializeField] - public float updateAfterTime = 1; - - public int PBComponentId { get; } - - private RectTransform rectTransform; - private List instances; - private float lastMovementTime; - private float isDirtySince; - private bool isDirty = false; - - #region UNITY - private void OnEnable() - { - rectTransform = GetComponent(); - instances = new List(); - transform.hasChanged = false; - AddToGraph(); - } - - private void OnDisable() - { - RemoveFromGraph(); - } - - private void Update() - { - if (transform.hasChanged) - { - if (!isDirty) - isDirtySince = Time.time; - - isDirty = true; - transform.hasChanged = false; - lastMovementTime = Time.time; - } - - if (isDirty && - (Time.time - lastMovementTime > updateAfterTimeOfNoMovement - || Time.time - isDirtySince > updateAfterTime)) - { - AddToGraph(); - lastMovementTime = float.MaxValue; - } - } - - private void OnValidate() - { - navTag = PathBerserker2dSettings.EnsureNavTagExists(navTag); - updateAfterTimeOfNoMovement = Mathf.Max(0, updateAfterTimeOfNoMovement); - updateAfterTime = Mathf.Max(0, updateAfterTime); - } - - private void Reset() - { - // only modify sizeDelta, if its at default value - var rt = GetComponent(); - if (rt.sizeDelta == new Vector2(100, 100)) - rt.sizeDelta = Vector2.one; - } - #endregion - - /// - /// Updates area of effect mapping. Call after modifying NavAreaMarker transform. - /// Alternatively, instead of calling this function, set transform.hasChanged to true. - /// - public void UpdateMappings() - { - AddToGraph(); - lastMovementTime = float.MaxValue; - } - - private void AddToGraph() - { - isDirty = false; - if (instances.Count > 0) - RemoveFromGraph(); - - var r = rectTransform.rect; - Vector2 scaleFactor = rectTransform.lossyScale * r.size * 0.5f; - Vector2 center = r.center; - - r.min = center - scaleFactor + (Vector2)rectTransform.position; - r.max = center + scaleFactor + (Vector2)rectTransform.position; - - var results = PBWorld.BoxCastWithStaged(r, rectTransform.rotation.eulerAngles.z, minAngle, maxAngle); - - foreach (var pointer in results) - { - var instance = new NavAreaMarkerInstance(this, pointer); - PBWorld.NavGraph.AddSegmentModifier(instance); - instances.Add(instance); - } - } - - private void RemoveFromGraph() - { - foreach (var instance in instances) - { - PBWorld.NavGraph.RemoveSegmentModifier(instance); - } - instances.Clear(); - } - } - - internal class NavAreaMarkerInstance - { - public int NavTag => original.NavTag; - public float T => position.t; - public float Length => position.length; - - public NavSubsegmentPointer position; - public int PBComponentId => original.PBComponentId; - - NavAreaMarker original; - - public NavAreaMarkerInstance(NavAreaMarker original) - { - this.original = original; - } - - public NavAreaMarkerInstance(NavAreaMarker original, NavSubsegmentPointer position) - { - this.original = original; - this.position = position; - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavAreaMarker.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavAreaMarker.cs.meta deleted file mode 100644 index de129722..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavAreaMarker.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: cd188745fa9d851459105e6651b2b80a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLink.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLink.cs deleted file mode 100644 index ae1163cd..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLink.cs +++ /dev/null @@ -1,207 +0,0 @@ -using UnityEngine; - -namespace PathBerserker2d -{ - /// - /// A link from one segment to another. - /// - /// - /// NavLink gets added to the pathfinder at runtime. - /// It can be loaded and unloaded by enabling / disabling the component - /// After being loaded and added to the pathfinder, the position of the link will not be updated. - /// For example that means, if your link start position gets mapped to a position on a moving platform, the initial mapping of the link start to the segment won't change. - /// The mapped position is relative to the NavSurface containing the moving platform. - /// It will follow the movements of the platform, even though the start marker of the link will not. - /// ## Mapping - /// You can update the links mapping by calling - /// - /// Internally, when moving the start and end marker around in scene view while the game is playing, is called. - /// That means you can move the markers around and the link will update its mapping. - /// If you move them around by any other means however, you have to call afterwards. - /// ## Visualization - /// Everything visualization related is purely for you and is not meant to accessed at runtime. - /// Visualizations like bezier or projectile are meant to allow you to figure out a good clearance value. - /// ## Traversable - /// When a link is marked bidirectional, internally two links get added to the pathfinder. One for each direction. - /// Both links traversable can be set separately with and . - /// - /// **Not being traversable should always be temporary.** In the sense of, **"this link is not traversable right now, but will be in the future"**. - /// NavAgents will wait indefinitely for the link to become traversable again. - /// You can adjust AvgWaitTime to increase the cost of such not alway traversable links. - /// The pathfinder will add it to the cost of traversal. - /// The pathfinder does not care if a link is marked as traversable or not. It only cares about the cost of traversal. - /// If you want to disable a link for a longer time, consider disabling the link component. Then it will be unloaded and not considered for any pathfinding. - /// - [AddComponentMenu("PathBerserker2d/Nav Link")] - public sealed class NavLink : BaseNavLink - { - public enum VisualizationType - { - Linear = 0, - QuadradticBezier = 1, - Projectile = 2, - Teleport = 3, - None = 4, - TransformBasedMovement = 5 - } - - public Vector2 GoalWorldPosition - { - get - { - return transform.TransformPoint(goal); - } - set - { - goal = transform.InverseTransformPoint(value); - } - } - public Vector2 StartWorldPosition - { - get - { - return transform.TransformPoint(start); - } - set - { - start = transform.InverseTransformPoint(value); - } - } - public Vector2 StartLocalPosition - { - get - { - return start; - } - set - { - start = value; - } - } - public Vector2 GoalLocalPosition - { - get - { - return goal; - } - set - { - goal = value; - } - } - - public VisualizationType CurrentVisualizationType { get { return visualizationType; } } - - public bool IsBidirectional - { - get { return isBidirectional; } - set - { - if (isBidirectional != value && !value) - { - linkGoalToStart.RemoveFromWorld(); - } - isBidirectional = value; - } - } - - public bool IsAddedToWorld => linkStartToGoal?.IsAdded ?? false; - - internal float HorizontalSpeed => horizontalSpeed; - internal float TraversalAngle => traversalAngle; - internal Vector2 BezierControlPoint { get => bezierControlPoint; set => bezierControlPoint = value; } - - [Header("Location")] - [SerializeField] - Vector2 start = Vector2.left * 2; - [SerializeField] - Vector2 goal = Vector2.right * 2; - [SerializeField] - bool isBidirectional = true; - [SerializeField] - VisualizationType visualizationType = VisualizationType.TransformBasedMovement; - [SerializeField] - float traversalAngle = 0; - [SerializeField] - float horizontalSpeed = 1; - [SerializeField, HideInInspector] - Vector2 bezierControlPoint = Vector2.up * 3; - - private NavLinkInstance linkStartToGoal; - private NavLinkInstance linkGoalToStart; - - #region UNITY - private void OnEnable() - { - if (linkStartToGoal == null) - linkStartToGoal = new NavLinkInstance(this); - if (linkGoalToStart == null) - linkGoalToStart = new NavLinkInstance(this); - - AutoUpdateMapping(); - } - - private void OnDisable() - { - linkStartToGoal.RemoveFromWorld(); - linkGoalToStart.RemoveFromWorld(); - } - - protected override void OnValidate() - { - base.OnValidate(); - if (linkGoalToStart != null && (!linkGoalToStart.IsAdded || linkStartToGoal != null)) - { - AutoUpdateMapping(); - - if (!isBidirectional) - linkGoalToStart.RemoveFromWorld(); - } - } - #endregion - - /// - /// Update the mapping for both link instances. Call after link positions have been changed. - /// - public void UpdateMapping() - { - NavSegmentPositionPointer navStart, navGoal; - if (PBWorld.TryMapPointWithStaged(StartWorldPosition, out navStart) - && PBWorld.TryMapPointWithStaged(GoalWorldPosition, out navGoal)) - { - linkStartToGoal.UpdateMapping(navStart, navGoal, StartWorldPosition, GoalWorldPosition); - linkGoalToStart.UpdateMapping(navGoal, navStart, GoalWorldPosition, StartWorldPosition); - - linkStartToGoal.AddToWorld(); - if (isBidirectional) linkGoalToStart.AddToWorld(); - } - else - { - linkStartToGoal.RemoveFromWorld(); - linkGoalToStart.RemoveFromWorld(); - } - } - - /// - /// Set the link instance from start point to goal traversable. - /// - public void SetStartToGoalLinkTraversable(bool traversable) - { - this.linkStartToGoal.IsTraversable = traversable; - } - - /// - /// Set the link instance from goal point to start traversable. This link only exist, if the link is bidirectional. - /// - public void SetGoalToStartLinkTraversable(bool traversable) - { - this.linkGoalToStart.IsTraversable = traversable; - } - - private void AutoUpdateMapping() - { - if (autoMap) - UpdateMapping(); - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLink.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLink.cs.meta deleted file mode 100644 index 1e63c149..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLink.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 87d47b3e0cb42914b8b2ae885bebf30b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {fileID: 2800000, guid: 579b19e3fcbb57e43adcf1e3f754f5ef, type: 3} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLinkCluster.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLinkCluster.cs deleted file mode 100644 index a6a110eb..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLinkCluster.cs +++ /dev/null @@ -1,118 +0,0 @@ -using UnityEngine; -using System.Collections.Generic; - -namespace PathBerserker2d -{ - /// - /// Creates links to interconnect a collection. - /// - /// - /// Consists of a list of points. - /// At runtime a link is generated for each point to connect it with each other point. - /// This is a convenience component. It drastically reduces the amount of work required to setup an elevator or ladder for example. - /// - /// Otherwise it functions and behaves the same as a NavLink. - /// Reference the documentation for NavLink for further details. - /// - [AddComponentMenu("PathBerserker2d/Nav Link Cluster")] - public sealed class NavLinkCluster : BaseNavLink - { - internal enum PointTraversalType - { - Exit, - Entry, - Both - } - - internal LinkPoint[] LinkPoints => linkPoints; - - [SerializeField] - internal LinkPoint[] linkPoints = new LinkPoint[] { new LinkPoint(Vector2.left * 2), new LinkPoint(Vector2.right * 2) }; - - private List linkInstances; - - #region UNITY - private void OnEnable() - { - if (linkInstances == null) - linkInstances = new List(); - - if (autoMap) - UpdateMapping(); - } - - private void OnDisable() - { - foreach (var li in linkInstances) - li.RemoveFromWorld(); - } - #endregion - - /// - /// Update the mapping for all link instances. Call after link positions have been changed. - /// - public void UpdateMapping() - { - NavSegmentPositionPointer navStart, navGoal; - int instanceCounter = 0; - foreach (var startPoint in linkPoints) - { - if (startPoint.traversalType == PointTraversalType.Exit) - continue; - - Vector2 worldStart = transform.TransformPoint(startPoint.point); - foreach (var goalPoint in linkPoints) - { - if (goalPoint.traversalType == PointTraversalType.Entry || goalPoint.point == startPoint.point) - continue; - - Vector2 worldGoal = transform.TransformPoint(goalPoint.point); - if (instanceCounter >= linkInstances.Count) - { - linkInstances.Add(new NavLinkInstance(this)); - } - var linkInstance = linkInstances[instanceCounter++]; - - if (PBWorld.TryMapPointWithStaged(worldStart, out navStart) - && PBWorld.TryMapPointWithStaged(worldGoal, out navGoal)) - { - linkInstance.UpdateMapping(navStart, navGoal, worldStart, worldGoal); - linkInstance.AddToWorld(); - } - else - { - linkInstance.RemoveFromWorld(); - } - } - } - } - - /// - /// Set link instances to be traversable based on their start and end points. - /// - /// Determines whether to enable or disable the given link instance. Link instance is given as its start and goal position. - public void SetLinksTraversable(System.Func traversableFunc) - { - foreach (var link in linkInstances) - { - if (link.IsAdded) - link.IsTraversable = traversableFunc(link.Start.Position, link.Goal.Position); - } - } - - [System.Serializable] - internal struct LinkPoint - { - [SerializeField] - public Vector2 point; - [SerializeField] - public PointTraversalType traversalType; - - public LinkPoint(Vector2 point) - { - this.point = point; - this.traversalType = PointTraversalType.Both; - } - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLinkCluster.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLinkCluster.cs.meta deleted file mode 100644 index ac275dd5..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLinkCluster.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: be2a77a7bf2e29d438041e3d46dd5667 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLinkInstance.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLinkInstance.cs deleted file mode 100644 index 85e123e0..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLinkInstance.cs +++ /dev/null @@ -1,106 +0,0 @@ -using UnityEngine; - -namespace PathBerserker2d -{ - internal sealed class NavLinkInstance : INavLinkInstance - { - public NavSegmentPositionPointer Start => start; - public NavSegmentPositionPointer Goal => goal; - public int LinkType => creator.LinkType; - public string LinkTypeName => PathBerserker2dSettings.GetLinkTypeName(creator.LinkType); - public GameObject GameObject => creator.GameObject; - public bool IsAdded => isAdded; - public float Clearance => creator.Clearance; - public float CostOverride => creator.CostOverride; - public int NavTag => creator.NavTag; - public bool IsTraversable - { - get - { - return isTraversable && (creator.MaxTraversableDistance <= 0 || Vector2.Distance(Start.Position, Goal.Position) <= creator.MaxTraversableDistance); - } - set - { - isTraversable = value; - } - } - public int PBComponentId => creator.PBComponentId; - internal INavLinkInstanceCreator Creator => creator; - - - private INavLinkInstanceCreator creator; - private NavSegmentPositionPointer start; - private Vector2 startPos; - private NavSegmentPositionPointer goal; - private Vector2 goalPos; - private bool isAdded = false; - private bool isTraversable = true; - - public NavLinkInstance(INavLinkInstanceCreator creator) - { - this.creator = creator; - } - - public float TravelCosts(Vector2 start, Vector2 goal) - { - return creator.TravelCosts(start, goal); - } - - - - public void AddToWorld() - { - if (!isAdded) - { - PBWorld.NavGraph.AddNavLink(this, start, goal); - isAdded = true; - } - } - - public void RemoveFromWorld() - { - if (isAdded) - { - PBWorld.NavGraph.RemoveNavLink(this, start, goal); - isAdded = false; - } - } - - public void UpdateMapping(NavSegmentPositionPointer start, NavSegmentPositionPointer goal, Vector2 startPos, Vector2 goalPos) - { - this.startPos = startPos; - this.goalPos = goalPos; - - if (isAdded) - { - if (start != this.start) - { - var oldPos = this.start; - this.start = start; - - PBWorld.NavGraph.MoveNavLinkStart(this, start, goal, oldPos); - } - if (goal != this.goal) - { - var oldPos = this.goal; - this.goal = goal; - - PBWorld.NavGraph.MoveNavLinkGoal(this, start, goal, oldPos); - } - } - else - { - this.start = start; - this.goal = goal; - } - } - - public void OnRemove() - { - if (start.surface != null) - RemoveFromWorld(); - else - isAdded = false; - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLinkInstance.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLinkInstance.cs.meta deleted file mode 100644 index 7e3c51f8..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavLinkInstance.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b8d40862c6107ef4a856664b359e51b9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavSegmentSubstractor.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavSegmentSubstractor.cs deleted file mode 100644 index f87bca27..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavSegmentSubstractor.cs +++ /dev/null @@ -1,25 +0,0 @@ -using UnityEngine; - -namespace PathBerserker2d -{ - /// - /// Marks with its RectTransform an area to remove segments from. - /// - [RequireComponent(typeof(RectTransform))] - public class NavSegmentSubstractor : MonoBehaviour - { - /// - /// Minimum angle between the segment tangent and up. Use this to only remove segments with certain angles. - /// - [Tooltip("Minimum angle between the segment tangent and up. Use this to only remove segments with certain angles.")] - [SerializeField, Range(0, 360)] - public float fromAngle = 0; - - /// - /// Maximum angle between the segment tangent and up. Use this to only remove segments with certain angles. - /// - [Tooltip("Maximum angle between the segment tangent and up. Use this to only remove segments with certain angles.")] - [SerializeField, Range(0, 360)] - public float toAngle = 360; - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavSegmentSubstractor.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavSegmentSubstractor.cs.meta deleted file mode 100644 index 7d8df844..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/NavSegmentSubstractor.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a276efee5bef16c408d4567ee5ed9369 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/SegmentConnectionLink.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/SegmentConnectionLink.cs deleted file mode 100644 index 4c59d413..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/SegmentConnectionLink.cs +++ /dev/null @@ -1,45 +0,0 @@ -using UnityEngine; - -namespace PathBerserker2d -{ - internal class CornerLink : INavLinkInstance - { - public NavSegmentPositionPointer Start => start; - - public NavSegmentPositionPointer Goal => goal; - - public int LinkType => 0; - - public string LinkTypeName => PathBerserker2dSettings.GetLinkTypeName(0); - - public GameObject GameObject => null; - - public float Clearance => float.MaxValue; - - public int NavTag => 0; - - public bool IsTraversable => true; - public int PBComponentId => 0; - - private NavSegmentPositionPointer start; - private NavSegmentPositionPointer goal; - private float angle; - - public CornerLink(NavSegmentPositionPointer start, NavSegmentPositionPointer goal, float angle) - { - this.start = start; - this.goal = goal; - this.angle = angle; - } - - public float TravelCosts(Vector2 start, Vector2 goal) - { - return angle; - } - - public void OnRemove() - { - - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/SegmentConnectionLink.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/SegmentConnectionLink.cs.meta deleted file mode 100644 index 15005903..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavObjects/SegmentConnectionLink.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e3c7717cb27cab34d9ec825e3cbc10ea -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface.meta deleted file mode 100644 index 6058cfcd..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 874b67fb230896a43a6d44a87da38828 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/ColliderLayerFilter.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/ColliderLayerFilter.cs deleted file mode 100644 index 23570777..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/ColliderLayerFilter.cs +++ /dev/null @@ -1,26 +0,0 @@ -using UnityEngine; -using System.Collections.Generic; -using System.Linq; - -namespace PathBerserker2d -{ - internal class ColliderLayerFilter : IColliderFilter - { - private LayerMask layerMask; - private bool onlyStatic; - - public ColliderLayerFilter(LayerMask layerMask, bool onlyStatic) - { - this.layerMask = layerMask; - this.onlyStatic = onlyStatic; - } - - public IEnumerable Filter(IEnumerable colliders) - { - return colliders.Where( - (col) => layerMask.IsLayerWithinMask(col.gameObject.layer) && - !col.GetComponent() && - (!onlyStatic || col.gameObject.isStatic)); - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/ColliderLayerFilter.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/ColliderLayerFilter.cs.meta deleted file mode 100644 index 658ad22c..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/ColliderLayerFilter.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 548bcd56f78f38e418eb0a3ec41825a8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation.meta deleted file mode 100644 index 951c7470..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 8083133de4af48e48b87fdb05b356ca2 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/ColliderConverter.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/ColliderConverter.cs deleted file mode 100644 index 42f47a6b..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/ColliderConverter.cs +++ /dev/null @@ -1,236 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using UnityEngine; - -namespace PathBerserker2d -{ - internal class ColliderConverter - { - public Polygon[] Convert(Collider2D collider) - { - Polygon[] cachedPolys; - bool hasRigidbody = collider.GetComponentInParent(); - - if (collider is PolygonCollider2D && PathBerserker2dSettings.UsePolygonCollider2dPathsForBaking) - { - cachedPolys = PolygonColliderToPolygon((PolygonCollider2D)collider); - } - else - { - var mesh = collider.CreateMesh(hasRigidbody, hasRigidbody); - if (mesh == null) - { - if (collider.GetType() == typeof(EdgeCollider2D)) - { - //special handling for an open edge collider - cachedPolys = EdgeColliderToPolygon(collider as EdgeCollider2D); - } - else - { - Debug.LogWarning(string.Format("Unity's 'CreateMesh' returned null for Collider {0}({1}). Will ignore this collider.", collider.name, collider.GetType())); - - cachedPolys = new Polygon[0]; - } - } - else - { - cachedPolys = MeshToPolygons(mesh); - } - } - return cachedPolys; - } - - private static Polygon[] EdgeColliderToPolygon(EdgeCollider2D edgeCollider2D) - { - Matrix4x4 localToWorld = edgeCollider2D.transform.localToWorldMatrix * Matrix4x4.Translate(edgeCollider2D.offset); - return new Polygon[1] { - new Polygon( - new Contour( - Array.ConvertAll(edgeCollider2D.points, (v) => (Vector2)localToWorld.MultiplyPoint3x4(v)), - false)) - }; - } - - private static Polygon[] MeshToPolygons(Mesh mesh) - { - // 1. find connected regions of mesh - var verts = mesh.vertices; - var triangles = mesh.triangles; - - MonoBehaviour.DestroyImmediate(mesh); - - List[] graph = new List[verts.Length]; - for (int i = 0; i < graph.Length; i++) - graph[i] = new List(3); - - for (int iTris = 0; iTris < triangles.Length; iTris += 3) - { - int a = triangles[iTris]; - int b = triangles[iTris + 1]; - int c = triangles[iTris + 2]; - - AddEdgeToGraph(graph, a, b); - AddEdgeToGraph(graph, b, c); - AddEdgeToGraph(graph, c, a); - } - - int nextRegion = 1; - int[] regionMap = new int[verts.Length]; - for (int iVert = 0; iVert < verts.Length; iVert++) - { - if (regionMap[iVert] == 0) - { - Flood(nextRegion++, regionMap, graph, iVert); - } - } - - StableConnector[] connectors = new StableConnector[nextRegion - 1]; - for (int i = 0; i < connectors.Length; i++) - connectors[i] = new StableConnector(); - - for (int iVert = 0; iVert < verts.Length; iVert++) - { - var connections = graph[iVert]; - foreach (var conn in connections) - { - var other = graph[conn]; - if (!other.Contains(iVert)) - { - connectors[regionMap[iVert] - 1].Add(iVert, conn); - } - } - } - - List polygons = new List(connectors.Length); - for (int i = 0; i < connectors.Length; i++) - { - ConnectorToContours(connectors[i], verts, ref polygons); - } - // some polygons are contained by other polygons, make a check - for (int iPoly = 0; iPoly < polygons.Count; iPoly++) - { - var poly = polygons[iPoly]; - for (int iOtherPoly = iPoly + 1; iOtherPoly < polygons.Count; iOtherPoly++) - { - if (poly.Contains(polygons[iOtherPoly])) - { - poly.AddAsChild(polygons[iOtherPoly]); - polygons.RemoveAt(iOtherPoly); - iOtherPoly--; - } - } - } - return polygons.ToArray(); - } - - private static Polygon[] PolygonColliderToPolygon(PolygonCollider2D collider) - { - if (collider.pathCount == 0) - return new Polygon[0]; - - var path = collider.GetPath(0); - if (path.Length < 3) - return new Polygon[0]; - - var worldPath = path.Select(vert => (Vector2)collider.transform.TransformPoint(vert)).Reverse(); - return new Polygon[] { - new Polygon(new Contour(worldPath)) - }; - } - - private static void AddEdgeToGraph(List[] graph, int a, int b) - { - graph[a].Add(b); - } - - private static void Flood(int id, int[] regionMap, List[] graph, int start) - { - regionMap[start] = id; - - Stack indiciesToProcess = new Stack(10); - - indiciesToProcess.Push(start); - - while (indiciesToProcess.Count > 0) - { - int i = indiciesToProcess.Pop(); - - var connections = graph[i]; - foreach (var conn in connections) - { - if (regionMap[conn] != id) - { - regionMap[conn] = id; - indiciesToProcess.Push(conn); - } - } - } - } - - private static void ConnectorToContours(StableConnector connector, Vector3[] verts, ref List polygons) - { - List holes = new List(1); - List> hulls = new List>(1); - foreach (var chain in connector.closedPolygons) - { - List points = new List(chain.points.Count); - foreach (var p in chain.points) - { - points.Add(verts[p]); - } - - // simplification moved to later step in pipeline - //points = ExtendedGeometry.SimplifyContour(points, 0.1f); - /* - for (int i = 0; i < points.Count; i++) - { - points[i] = new Vector2((float)Math.Round(points[i].x, 3), - (float)Math.Round(points[i].y, 3)); ; - }*/ - - Contour c = new Contour(points); - double area = c.SignedArea(); - if (area > 0) - hulls.Add(new Tuple(area, new Polygon(c))); - else - holes.Add(c); - } - if (hulls.Count == 1) - { - hulls[0].Item2.Holes = holes; - polygons.Add(hulls[0].Item2); - } - else - { - hulls.Sort((a, b) => b.Item1.CompareTo(a.Item1)); - - for (int iHull = 0; iHull < hulls.Count; iHull++) - { - for (int iHull2 = iHull + 1; iHull2 < hulls.Count; iHull2++) - { - if (hulls[iHull].Item2.Contains(hulls[iHull2].Item2)) - { - hulls[iHull].Item2.AddAsChild(hulls[iHull2].Item2); - hulls.RemoveAt(iHull2); - iHull2--; - } - } - } - foreach (var hull in hulls) - { - for (int iHole = 0; iHole < holes.Count; iHole++) - { - if (hull.Item2.Contains(holes[iHole])) - { - hull.Item2.Holes.Add(holes[iHole]); - holes.RemoveAt(iHole); - iHole--; - } - } - } - polygons.AddRange(hulls.ConvertAll(t => t.Item2)); - } - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/ColliderConverter.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/ColliderConverter.cs.meta deleted file mode 100644 index c6c2133e..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/ColliderConverter.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7608182b2081ee14db7b159b5c2f0267 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/IntersectionTester.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/IntersectionTester.cs deleted file mode 100644 index e677149e..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/IntersectionTester.cs +++ /dev/null @@ -1,639 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using System; -using System.Linq; - -namespace PathBerserker2d -{ - internal class IntersectionTester - { - // 1,23456 -> 1234 - private const float FUDGE_FACTOR = 0.01f; - - public IClipper Clipper { get => clipper; } - - IClipper clipper; - ColliderConverter colliderConverter; - INavSegmentCreationParamProvider paramProvider; - Matrix4x4 surfaceWorldToLocal; - - public IntersectionTester(INavSegmentCreationParamProvider paramProvider, Matrix4x4 surfaceWorldToLocal) - { - this.clipper = new ClipperWrapper(); - this.colliderConverter = new ColliderConverter(); - this.paramProvider = paramProvider; - this.surfaceWorldToLocal = surfaceWorldToLocal; - } - - public Polygon[] ColliderToPolygon(Collider2D col) - { - return colliderConverter.Convert(col); - } - - public void MarkContour(Contour contour, NavSurface owner, PolygonSet polySet, List navSegments) - { - int prevSegIndex = -1; - int firstNavSegIndex = navSegments.Count; - bool lastSegTouchesLastPoint = false; - - for (int iPrevLine = contour.IsClosed ? contour.VertexCount - 1 : 0, iLine = contour.IsClosed ? 0 : 1; iLine < contour.VertexCount; iPrevLine = iLine, iLine++) - { - Vector2 a = contour[iPrevLine]; - Vector2 b = contour[iLine]; - - Vector2 dir = b - a; - float length = dir.magnitude; - dir /= length; - Vector2 normal = new Vector2(-dir.y, dir.x); - - int cellCount = Math.Max(1, Mathf.RoundToInt(length / paramProvider.CellSize)); - - Vector2 fudgedA = a + normal * FUDGE_FACTOR; - Vector2 fudgedB = b + normal * FUDGE_FACTOR; - Vector2 cellHeight = normal * paramProvider.MaxClearance; - - List cellSpace = new List(4); - cellSpace.Add(fudgedB); - cellSpace.Add(fudgedA); - cellSpace.Add(fudgedA + cellHeight); - cellSpace.Add(fudgedB + cellHeight); - - Polygon walkSpacePolygon = new Polygon(new Contour(cellSpace)); - - //var ts = new Polygon(new Contour(cellSpace.ToList())); - //GizmosQueue.Instance.Enqueue(5, () => - //{ - // Gizmos.color = Color.gray; - // ts.Draw(); - //}); - - List intersections = new List(5); - foreach (var testCandidate in polySet.Query(walkSpacePolygon.BoundingRect)) - { - if (testCandidate.Hull.IsClosed) - { - //GizmosQueue.Instance.Enqueue(5, () => - //{ - // Gizmos.color = Color.red; - // //testCandidate.Draw(); - //}); - - clipper.Compute(testCandidate, walkSpacePolygon, BoolOpType.INTERSECTION, out var clipResult); - intersections.AddRange(clipResult); - } - else - intersections.Add(testCandidate); - } - //could do a union now; to evaluate - // this is nonsense, but better leave as is. It ensures that all cells are the same size - if (intersections.Count == -1) - { - var newSeg = CreateFreeSegment(cellCount, owner, a, dir, length); - if (prevSegIndex != -1) - { - navSegments[prevSegIndex].NextSegmentIndex = navSegments.Count; - newSeg.PrevSegmentIndex = prevSegIndex; - } - prevSegIndex = navSegments.Count; - navSegments.Add(newSeg); - lastSegTouchesLastPoint = true; - } - else - { - float correctedCellSize = length / cellCount; - - Vector2 cellOffset = dir * correctedCellSize; - - cellSpace[0] = (fudgedA + cellOffset); - cellSpace[1] = (fudgedA); - cellSpace[2] = (fudgedA + cellHeight); - cellSpace[3] = (cellSpace[0] + cellHeight); - - List cellClearances = new List(cellCount); - bool searchForHead = true; - float segmentStart = 0; - for (int iCell = 0; iCell < cellCount; iCell++) - { - - var poly = new Polygon(new Contour(new List(cellSpace))); - walkSpacePolygon.UpdateBounds(); - - //GizmosQueue.Instance.Enqueue(5, () => { poly.Draw(); }); - - float clearance = CalculateCellClearance(walkSpacePolygon, normal, paramProvider.MinClearance, paramProvider.MaxClearance, intersections); - if (searchForHead) - { - if (clearance >= paramProvider.MinClearance) - { - segmentStart = iCell * correctedCellSize; - searchForHead = false; - cellClearances.Add(clearance); - } - else - { - prevSegIndex = -1; - } - } - else - { - if (clearance < paramProvider.MinClearance) - { - var newSeg = new NavSegment( - owner, - surfaceWorldToLocal.MultiplyPoint3x4(segmentStart * dir + a), - surfaceWorldToLocal.MultiplyVector(dir), - iCell * correctedCellSize - segmentStart, - cellClearances.ToArray() - ); - if (prevSegIndex != -1) - { - navSegments[prevSegIndex].NextSegmentIndex = navSegments.Count; - newSeg.PrevSegmentIndex = prevSegIndex; - } - prevSegIndex = -1; - navSegments.Add(newSeg); - - cellClearances.Clear(); - searchForHead = true; - - } - else - { - cellClearances.Add(clearance); - } - } - cellSpace[1] = fudgedA + cellOffset * iCell; - cellSpace[2] = fudgedA + cellHeight + cellOffset * iCell; - if (iCell < cellCount - 2) - { - cellSpace[0] = fudgedA + cellOffset * (iCell + 1); - cellSpace[3] = fudgedA + cellHeight + cellOffset * (iCell + 1); - } - else - { - cellSpace[0] = b + normal * FUDGE_FACTOR; - cellSpace[3] = cellSpace[0] + cellHeight; - } - } - if (!searchForHead) - { - var newSeg = new NavSegment( - owner, - surfaceWorldToLocal.MultiplyPoint3x4(segmentStart * dir + a), - surfaceWorldToLocal.MultiplyVector(dir), - length - segmentStart, - cellClearances.ToArray() - ); - - if (prevSegIndex != -1) - { - navSegments[prevSegIndex].NextSegmentIndex = navSegments.Count; - newSeg.PrevSegmentIndex = prevSegIndex; - } - prevSegIndex = navSegments.Count; - navSegments.Add(newSeg); - - } - lastSegTouchesLastPoint = !searchForHead; - } - } - //check for reach around - if (firstNavSegIndex < navSegments.Count && - lastSegTouchesLastPoint && - (navSegments[firstNavSegIndex].Start - - navSegments[navSegments.Count - 1].End).sqrMagnitude < 0.01f * 0.01f - ) - { - navSegments[firstNavSegIndex].PrevSegmentIndex = navSegments.Count - 1; - navSegments[navSegments.Count - 1].NextSegmentIndex = firstNavSegIndex; - } - } - - private NavSegment CreateFreeSegment(int cellCount, NavSurface owner, Vector2 a, Vector2 dir, float length) - { - float[] cellClearances = new float[cellCount]; - for (int i = 0; i < cellCount; i++) - cellClearances[i] = paramProvider.MaxClearance; - - return new NavSegment(owner, surfaceWorldToLocal.MultiplyPoint3x4(a), surfaceWorldToLocal.MultiplyVector(dir), length, cellClearances); - } - -#if false - public static void UpdateNavObstacle(IEnumerable surfaces, NavObstacle obstacle, Clipper clipper, NavSegmentCreationSettings settings) - { - foreach (var surface in surfaces) - { - UpdateNavObstacle(surface, obstacle, clipper, settings); - } - } - - public static void UpdateNavObstacle(NavSurface surface, NavObstacle obstacle, Clipper clipper, NavSegmentCreationSettings settings) - { - var obstacleBounds = obstacle.Bounds; - var surfBounds = surface.WorldBounds; - surfBounds.size += new Vector2(settings.AgentHeight, settings.AgentHeight) * 2; - if (surfBounds.Overlaps(obstacleBounds)) - { - for (int iSeg = 0; iSeg < surface.NavSegments.Count; iSeg++) - { - var seg = surface.NavSegments[iSeg]; - // is within effected bounds? - Vector2 min = seg.Start; - Vector2 max = seg.Start; - min = Vector2.Min(min, seg.End); - max = Vector2.Max(max, seg.End); - min = Vector2.Min(min, seg.End + seg.Normal * settings.AgentHeight); - max = Vector2.Max(max, seg.End + seg.Normal * settings.AgentHeight); - min = Vector2.Min(min, seg.Start + seg.Normal * settings.AgentHeight); - max = Vector2.Max(max, seg.Start + seg.Normal * settings.AgentHeight); - - Rect segBounds = new Rect(min.x, min.y, max.x - min.x, max.y - min.y); - /*GizmosQueue.Instance.Enqueue(10, () => - { - Gizmos.color = Color.red; - ABC.Utility.DrawRect(segBounds.position, segBounds.size); - });*/ - - if (obstacleBounds.Overlaps(segBounds)) - { - float[] clearances; - if (UpdateMarkOfNavSegment(seg, obstacle, settings, clipper, out clearances)) - { - obstacle.EffectedNavSegments.Add(new Tuple(new NavSegmentDataPointer(surface, iSeg), clearances)); - } - } - } - } - } - - public static void UpdateNavAreaMarker(IEnumerable surfaces, NavAreaMarker marker) - { - Matrix4x4 worldToMarker = marker.transform.worldToLocalMatrix; - - Rect rect = marker.Bounds; - marker.EffectedNavSegments.Clear(); - - foreach (var surf in surfaces) - { - for (int iSeg = 0; iSeg < surf.SegmentCount; iSeg++) - { - var seg = surf.NavSegments[iSeg]; - float u1, u2; - - /* - GizmosQueue.Instance.Enqueue(5, () => - { - - var old = Gizmos.matrix; - Gizmos.color = Color.magenta; - ABC.Utility.DrawRect(rect.position, rect.size); - Gizmos.matrix = marker.transform.localToWorldMatrix; - Gizmos.color = Color.red; - ABC.Utility.DrawRect(rect.position, rect.size); - Gizmos.color = Color.magenta; - Gizmos.matrix = worldToMarker; - Gizmos.DrawLine(seg.Start, seg.End); - Gizmos.matrix = old; - });*/ - - if (RectLineIntersection(rect, worldToMarker.MultiplyPoint(seg.Start), worldToMarker.MultiplyPoint(seg.End), out u1, out u2)) - { - // entirely inside - if (u1 < 0 && 1 < u2) - { - marker.EffectedNavSegments.Add(new Tuple( - new NavSegmentDataPointer(surf, iSeg), new Vector2(0, seg.Length))); - } - - // 2 intersections - else if (0 <= u1 && u1 < u2 && u2 <= 1) - { - marker.EffectedNavSegments.Add(new Tuple( - new NavSegmentDataPointer(surf, iSeg), - new Vector2(u1 * seg.Length, u2 * seg.Length))); - } - - // 1 intersection - else if (0 <= u1 && u1 <= 1) - { - marker.EffectedNavSegments.Add(new Tuple( - new NavSegmentDataPointer(surf, iSeg), - new Vector2(u1 * seg.Length, seg.Length))); - } - else if (0 <= u2 && u2 <= 1) - { - marker.EffectedNavSegments.Add(new Tuple( - new NavSegmentDataPointer(surf, iSeg), - new Vector2(0, u2 * seg.Length))); - } - } - } - } - } -#endif - - -#if false - public static void UpdateMarkAddNavSurface(IEnumerable navSegments, NavSurface navSurface, NavSegmentCreationSettings settings, Clipper clipper) - { - //1. find bounds of navSurface - var surfaceBounds = navSurface.Bounds; - var filter = new NavSurfaceColliderFilter(navSurface); - - foreach (var seg in navSegments) - { - // is within effected bounds? - - Vector2 min = seg.Start; - Vector2 max = seg.Start; - min = Vector2.Min(min, seg.End); - max = Vector2.Max(max, seg.End); - min = Vector2.Min(min, seg.End + seg.Normal * settings.AgentHeight); - max = Vector2.Max(max, seg.End + seg.Normal * settings.AgentHeight); - min = Vector2.Min(min, seg.Start + seg.Normal * settings.AgentHeight); - max = Vector2.Max(max, seg.Start + seg.Normal * settings.AgentHeight); - - if (surfaceBounds.Overlaps(new Rect(min.x, min.y, max.x - min.x, max.y - min.y))){ - UpdateMarkOfNavSegment(seg, filter, settings, clipper); - } - } - } -#endif -#if false - // filter needs to filter out non new colliders - public static bool UpdateMarkOfNavSegment(NavSegment navSegment, NavObstacle obstacle, NavSegmentCreationSettings settings, Clipper clipper, out float[] clearanceValues) - { - - List polygonToTestAgainst = ConvertHullToClipperFormat(HullFromCollider(obstacle.Collider, settings, obstacle.transform.localToWorldMatrix), settings.FloatToIntMultiplier); - - float correctedCellSize = navSegment.Length / navSegment.CellCount; - float f2iCellSize = CIntConversion.FloatToCInt(correctedCellSize); - float f2iMinClearance = settings.FloatToIntMultiplier * settings.MinClearance; - float f2iMaxClearance = settings.FloatToIntMultiplier * settings.AgentHeight; - IntPoint f2iA = CIntConversion.Vector2ToIntPoint(navSegment.LStart); - - IntPoint cellOffset = new IntPoint(navSegment.Tangent.x * f2iCellSize, navSegment.Tangent.y * f2iCellSize); - - List cellSpace = new List(4); - cellSpace.Add(f2iA + cellOffset); - cellSpace.Add(f2iA); - cellSpace.Add(f2iA); - cellSpace.Add(f2iA); - - clearanceValues = new float[navSegment.CellCount]; - bool segmentWasChanged = false; - for (int iCell = 0; iCell < navSegment.CellCount; iCell++) - { - float prevClearance = navSegment.GetCellClearance(iCell); - if (prevClearance <= settings.MinClearance) - continue; - - IntPoint cellHeight = CIntConversion.Vector2ToIntPoint(navSegment.Normal * prevClearance); - cellSpace[2] = cellSpace[1] + cellHeight; - cellSpace[3] = cellSpace[0] + cellHeight; - - /* - var clone = new List(cellSpace); - GizmosQueue.Instance.Enqueue(5, () => - { - Gizmos.DrawLine(CIntConversion.IntPointToVector2(clone[0], settings.FloatToIntMultiplier), CIntConversion.IntPointToVector2(clone[1], settings.FloatToIntMultiplier)); - Gizmos.DrawLine(CIntConversion.IntPointToVector2(clone[1], settings.FloatToIntMultiplier), CIntConversion.IntPointToVector2(clone[2], settings.FloatToIntMultiplier)); - Gizmos.DrawLine(CIntConversion.IntPointToVector2(clone[2], settings.FloatToIntMultiplier), CIntConversion.IntPointToVector2(clone[3], settings.FloatToIntMultiplier)); - Gizmos.DrawLine(CIntConversion.IntPointToVector2(clone[3], settings.FloatToIntMultiplier), CIntConversion.IntPointToVector2(clone[0], settings.FloatToIntMultiplier)); - }); - */ - - float clearance = CalculateCellClearance(cellSpace, navSegment.Normal, f2iMinClearance, prevClearance * settings.FloatToIntMultiplier, polygonToTestAgainst, clipper) / settings.FloatToIntMultiplier; - segmentWasChanged = clearance < prevClearance || segmentWasChanged; - clearanceValues[iCell] = clearance; - - cellSpace[1] += cellOffset; - if (iCell < navSegment.CellCount - 2) - { - cellSpace[0] += cellOffset; - } - else - { - cellSpace[0] = CIntConversion.Vector2ToIntPoint(navSegment.LEnd); - } - } - return segmentWasChanged; - } -#endif -#if false - public static bool UpdateMarkOfNavSegmentComplete(NavSegment navSegment, IColliderFilter filter, NavSegmentCreationSettings settings, Clipper clipper) - { - Vector2 oBoxPoint = navSegment.Start + navSegment.Tangent * navSegment.Length * 0.5f + navSegment.Normal * settings.AgentHeight * 0.5f; - Vector2 oBoxSize = new Vector2(navSegment.Length, settings.AgentHeight); - float oBoxAngle = Vector2.SignedAngle(Vector2.up, navSegment.Normal); - - Collider2D[] touchedColliders = Physics2D.OverlapBoxAll(oBoxPoint, oBoxSize, oBoxAngle, settings.IncludeLayers); - - List> polygonsToTestAgainst = new List>(touchedColliders.Length); - foreach (var col in filter.Filter(touchedColliders)) - { - polygonsToTestAgainst.Add(ConvertHullToClipperFormat(HullFromCollider(col, settings), settings.FloatToIntMultiplier)); - } - - float correctedCellSize = navSegment.Length / navSegment.CellCount; - float f2iCellSize = CIntConversion.FloatToCInt(correctedCellSize, settings.FloatToIntMultiplier); - float f2iMinClearance = settings.FloatToIntMultiplier * settings.MinClearance; - float f2iMaxClearance = settings.FloatToIntMultiplier * settings.AgentHeight; - IntPoint f2iA = CIntConversion.Vector2ToIntPoint(navSegment.Start, settings.FloatToIntMultiplier); - - Vector2 normal = navSegment.Normal; - IntPoint cellOffset = new IntPoint(navSegment.Tangent.x * f2iCellSize, navSegment.Tangent.y * f2iCellSize); - IntPoint cellHeight = new IntPoint(Mathf.RoundToInt(normal.x * settings.AgentHeight * settings.FloatToIntMultiplier), - Mathf.RoundToInt(normal.y * settings.AgentHeight * settings.FloatToIntMultiplier)); - - List cellSpace = new List(4); - cellSpace.Add(f2iA + cellOffset); - cellSpace.Add(f2iA); - cellSpace.Add(f2iA); - cellSpace.Add(f2iA); - - bool segmentWasChanged = false; - for (int iCell = 0; iCell < navSegment.CellCount; iCell++) - { - float prevClearance = navSegment.GetCellClearance(iCell); - - cellSpace[2] = cellSpace[1] + cellHeight; - cellSpace[3] = cellSpace[0] + cellHeight; - - /* - var clone = new List(cellSpace); - GizmosQueue.Instance.Enqueue(5, () => - { - Gizmos.DrawLine(CIntConversion.IntPointToVector2(clone[0], settings.FloatToIntMultiplier), CIntConversion.IntPointToVector2(clone[1], settings.FloatToIntMultiplier)); - Gizmos.DrawLine(CIntConversion.IntPointToVector2(clone[1], settings.FloatToIntMultiplier), CIntConversion.IntPointToVector2(clone[2], settings.FloatToIntMultiplier)); - Gizmos.DrawLine(CIntConversion.IntPointToVector2(clone[2], settings.FloatToIntMultiplier), CIntConversion.IntPointToVector2(clone[3], settings.FloatToIntMultiplier)); - Gizmos.DrawLine(CIntConversion.IntPointToVector2(clone[3], settings.FloatToIntMultiplier), CIntConversion.IntPointToVector2(clone[0], settings.FloatToIntMultiplier)); - }); - */ - - float clearance = CalculateCellClearance(cellSpace, navSegment.Normal, f2iMinClearance, f2iMaxClearance, polygonsToTestAgainst, clipper) / settings.FloatToIntMultiplier; - segmentWasChanged = clearance != prevClearance || segmentWasChanged; - navSegment.SetCellClearanceAt(iCell, clearance); - - cellSpace[1] += cellOffset; - if (iCell < navSegment.CellCount - 2) - { - cellSpace[0] += cellOffset; - } - else - { - cellSpace[0] = CIntConversion.Vector2ToIntPoint(navSegment.End, settings.FloatToIntMultiplier); - } - } - return segmentWasChanged; - } -#endif - private float CalculateCellClearance(Polygon cell, Vector2 lineNormalNorm, float minClearance, float maxClearance, List otherPolygons) - { - float clearance = maxClearance; - foreach (var testCandidate in otherPolygons) - { - if (testCandidate.Hull.IsClosed) - { - var resultType = clipper.Compute(cell, testCandidate, BoolOpType.INTERSECTION, out var resultPolygon); - - /*var a = cell; - var b = testCandidate; - GizmosQueue.Instance.Enqueue(5, () => - { - Gizmos.color = Color.red; - a.Draw(); - Gizmos.color = Color.blue; - b.Draw(); - });*/ - - if (resultType == ResultType.NoOverlap) - continue; - - double combinedArea = 0; - for (int i = 0; i < resultPolygon.Count; i++) - { - combinedArea += resultPolygon[i].Hull.Area(); - } - if (combinedArea < 0.001) - continue; - - foreach (var intersectionPolygon in resultPolygon) - { - foreach (var point in intersectionPolygon.Hull) - { - float dot = DistancePointLine(point, cell.Hull[1], lineNormalNorm); - if (dot < clearance) - { - clearance = dot; - if (clearance < minClearance) - { - return 0; - } - } - } - } - } - else - { - float c = OpenPolygonClearanceClipping( - testCandidate, cell, lineNormalNorm, minClearance, maxClearance); - if (c < clearance) - { - clearance = c; - if (clearance < minClearance) - { - return 0; - } - } - } - } - return clearance; - } - - private float OpenPolygonClearanceClipping(Polygon openPoly, Polygon target, Vector2 lineNormalNorm, float minClearance, float maxClearance) - { - float clearance = maxClearance; - bool inside = target.PointInPolyon(openPoly.Hull[0]); - bool prevNormalCheck = false; - for (int i = 0; i < openPoly.Hull.VertexCount - 1; i++) - { - Vector2 a = openPoly.Hull[i]; - Vector2 b = openPoly.Hull[i + 1]; - - clearance = EdgePolygonClearanceClipping(openPoly.Hull[i], - openPoly.Hull[i + 1], - lineNormalNorm, - target, - minClearance, - maxClearance, - clearance, - ref inside, - ref prevNormalCheck); - - if (clearance < minClearance) - { - return 0; - } - } - return clearance; - } - - private float EdgePolygonClearanceClipping(Vector2 a, Vector2 b, Vector2 lineNormal, Polygon target, - float minClearance, float maxClearance, float clearance, ref bool inside, ref bool prevNormalCheck) - { - Vector2 dir = b - a; - Vector2 normal = new Vector2(-dir.y, dir.x); - - bool normalCheck = Vector2.Dot(normal, lineNormal) < 0; - - - if (inside && (normalCheck || prevNormalCheck)) - { - float dist = DistancePointLine(a, target.Hull[1], lineNormal); - if (dist < clearance) - { - clearance = dist; - if (clearance < minClearance) - { - return 0; - } - } - } - prevNormalCheck = normalCheck; - - Vector2 inter; - if ((ExtendedGeometry.FindLineIntersection(a, b, target.Hull[0], target.Hull[1], out inter) - || ExtendedGeometry.FindLineIntersection(a, b, target.Hull[1], target.Hull[2], out inter) - || ExtendedGeometry.FindLineIntersection(a, b, target.Hull[2], target.Hull[3], out inter) - || ExtendedGeometry.FindLineIntersection(a, b, target.Hull[3], target.Hull[0], out inter)) - && inter != a && inter != b) - { - if (normalCheck) - { - float dist = DistancePointLine(inter, target.Hull[1], lineNormal); - if (dist < clearance) - { - clearance = dist; - if (clearance < minClearance) - { - return 0; - } - } - } - inside = !inside; - - clearance = EdgePolygonClearanceClipping( - inter, b, lineNormal, target, minClearance, maxClearance, clearance, - ref inside, ref prevNormalCheck); - } - return clearance; - } - - private float DistancePointLine(Vector2 point, Vector2 la, Vector2 lNormal) - { - return lNormal.x * (point.x - la.x) + lNormal.y * (point.y - la.y); - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/IntersectionTester.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/IntersectionTester.cs.meta deleted file mode 100644 index 0bc7bce0..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/IntersectionTester.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b5a6b159837bdea438010d88de208dfd -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/NavSurfaceBakeJob.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/NavSurfaceBakeJob.cs deleted file mode 100644 index 0f535fe2..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/NavSurfaceBakeJob.cs +++ /dev/null @@ -1,311 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Linq; -using UnityEngine; - -namespace PathBerserker2d -{ - internal class NavSurfaceBakeJob - { - public bool IsFinished { get { return bakeThread != null && !bakeThread.IsAlive; } } - public bool IsRunning { get { return bakeThread != null && bakeThread.IsAlive; } } - public float Progress { get { return progress; } } - public float TotalBakeTime { get; private set; } - - public List navSegments; - public Rect bounds; - - private Polygon[][] polygons; - private IntersectionTester it; - private NavSurface owner; - private Tuple[] subtractors; - Matrix4x4 surfaceWorldToLocal; - Matrix4x4 surfaceLocalToWorld; - - private Thread bakeThread; - private volatile float progress = 0; - private volatile bool aborted; - - public NavSurfaceBakeJob(NavSurface owner) - { - this.owner = owner; - } - - public void Start(Polygon[][] polygons, IntersectionTester it, Tuple[] subtractors, Matrix4x4 surfaceWorldToLocal) - { - this.polygons = polygons; - this.it = it; - this.subtractors = subtractors; - this.surfaceWorldToLocal = surfaceWorldToLocal; - this.surfaceLocalToWorld = surfaceWorldToLocal.inverse; - - aborted = false; - progress = 0; - - bakeThread = new Thread(Bake); - bakeThread.IsBackground = true; - bakeThread.Start(); - } - - public void AbortJoin() - { - if (bakeThread != null && bakeThread.IsAlive) - { - this.aborted = true; - bakeThread.Join(); - } - } - - private void Bake() - { - // filter out empty polygons - polygons = polygons.Where(p => p.Length > 0).ToArray(); - - if (polygons.Length == 0) - { - navSegments = new List(0); - bounds = new Rect(); - return; - } - - var sw = new System.Diagnostics.Stopwatch(); - sw.Start(); - - var polySet = new PolygonSet(); - foreach (var polys in polygons) - { - foreach (var poly in polys) - { - polySet.AddPolygon(it.Clipper, poly); - } - } - - //pre process, simplify countours - bounds = polySet.First().BoundingRect; - foreach (var poly in polySet) - { - poly.Simplify(owner.SmallestDistanceYouCareAbout); - bounds = bounds.CombineWith(poly.BoundingRect); - } - - float totalContourCount = 0; - foreach (var poly in polySet) - { - totalContourCount += poly.Holes.Count + 1; - } - - navSegments = new List((int)totalContourCount * 5); - float processedContourCount = 0; - foreach (var poly in polySet) - { - foreach (var contour in poly) - { - it.MarkContour(contour, owner, polySet, navSegments); - - processedContourCount++; - progress = processedContourCount / totalContourCount; - - if (aborted) - goto End; - } - } - - // post process - // 1. filter slopes - FilterSlopes(); - - // 2. substract substractors - FilterSubtractors(); - - // 3. filter by length - FilterSmallSegments(); - - End: - sw.Stop(); - TotalBakeTime = sw.ElapsedMilliseconds; - } - - private void RemoveSegmentAt(int index) - { - if (navSegments[index].HasNext) - { - navSegments[navSegments[index].NextSegmentIndex].PrevSegmentIndex = -1; - } - if (navSegments[index].HasPrev) - { - navSegments[navSegments[index].PrevSegmentIndex].NextSegmentIndex = -1; - } - - int lastIndex = navSegments.Count - 1; - if (lastIndex != index) - { - if (navSegments[lastIndex].HasNext) - { - navSegments[navSegments[lastIndex].NextSegmentIndex].PrevSegmentIndex = index; - } - if (navSegments[lastIndex].HasPrev) - { - navSegments[navSegments[lastIndex].PrevSegmentIndex].NextSegmentIndex = index; - } - navSegments[index] = navSegments[lastIndex]; - } - navSegments.RemoveAt(lastIndex); - } - - private void FilterSlopes() - { - for (int i = 0; i < navSegments.Count; i++) - { - var seg = navSegments[i]; - if (Vector2.Angle(Vector2.up, surfaceLocalToWorld.MultiplyVector(seg.Normal)) > owner.MaxSlopeAngle) - { - RemoveSegmentAt(i); - i--; - } - } - } - - private void FilterSubtractors() - { - float i1, i2; - for (int i = 0; i < navSegments.Count; i++) - { - float angle = Vector2.SignedAngle(navSegments[i].Tangent, Vector2.up); - - foreach (var s in subtractors) - { - if (!ExtendedGeometry.IsAngleBetweenAngles(s.Item2.x, s.Item2.y, angle)) - continue; - - if (ExtendedGeometry.RectLineIntersection(s.Item1, surfaceLocalToWorld.MultiplyPoint3x4(navSegments[i].GetPositionAlongSegment(0)), surfaceLocalToWorld.MultiplyPoint3x4(navSegments[i].GetPositionAlongSegment(navSegments[i].Length)), out i1, out i2)) - { - // entirely inside - if (i1 < 0 && i2 > 1) - { - RemoveSegmentAt(i); - i--; - break; - } - else if (i1 > 0 || i2 < 1) - { - // inside, 2 intersections, subdiv - float cellSize = (float)navSegments[i].Length / (float)navSegments[i].CellCount; - float[] clearances = navSegments[i].CloneCellClearances(); - - NavSegment segA = null; - NavSegment segB = null; - - if (i1 > 0 && i1 < 1) - { - int cellCountA = Mathf.CeilToInt(navSegments[i].CellCount * i1); - float cellSizeA = (float)(i1 * navSegments[i].Length) / (float)cellCountA; - float cellConvA = cellSizeA / cellSize; - bool cellSizeEqual = Mathf.Abs(cellSizeA - cellSize) < 0.001f; - - float[] clearancesA = new float[cellCountA]; - - for (int iCell = 0; iCell < clearancesA.Length; iCell++) - { - int a = Mathf.FloorToInt(iCell * cellConvA); - - if (cellSizeEqual) - clearancesA[iCell] = clearances[a]; - else - { - int b = Mathf.FloorToInt((iCell + 1) * cellConvA); - - // prevents rounding issue - if (b >= clearances.Length) - b--; - - clearancesA[iCell] = Mathf.Min(clearances[a], clearances[b]); - } - } - - Vector2 newStart = surfaceLocalToWorld.MultiplyPoint3x4(navSegments[i].Start); - segA = new NavSegment(owner, surfaceWorldToLocal.MultiplyPoint3x4(newStart), navSegments[i].Tangent, i1 * navSegments[i].Length, clearancesA); - } - - if (i2 > 0 && i2 < 1) - { - int cellCountB = Mathf.CeilToInt(navSegments[i].CellCount * (1f - i2)); - - float cellSizeB = (float)((1f - i2) * navSegments[i].Length) / (float)cellCountB; - float cellConvB = cellSizeB / cellSize; - float cellOffset = ((navSegments[i].Length / cellSizeB) - cellCountB) * cellConvB; - bool cellSizeEqual = Mathf.Abs(cellSizeB - cellSize) < 0.001f; - - float[] clearancesB = new float[cellCountB]; - - for (int iCell = 0; iCell < clearancesB.Length; iCell++) - { - int a = Mathf.FloorToInt(cellOffset + iCell * cellConvB); - - - //happens when cellsizes match exactly - if (cellSizeEqual) - clearancesB[iCell] = clearances[a]; - else - { - int b = Mathf.FloorToInt(cellOffset + (iCell + 1) * cellConvB); - - // prevents rounding issue - if (b >= clearances.Length) - b--; - - clearancesB[iCell] = Mathf.Min(clearances[a], clearances[b]); - } - } - - Vector2 newStart = navSegments[i].Start + navSegments[i].Tangent * i2 * navSegments[i].Length; - segB = new NavSegment(owner, newStart, navSegments[i].Tangent, (1f - i2) * navSegments[i].Length, clearancesB); - } - - if (segA != null && segB != null) - { - if (navSegments[i].HasNext) - navSegments[navSegments[i].NextSegmentIndex].PrevSegmentIndex = navSegments.Count; - - segA.PrevSegmentIndex = navSegments[i].PrevSegmentIndex; - segB.NextSegmentIndex = navSegments[i].NextSegmentIndex; - - navSegments[i] = segA; - navSegments.Add(segB); - } - else if (segA != null) - { - if (navSegments[i].HasNext) - navSegments[navSegments[i].NextSegmentIndex].PrevSegmentIndex = -1; - - segA.PrevSegmentIndex = navSegments[i].PrevSegmentIndex; - navSegments[i] = segA; - } - else if (segB != null) - { - if (navSegments[i].HasPrev) - navSegments[navSegments[i].PrevSegmentIndex].NextSegmentIndex = -1; - - segB.NextSegmentIndex = navSegments[i].NextSegmentIndex; - navSegments[i] = segB; - } - } - } - } - } - } - - private void FilterSmallSegments() - { - for (int i = 0; i < navSegments.Count; i++) - { - var seg = navSegments[i]; - if (seg.Length < owner.MinSegmentLength) - { - RemoveSegmentAt(i); - i--; - } - } - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/NavSurfaceBakeJob.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/NavSurfaceBakeJob.cs.meta deleted file mode 100644 index 85886e5c..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/NavSurfaceBakeJob.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e80d421fda183c14f9f8fceb48c6d850 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/PolygonSet.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/PolygonSet.cs deleted file mode 100644 index 1acc553b..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/PolygonSet.cs +++ /dev/null @@ -1,91 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -namespace PathBerserker2d -{ - internal class PolygonSet : IEnumerable - { - private B2DynamicTree polygonTree = new B2DynamicTree(); - - public void AddPolygon(IClipper clipper, Polygon newPoly) - { - if (newPoly.Hull.IsClosed) - { - // try to merge the new polygon with the existing once - List polygonsToInsert = new List(4); - var iterator = polygonTree.Query(newPoly.BoundingRect); - while (iterator.MoveNext()) - { - var poly = polygonTree.GetUserData(iterator.Current); - if (poly.Hull.IsClosed) - { - var resultType = clipper.Compute(poly, newPoly, BoolOpType.UNION, out var resultPolys); - if (resultType == ResultType.Clipped) - { - // delete poly - polygonTree.RemoveProxy(iterator.Current); - newPoly = resultPolys[0]; - } - } - else - { - var resultType = clipper.Compute(poly, newPoly, BoolOpType.DIFFERENCE, out var resultPolys, true); - if (resultType == ResultType.Clipped) - { - polygonsToInsert.AddRange(resultPolys); - polygonTree.RemoveProxy(iterator.Current); - } - } - } - foreach (var poly in polygonsToInsert) - polygonTree.CreateProxy(poly.BoundingRect, poly); - polygonTree.CreateProxy(newPoly.BoundingRect, newPoly); - } - else - { - List workList = new List(); - List polygonsToTest = new List(); - - polygonsToTest.Add(newPoly); - - var iterator = polygonTree.Query(newPoly.BoundingRect); - while (iterator.MoveNext()) - { - var poly = polygonTree.GetUserData(iterator.Current); - if (!poly.Hull.IsClosed) - continue; - foreach (var polyToTest in polygonsToTest) - { - var resultType = clipper.Compute(polyToTest, poly, BoolOpType.DIFFERENCE, out var result, true); - workList.AddRange(result); - } - var swap = polygonsToTest; - polygonsToTest = workList; - workList = swap; - workList.Clear(); - } - - foreach (var poly in polygonsToTest) - polygonTree.CreateProxy(poly.BoundingRect, poly); - } - } - - public IEnumerable Query(Rect aabb) - { - var iterator = polygonTree.Query(aabb); - while (iterator.MoveNext()) - yield return polygonTree.GetUserData(iterator.Current); - } - - public IEnumerator GetEnumerator() - { - return ((IEnumerable)polygonTree).GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return ((IEnumerable)polygonTree).GetEnumerator(); - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/PolygonSet.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/PolygonSet.cs.meta deleted file mode 100644 index 8223d801..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/PolygonSet.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b932c82fe004d5241a91ddc0c3110368 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/StableConnector.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/StableConnector.cs deleted file mode 100644 index 08d15b79..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/StableConnector.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System.Collections.Generic; - -namespace PathBerserker2d -{ - internal class StableConnector where T : System.IEquatable - { - public void Add(T a, T b) - { - LinkedListNode> current = openPolygons.First; - - while (current != null) - { - LinkedListNode> next = current.Next; - - StablePointChain currentChain = current.Value; - - if (currentChain.LinkSegment(a, b)) - { - if (currentChain.IsClosed()) - { - closedPolygons.AddLast(currentChain); - openPolygons.Remove(current); - return; - } - else - { - LinkedListNode> innerCurrent = current.Next; - - while (innerCurrent != null) - { - LinkedListNode> innerNext = innerCurrent.Next; - - if (currentChain.LinkPointChain(innerCurrent.Value)) - { - openPolygons.Remove(innerCurrent); - break; - } - innerCurrent = innerNext; - } - } - return; - } - current = next; - } - openPolygons.AddLast(new StablePointChain(a, b)); - return; - } - - LinkedListNode> begin() { return closedPolygons.First; } - LinkedListNode> end() { return closedPolygons.Last; } - - public void Clear() - { - closedPolygons.Clear(); - openPolygons.Clear(); - } - - public int GetNumClosedPolygons() { return closedPolygons.Count; } - - LinkedList> openPolygons = new LinkedList>(); - public LinkedList> closedPolygons = new LinkedList>(); - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/StableConnector.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/StableConnector.cs.meta deleted file mode 100644 index 72a7fd41..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/StableConnector.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 303b1b9f64c54d14fb937b565d682481 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/StablePointChain.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/StablePointChain.cs deleted file mode 100644 index d2ee3369..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/StablePointChain.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System.Collections.Generic; -using System; - -namespace PathBerserker2d -{ - internal class StablePointChain where T : IEquatable - { - public LinkedList points = new LinkedList(); - - bool closed; // is the first point linked with the last one - - public StablePointChain(T a, T b) - { - closed = false; - - Add(a, b); - } - - public void Add(T a, T b) - { - points.AddLast(a); - points.AddLast(b); - } - - public bool LinkSegment(T a, T b) - { - if (b.Equals(points.First.Value)) - { - if (a.Equals(points.Last.Value)) - closed = true; - else - points.AddFirst(a); - return true; - } - if (a.Equals(points.Last.Value)) - { - if (b.Equals(points.First.Value)) - closed = true; - else - points.AddLast(b); - return true; - } - return false; - } - - public bool LinkPointChain(StablePointChain chain) - { - if (chain.points.First.Value.Equals(points.Last.Value)) - { - chain.points.RemoveFirst(); - AppendRange(chain.points); - - return true; - } - if (chain.points.Last.Value.Equals(points.First.Value)) - { - points.RemoveFirst(); - PrependRange(chain.points); - - return true; - } - return false; - } - - private void PrependRange(LinkedList list) - { - var node = list.Last; - do - { - this.points.AddFirst(node.Value); - } while ((node = node.Previous) != null); - } - - private void AppendRange(LinkedList list) - { - var node = list.First; - do - { - this.points.AddLast(node.Value); - } while ((node = node.Next) != null); - } - - public LinkedListNode First { get { return points.First; } } - public LinkedListNode Last { get { return points.Last; } } - - public bool IsClosed() { return closed; } - public void Clear() { points.Clear(); } - public int GetNumPoints() { return points.Count; } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/StablePointChain.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/StablePointChain.cs.meta deleted file mode 100644 index 67c7a12a..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/Creation/StablePointChain.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c0d953896d15cb447b92d08cd1972cfd -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/IColliderFilter.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/IColliderFilter.cs deleted file mode 100644 index 45110a99..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/IColliderFilter.cs +++ /dev/null @@ -1,10 +0,0 @@ -using UnityEngine; -using System.Collections.Generic; - -namespace PathBerserker2d -{ - internal interface IColliderFilter - { - IEnumerable Filter(IEnumerable colliders); - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/IColliderFilter.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/IColliderFilter.cs.meta deleted file mode 100644 index 1724533d..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/IColliderFilter.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2c3d0be58d090604f8d8340d3fcb51d5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/INavSegmentCreationParamProvider.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/INavSegmentCreationParamProvider.cs deleted file mode 100644 index 61a48756..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/INavSegmentCreationParamProvider.cs +++ /dev/null @@ -1,12 +0,0 @@ -using UnityEngine; - -namespace PathBerserker2d -{ - internal interface INavSegmentCreationParamProvider - { - float MaxClearance { get; } - float MinClearance { get; } - float CellSize { get; } - LayerMask ColliderMask { get; } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/INavSegmentCreationParamProvider.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/INavSegmentCreationParamProvider.cs.meta deleted file mode 100644 index fa37f565..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/INavSegmentCreationParamProvider.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: feb0a5de8c6910c4cbf247bff903f262 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments.meta deleted file mode 100644 index 9fc5f6bd..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: c9ba631cc202a4d44a0f62ae74788b74 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegment.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegment.cs deleted file mode 100644 index 121eb40b..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegment.cs +++ /dev/null @@ -1,28 +0,0 @@ -using UnityEngine; - -namespace PathBerserker2d -{ - [System.Serializable] - internal class NavSegment : LineSegmentWithClearance, System.IEquatable - { - public NavSurface Owner { get { return owner; } } - - [SerializeField] - private NavSurface owner; - - public NavSegment(NavSurface owner, Vector2 start, Vector2 dirNorm, float length, float[] cellClearances) : base(start, dirNorm, length, cellClearances) - { - this.owner = owner; - } - - public bool Equals(NavSegment other) - { - return ReferenceEquals(other, this); - } - - public override string ToString() - { - return $"NavSegment({Start} -{Tangent}> {End})"; - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegment.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegment.cs.meta deleted file mode 100644 index b569ff62..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegment.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c1edc43a078c650468d85cf0e014d7d5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegmentPointer.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegmentPointer.cs deleted file mode 100644 index cd968d55..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegmentPointer.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace PathBerserker2d -{ - /// - /// Points to a segment. - /// - public struct NavSegmentPointer : IEquatable - { - public static NavSegmentPointer Invalid { get { return new NavSegmentPointer(null, 0); } } - - public readonly int proxyDataIndex; - public readonly NavSurface surface; - - public NavSegmentPointer(NavSurface surface, int proxyDataIndex) - { - this.surface = surface; - this.proxyDataIndex = proxyDataIndex; - } - - public static bool operator ==(NavSegmentPointer a, NavSegmentPointer b) - { - return a.surface == b.surface && a.proxyDataIndex == b.proxyDataIndex; - } - - public static bool operator !=(NavSegmentPointer a, NavSegmentPointer b) - { - return a.surface != b.surface || a.proxyDataIndex != b.proxyDataIndex; - } - - public override bool Equals(object obj) - { - return obj is NavSegmentPointer && Equals((NavSegmentPointer)obj); - } - - public bool Equals(NavSegmentPointer other) - { - return proxyDataIndex == other.proxyDataIndex && - EqualityComparer.Default.Equals(surface, other.surface); - } - - public override int GetHashCode() - { - var hashCode = 1340906973; - hashCode = hashCode * -1521134295 + proxyDataIndex.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(surface); - return hashCode; - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegmentPointer.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegmentPointer.cs.meta deleted file mode 100644 index 248ebb48..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegmentPointer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9e41ae4e12fece74ea72adcba77c7b39 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegmentPositionPointer.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegmentPositionPointer.cs deleted file mode 100644 index 94acd2f0..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegmentPositionPointer.cs +++ /dev/null @@ -1,95 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; - -namespace PathBerserker2d -{ - /// - /// Points to a position on a segment. - /// - public struct NavSegmentPositionPointer : IEquatable - { - public static NavSegmentPositionPointer Invalid { get { return new NavSegmentPositionPointer(null, null, 0); } } - - public Vector2 Position => cluster.owner.LocalToWorld.MultiplyPoint3x4(cluster.GetPositionAlongSegment(t)); - public Vector2 Normal => surface.LocalToWorldMatrix.MultiplyVector(cluster.Normal); - - internal readonly float t; - internal readonly NavGraphNodeCluster cluster; - internal readonly NavSurface surface; - // used to detect if the surface has changed - internal readonly int bakeIteration; - - internal NavSegmentPositionPointer(NavSurface surface, NavGraphNodeCluster cluster, float t) - { - this.surface = surface; - this.cluster = cluster; - this.t = t; - this.bakeIteration = surface != null ? surface.BakeIteration : -1; - } - - public static bool operator ==(NavSegmentPositionPointer a, NavSegmentPositionPointer b) - { - return a.surface == b.surface && a.cluster == b.cluster && a.t == b.t; - } - - public static bool operator !=(NavSegmentPositionPointer a, NavSegmentPositionPointer b) - { - return a.surface != b.surface || a.cluster != b.cluster || a.t != b.t; - } - - [Obsolete("Use the property Position instead.")] - public Vector2 GetPosition() - { - return cluster.owner.LocalToWorld.MultiplyPoint3x4(cluster.GetPositionAlongSegment(t)); - } - - public bool IsInvalid() - { - return surface == null || bakeIteration != surface.BakeIteration; - } - - public bool IsValid() - { - return surface != null && surface.BakeIteration == bakeIteration; - } - - public bool Equals(NavSegmentPositionPointer other) - { - return other != null && t == other.t && - cluster == other.cluster && - surface == other.surface; - } - - - public override bool Equals(object obj) - { - if ((obj == null) || !this.GetType().Equals(obj.GetType())) - { - return false; - } - else - { - var p = (NavSegmentPositionPointer)obj; - return Equals(p); - } - } - - public override string ToString() - { - if (IsInvalid()) - return $"NSP is invalid"; - return $"NSP points at " + Position; - } - - public override int GetHashCode() - { - int hashCode = 1774642579; - hashCode = hashCode * -1521134295 + t.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(cluster); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(surface); - hashCode = hashCode * -1521134295 + bakeIteration.GetHashCode(); - return hashCode; - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegmentPositionPointer.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegmentPositionPointer.cs.meta deleted file mode 100644 index e18da5c9..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSegmentPositionPointer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e51973dfb11a2024f865147ad3348ab4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSubsegmentPointer.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSubsegmentPointer.cs deleted file mode 100644 index 28a1af76..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSubsegmentPointer.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; - -namespace PathBerserker2d -{ - /// - /// Points to a subsection on a segment. It has a start point on the target segment and a length. - /// - public struct NavSubsegmentPointer : IEquatable - { - public static NavSubsegmentPointer Invalid { get { return new NavSubsegmentPointer(null, 0, 0, 0); } } - - public readonly float t; - public readonly float length; - public readonly int proxyDataIndex; - public readonly NavSurface surface; - public readonly int bakeIteration; - - public NavSubsegmentPointer(NavSurface surface, int proxyDataIndex, float t, float length) - { - this.surface = surface; - this.proxyDataIndex = proxyDataIndex; - this.t = t; - this.length = length; - this.bakeIteration = surface != null ? surface.BakeIteration : -1; - } - - public static bool operator ==(NavSubsegmentPointer a, NavSubsegmentPointer b) - { - return a.surface == b.surface && a.proxyDataIndex == b.proxyDataIndex && a.t == b.t && a.length == b.length; - } - - public static bool operator !=(NavSubsegmentPointer a, NavSubsegmentPointer b) - { - return a.surface != b.surface || a.proxyDataIndex != b.proxyDataIndex || a.t != b.t || a.length != b.length; - } - - public override bool Equals(object obj) - { - return obj is NavSubsegmentPointer && Equals((NavSubsegmentPointer)obj); - } - - public bool Equals(NavSubsegmentPointer other) - { - return t == other.t && - length == other.length && - proxyDataIndex == other.proxyDataIndex && - EqualityComparer.Default.Equals(surface, other.surface); - } - - public bool IsInvalid() - { - return surface == null || bakeIteration != surface.BakeIteration; - } - - public override int GetHashCode() - { - var hashCode = -1731056371; - hashCode = hashCode * -1521134295 + t.GetHashCode(); - hashCode = hashCode * -1521134295 + length.GetHashCode(); - hashCode = hashCode * -1521134295 + proxyDataIndex.GetHashCode(); - hashCode = hashCode * -1521134295 + EqualityComparer.Default.GetHashCode(surface); - return hashCode; - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSubsegmentPointer.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSubsegmentPointer.cs.meta deleted file mode 100644 index 0db7115a..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSegments/NavSubsegmentPointer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5b6e634508177a64192239519f0e2e07 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSurface.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSurface.cs deleted file mode 100644 index 9a478a07..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSurface.cs +++ /dev/null @@ -1,321 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using UnityEngine; - -namespace PathBerserker2d -{ - /// - /// A collection of line segments to traverse on. - /// - /// - /// NavSurfaces are independent collections of segments. At runtime their data gets added to the pathfinder. - /// You can load and unload NavSurfaces at runtime. This allows you to setup Prefabs with navigation data and stream them in at runtime. - /// Loading and unloading is as simple as enabling and disabling a NavSurface script. - /// ## Baking - /// The bake process **only consideres colliders that are children of the NavSurface**. - /// This also extends to the clearance calculation of segment cells. - /// Baking is currently limited to editor mode only. You can't bake at runtime. - /// ## Transformations - /// All baked postion data is relative to the current NavSurface transformation. - /// Segments in calculated paths remain relative to the NavSurface of origin. - /// If you pathfind on a NavSurface and then move it, the path will reflect that transformation, without any extra calculations. - /// - /// See also \ref cc_navagent "Core concepts: NavAgent". - /// - [ScriptExecutionOrder(-55)] - [AddComponentMenu("PathBerserker2d/Nav Surface")] - public class NavSurface : MonoBehaviour, INavSegmentCreationParamProvider - { - internal const int CurrentBakeVersion = 2; - - public Rect WorldBounds => Geometry.EnlargeRect(Geometry.TransformBoundingRect(localBoundingRect, LocalToWorldMatrix), PathBerserker2dSettings.PointMappingDistance); - - public float MaxClearance => maxClearance; - - public float MinClearance => minClearance; - - public float CellSize => cellSize; - - public LayerMask ColliderMask - { - get => includedColliders; - set => includedColliders = value; - } - - /// - /// Length of all segments combined - /// - public float TotalLineLength => totalLineLength; - - /// - /// Segments exceeding this angle are removed from the bake output. Should equal the highest slope angle of your NavAgents. - /// - public float MaxSlopeAngle => maxSlopeAngle; - - /// - /// Parameter for the line simplifier (Ramer-Douglas-Peucker). Higher values reduce overall segment count at the expense of fitting the original collider shape. - /// - public float SmallestDistanceYouCareAbout => smallestDistanceYouCareAbout; - - /// - /// Segments shorter than this will be removed from the bake output. - /// - public float MinSegmentLength => minSegmentLength; - - /// - /// Gets fired after a BakeJob initiated by a call to Bake() completes. - /// THIS DOES NOT mean that the changes are already available to the pathfinder. That will happen later. - /// Use OnReadyToPathfind for that instead. This only really tells you when you may start a new bake. - /// - public event Action OnBakingCompleted; - - /// Called after the NavSurface has been added to the pathfinder. Usually sometime after OnBakingCompleted has been called. Only know are the changes from baking actually visible in the pathfinder. - /// IF THERE ARE MULTIPLE NavSurface Components on this GameObject you are ass out. These events will fire for both of them always. Don't put 2 NavSurfaces on the same GameObject! - public event Action OnReadyToPathfind; - - /// Called after the NavSurface is removed from the pathfinder. Usually after the NavSurface is deleted OR REBAKED! Removing the old NavSurface data to replace it with new baked data will trigger this event. When this event is called, you can be sure that the old data NavData is no longer in use for anything. - /// IF THERE ARE MULTIPLE NavSurface Components on this GameObject you are ass out. These events will fire for both of them always. Don't put 2 NavSurfaces on the same GameObject! - public event Action OnRemovedFromPathfinding; - - internal List NavSegments => navSegments; - internal NavSurfaceBakeJob BakeJob { get; private set; } - internal bool hasDataChanged; - internal int BakeVersion => bakeVersion; - internal int BakeIteration => bakeIteration; - internal int PBComponentId { get; private set; } - - [Header("Bake Settings")] - [Tooltip("Maximum height that gets checked for potential obstructions. Should equal the height of your largest NavAgent.")] - [SerializeField] - float maxClearance = 1.8f; - - [Tooltip("Parts of segments with less unobstructed space will be erased. Should equal the height of your smallest NavAgent.")] - [SerializeField] - float minClearance = 0.1f; - - [Tooltip("Size of a single segment part. Smaller numbers increase the accuracy of obstruction calculations at the expense of both bake and runtime performance.")] - [SerializeField] - float cellSize = 0.1f; - - [Tooltip("Colliders to consider for the bake process.")] - [SerializeField] - LayerMask includedColliders = ~0; - - - [Tooltip("Use only colliders from gameobjects marked static.")] - [SerializeField] - bool onlyStaticColliders = false; - - [Tooltip("Segments exceeding this angle are removed from the bake output. Should equal the highest slope angle of your NavAgents.")] - [SerializeField] - [Range(0, 180)] - float maxSlopeAngle = 180f; - - [Tooltip("Parameter for the line simplifier (Ramer-Douglas-Peucker). Higher values reduce overall segment count at the expense of fitting the original collider shape.")] - [SerializeField] - float smallestDistanceYouCareAbout = 0.1f; - - [Tooltip("Segments shorter than this will be removed from the bake output.")] - [SerializeField] - float minSegmentLength = 0.1f; - - [SerializeField] - private List navSegments = new List(); - - [SerializeField, HideInInspector] - private Rect localBoundingRect; - [SerializeField, HideInInspector] - private float totalLineLength; - [SerializeField, HideInInspector] - // version of bake algorithm this surface was last baked with - private int bakeVersion = 0; - [SerializeField, HideInInspector] - // number of distinct bakes - private int bakeIteration = 0; - - Matrix4x4 localToWorldMat; - - #region Unity_Methods - private void Awake() - { - UpdateLocalMatrix(); - PBComponentId = PBWorld.GeneratePBComponentId(); - PBWorld.NavGraphChangeSource.OnGraphChange += NavGraphChangeSource_OnGraphChange; - } - - private void OnEnable() - { - if (navSegments != null && navSegments.Count > 0) - { - PBWorld.NavGraph.AddNavSurface(this); - } - } - - private void OnDisable() - { - PBWorld.NavGraph.RemoveNavSurface(this); - } - - private void OnValidate() - { - if (minClearance <= 0) - minClearance = 0.1f; - if (maxClearance <= minClearance) - maxClearance = minClearance + 0.1f; - if (cellSize <= 0) - cellSize = 0.1f; - - BakeJob = new NavSurfaceBakeJob(this); - hasDataChanged = true; - } - - private void Update() - { - UpdateLocalMatrix(); - } - - #endregion - - public Vector2 LocalToWorld(Vector2 pos) - { - return LocalToWorldMatrix.MultiplyPoint3x4(pos); - } - - public Matrix4x4 LocalToWorldMatrix - { - get - { - return localToWorldMat; - } - } - - internal Matrix4x4 LocalToWorldMatrixEditor - { - get - { - return Matrix4x4.TRS(transform.position, Quaternion.Euler(0, 0, transform.rotation.eulerAngles.z), Vector3.one); ; - } - } - - public Vector2 WorldToLocal(Vector2 pos) - { - return WorldToLocalMatrix.MultiplyPoint3x4(pos); - } - - public Matrix4x4 WorldToLocalMatrix => LocalToWorldMatrix.inverse; - - /// - /// Updates NavSurface baked data. Baking largely runs in a different thread. This function should be run as a Coroutine. NavSurface will be removed from World first and added back, when baking is completed. - /// Calling this function before the previous bake job completed, will abort the previous job. - /// - public IEnumerator Bake() - { - PBWorld.NavGraph.RemoveNavSurface(this); - StartBakeJob(); - - while (!BakeJob.IsFinished) - { - yield return null; - } - UpdateInternalData(BakeJob.navSegments, BakeJob.bounds); - PBWorld.NavGraph.AddNavSurface(this); - - OnBakingCompleted?.Invoke(); - } - - internal void StartBakeJob() - { - UpdateLocalMatrix(); - if (BakeJob == null) - BakeJob = new NavSurfaceBakeJob(this); - else - BakeJob.AbortJoin(); - - var subtractors = GetComponentsInChildren(); - Tuple[] substractorRects = new Tuple[subtractors.Length]; - for (int i = 0; i < subtractors.Length; i++) - { - var rT = subtractors[i].GetComponent(); - var rect = rT.rect; - Vector2 scaleFactor = rT.lossyScale * rect.size * 0.5f; - Vector2 center = rect.center; - - rect.min = center - scaleFactor + (Vector2)rT.position; - rect.max = center + scaleFactor + (Vector2)rT.position; - - substractorRects[i] = new Tuple(rect, new Vector2(subtractors[i].fromAngle, subtractors[i].toAngle)); - } - - var filter = new ColliderLayerFilter(includedColliders, onlyStaticColliders); - var allColliders = filter.Filter(this.GetComponentsInChildren()).ToArray(); - - var it = new IntersectionTester(this, WorldToLocalMatrix); - Polygon[][] polygons = new Polygon[allColliders.Length][]; - for (int i = 0; i < allColliders.Length; i++) - { - var col = allColliders[i]; - polygons[i] = it.ColliderToPolygon(col); - } - - BakeJob.Start(polygons, it, substractorRects, WorldToLocalMatrix); - } - - internal NavSegment GetSegment(int index) - { - return navSegments[index]; - } - - internal void UpdateInternalData(List segments, Rect bounds) - { - if (segments == null) - { - Debug.LogError("Updating NavSurface failed. Got null as segments"); - return; - } - - this.localBoundingRect = Geometry.TransformBoundingRect(bounds, WorldToLocalMatrix); - - this.totalLineLength = 0; - foreach (var seg in segments) - totalLineLength += seg.Length; - - this.navSegments = segments; - bakeVersion = CurrentBakeVersion; - hasDataChanged = true; - bakeIteration++; - } - - /// - /// Filters and rethrows change events that have this NavSurface as target. It's a convenience feature. - /// You may also just subscribe to PBWorld.NavGraphChangeSource.OnGraphChange and filter the changes yourself. - /// - /// - /// - /// - private void NavGraphChangeSource_OnGraphChange(NavGraphChange arg1, int srcCompId) - { - if (srcCompId == PBComponentId) - { - switch (arg1) - { - case NavGraphChange.NavSurfaceAdded: - OnReadyToPathfind?.Invoke(); - break; - case NavGraphChange.NavSurfaceRemoved: - OnRemovedFromPathfinding?.Invoke(); - break; - default: - // this could happen if there is another component on this gameobject which the change event was directed at. Just ignore it. - break; - } - } - } - - private void UpdateLocalMatrix() - { - localToWorldMat = Matrix4x4.TRS(transform.position, Quaternion.Euler(0, 0, transform.rotation.eulerAngles.z), Vector3.one); - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSurface.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSurface.cs.meta deleted file mode 100644 index afd2205b..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/NavSurface/NavSurface.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7616445e6074b27418ea1cd9bf9902f8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: -55 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/PBWorld.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/PBWorld.cs deleted file mode 100644 index 865e6952..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/PBWorld.cs +++ /dev/null @@ -1,235 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Threading; -using UnityEngine; -using UnityEngine.SceneManagement; - -namespace PathBerserker2d -{ - /// - /// Singleton managing the global NavGraph instance. - /// - /// - /// Is instantiated automatically on scene load. - /// - /// Use it to access the NavGraph, which is the graph the pathfinder works on. - /// - [ScriptExecutionOrder(-100), AddComponentMenu("")] - public class PBWorld : MonoBehaviour - { - [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] - private static void Initialize() - { - PathBerserker2dSettings.instance = Resources.Load(PathBerserker2dSettings.GlobalSettingsFile); - var world = new GameObject("PBWorld").AddComponent(); - DontDestroyOnLoad(world); - instance = world; - } - - private static PBWorld instance; - - internal static NavGraph NavGraph { get; set; } - public static INavGraphChangeSource NavGraphChangeSource => NavGraph; - - // threading stuff - CancellationTokenSource pathfinderThreadCancelationSource; - ConcurrentQueue pathRequestQueue; - - private float lastGraphUpdate = -100; - - #region UNITY_METHODS - private void Awake() - { - SceneManager.sceneUnloaded += SceneManager_sceneUnloaded; - } - - private void SceneManager_sceneUnloaded(Scene arg0) - { - // cycle the navgraph one more time to remove all unloaded navgraphs in case the scene is just reloaded - NavGraph.ForceApplyChanges(); - } - - private void OnEnable() - { - NavGraph = new NavGraph(PathBerserker2dSettings.PathfinderThreadCount); - - // create pathfinder threads - pathRequestQueue = new ConcurrentQueue(); - pathfinderThreadCancelationSource = new CancellationTokenSource(); - StartPathfinderThreads(); - } - - private void Start() - { - NavGraph.Update(); - } - - private void OnDisable() - { - pathfinderThreadCancelationSource.Cancel(); - } - - private void Update() - { - if (Time.time - lastGraphUpdate > PathBerserker2dSettings.InitiateUpdateInterval) - { - NavGraph.Update(); - lastGraphUpdate = Time.time; - } - } - - private void Reset() - { - Debug.LogError("This component should not be added manually. It will be automatically instantiated at runtime."); - DestroyImmediate(this); - } - #endregion - - /// - /// Tries to map a point to a navigation position. The distance a point can be away from the nearest segment is specified by .PointMappingDistance - /// - /// Position to map - /// Pointer to mapped position or an invalid pointer, if mapping failed. - /// True, if mapping succeeded - public static bool TryMapPoint(Vector2 position, out NavSegmentPositionPointer pointer) - { - return NavGraph.TryMapPoint(position, out pointer); - } - - /// - /// Tries to map a point to a navigation position. The distance a point can be away is determined by searchRadius - /// - /// Position to map - /// Pointer to mapped position or an invalid pointer, if mapping failed. - /// Maxium search distance when trying to map. - /// True, if mapping succeeded - public static bool TryMapPoint(Vector2 position, float searchRadius, out NavSegmentPositionPointer pointer) - { - return NavGraph.TryMapPoint(position, p => true, searchRadius, out pointer); - } - - /// - /// Tries to map a point to a navigation position. The distance a point can be away is determined by searchRadius. Also makes sure that the point is traversable for the supplied NavAgent. - /// - /// Position to map - /// Pointer to mapped position or an invalid pointer, if mapping failed. - /// Maxium search distance when trying to map. - /// Maxium search distance when trying to map. - /// True, if mapping succeeded - public static bool TryMapPoint(Vector2 position, float searchRadius, NavAgent agent, out NavSegmentPositionPointer pointer) - { - return NavGraph.TryMapPoint(position, p => agent.CouldBeLocatedAt(p), searchRadius, out pointer); - } - - /// - /// Tries to map an Agent to a navigation position. Uses last mapping to speed up search. Will only map the agent to a surface it could traverse. - /// - /// Position to map - /// Pointer with the previously mapped position. Taken as start for search. - /// True, if mapping succeeded - internal static bool TryMapAgent(Vector2 position, NavSegmentPositionPointer lastMapping, NavAgent agent, out NavSegmentPositionPointer result) - { - return NavGraph.TryMapAgent(position, lastMapping, agent, out result); - } - - internal static bool TryMapPointWithStaged(Vector2 position, out NavSegmentPositionPointer pointer) - { - return NavGraph.TryMapPointWithStaged(position, out pointer); - } - - /// Random point on NavGraph. Might not be reachable. - public static Vector2 GetRandomPointOnGraph() - { - return NavGraph.GetRandomPointOnGraph(); - } - - /// - /// Enqueues a . The path will be solved async. Use the PathRequest object to check its status. - /// - /// PathRequest object representing the pathfinding job. - public static void PathTo(PathRequest pathRequest) - { - pathRequest.SetToPending(); -#if PBDEBUG - Debug.Log($"PathRequest from: {pathRequest.start.GetPosition()} to: {pathRequest.goals[0].GetPosition()}"); -#endif - instance.pathRequestQueue.Enqueue(pathRequest); - } - - /// - /// Get all segments intersecting a rotated box. Segments can additionally be filtered by angle. - /// - /// Intersection rect. - /// The rotation of the rect around its center. - /// Minium angle in degree of returned segments. - /// Maximum angle in degree of returned segments. - public static List BoxCast(Rect rect, float rotation, float filterFromAngle, float filterToAngle) - { - filterFromAngle = ClampAngle(filterFromAngle); - filterToAngle = ClampAngle(filterToAngle); - return NavGraph.BoxCast(rect, rotation, filterFromAngle, filterToAngle); - } - - internal static List BoxCastWithStaged(Rect rect, float rotation, float filterFromAngle, float filterToAngle) - { - return NavGraph.BoxCastWithStaged(rect, rotation, filterFromAngle, filterToAngle); - } - - /// - /// Similar to TryMapPoint, but meant for mapping goal positions. Has a configurable search radius. - /// - /// Position to map - /// Maximum distance away from position a mapping is allowed to be. - /// Mapped pointer - /// True, if successfully mapped. - [Obsolete("Use TryMapPoint instead")] - public static bool TryFindClosestPointTo(Vector2 position, float maxMappingDistance, out NavSegmentPositionPointer pointer) - { - return NavGraph.TryMapPoint(position, (p) => true, maxMappingDistance, out pointer); - } - - /// - /// Get the position the is pointing at. - /// - internal static NavGraphNodeCluster GetClusterFromPositionPointer(NavSegmentPositionPointer pointer) - { - NavGraphNodeCluster cluster = null; - NavGraph.TryGetClusterAt(pointer, out cluster); - return cluster; - } - - private static int nextFreeComponentId = 1; - internal static int GeneratePBComponentId() - { - return nextFreeComponentId++; - } - - private void StartPathfinderThreads() - { - if (Application.platform == RuntimePlatform.WebGLPlayer) - { - PathfinderThread p = new PathfinderThread(pathfinderThreadCancelationSource.Token, pathRequestQueue, NavGraph, 0); - StartCoroutine(p.CoroutineRun()); - } - else - { - for (int i = 0; i < PathBerserker2dSettings.PathfinderThreadCount; i++) - { - PathfinderThread p = new PathfinderThread(pathfinderThreadCancelationSource.Token, pathRequestQueue, NavGraph, i); - Thread t = new Thread(p.Run); - t.Start(); - } - } - } - - private static float ClampAngle(float angle) - { - while (angle > 360) - angle -= 360; - while (angle < 0) - angle += 360; - return angle; - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/PBWorld.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/PBWorld.cs.meta deleted file mode 100644 index ee2ff044..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/PBWorld.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2048e50ad4fa22d40b52f955baa925d9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: -100 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/PathBerserker2d.asmdef b/Assets/PathBerserker2d/Scripts/PathBerserker2d/PathBerserker2d.asmdef deleted file mode 100644 index 0f938ca9..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/PathBerserker2d.asmdef +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "PathBerserker2d", - "references": [ - "GUID:75469ad4d38634e559750d17036d5f7c" - ], - "includePlatforms": [], - "excludePlatforms": [], - "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], - "autoReferenced": true, - "defineConstraints": [], - "versionDefines": [], - "noEngineReferences": false -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/PathBerserker2d.asmdef.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/PathBerserker2d.asmdef.meta deleted file mode 100644 index 4d6ad38e..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/PathBerserker2d.asmdef.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: f483b8ed1e509354483048b0c7a56768 -AssemblyDefinitionImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/PathBerserker2dSettings.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/PathBerserker2dSettings.cs deleted file mode 100644 index 649572c4..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/PathBerserker2dSettings.cs +++ /dev/null @@ -1,298 +0,0 @@ -using System; -using UnityEngine; - -namespace PathBerserker2d -{ - /// - /// Contains all project wide settings for PathBerserker2d. - /// - /// - /// Find it at *Edit/Project Settings/PathBerserker2d* - /// - public class PathBerserker2dSettings : ScriptableObject - { - public const string GlobalSettingsFolder = "Assets/PathBerserker2d/Resources"; - public const string GlobalSettingsFile = "PathBerserker2dSettings"; - - internal readonly static string[] buildinNavLinkTypeNames = new string[] { - "corner", // -1 - "jump", - "fall", - "teleport", - "climb", - "elevator" - }; - - internal static PathBerserker2dSettings instance; - - /// - /// Should unselected links be drawn? Only relevant when not in play mode. - /// - public static bool DrawUnselectedLinks { get { return instance.drawUnselectedLinks; } } - - /// - /// Array of all link type names - /// - public static string[] NavLinkTypeNames { get { return instance.navLinkTypeNames; } } - - /// - /// Array of all NavTag colors - /// - public static Color[] NavLinkTypeColors { get { return instance.navLinkTypeColors; } } - - /// - /// Array of all NavTag names - /// - public static string[] NavTags { get { return instance.navTags; } } - - /// - /// Array of all NavTag colors - /// - public static Color[] NavTagColors { get { return instance.navTagColors; } } - - /// - /// Should unselected surfaces be drawn? Only relevant when not in play mode. - /// - public static bool DrawUnselectedSurfaces { get { return instance.drawUnselectedSurfaces; } } - - /// - /// Should unselected substractors be drawn? Only relevant when not in play mode. - /// - public static bool DrawUnselectedSubstractors { get { return instance.drawUnselectedSubstractors; } } - - /// - /// Should unselected area markers be drawn? Only relevant when not in play mode. - /// - public static bool DrawUnselectedAreaMarkers { get { return instance.drawUnselectedAreaMarkers; } } - - /// - /// Maximum distance a point will try to be mapped to the NavGraph. Used in performance critical functions (e.g. mapping a NavAgents position) and should be as small as possible. - /// - public static float PointMappingDistance { get { return instance.pointMappingDistance; } } - - /// - /// Time between NavGraph updates. NavGraph queues changes to apply them in batch at this interval. Lower values will lower performance. - /// - public static float InitiateUpdateInterval { get { return instance.initiateUpdateInterval; } } - - /// - /// Amount of threads used for pathfinding. NOTE: WebGL doesn't support threads. If you build for WebGL this number is meaningless. - /// - public static int PathfinderThreadCount - { - get - { - if (Application.platform == RuntimePlatform.WebGLPlayer) - return 1; - return instance.pathfinderThreadCount; - } - } - - /// - /// Draw the NavGraph while in play mode? - /// - public static bool DrawGraphWhilePlaying { get { return instance.drawGraphWhilePlaying; } } - - /// - /// Maximum distance to search for the nearest NavGraph position to a point. Used in functions to e.g. map a mouse cursor click to a nav position. Make it as large as you want. - /// - [System.Obsolete] - public static float ClosestToSegmentMaxDistance { get { return instance.closestToSegmentMaxDistance; } } - - /// - /// Line width of NavGraph/NavSurface visualization. - /// - public static float NavSurfaceLineWidth { get { return instance.navSurfaceLineWidth; } } - - /// - /// Line width of NavAreaMarker visualization (only visible in playmode) - /// - public static float NavAreaMarkerLineWidth { get { return instance.navAreaMarkerLineWidth; } } - - /// - /// Whether to convert a PolygonCollider2d to a polygon with CreateMesh() or by reading its first Path. - /// - public static bool UsePolygonCollider2dPathsForBaking { get { return instance.usePolygonCollider2dPathsForBaking; } } - - /// - /// Converts a link type name to its corresponding integer. Throws an ArgumentException if name is not a valid link type name. - /// - public static int GetLinkTypeFromName(string name) - { - var names = NavLinkTypeNames; - for (int i = 0; i < names.Length; i++) - { - if (name == names[i]) - return i; - } - throw new ArgumentException(name + "is not a valid link type name. (case sensitive!)"); - } - - [Tooltip("Maximum distance a point will try to be mapped to the NavGraph. Used in performance critical functions (e.g. mapping a NavAgents position) and should be as small as possible.")] - [Header("Pathfinding")] - [SerializeField, HideInInspector] - private float pointMappingDistance = 0.1f; - - [SerializeField, HideInInspector] - private int pathfinderThreadCount = 1; - - [Tooltip("Time between NavGraph updates. NavGraph queues changes to apply them in batch at this interval. Lower values will lower performance.")] - [SerializeField, HideInInspector] - private float initiateUpdateInterval = 0.1f; - - [Tooltip("Maximum distance to search for the nearest NavGraph position to a point. Used in functions to e.g. map a mouse cursor click to a nav position. Make it as large as you want.")] - [SerializeField, HideInInspector] - private float closestToSegmentMaxDistance = 20; - - [Header("NavLinks")] - [SerializeField, HideInInspector] - private string[] navLinkTypeNames = new string[] { }; - [SerializeField, HideInInspector] - private Color[] navLinkTypeColors = new Color[] { }; - - [Header("NavSegments")] - [SerializeField, HideInInspector] - private string[] navTags = new string[] { "default" }; - [SerializeField, HideInInspector] - private Color[] navTagColors = new Color[] { Color.clear }; - - [Tooltip("Should unselected links be drawn? Only relevant when not in play mode.")] - [Header("Visualization")] - [SerializeField, HideInInspector] - private bool drawUnselectedLinks = true; - - [Tooltip("Should unselected surfaces be drawn? Only relevant when not in play mode.")] - [SerializeField, HideInInspector] - private bool drawUnselectedSurfaces = true; - - [Tooltip("Should unselected substractors be drawn? Only relevant when not in play mode.")] - [SerializeField, HideInInspector] - private bool drawUnselectedSubstractors = true; - - [Tooltip("Should unselected area markers be drawn? Only relevant when not in play mode.")] - [SerializeField, HideInInspector] - private bool drawUnselectedAreaMarkers = true; - - [Tooltip("Draw the NavGraph while in play mode?")] - [SerializeField, HideInInspector] - private bool drawGraphWhilePlaying = true; - - [Tooltip("Line width of NavGraph/NavSurface visualization")] - [SerializeField, HideInInspector] - private float navSurfaceLineWidth = 0.04f; - - [Tooltip("Line width of NavAreaMarker visualization (only visible in playmode)")] - [SerializeField, HideInInspector] - private float navAreaMarkerLineWidth = 0.04f; - - [Tooltip("Whether to convert a PolygonCollider2d to a polygon with CreateMesh() or by reading its first Path.")] - [SerializeField, HideInInspector] - private bool usePolygonCollider2dPathsForBaking = false; - - internal void OnValidate() - { - ValidateLinkTypeNames(); - pointMappingDistance = Mathf.Max(0.001f, pointMappingDistance); - pathfinderThreadCount = Mathf.Max(1, pathfinderThreadCount); - initiateUpdateInterval = Mathf.Max(0.1f, initiateUpdateInterval); - - navTags[0] = "default"; - navTagColors[0] = Color.clear; - if (navTags.Length > 32) - { - System.Array.Resize(ref navTags, 32); - } - if (navTagColors.Length != navTags.Length) - { - int oldLength = navTagColors.Length; - System.Array.Resize(ref navTagColors, navTags.Length); - for (int i = oldLength; i < navTags.Length; i++) - navTagColors[i] = DifferentColors.GetColor(i); - } - } - - internal void ValidateLinkTypeNames() - { - if (navLinkTypeNames.Length < buildinNavLinkTypeNames.Length) - { - navLinkTypeNames = new string[buildinNavLinkTypeNames.Length]; - } - if (navLinkTypeNames.Length > 32) - { - System.Array.Resize(ref navLinkTypeNames, 32); - } - if (navLinkTypeColors.Length != navLinkTypeNames.Length) - { - int oldLength = navLinkTypeColors.Length; - System.Array.Resize(ref navLinkTypeColors, navLinkTypeNames.Length); - for (int i = oldLength; i < navLinkTypeNames.Length; i++) - navLinkTypeColors[i] = DifferentColors.GetColor(i); - } - - for (int i = 0; i < buildinNavLinkTypeNames.Length; i++) - { - navLinkTypeNames[i] = buildinNavLinkTypeNames[i]; - } - } - - /// - /// Get the human readable name of a specific link type. - /// - public static string GetLinkTypeName(int linkType) - { - return instance.navLinkTypeNames[linkType]; - } - - /// - /// Get color associated with specific link type. - /// - public static Color GetLinkTypeColor(int linkType) - { - return instance.navLinkTypeColors[linkType]; - } - - /// - /// Set the color of a specific NavLinkType. - /// - internal static void SetLinkTypeColor(int navTag, Color color) - { - instance.navLinkTypeColors[navTag] = color; - } - - /// - /// Get the assigned color of a specific NavTag. - /// - public static Color GetNavTagColor(int navTag) - { - return instance.navTagColors[navTag]; - } - - /// - /// If the NavTag does not exists, returns 0 - /// - public static int EnsureNavTagExists(int navTag) - { - if (navTag < 0 || navTag >= NavTags.Length) - return 0; - return navTag; - } - - /// - /// Set the color of a specific NavTag. - /// - internal static void SetNavTagColor(int navTag, Color color) - { - instance.navTagColors[navTag] = color; - } - - /// - /// If the linkType does not exists, returns 0 - /// - public static int EnsureNavLinkTypeExists(int linkType) - { - if (linkType < 0 || linkType >= NavLinkTypeNames.Length) - return 1; - return linkType; - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/PathBerserker2dSettings.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/PathBerserker2dSettings.cs.meta deleted file mode 100644 index b6117011..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/PathBerserker2dSettings.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 393b1ec75130eb047bc70f7635277936 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder.meta deleted file mode 100644 index e975e822..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: df7508c295beef243878bd13a3a37d46 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/Path.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/Path.cs deleted file mode 100644 index 57fec3ac..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/Path.cs +++ /dev/null @@ -1,111 +0,0 @@ -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -namespace PathBerserker2d -{ - /// - /// A path ready to be traversed - /// - public class Path : IEnumerator - { - public PathSegment Current { get; private set; } - object IEnumerator.Current => Current; - - public PathSegment NextSegment { get { return Current.Next; } } - public bool HasNext { get { return Current.Next != null; } } - - public Vector2 Goal => lastSeg.LinkStart; - public Vector2 Start => start; - public readonly float totalCosts; - - private readonly PathSegment firstSeg; - private readonly PathSegment lastSeg; - private readonly int segmentCount; - private readonly Vector2 start; - private int remainingSegmentCount; - - internal Path(PathSegment firstSeg, PathSegment lastSeg, Vector2 start, int segCount, float totalCosts) - { - this.firstSeg = firstSeg; - this.lastSeg = lastSeg; - this.Current = firstSeg; - this.segmentCount = segCount; - this.remainingSegmentCount = segCount; - this.totalCosts = totalCosts; - this.start = start; - } - - public override string ToString() - { - return string.Format("Path (VertCount: {0}, Costs: {1})", segmentCount, totalCosts); - } - - public void Dispose() - { - - } - - /// - /// Advanced the path by 1 segment. - /// - public bool MoveNext() - { - if (Current.Next != null) - { - Current = Current.Next; - remainingSegmentCount--; - return true; - } - return false; - } - - public void Reset() - { - remainingSegmentCount = segmentCount; - Current = firstSeg; - } - - /// - /// Creates a list of all path points. Current enumerator progress is ignored. - /// List starts with path start and ends with path goal. Corner links will result in the same point being enumerated twice in a row. - /// - public List AllPathPoints() - { - List pathPoints = new List(segmentCount * 2 + 2); - pathPoints.Add(Start); - - var seg = firstSeg; - while (seg.Next != null) - { - pathPoints.Add(seg.LinkStart); - pathPoints.Add(seg.LinkEnd); - seg = seg.Next; - } - pathPoints.Add(Goal); - return pathPoints; - } - - /// - /// Creates a list of all path points, starting from current segment. - /// List starts with current.linkstart and ends with path goal. If these points are equivalent, only goal will be returned. Corner links will result in the same point being enumerated twice in a row. - /// - public List RemainingPathPoints() - { - List pathPoints = new List(remainingSegmentCount * 2 + 2); - pathPoints.Add(Current.LinkStart); - - var seg = Current; - while (seg.Next != null) - { - pathPoints.Add(seg.LinkStart); - pathPoints.Add(seg.LinkEnd); - seg = seg.Next; - } - - if (Current.Next != null) - pathPoints.Add(Goal); - return pathPoints; - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/Path.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/Path.cs.meta deleted file mode 100644 index 3c85bf97..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/Path.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 58dedc7e6d80873469cc62eee12e4a34 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathRequest.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathRequest.cs deleted file mode 100644 index 6dd2655c..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathRequest.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; - -namespace PathBerserker2d -{ - /// - /// Represents an async path request. - /// - public class PathRequest - { - public enum RequestState { - Draft, - Pending, - Finished, - Failed - } - - public enum RequestFailReason { - CouldntMapStart, - CouldntMapGoal, - MappedStartChanged, - AllMappedGoalsChanged, - NoPathFromStartToGoal, - WorldWasDestroyed, - ToFarFromStart, - } - - /// - /// Status of the processing of the request. - /// - public RequestState Status{ get { return status; } } - /// - /// If the request failed, it will set this field to the cause of failure. - /// - public RequestFailReason FailReason { get; private set; } - /// - /// If the request succeeded, this is found path. - /// - public Path Path { get; private set; } - - /// - /// Start of the requested path - /// - public NavSegmentPositionPointer start; - /// - /// Goals of the requested path. - /// - public IList goals; - /// - /// NavAgent the calculated path should be usable by. - /// - public NavAgent client; - - /// - /// If the request failed, this will contain the closest reachable position found to the goal. This does NOT work when multiple goals where specified. - /// - public NavSegmentPositionPointer closestReachablePosition; - private volatile RequestState status = RequestState.Draft; - - public PathRequest(NavAgent client) - { - this.client = client; - this.start = client.currentMappedPosition; - } - - internal void SetToPending() - { - status = RequestState.Pending; - } - - internal void Reset() - { - Debug.Assert(status != RequestState.Pending); - status = RequestState.Draft; - } - - internal void Fulfill(Path path) { - this.Path = path; - this.status = RequestState.Finished; - } - - internal void Fail(RequestFailReason requestFailReason) { - this.FailReason = requestFailReason; - this.status = RequestState.Failed; -#if PBDEBUG - Debug.Log("Pathrequest failed because " + requestFailReason); -#endif - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathRequest.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathRequest.cs.meta deleted file mode 100644 index 4a76ed3b..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathRequest.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2750643c1f0175e4891d9493e72b9cc6 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathSegment.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathSegment.cs deleted file mode 100644 index 47e8b649..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathSegment.cs +++ /dev/null @@ -1,77 +0,0 @@ -using UnityEngine; - -namespace PathBerserker2d -{ - /// - /// Encapsulates the movement on a segment to a link and the traversal of that link. - /// - /// - /// Only the last PathSegment does not have a link. - /// - public class PathSegment - { - public PathSegment Next { get; internal set; } - /// - /// World position of the link start. May change from frame to frame, if corresponding NavSurface moves. - /// - public Vector2 LinkStart { get { return owner.LocalToWorld(linkStart); } } - /// - /// World position of the link end. May change from frame to frame, if corresponding NavSurface moves. - /// - public Vector2 LinkEnd { get { return Next.owner.LocalToWorld(linkEnd); } } - /// - /// Segments normal. May change from frame to frame, if corresponding NavSurface moves. - /// - public Vector2 Normal => owner.LocalToWorldMatrix.MultiplyVector(cluster.Normal); - /// - /// Segments tangent. May change from frame to frame, if corresponding NavSurface moves. - /// - public Vector2 Tangent => owner.LocalToWorldMatrix.MultiplyVector(cluster.Tangent); - /// - /// Point on segment that together with Tangent defines the segments line equation. May change from frame to frame, if corresponding NavSurface moves. - /// - public Vector2 Point => owner.LocalToWorldMatrix.MultiplyPoint3x4(cluster.Start); - - public readonly INavLinkInstance link; - public readonly NavSurface owner; - private Vector2 linkStart; - private Vector2 linkEnd; - internal NavGraphNodeCluster cluster; - - internal PathSegment(Vector2 linkStart, Vector2 linkEnd, NavSurface owner, INavLinkInstance link, NavGraphNodeCluster cluster) - { - this.linkStart = linkStart; - this.linkEnd = linkEnd; - this.owner = owner; - this.link = link; - this.cluster = cluster; - } - - /// - /// Get the NavTag vector at a distance along the segment. - /// - /// Distance along segment. - /// Integer with bits set to the existence of the corresponding nav tag at that position. - public int GetTagVector(float t) - { - return cluster.GetNavTagVector(t); - } - - /// - /// Like GetTagVector, but works by projecting the parameter on the segment. - /// - /// Integer with bits set to the existence of the corresponding nav tag at that position. - public int GetTagVector(Vector2 pos) - { - return cluster.GetNavTagVector(owner.WorldToLocal(pos)); - } - - /// - /// Projects a position on the segment and returns its distance from the segment start Result may change from frame to frame, if corresponding NavSurface moves. - /// - public float DistanceAlongSegment(Vector2 pos) - { - return Vector2.Dot(cluster.Tangent, owner.WorldToLocal(pos) - cluster.Start); - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathSegment.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathSegment.cs.meta deleted file mode 100644 index 2c156e05..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathSegment.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ad1de11ac5ee257459efc73dd2bb1eaa -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathValues.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathValues.cs deleted file mode 100644 index 468ccf9b..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathValues.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Priority_Queue; - -namespace PathBerserker2d -{ - internal class PathValues : FastPriorityQueueNode - { - public NavGraphNode node; - public NavGraphNode parent; - public float costSoFar; - public float estimatedFutherPath; - - public PathValues(NavGraphNode node) - { - this.node = node; - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathValues.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathValues.cs.meta deleted file mode 100644 index 0e788af5..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathValues.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4eeeecfc6e39a704f89e7c3539b74bf6 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/Pathfinder.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/Pathfinder.cs deleted file mode 100644 index 67fad4bd..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/Pathfinder.cs +++ /dev/null @@ -1,339 +0,0 @@ -using Priority_Queue; -using System.Collections.Generic; -using UnityEngine; - -namespace PathBerserker2d -{ - internal class Pathfinder - { - FastPriorityQueue openList = new FastPriorityQueue(1000); - HashSet closedList = new HashSet(); - NavGraph navGraph; - int pathValueId; - - float maxHeuristicAllowed; - NavSegmentPositionPointer closestReachablePosition; - NavAgent agent; - - public Pathfinder(NavGraph navGraph, int pathValueId) - { - this.navGraph = navGraph; - this.pathValueId = pathValueId; - } - - public void ProcessPathRequest(PathRequest request) - { - Path path = null; - this.agent = request.client; - - navGraph.graphLock.AcquireReaderLock(-1); - try - { - NavGraphNodeCluster startCluster; - if (!navGraph.TryGetClusterAt(request.start, out startCluster)) - { - request.Fail(PathRequest.RequestFailReason.MappedStartChanged); - return; - } - NavGraphNode nvStart = new NavGraphNode(pathValueId + 1, startCluster, request.start.t); - closestReachablePosition = request.start; - - IList nvGoals = new List(request.goals.Count); - NavGraphNodeCluster goalCluster; - for (int iGoal = 0; iGoal < request.goals.Count; iGoal++) - { - if (navGraph.TryGetClusterAt(request.goals[iGoal], out goalCluster)) - { - nvGoals.Add(new NavGraphNode(pathValueId + 1, goalCluster, request.goals[iGoal].t)); - goalCluster.containsGoal[pathValueId] = true; - } - } - if (nvGoals.Count == 0) - { - request.Fail(PathRequest.RequestFailReason.AllMappedGoalsChanged); - return; - } - - if (nvGoals.Count == 1) - { - path = this.FindPathSingleGoal(nvStart, nvGoals); - } - else - { - path = this.FindPathMultiGoal(nvStart, nvGoals); - } - maxHeuristicAllowed = float.MaxValue; - - for (int iGoal = 0; iGoal < nvGoals.Count; iGoal++) - { - nvGoals[iGoal].cluster.containsGoal[pathValueId] = false; - } - } - finally - { - navGraph.graphLock.ReleaseReaderLock(); - } - - if (path == null) - { - request.closestReachablePosition = closestReachablePosition; - request.Fail(PathRequest.RequestFailReason.NoPathFromStartToGoal); - } - else - { - request.Fulfill(path); - } - - } - - private Path FindPathSingleGoal(NavGraphNode start, IList goals) - { - Vector2 goalPos = goals[0].WPosition(); - Path path = null; - float closestH = float.MaxValue; - - Restart: - foreach (var conn in start.cluster.EnumerateReachableNavVerts(start.t, agent, goals, pathValueId)) - { - Expand(conn, start, goalPos); - } - UpdateClosestPositionToGoal(start, goalPos, ref closestH); - -#if PBDEBUG - int iterationCount = 0; -#endif - while (openList.Count > 0) - { -#if PBDEBUG - iterationCount++; -#endif - var vert = openList.Dequeue(); - var node = vert.node; - /*GizmosQueue.Instance.Enqueue(1, () => - { - Gizmos.color = Color.yellow; - Vector3 v = vert.WPosition(); - v.z = 5; - DebugDrawingExtensions.DrawCircle(v, 0.1f); - });*/ - if (node.IsGoal) - { - // reached goal !! - if (vert.costSoFar < 0) - { - Debug.LogError("Path found with negative values. This breaks pathfinding. Found path will be thrown away."); - return path; - } - - float v = CheckHeuristicValidity(start, node); - if (v != 0) - { - // heuristic was violated! start over. -#if PBDEBUG - Debug.Log("Heuristic was violated. Retrying with upper bound."); -#endif - maxHeuristicAllowed = v; - openList.Clear(); - closedList.Clear(); - - goto Restart; - } - - path = GatherPath(start, node); - break; - } - - closedList.Add(node); - - UpdateClosestPositionToGoal(node, goalPos, ref closestH); - - foreach (var conn in vert.node.GetConnections(agent, goals, pathValueId)) - { - Expand(conn, node, goalPos); - } - } - - openList.Clear(); - closedList.Clear(); -#if NOPE_DEBUG - if (path != null) - Debug.Log(string.Format( - "Found in {0} iteration the path: {1}", iterationCount, path)); - else - { - Debug.Log(string.Format( - "Found no path in {0} iteration.", iterationCount)); - } -#endif - - return path; - } - - private Path FindPathMultiGoal(NavGraphNode start, IList goals) - { - Path path = null; - - foreach (var conn in start.cluster.EnumerateReachableNavVerts(start.t, agent, goals, pathValueId)) - { - ExpandZeroH(conn, start); - } - -#if PBDEBUG - int iterationCount = 0; -#endif - while (openList.Count > 0) - { -#if PBDEBUG - iterationCount++; -#endif - var vert = openList.Dequeue(); - var node = vert.node; - if (node.IsGoal) - { - // reached goal !! - if (vert.costSoFar < 0) - { - Debug.LogError("Path found with negative values. This breaks pathfinding. Found path will be thrown away."); - return path; - } - - path = GatherPath(start, node); - break; - } - - closedList.Add(node); - foreach (var conn in node.GetConnections(agent, goals, pathValueId)) - { - ExpandZeroH(conn, node); - } - } - - openList.Clear(); - closedList.Clear(); -#if PBDEBUG - if (path != null) - Debug.Log(string.Format( - "Found in {0} iteration the path: {1}", iterationCount, path)); - else - { - Debug.Log(string.Format( - "Found no path in {0} iteration.", iterationCount)); - } -#endif - return path; - } - - private void Expand(NavConnection conn, NavGraphNode vert, Vector2 goalPos) - { - if (float.IsPositiveInfinity(conn.traversalCosts) || closedList.Contains(conn.end)) - return; - - - float costSoFar = vert.pathValues[pathValueId].costSoFar + conn.traversalCosts; - var pathValue = conn.end.pathValues[pathValueId]; - - bool isOpen = openList.Contains(pathValue); - if (isOpen && pathValue.costSoFar <= costSoFar) - { - // we know about this vert and have a faster way of accessing it - return; - } - - pathValue.parent = vert; - pathValue.costSoFar = costSoFar; - - float estimate = conn.end.HeuristicalCostsToGoal(vert.cluster.owner.WorldToLocal.MultiplyPoint3x4(goalPos)); - if (estimate > maxHeuristicAllowed) - estimate = maxHeuristicAllowed; - pathValue.estimatedFutherPath = estimate; - float totalCosts = costSoFar + estimate; - if (isOpen) - { - openList.UpdatePriority(pathValue, totalCosts); - } - else - { - openList.Enqueue(pathValue, totalCosts); - } - } - - private void ExpandZeroH(NavConnection conn, NavGraphNode vert) - { - if (float.IsPositiveInfinity(conn.traversalCosts) || closedList.Contains(conn.end)) - return; - - float costSoFar = vert.pathValues[pathValueId].costSoFar + conn.traversalCosts; - var pathValue = conn.end.pathValues[pathValueId]; - - bool isOpen = openList.Contains(pathValue); - if (isOpen && pathValue.costSoFar <= costSoFar) - { - // we know about this vert and have a faster way of accessing it - return; - } - - pathValue.parent = vert; - pathValue.costSoFar = costSoFar; - - if (isOpen) - { - openList.UpdatePriority(pathValue, costSoFar); - } - else - { - openList.Enqueue(pathValue, costSoFar); - } - } - - private Path GatherPath(NavGraphNode startVert, NavGraphNode goalVert) - { - int segCount = 1; - NavGraphNode vert = goalVert; - PathSegment lastSeg = new PathSegment(goalVert.Position(), Vector2.zero, goalVert.cluster.owner.navSurface, null, vert.cluster); - PathSegment prevSeg = lastSeg; - - while ((vert = vert.pathValues[pathValueId].parent) != startVert) - { - var seg = new PathSegment( - vert.Position(), - vert.LinkTarget.GetPositionAlongSegment(vert.LinkTargetT), - vert.cluster.owner.navSurface, - vert.link, - vert.cluster); - seg.Next = prevSeg; - prevSeg = seg; - - segCount++; - } - return new Path(prevSeg, lastSeg, startVert.Position(), segCount, goalVert.pathValues[pathValueId].costSoFar); - } - - private float CheckHeuristicValidity(NavGraphNode startVert, NavGraphNode goalVert) - { - float totalCosts = goalVert.pathValues[pathValueId].costSoFar; - NavGraphNode vert = goalVert; - while ((vert = vert.pathValues[pathValueId].parent) != startVert) - { - if (vert.pathValues[pathValueId].estimatedFutherPath > totalCosts) - { - return totalCosts; - } - } - return 0; - } - - private void UpdateClosestPositionToGoal(NavGraphNode node, Vector2 goalPos, ref float closestH) - { - float minDist = node.cluster.PointDistance(goalPos); - if (minDist < closestH) - { - closestH = minDist; - float t = node.cluster.DistanceOfPointAlongSegment(node.cluster.owner.WorldToLocal.MultiplyPoint3x4(goalPos)); - if (node.cluster.CanAgentReachPoint(agent, node.t, t)) - { - closestReachablePosition = new NavSegmentPositionPointer(node.cluster.owner.navSurface, node.cluster, t); - } - } - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/Pathfinder.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/Pathfinder.cs.meta deleted file mode 100644 index db2d4e8f..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/Pathfinder.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 79dde31c2ed068841b732c032be29020 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathfinderThread.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathfinderThread.cs deleted file mode 100644 index cf4900a5..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathfinderThread.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System.Collections; -using System.Collections.Concurrent; -using System.Threading; -using UnityEngine; - -namespace PathBerserker2d -{ - internal class PathfinderThread - { - CancellationToken cancelToken; - ConcurrentQueue pathRequestQueue; - Pathfinder pathfinder; - - public PathfinderThread(CancellationToken cancelToken, - ConcurrentQueue pathRequestQueue, NavGraph navGraph, int id) - { - this.cancelToken = cancelToken; - this.pathRequestQueue = pathRequestQueue; - this.pathfinder = new Pathfinder(navGraph, id); - } - - public void Run() - { - while (!cancelToken.IsCancellationRequested) - { - // will process a path or sleep for 0.1sec - PathRequest request; - if (pathRequestQueue.TryDequeue(out request)) - { - pathfinder.ProcessPathRequest(request); - } - else - { - Thread.Sleep(100); - } - } - } - - public IEnumerator CoroutineRun() - { - while (!cancelToken.IsCancellationRequested) - { - // will process a path or sleep for 0.1sec - PathRequest request; - if (pathRequestQueue.TryDequeue(out request)) - { - pathfinder.ProcessPathRequest(request); - yield return null; - } - else - yield return new WaitForSecondsRealtime(0.1f); - } - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathfinderThread.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathfinderThread.cs.meta deleted file mode 100644 index 3f14e00b..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Pathfinder/PathfinderThread.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d35f8bee578d72940a6e7061df49850e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities.meta deleted file mode 100644 index 5ee049fa..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 0ca86d6ef0e3c0146984f0794920e007 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/B2DynamicTree.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/B2DynamicTree.cs deleted file mode 100644 index a18c83df..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/B2DynamicTree.cs +++ /dev/null @@ -1,959 +0,0 @@ - -// MIT License - -// Copyright (c) 2019 Erin Catto - -// 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. - -// ported by me, orignal source: https://github.com/erincatto/box2d/blob/master/src/collision/b2_dynamic_tree.cpp - -using System; -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -namespace PathBerserker2d -{ - /// A node in the dynamic tree. The client does not interact with this directly. - internal struct B2TreeNode - { - /// Enlarged AABB - public Rect aabb; - - public T userData; - - public int parent; - public int child1; - public int child2; - public int next; - - // leaf = 0, free node = -1 - public int height; - - public bool moved; - - public bool IsLeaf() - { - return child1 == -1; - } - } - - internal class B2DynamicTree : IEnumerable - { - public int NodeCount => nodeCount; - - private readonly float AABBExtension = 0.1f; - private readonly float AABBMultiplier = 4.0f; - - int root = -1; - B2TreeNode[] nodes; - int nodeCount = 0; - int nextFreeNode = 0; - - public B2DynamicTree(int capacity = 16) - { - nodes = new B2TreeNode[capacity]; - - // Build a linked list for the free list. - for (int i = 0; i < nodes.Length - 1; ++i) - { - nodes[i].next = i + 1; - nodes[i].height = -1; - } - nodes[nodes.Length - 1].next = -1; - nodes[nodes.Length - 1].height = -1; - } - - // Allocate a node from the pool. Grow the pool if necessary. - private int AllocateNode() - { - // Expand the node pool as needed. - if (nextFreeNode == -1) - { -#if PBDEBUG - Debug.Assert(nodes.Length == nodeCount); -#endif - - // The free list is empty. Rebuild a bigger pool. - Array.Resize(ref nodes, nodes.Length * 2); - - // Build a linked list for the free list. The parent - // pointer becomes the "next" pointer. - for (int i = nodeCount; i < nodes.Length - 1; ++i) - { - nodes[i].next = i + 1; - nodes[i].height = -1; - } - nodes[nodes.Length - 1].next = -1; - nodes[nodes.Length - 1].height = -1; - nextFreeNode = nodeCount; - } - - // Peel a node off the free list. - int nodeId = nextFreeNode; - nextFreeNode = nodes[nodeId].next; - nodes[nodeId].parent = -1; - nodes[nodeId].child1 = -1; - nodes[nodeId].child2 = -1; - nodes[nodeId].height = 0; - nodes[nodeId].userData = default(T); - nodes[nodeId].moved = false; - ++nodeCount; - return nodeId; - } - - // Return a node to the pool. - private void FreeNode(int nodeId) - { -#if PBDEBUG - Debug.Assert(0 <= nodeId && nodeId < nodes.Length); - Debug.Assert(0 < nodeCount); -#endif - nodes[nodeId].next = nextFreeNode; - nodes[nodeId].height = -1; - nextFreeNode = nodeId; - --nodeCount; - } - - // Create a proxy in the tree as a leaf node. We return the index - // of the node instead of a pointer so that we can grow - // the node pool. - public int CreateProxy(Rect aabb, T userData) - { - int proxyId = AllocateNode(); - - // Fatten the aabb. - Vector2 r = new Vector2(AABBExtension, AABBExtension); - nodes[proxyId].aabb.min = aabb.min - r; - nodes[proxyId].aabb.max = aabb.max + r; - nodes[proxyId].userData = userData; - nodes[proxyId].height = 0; - nodes[proxyId].moved = true; - - InsertLeaf(proxyId); - - return proxyId; - } - - public void RemoveProxy(int proxyId) - { -#if PBDEBUG - Debug.Assert(0 <= proxyId && proxyId < nodes.Length); - Debug.Assert(nodes[proxyId].IsLeaf()); -#endif - - if (!nodes[proxyId].IsLeaf()) - throw new Exception("Tried to remove non leaf node"); - - RemoveLeaf(proxyId); - FreeNode(proxyId); - } - - public bool MoveProxy(int proxyId, Rect aabb, Vector2 displacement) - { -#if PBDEBUG - Debug.Assert(0 <= proxyId && proxyId < nodes.Length); - Debug.Assert(nodes[proxyId].IsLeaf()); -#endif - - // Extend AABB - - Vector2 r = new Vector2(AABBExtension, AABBExtension); - Rect fatAABB = new Rect(aabb.min - r, aabb.size + 2 * r); - - // Predict AABB movement - Vector2 d = AABBMultiplier * displacement; - - if (d.x < 0.0f) - { - fatAABB.xMin += d.x; - } - else - { - fatAABB.xMax += d.x; - } - - if (d.y < 0.0f) - { - fatAABB.yMin += d.y; - } - else - { - fatAABB.yMin += d.y; - } - - Rect treeAABB = nodes[proxyId].aabb; - if (treeAABB.ContainsBounds(aabb)) - { - // The tree AABB still contains the object, but it might be too large. - // Perhaps the object was moving fast but has since gone to sleep. - // The huge AABB is larger than the new fat AABB. - Rect hugeAABB = new Rect(fatAABB.min - 4.0f * r, fatAABB.size + 8 * r); - - if (hugeAABB.ContainsBounds(treeAABB)) - { - // The tree AABB contains the object AABB and the tree AABB is - // not too large. No tree update needed. - return false; - } - - // Otherwise the tree AABB is huge and needs to be shrunk - } - - RemoveLeaf(proxyId); - - nodes[proxyId].aabb = fatAABB; - - InsertLeaf(proxyId); - - nodes[proxyId].moved = true; - - return true; - } - - - private void InsertLeaf(int leaf) - { - if (root == -1) - { - root = leaf; - nodes[root].parent = -1; - return; - } - - // Find the best sibling for this node - Rect leafAABB = nodes[leaf].aabb; - int index = root; - while (nodes[index].IsLeaf() == false) - { - int child1 = nodes[index].child1; - int child2 = nodes[index].child2; - - float area = nodes[index].aabb.Area(); - - Rect combinedAABB = leafAABB.CombineWith(nodes[index].aabb); - float combinedArea = combinedAABB.Area(); - - // Cost of creating a new parent for this node and the new leaf - float cost = 2.0f * combinedArea; - - // Minimum cost of pushing the leaf further down the tree - float inheritanceCost = 2.0f * (combinedArea - area); - - // Cost of descending into child1 - float cost1; - if (nodes[child1].IsLeaf()) - { - Rect aabb = leafAABB.CombineWith(nodes[child1].aabb); - cost1 = aabb.Area() + inheritanceCost; - } - else - { - Rect aabb = leafAABB.CombineWith(nodes[child1].aabb); - float oldArea = nodes[child1].aabb.Area(); - float newArea = aabb.Area(); - cost1 = (newArea - oldArea) + inheritanceCost; - } - - // Cost of descending into child2 - float cost2; - if (nodes[child2].IsLeaf()) - { - Rect aabb = leafAABB.CombineWith(nodes[child2].aabb); - cost2 = aabb.Area() + inheritanceCost; - } - else - { - Rect aabb = leafAABB.CombineWith(nodes[child2].aabb); - float oldArea = nodes[child2].aabb.Area(); - float newArea = aabb.Area(); - cost2 = newArea - oldArea + inheritanceCost; - } - - // Descend according to the minimum cost. - if (cost < cost1 && cost < cost2) - { - break; - } - - // Descend - if (cost1 < cost2) - { - index = child1; - } - else - { - index = child2; - } - } - - int sibling = index; - - // Create a new parent. - int oldParent = nodes[sibling].parent; - int newParent = AllocateNode(); - nodes[newParent].parent = oldParent; - nodes[newParent].userData = default(T); - nodes[newParent].aabb = leafAABB.CombineWith(nodes[sibling].aabb); - nodes[newParent].height = nodes[sibling].height + 1; - - if (oldParent != -1) - { - // The sibling was not the root. - if (nodes[oldParent].child1 == sibling) - { - nodes[oldParent].child1 = newParent; - } - else - { - nodes[oldParent].child2 = newParent; - } - - nodes[newParent].child1 = sibling; - nodes[newParent].child2 = leaf; - nodes[sibling].parent = newParent; - nodes[leaf].parent = newParent; - } - else - { - // The sibling was the root. - nodes[newParent].child1 = sibling; - nodes[newParent].child2 = leaf; - nodes[sibling].parent = newParent; - nodes[leaf].parent = newParent; - root = newParent; - } - - // Walk back up the tree fixing heights and AABBs - index = nodes[leaf].parent; - while (index != -1) - { - index = Balance(index); - - int child1 = nodes[index].child1; - int child2 = nodes[index].child2; - -#if PBDEBUG - Debug.Assert(child1 != -1); - Debug.Assert(child2 != -1); -#endif - - nodes[index].height = 1 + Mathf.Max(nodes[child1].height, nodes[child2].height); - nodes[index].aabb = nodes[child1].aabb.CombineWith(nodes[child2].aabb); - - index = nodes[index].parent; - } - - //Validate(); - } - - private void RemoveLeaf(int leaf) - { - if (leaf == root) - { - root = -1; - return; - } - - int parent = nodes[leaf].parent; - int grandParent = nodes[parent].parent; - int sibling; - if (nodes[parent].child1 == leaf) - { - sibling = nodes[parent].child2; - } - else - { - sibling = nodes[parent].child1; - } - - if (grandParent != -1) - { - // Destroy parent and connect sibling to grandParent. - if (nodes[grandParent].child1 == parent) - { - nodes[grandParent].child1 = sibling; - } - else - { - nodes[grandParent].child2 = sibling; - } - nodes[sibling].parent = grandParent; - FreeNode(parent); - - // Adjust ancestor bounds. - int index = grandParent; - while (index != -1) - { - index = Balance(index); - - int child1 = nodes[index].child1; - int child2 = nodes[index].child2; - - nodes[index].aabb = nodes[child1].aabb.CombineWith(nodes[child2].aabb); - nodes[index].height = 1 + Mathf.Max(nodes[child1].height, nodes[child2].height); - - index = nodes[index].parent; - } - } - else - { - root = sibling; - nodes[sibling].parent = -1; - FreeNode(parent); - } - - //Validate(); - } - - // Perform a left or right rotation if node A is imbalanced. - // Returns the new root index. - private int Balance(int iA) - { -#if PBDEBUG - Debug.Assert(iA != -1); -#endif - - if (nodes[iA].IsLeaf() || nodes[iA].height < 2) - { - return iA; - } - - int iB = nodes[iA].child1; - int iC = nodes[iA].child2; -#if PBDEBUG - Debug.Assert(0 <= iB && iB < nodes.Length); - Debug.Assert(0 <= iC && iC < nodes.Length); -#endif - - int balance = nodes[iC].height - nodes[iB].height; - - // Rotate C up - if (balance > 1) - { - int iF = nodes[iC].child1; - int iG = nodes[iC].child2; - -#if PBDEBUG - Debug.Assert(0 <= iF && iF < nodes.Length); - Debug.Assert(0 <= iG && iG < nodes.Length); -#endif - - // Swap A and C - nodes[iC].child1 = iA; - nodes[iC].parent = nodes[iA].parent; - nodes[iA].parent = iC; - - // A's old parent should point to C - if (nodes[iC].parent != -1) - { - if (nodes[nodes[iC].parent].child1 == iA) - { - nodes[nodes[iC].parent].child1 = iC; - } - else - { -#if PBDEBUG - Debug.Assert(nodes[nodes[iC].parent].child2 == iA); -#endif - nodes[nodes[iC].parent].child2 = iC; - } - } - else - { - root = iC; - } - - // Rotate - if (nodes[iF].height > nodes[iG].height) - { - nodes[iC].child2 = iF; - nodes[iA].child2 = iG; - nodes[iG].parent = iA; - nodes[iA].aabb = nodes[iB].aabb.CombineWith(nodes[iG].aabb); - nodes[iC].aabb = nodes[iA].aabb.CombineWith(nodes[iF].aabb); - - nodes[iA].height = 1 + Mathf.Max(nodes[iB].height, nodes[iG].height); - nodes[iC].height = 1 + Mathf.Max(nodes[iA].height, nodes[iF].height); - } - else - { - nodes[iC].child2 = iG; - nodes[iA].child2 = iF; - nodes[iF].parent = iA; - nodes[iA].aabb = nodes[iB].aabb.CombineWith(nodes[iF].aabb); - nodes[iC].aabb = nodes[iA].aabb.CombineWith(nodes[iG].aabb); - - nodes[iA].height = 1 + Mathf.Max(nodes[iB].height, nodes[iF].height); - nodes[iC].height = 1 + Mathf.Max(nodes[iA].height, nodes[iG].height); - } - - return iC; - } - - // Rotate B up - if (balance < -1) - { - int iD = nodes[iB].child1; - int iE = nodes[iB].child2; - -#if PBDEBUG - Debug.Assert(0 <= iD && iD < nodes.Length); - Debug.Assert(0 <= iE && iE < nodes.Length); -#endif - - // Swap A and B - nodes[iB].child1 = iA; - nodes[iB].parent = nodes[iA].parent; - nodes[iA].parent = iB; - - // A's old parent should point to B - if (nodes[iB].parent != -1) - { - if (nodes[nodes[iB].parent].child1 == iA) - { - nodes[nodes[iB].parent].child1 = iB; - } - else - { -#if PBDEBUG - Debug.Assert(nodes[nodes[iB].parent].child2 == iA); -#endif - nodes[nodes[iB].parent].child2 = iB; - } - } - else - { - root = iB; - } - - // Rotate - if (nodes[iD].height > nodes[iE].height) - { - nodes[iB].child2 = iD; - nodes[iA].child1 = iE; - nodes[iE].parent = iA; - nodes[iA].aabb = nodes[iC].aabb.CombineWith(nodes[iE].aabb); - nodes[iB].aabb = nodes[iA].aabb.CombineWith(nodes[iD].aabb); - - nodes[iA].height = 1 + Mathf.Max(nodes[iC].height, nodes[iE].height); - nodes[iB].height = 1 + Mathf.Max(nodes[iA].height, nodes[iD].height); - } - else - { - nodes[iB].child2 = iE; - nodes[iA].child1 = iD; - nodes[iD].parent = iA; - nodes[iA].aabb = nodes[iC].aabb.CombineWith(nodes[iD].aabb); - nodes[iB].aabb = nodes[iA].aabb.CombineWith(nodes[iE].aabb); - - nodes[iA].height = 1 + Mathf.Max(nodes[iC].height, nodes[iD].height); - nodes[iB].height = 1 + Mathf.Max(nodes[iA].height, nodes[iE].height); - } - - return iB; - } - - return iA; - } - - public int GetHeight() - { - if (root == -1) - { - return 0; - } - - return nodes[root].height; - } - - // - public float GetAreaRatio() - { - if (root == -1) - { - return 0.0f; - } - - float rootArea = nodes[root].aabb.Area(); - - float totalArea = 0.0f; - for (int i = 0; i < nodes.Length; ++i) - { - if (nodes[i].height < 0) - { - // Free node in pool - continue; - } - - totalArea += nodes[i].aabb.Area(); - } - - return totalArea / rootArea; - } - - // Compute the height of a sub-tree. - private int ComputeHeight(int nodeId) - { -#if PBDEBUG - Debug.Assert(0 <= nodeId && nodeId < nodes.Length); -#endif - - if (nodes[nodeId].IsLeaf()) - { - return 0; - } - - int height1 = ComputeHeight(nodes[nodeId].child1); - int height2 = ComputeHeight(nodes[nodeId].child2); - return 1 + Mathf.Max(height1, height2); - } - - private int ComputeHeight() - { - int height = ComputeHeight(root); - return height; - } - - private void ValidateStructure(int index) - { - if (index == -1) - { - return; - } - - if (index == root) - { - Debug.Assert(nodes[index].parent == -1); - } - - int child1 = nodes[index].child1; - int child2 = nodes[index].child2; - - if (nodes[index].IsLeaf()) - { - Debug.Assert(child1 == -1); - Debug.Assert(child2 == -1); - Debug.Assert(nodes[index].height == 0); - return; - } - - Debug.Assert(0 <= child1 && child1 < nodes.Length); - Debug.Assert(0 <= child2 && child2 < nodes.Length); - - Debug.Assert(nodes[child1].parent == index); - Debug.Assert(nodes[child2].parent == index); - - ValidateStructure(child1); - ValidateStructure(child2); - } - - private void ValidateMetrics(int index) - { - if (index == -1) - { - return; - } - - int child1 = nodes[index].child1; - int child2 = nodes[index].child2; - - if (nodes[index].IsLeaf()) - { - Debug.Assert(child1 == -1); - Debug.Assert(child2 == -1); - Debug.Assert(nodes[index].height == 0); - return; - } - - Debug.Assert(0 <= child1 && child1 < nodes.Length); - Debug.Assert(0 <= child2 && child2 < nodes.Length); - - int height1 = nodes[child1].height; - int height2 = nodes[child2].height; - int height; - height = 1 + Mathf.Max(height1, height2); - Debug.Assert(nodes[index].height == height); - - Rect aabb = nodes[child1].aabb.CombineWith(nodes[child2].aabb); - - Debug.Assert(aabb.min == nodes[index].aabb.min); - Debug.Assert(aabb.max == nodes[index].aabb.max); - - ValidateMetrics(child1); - ValidateMetrics(child2); - } - - public void Validate() - { -#if b2DEBUG - ValidateStructure(root); - ValidateMetrics(root); - - int freeCount = 0; - int freeIndex = nextFreeNode; - while (freeIndex != -1) - { - Debug.Assert(0 <= freeIndex && freeIndex < nodes.Length); - freeIndex = nodes[freeIndex].next; - ++freeCount; - } - - Debug.Assert(GetHeight() == ComputeHeight()); - - Debug.Assert(nodeCount + freeCount == nodes.Length); -#endif - } - - public int GetMaxBalance() - { - int maxBalance = 0; - for (int i = 0; i < nodes.Length; ++i) - { - if (nodes[i].height <= 1) - { - continue; - } - -#if PBDEBUG - Debug.Assert(nodes[i].IsLeaf() == false); -#endif - - int child1 = nodes[i].child1; - int child2 = nodes[i].child2; - int balance = Mathf.Abs(nodes[child2].height - nodes[child1].height); - maxBalance = Mathf.Max(maxBalance, balance); - } - - return maxBalance; - } - - public void RebuildBottomUp() - { - int[] nodeIndecies = new int[nodeCount]; - int count = 0; - - // Build array of leaves. Free the rest. - for (int i = 0; i < nodes.Length; ++i) - { - if (nodes[i].height < 0) - { - // free node in pool - continue; - } - - if (nodes[i].IsLeaf()) - { - nodes[i].parent = -1; - nodeIndecies[count] = i; - ++count; - } - else - { - FreeNode(i); - } - } - - while (count > 1) - { - float minCost = float.MaxValue; - int iMin = -1, jMin = -1; - for (int i = 0; i < count; ++i) - { - Rect aabbi = nodes[nodeIndecies[i]].aabb; - - for (int j = i + 1; j < count; ++j) - { - Rect aabbj = nodes[nodeIndecies[j]].aabb; - Rect b = aabbi.CombineWith(aabbj); - float cost = b.Area(); - if (cost < minCost) - { - iMin = i; - jMin = j; - minCost = cost; - } - } - } - - int index1 = nodeIndecies[iMin]; - int index2 = nodeIndecies[jMin]; - - int parentIndex = AllocateNode(); - nodes[parentIndex].child1 = index1; - nodes[parentIndex].child2 = index2; - nodes[parentIndex].height = 1 + Mathf.Max(nodes[index1].height, nodes[index2].height); - nodes[parentIndex].aabb = nodes[index1].aabb.CombineWith(nodes[index2].aabb); - nodes[parentIndex].parent = -1; - - nodes[index1].parent = parentIndex; - nodes[index2].parent = parentIndex; - - nodeIndecies[jMin] = nodeIndecies[count - 1]; - nodeIndecies[iMin] = parentIndex; - --count; - } - - root = nodeIndecies[0]; - - Validate(); - } - - public void ShiftOrigin(Vector2 newOrigin) - { - // Build array of leaves. Free the rest. - for (int i = 0; i < nodes.Length; ++i) - { - nodes[i].aabb.min -= newOrigin; - nodes[i].aabb.max -= newOrigin; - } - } - - public T GetUserData(int proxyId) - { -#if PBDEBUG - Debug.Assert(0 <= proxyId && proxyId < nodes.Length); -#endif - return nodes[proxyId].userData; - } - - public bool TryGetUserData(int proxyId, out T data) - { - if (proxyId < 0 || proxyId >= nodes.Length) - { - data = default(T); - return false; - } - data = nodes[proxyId].userData; - return true; - } - - public bool WasMoved(int proxyId) - { -#if PBDEBUG - Debug.Assert(0 <= proxyId && proxyId < nodes.Length); -#endif - return nodes[proxyId].moved; - } - - public void ClearMoved(int proxyId) - { -#if PBDEBUG - Debug.Assert(0 <= proxyId && proxyId < nodes.Length); -#endif - nodes[proxyId].moved = false; - } - - public Rect GetFatAABB(int proxyId) - { -#if PBDEBUG - Debug.Assert(0 <= proxyId && proxyId < nodes.Length); -#endif - return nodes[proxyId].aabb; - } - - Stack queryStack = new Stack(); - public QueryEnumerator Query(Rect aabb) - { - return new QueryEnumerator(this, aabb); - } - - public IEnumerator GetEnumerator() - { - // Build array of leaves. Free the rest. - for (int i = 0; i < nodes.Length; ++i) - { - if (nodes[i].height >= 0 && nodes[i].IsLeaf()) - { - yield return nodes[i].userData; - } - } - } - - IEnumerator IEnumerable.GetEnumerator() - { - return this.GetEnumerator(); - } - - public void Draw() - { - Draw(root); - } - - private void Draw(int index) - { - if (index == -1) - { - return; - } - - Gizmos.color = nodes[index].IsLeaf() ? Color.green : Color.red; - DebugDrawingExtensions.DrawRect(nodes[index].aabb); - - Draw(nodes[index].child1); - Draw(nodes[index].child2); - } - - public struct QueryEnumerator { - - B2DynamicTree tree; - Rect aabb; - - public QueryEnumerator(B2DynamicTree tree, Rect aabb) - { - this.tree = tree; - this.aabb = aabb; - Current = 0; - tree.queryStack.Push(tree.root); - } - - public int Current { - get; - private set; - } - - public bool MoveNext() - { - while (tree.queryStack.Count > 0) - { - int nodeId = tree.queryStack.Pop(); - if (nodeId == -1) - { - continue; - } - - if (tree.nodes[nodeId].aabb.Overlaps(aabb)) - { - if (tree.nodes[nodeId].IsLeaf()) - { - Current = nodeId; - return true; - } - else - { - tree.queryStack.Push(tree.nodes[nodeId].child1); - tree.queryStack.Push(tree.nodes[nodeId].child2); - } - } - } - return false; - } - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/B2DynamicTree.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/B2DynamicTree.cs.meta deleted file mode 100644 index 45844578..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/B2DynamicTree.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 50260b47c6ab16343834ce0701e7a454 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/DebugDrawingExtensions.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/DebugDrawingExtensions.cs deleted file mode 100644 index b56d0d9d..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/DebugDrawingExtensions.cs +++ /dev/null @@ -1,192 +0,0 @@ -using System; -using UnityEngine; - -namespace PathBerserker2d -{ - internal static class DebugDrawingExtensions - { - public static void DrawArrowHead(Vector2 basePos, Vector2 dir, float size) - { - dir.Normalize(); - Vector2 normal = new Vector2(-dir.y, dir.x) * size; - Gizmos.DrawLine(basePos - normal, basePos + normal); - Gizmos.DrawLine(basePos - normal, basePos + dir * size); - Gizmos.DrawLine(basePos + normal, basePos + dir * size); - } - - public static void DrawArrowHeadFromSpike(Vector2 pointyPos, Vector2 dir, float size) - { - dir.Normalize(); - pointyPos -= dir * size; - Vector2 normal = new Vector2(-dir.y, dir.x) * size; - Gizmos.DrawLine(pointyPos - normal, pointyPos + normal); - Gizmos.DrawLine(pointyPos - normal, pointyPos + dir * size); - Gizmos.DrawLine(pointyPos + normal, pointyPos + dir * size); - } - - public static void DrawArrow(Vector2 start, Vector2 end) - { - Vector2 dir = end - start; - float length = dir.magnitude; - dir /= length; - Vector2 baseA = start + dir * (length - 0.1f); - Gizmos.DrawLine(start, baseA); - - Vector2 normal = new Vector2(-dir.y, dir.x) * 0.1f; - Gizmos.DrawLine(baseA - normal, baseA + normal); - Gizmos.DrawLine(baseA - normal, end); - Gizmos.DrawLine(baseA + normal, end); - } - - public static void DrawCircle(Vector2 center, float radius = 0.05f) - { - int segmentCount = 10; - Vector2 prevPoint = center + Vector2.up * radius; - - for (float t = 1; t <= segmentCount; t++) - { - float x = (t / segmentCount) * Mathf.PI * 2.0f; - float cx = Mathf.Sin(x); - float cy = Mathf.Cos(x); - - Vector2 point = center + new Vector2(cx, cy) * radius; - Gizmos.DrawLine(prevPoint, point); - prevPoint = point; - } - Gizmos.DrawLine(prevPoint, center + Vector2.up * radius); - } - - public static void DrawBezierConnection(Vector2 start, Vector2 end, bool biDirectional) - { - Vector2 cp; - var tangent = (end - start); - var length = tangent.magnitude; - var normal = new Vector2(-tangent.y, tangent.x) / length; - cp = start + tangent * 0.5f + normal * (length / 5f); - - DrawBezierConnection(start, end, cp, biDirectional); - } - - public static void DrawBezierConnection(Vector2 start, Vector2 end, Vector2 cp, bool biDirectional) - { - float arcLength = (Vector2.Distance(end, start) * 2 + Vector2.Distance(end, cp) + Vector2.Distance(start, cp)) / 3f; - int numberOfSegments = Mathf.CeilToInt(arcLength); - Vector2 prev = start; - float t; - for (t = 1; t <= numberOfSegments; t++) - { - Vector2 v = QuadraticBezierCurve(t / numberOfSegments, start, cp, end); - Gizmos.DrawLine(prev, v); - prev = v; - } - - //draw arrows - t = (numberOfSegments - 1) / (float)numberOfSegments; - Vector2 dir = end - QuadraticBezierCurve(t, start, cp, end); - DrawArrowHeadFromSpike(end, dir, 0.3f); - if (biDirectional) - { - dir = start - QuadraticBezierCurve(1f / numberOfSegments, start, cp, end); - DrawArrowHeadFromSpike(start, dir, 0.3f); - } - } - - public static void DrawBezierConnectionWithOffset(Vector2 start, Vector2 end, Vector2 cp, Vector2 offset) - { - float arcLength = (Vector2.Distance(end, start) * 2 + Vector2.Distance(end, cp) + Vector2.Distance(start, cp)) / 3f; - int numberOfSegments = Mathf.CeilToInt(arcLength); - Vector2 prev = start + offset; - Gizmos.DrawLine(start, prev); - float t; - for (t = 1; t <= numberOfSegments; t++) - { - Vector2 v = QuadraticBezierCurve(t / numberOfSegments, start, cp, end) + offset; - Gizmos.DrawLine(v, v - offset); - Gizmos.DrawLine(prev, v); - prev = v; - } - } - - public static void DrawProjectileArc(Vector2 start, Vector2 end, float hSpeed, bool isBidiretional) - { - float hDelta = end.x - start.x; - float t = hDelta / hSpeed; - int numberOfSegments = Mathf.CeilToInt(t) + 4; - float p0 = start.y - end.y; - float v0 = 9.81f * t * 0.5f - p0 / t; - - Func func = x => 0.5f * -9.81f * x * x + v0 * x + p0; - - Vector2 prev = start; - float z; - float timePerSegment = t / numberOfSegments; - for (z = 1; z <= numberOfSegments; z++) - { - Vector2 v = new Vector2(start.x + z * timePerSegment * hSpeed, end.y + func(z * timePerSegment)); - Gizmos.DrawLine(prev, v); - prev = v; - } - - Vector2 dir = end - new Vector2(start.x + (numberOfSegments - 1) * timePerSegment * hSpeed, end.y + func((numberOfSegments - 1) * timePerSegment)); - DrawArrowHeadFromSpike(end, dir, 0.3f); - if (isBidiretional) - { - dir = start - new Vector2(start.x + timePerSegment * hSpeed, end.y + func(timePerSegment)); - DrawArrowHeadFromSpike(start, dir, 0.3f); - } - } - - public static void DrawProjectileArcWithOffset(Vector2 start, Vector2 end, float hSpeed, Vector2 offset) - { - float hDelta = end.x - start.x; - float t = hDelta / hSpeed; - int numberOfSegments = Mathf.CeilToInt(t) + 4; - float p0 = start.y - end.y; - float v0 = 9.81f * t * 0.5f - p0 / t; - - Func func = x => 0.5f * -9.81f * x * x + v0 * x + p0; - - Vector2 prev = start + offset; - Gizmos.DrawLine(start, prev); - float z; - float timePerSegment = t / numberOfSegments; - for (z = 1; z <= numberOfSegments; z++) - { - Vector2 v = new Vector2(start.x + z * timePerSegment * hSpeed, end.y + func(z * timePerSegment)) + offset; - Gizmos.DrawLine(prev, v); - Gizmos.DrawLine(v, v - offset); - prev = v; - } - } - - private static Vector2 QuadraticBezierCurve(float t, Vector2 a, Vector2 b, Vector2 c) - { - return (1 - t) * (1 - t) * a + 2 * (1 - t) * t * b + t * t * c; - } - - public static Color LinearBlendBetweenColors(float value, params Color[] colors) - { - value = Mathf.Clamp01(value); - int index = (int)(value * (colors.Length - 1)); - float t = (value * (colors.Length - 1)) - index; - Color b = index >= colors.Length - 1 ? colors[index] : colors[index + 1]; - return Color.Lerp(colors[index], b, t); - } - - public static void DrawRect(Vector2 position, Vector2 size) - { - Gizmos.DrawLine(position + size, new Vector3(position.x, position.y + size.y)); - Gizmos.DrawLine(position, new Vector3(position.x, position.y + size.y)); - Gizmos.DrawLine(position + size, new Vector3(position.x + size.x, position.y)); - Gizmos.DrawLine(position, new Vector3(position.x + size.x, position.y)); - } - - public static void DrawRect(Rect rect) - { - Gizmos.DrawLine(rect.position + rect.size, new Vector3(rect.position.x, rect.position.y + rect.size.y)); - Gizmos.DrawLine(rect.position, new Vector3(rect.position.x, rect.position.y + rect.size.y)); - Gizmos.DrawLine(rect.position + rect.size, new Vector3(rect.position.x + rect.size.x, rect.position.y)); - Gizmos.DrawLine(rect.position, new Vector3(rect.position.x + rect.size.x, rect.position.y)); - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/DebugDrawingExtensions.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/DebugDrawingExtensions.cs.meta deleted file mode 100644 index be929618..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/DebugDrawingExtensions.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1a74ed22fccf86e4ebb67f3dda822eb3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/DifferentColors.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/DifferentColors.cs deleted file mode 100644 index 6d222110..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/DifferentColors.cs +++ /dev/null @@ -1,767 +0,0 @@ -using System.Globalization; -using UnityEngine; - -namespace PathBerserker2d -{ - internal class DifferentColors - { - public static Color32 GetRandomColor() - { - int id = Random.Range(0, colors.Length - 1); - return GetColor(id); - } - - public static Color32 GetColor(int id) - { - if (id < 0) - return Color.white; - while (id >= colors.Length) - { - id -= colors.Length; - } - int rgb = System.Int32.Parse(colors[id], NumberStyles.HexNumber); - return ToColor(rgb); - } - - static Color32 ToColor(int HexVal) - { - byte R = (byte)((HexVal >> 16) & 0xFF); - byte G = (byte)((HexVal >> 8) & 0xFF); - byte B = (byte)((HexVal) & 0xFF); - return new Color32(R, G, B, 255); - } - - readonly static string[] colors = new string[] - { - "9BC4E5", -"310106", -"04640D", -"FEFB0A", -"FB5514", -"E115C0", -"00587F", -"0BC582", -"FEB8C8", -"9E8317", -"01190F", -"847D81", -"58018B", -"B70639", -"703B01", -"F7F1DF", -"118B8A", -"4AFEFA", -"FCB164", -"796EE6", -"000D2C", -"53495F", -"F95475", -"61FC03", -"5D9608", -"DE98FD", -"98A088", -"4F584E", -"248AD0", -"5C5300", -"9F6551", -"BCFEC6", -"932C70", -"2B1B04", -"B5AFC4", -"D4C67A", -"AE7AA1", -"C2A393", -"0232FD", -"6A3A35", -"BA6801", -"168E5C", -"16C0D0", -"C62100", -"014347", -"233809", -"42083B", -"82785D", -"023087", -"B7DAD2", -"196956", -"8C41BB", -"ECEDFE", -"2B2D32", -"94C661", -"F8907D", -"895E6B", -"788E95", -"FB6AB8", -"576094", -"DB1474", -"8489AE", -"860E04", -"FBC206", -"6EAB9B", -"F2CDFE", -"645341", -"760035", -"647A41", -"496E76", -"E3F894", -"F9D7CD", -"876128", -"A1A711", -"01FB92", -"FD0F31", -"BE8485", -"C660FB", -"120104", -"D48958", -"05AEE8", -"C3C1BE", -"9F98F8", -"1167D9", -"D19012", -"B7D802", -"826392", -"5E7A6A", -"B29869", -"1D0051", -"8BE7FC", -"76E0C1", -"BACFA7", -"11BA09", -"462C36", -"65407D", -"491803", -"F5D2A8", -"03422C", -"72A46E", -"128EAC", -"47545E", -"B95C69", -"A14D12", -"C4C8FA", -"372A55", -"3F3610", -"D3A2C6", -"719FFA", -"0D841A", -"4C5B32", -"9DB3B7", -"B14F8F", -"747103", -"9F816D", -"D26A5B", -"8B934B", -"F98500", -"002935", -"D7F3FE", -"FCB899", -"1C0720", -"6B5F61", -"F98A9D", -"9B72C2", -"A6919D", -"2C3729", -"D7C70B", -"9F9992", -"EFFBD0", -"FDE2F1", -"923A52", -"5140A7", -"BC14FD", -"6D706C", -"0007C4", -"C6A62F", -"000C14", -"904431", -"600013", -"1C1B08", -"693955", -"5E7C99", -"6C6E82", -"D0AFB3", -"493B36", -"AC93CE", -"C4BA9C", -"09C4B8", -"69A5B8", -"374869", -"F868ED", -"E70850", -"C04841", -"C36333", -"700366", -"8A7A93", -"52351D", -"B503A2", -"D17190", -"A0F086", -"7B41FC", -"0EA64F", -"017499", -"08A882", -"7300CD", -"A9B074", -"4E6301", -"AB7E41", -"547FF4", -"134DAC", -"FDEC87", -"056164", -"FE12A0", -"C264BA", -"939DAD", -"0BCDFA", -"277442", -"1BDE4A", -"826958", -"977678", -"BAFCE8", -"7D8475", -"8CCF95", -"726638", -"FEA8EB", -"EAFEF0", -"6B9279", -"C2FE4B", -"304041", -"1EA6A7", -"022403", -"062A47", -"054B17", -"F4C673", -"02FEC7", -"9DBAA8", -"775551", -"835536", -"565BCC", -"80D7D2", -"7AD607", -"696F54", -"87089A", -"664B19", -"242235", -"7DB00D", -"BFC7D6", -"D5A97E", -"433F31", -"311A18", -"FDB2AB", -"D586C9", -"7A5FB1", -"32544A", -"EFE3AF", -"859D96", -"2B8570", -"8B282D", -"E16A07", -"4B0125", -"021083", -"114558", -"F707F9", -"C78571", -"7FB9BC", -"FC7F4B", -"8D4A92", -"6B3119", -"884F74", -"994E4F", -"9DA9D3", -"867B40", -"CED5C4", -"1CA2FE", -"D9C5B4", -"FEAA00", -"507B01", -"A7D0DB", -"53858D", -"588F4A", -"FBEEEC", -"FC93C1", -"D7CCD4", -"3E4A02", -"C8B1E2", -"7A8B62", -"9A5AE2", -"896C04", -"B1121C", -"402D7D", -"858701", -"D498A6", -"B484EF", -"5C474C", -"067881", -"C0F9FC", -"726075", -"8D3101", -"6C93B2", -"A26B3F", -"AA6582", -"4F4C4F", -"5A563D", -"E83005", -"32492D", -"FC7272", -"B9C457", -"552A5B", -"B50464", -"616E79", -"DCE2E4", -"CF8028", -"0AE2F0", -"4F1E24", -"FD5E46", -"4B694E", -"C5DEFC", -"5DC262", -"022D26", -"7776B8", -"FD9F66", -"B049B8", -"988F73", -"BE385A", -"2B2126", -"54805A", -"141B55", -"67C09B", -"456989", -"DDC1D9", -"166175", -"C1E29C", -"A397B5", -"2E2922", -"ABDBBE", -"B4A6A8", -"A06B07", -"A99949", -"0A0618", -"B14E2E", -"60557D", -"D4A556", -"82A752", -"4A005B", -"3C404F", -"6E6657", -"7E8BD5", -"1275B8", -"D79E92", -"230735", -"661849", -"7A8391", -"FE0F7B", -"B0B6A9", -"629591", -"D05591", -"97B68A", -"97939A", -"035E38", -"53E19E", -"DFD7F9", -"02436C", -"525A72", -"059A0E", -"3E736C", -"AC8E87", -"D10C92", -"B9906E", -"66BDFD", -"C0ABFD", -"0734BC", -"341224", -"8AAAC1", -"0E0B03", -"414522", -"6A2F3E", -"2D9A8A", -"4568FD", -"FDE6D2", -"FEE007", -"9A003C", -"AC8190", -"DCDD58", -"B7903D", -"1F2927", -"9B02E6", -"827A71", -"878B8A", -"8F724F", -"AC4B70", -"37233B", -"385559", -"F347C7", -"9DB4FE", -"D57179", -"DE505A", -"37F7DD", -"503500", -"1C2401", -"DD0323", -"00A4BA", -"955602", -"FA5B94", -"AA766C", -"B8E067", -"6A807E", -"4D2E27", -"73BED7", -"D7BC8A", -"614539", -"526861", -"716D96", -"829A17", -"210109", -"436C2D", -"784955", -"987BAB", -"8F0152", -"0452FA", -"B67757", -"A1659F", -"D4F8D8", -"48416F", -"DEBAAF", -"A5A9AA", -"8C6B83", -"403740", -"70872B", -"D9744D", -"151E2C", -"5C5E5E", -"B47C02", -"F4CBD0", -"E49D7D", -"DD9954", -"B0A18B", -"2B5308", -"EDFD64", -"9D72FC", -"2A3351", -"68496C", -"C94801", -"EED05E", -"826F6D", -"E0D6BB", -"5B6DB4", -"662F98", -"0C97CA", -"C1CA89", -"755A03", -"DFA619", -"CD70A8", -"BBC9C7", -"F6BCE3", -"A16462", -"01D0AA", -"87C6B3", -"E7B2FA", -"D85379", -"643AD5", -"D18AAE", -"13FD5E", -"B3E3FD", -"C977DB", -"C1A7BB", -"9286CB", -"A19B6A", -"8FFED7", -"6B1F17", -"DF503A", -"10DDD7", -"9A8457", -"60672F", -"7D327D", -"DD8782", -"59AC42", -"82FDB8", -"FC8AE7", -"909F6F", -"B691AE", -"B811CD", -"BCB24E", -"CB4BD9", -"2B2304", -"AA9501", -"5D5096", -"403221", -"F9FAB4", -"3990FC", -"70DE7F", -"95857F", -"84A385", -"50996F", -"797B53", -"7B6142", -"81D5FE", -"9CC428", -"0B0438", -"3E2005", -"4B7C91", -"523854", -"005EA9", -"F0C7AD", -"ACB799", -"FAC08E", -"502239", -"BFAB6A", -"2B3C48", -"0EB5D8", -"8A5647", -"49AF74", -"067AE9", -"F19509", -"554628", -"4426A4", -"7352C9", -"3F4287", -"8B655E", -"B480BF", -"9BA74C", -"5F514C", -"CC9BDC", -"BA7942", -"1C4138", -"3C3C3A", -"29B09C", -"02923F", -"701D2B", -"36577C", -"3F00EA", -"3D959E", -"440601", -"8AEFF3", -"6D442A", -"BEB1A8", -"A11C02", -"8383FE", -"A73839", -"DBDE8A", -"0283B3", -"888597", -"32592E", -"F5FDFA", -"01191B", -"AC707A", -"B6BD03", -"027B59", -"7B4F08", -"957737", -"83727D", -"035543", -"6F7E64", -"C39999", -"52847A", -"925AAC", -"77CEDA", -"516369", -"E0D7D0", -"FCDD97", -"555424", -"96E6B6", -"85BB74", -"5E2074", -"BD5E48", -"9BEE53", -"1A351E", -"3148CD", -"71575F", -"69A6D0", -"391A62", -"E79EA0", -"1C0F03", -"1B1636", -"D20C39", -"765396", -"7402FE", -"447F3E", -"CFD0A8", -"3A2600", -"685AFC", -"A4B3C6", -"534302", -"9AA097", -"FD5154", -"9B0085", -"403956", -"80A1A7", -"6E7A9A", -"605E6A", -"86F0E2", -"5A2B01", -"7E3D43", -"ED823B", -"32331B", -"424837", -"40755E", -"524F48", -"B75807", -"B40080", -"5B8CA1", -"FDCFE5", -"CCFEAC", -"755847", -"CAB296", -"C0D6E3", -"2D7100", -"D5E4DE", -"362823", -"69C63C", -"AC3801", -"163132", -"4750A6", -"61B8B2", -"FCC4B5", -"DEBA2E", -"FE0449", -"737930", -"8470AB", -"687D87", -"D7B760", -"6AAB86", -"8398B8", -"B7B6BF", -"92C4A1", -"B6084F", -"853B5E", -"D0BCBA", -"92826D", -"C6DDC6", -"BE5F5A", -"280021", -"435743", -"874514", -"63675A", -"E97963", -"8F9C9E", -"985262", -"909081", -"023508", -"DDADBF", -"D78493", -"363900", -"5B0120", -"603C47", -"C3955D", -"AC61CB", -"FD7BA7", -"716C74", -"8D895B", -"071001", -"82B4F2", -"B6BBD8", -"71887A", -"8B9FE3", -"997158", -"65A6AB", -"2E3067", -"321301", -"FEECCB", -"3B5E72", -"C8FE85", -"A1DCDF", -"CB49A6", -"B1C5E4", -"3E5EB0", -"88AEA7", -"04504C", -"975232", -"6786B9", -"068797", -"9A98C4", -"A1C3C2", -"1C3967", -"DBEA07", -"789658", -"E7E7C6", -"A6C886", -"957F89", -"752E62", -"171518", -"A75648", -"01D26F", -"0F535D", -"047E76", -"C54754", -"5D6E88", -"AB9483", -"803B99", -"FA9C48", -"4A8A22", -"654A5C", -"965F86", -"9D0CBB", -"A0E8A0", -"D3DBFA", -"FD908F", -"AEAB85", -"A13B89", -"F1B350", -"066898", -"948A42", -"C8BEDE", -"19252C", -"7046AA", -"E1EEFC", -"3E6557", -"CD3F26", -"2B1925", -"DDAD94", -"C0B109", -"37DFFE", -"039676", -"907468", -"9E86A5", -"3A1B49", -"BEE5B7", -"C29501", -"9E3645", -"DC580A", -"645631", -"444B4B", -"FD1A63", -"DDE5AE", -"887800", -"36006F", -"3A6260", -"784637", -"FEA0B7", -"A3E0D2", -"6D6316", -"5F7172", -"B99EC7", -"777A7E", -"E0FEFD", -"E16DC5", -"01344B", -"F8F8FC", -"9F9FB5", -"182617", -"FE3D21", -"7D0017", -"822F21", -"EFD9DC", -"6E68C4", -"35473E", -"007523", -"767667", -"A6825D", -"83DC5F", -"227285", -"A95E34", -"526172", -"979730", -"756F6D", -"716259", -"E8B2B5", -"B6C9BB", -"9078DA", -"4F326E", -"B2387B", -"888C6F", -"314B5F", -"E5B678", -"38A3C6", -"586148", -"5C515B", -"CDCCE1", -"C8977F" - }; - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/DifferentColors.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/DifferentColors.cs.meta deleted file mode 100644 index bd0c4ef7..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/DifferentColors.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ecd1377c04d5d854aafa2aecdbf09094 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/ExtensionMethods.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/ExtensionMethods.cs deleted file mode 100644 index 48a78d1e..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/ExtensionMethods.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; - -namespace PathBerserker2d -{ - internal static class ExtensionMethods - { - - #region LinkedList - - public static void AppendRange(this LinkedList source, IEnumerable items) - { - foreach (T item in items) - { - source.AddLast(item); - } - } - - public static void PrependRange(this LinkedList source, IEnumerable items) - { - LinkedListNode first = source.First; - foreach (T item in items) - { - source.AddBefore(first, item); - } - } - - public static T[] ToArray(this LinkedList source) - { - T[] result = new T[source.Count]; - LinkedListNode cNode = source.First; - int index = 0; - do - { - result[index] = cNode.Value; - index++; - } while ((cNode = cNode.Next) != null); - return result; - } - - public static void Reverse(this LinkedList source) - { - var head = source.First; - while (head.Next != null) - { - var next = head.Next; - source.Remove(next); - source.AddFirst(next.Value); - } - } - #endregion - - public static bool IsLayerWithinMask(this LayerMask source, int other) - { - return source == (source | (1 << other)); - } - - public static Vector2 Rotate(this Vector2 v, float degrees) - { - float sin = Mathf.Sin(degrees * Mathf.Deg2Rad); - float cos = Mathf.Cos(degrees * Mathf.Deg2Rad); - - float tx = v.x; - float ty = v.y; - v.x = (cos * tx) - (sin * ty); - v.y = (sin * tx) + (cos * ty); - return v; - } - - public static Vector2 RotateRad(this Vector2 v, float rads) - { - float sin = Mathf.Sin(rads); - float cos = Mathf.Cos(rads); - - float tx = v.x; - float ty = v.y; - v.x = (cos * tx) - (sin * ty); - v.y = (sin * tx) + (cos * ty); - return v; - } - - public static bool ContainsBounds(this Rect source, Rect other) - { - return source.Contains(other.min) && source.Contains(other.max); - } - - public static Rect CombineWith(this Rect source, Rect other) - { - return Rect.MinMaxRect( - Mathf.Min(source.xMin, other.xMin), - Mathf.Min(source.yMin, other.yMin), - Mathf.Max(source.xMax, other.xMax), - Mathf.Max(source.yMax, other.yMax)); - } - - public static float Area(this Rect source) - { - return source.x * source.y; - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/ExtensionMethods.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/ExtensionMethods.cs.meta deleted file mode 100644 index 9596bed8..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/ExtensionMethods.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 725e57c874bd99c44bb3ff3513a4e6e5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/Geometry.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/Geometry.cs deleted file mode 100644 index 3915aabc..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/Geometry.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; - -namespace PathBerserker2d -{ - public static class Geometry - { - public static float DistancePointLineSegment(Vector2 p, Vector2 a, Vector2 b) - { - return Vector2.Distance(p, ProjectPointOnLineSegment(p, a, b)); - } - - /// - /// Finds closest point to p on line a -> b - /// - public static Vector2 ProjectPointOnLineSegment(Vector2 p, Vector2 a, Vector2 b) - { - Vector2 dir = b - a; - float l2 = dir.sqrMagnitude; - if (l2 == 0.0) - return a; - - float t = Mathf.Clamp01(Vector2.Dot(p - a, dir) / l2); - Vector2 projection = a + t * dir; - return projection; - } - - /// - /// Project point on line. - /// - /// Point to proejct - /// Point on line - /// Line tangent. Must be normalized! - /// Closets point on line to p - public static Vector2 ProjectPointOnLine(Vector2 p, Vector2 a, Vector2 dir) - { - float t = Vector2.Dot(p - a, dir); - return a + t * dir; - } - - public static bool IsPointOnPositiveSideOfLine(Vector2 point, Vector2 linePointA, Vector2 normal) - { - return Vector2.Dot(point - linePointA, normal) >= 0; - } - - /// - /// Returns a rect that encapsulates the passed in rect after being transformed. - /// - public static Rect TransformBoundingRect(Rect bounds, Matrix4x4 transformation) - { - // bounds -> extract 2 diagonal corners - // transform corners - Vector2 a = transformation.MultiplyPoint3x4(bounds.min); - Vector2 b = transformation.MultiplyPoint3x4(bounds.max); - Vector2 c = transformation.MultiplyPoint3x4(new Vector2(bounds.xMin, bounds.yMax)); - Vector2 d = transformation.MultiplyPoint3x4(new Vector2(bounds.xMax, bounds.yMin)); - - // create new box containing corners - Vector2 min = Vector2.Min(d, Vector2.Min(c, Vector2.Min(a, b))); - Vector2 max = Vector2.Max(d, Vector2.Max(c, Vector2.Max(a, b))); - - return new Rect(min, max - min); - } - - public static Rect EnlargeRect(Rect rect, float amount) - { - return new Rect(rect.position - Vector2.one * amount, rect.size + Vector2.one * amount * 2); - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/Geometry.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/Geometry.cs.meta deleted file mode 100644 index baaed667..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/Geometry.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3f2df2ee5a1fccc4f86bb36c3db1860f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/LineSegment.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/LineSegment.cs deleted file mode 100644 index aa3953be..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/LineSegment.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System; -using UnityEngine; - -namespace PathBerserker2d -{ - [System.Serializable] - internal class LineSegment - { - public Vector2 Start { get { return start; } } - public Vector2 End { get { return GetPositionAlongSegment(Length); } } - public Vector2 Normal { get { return new Vector2(-Tangent.y, Tangent.x); } } - public Vector2 Tangent { get { return dirNorm; } } - public float Length { get { return length; } } - - public Rect AABB - { - get - { - Vector2 min = Vector2.Min(Start, End); - Vector2 max = Vector2.Max(Start, End); - return new Rect(min, max - min); - } - } - - [SerializeField] - private Vector2 start; - [SerializeField] - private float length; - [SerializeField] - private Vector2 dirNorm; - - public LineSegment(Vector2 start, Vector2 dirNorm, float length) - { - this.start = start; - this.length = length; - this.dirNorm = dirNorm; - } - - public LineSegment(LineSegment other) - { - this.start = other.start; - this.length = other.length; - this.dirNorm = other.dirNorm; - } - - public Vector2 GetPositionAlongSegment(float t) - { - return Start + Tangent * t; - } - - public Vector2 ProjectPointOnSegment(Vector2 lPoint) - { - return Start + DistanceOfPointAlongSegment(lPoint) * Tangent; - } - - public float DistanceOfPointAlongSegment(Vector2 lPoint) - { - Vector2 ap = lPoint - Start; - return Mathf.Clamp(Vector2.Dot(Tangent, ap), 0, Length); - } - - public float PointDistance(Vector2 position) - { - return Vector2.Distance(position, ProjectPointOnSegment(position)); - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/LineSegment.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/LineSegment.cs.meta deleted file mode 100644 index 5502b4b3..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/LineSegment.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 21f708fb1003baa43a6477a00ed8fa0c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/LineSegmentWithClearance.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/LineSegmentWithClearance.cs deleted file mode 100644 index 9c4f320c..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/LineSegmentWithClearance.cs +++ /dev/null @@ -1,93 +0,0 @@ -using System; -using UnityEngine; - -namespace PathBerserker2d -{ - [System.Serializable] - internal class LineSegmentWithClearance : LineSegment - { - public int CellCount { get { return cellClearances.Length; } } - public int NextSegmentIndex { get => nextSegIndex; internal set => nextSegIndex = value; } - public int PrevSegmentIndex { get => prevSegIndex; internal set => prevSegIndex = value; } - - public bool HasNext => nextSegIndex >= 0; - public bool HasPrev => prevSegIndex >= 0; - - [SerializeField] - protected float[] cellClearances; - [SerializeField] - private int prevSegIndex = -1; - [SerializeField] - private int nextSegIndex = -1; - - public LineSegmentWithClearance(Vector2 start, Vector2 dirNorm, float length, float[] cellClearances) : base(start, dirNorm, length) - { - this.cellClearances = cellClearances; - } - - public LineSegmentWithClearance(LineSegmentWithClearance other) : base(other) - { - this.prevSegIndex = other.prevSegIndex; - this.nextSegIndex = other.nextSegIndex; - this.cellClearances = (float[])other.cellClearances.Clone(); - } - - public float GetClearanceAlongSegment(float dist) - { - return cellClearances[CellIndexOf(dist)]; - } - - public bool DoesClearanceAllowTraversal(float startT, float endT, float agentHeight) - { - return GetMinClearanceTo(startT, endT) < agentHeight; - } - - private int CellIndexOf(float t) - { - if (t >= Length) - return cellClearances.Length - 1; - else if (t <= 0) - return 0; - else - return Mathf.FloorToInt(t * (cellClearances.Length / Length)); - } - - public float GetMinClearanceTo(float from, float to) - { - int cellFrom = CellIndexOf(from); - int cellTo = CellIndexOf(to); - - int dir = cellTo - cellFrom; - if (dir == 0) - { - // same cell - return cellClearances[cellFrom]; - } - else if (dir < 0) - { - float minClearance = cellClearances[cellFrom]; - for (int iCell = cellFrom - 1; iCell >= cellTo; iCell--) - { - if (minClearance > cellClearances[iCell]) - minClearance = cellClearances[iCell]; - } - return minClearance; - } - else - { - float minClearance = cellClearances[cellFrom]; - for (int iCell = cellFrom + 1; iCell <= cellTo; iCell++) - { - if (minClearance > cellClearances[iCell]) - minClearance = cellClearances[iCell]; - } - return minClearance; - } - } - - public float[] CloneCellClearances() - { - return (float[])cellClearances.Clone(); - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/LineSegmentWithClearance.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/LineSegmentWithClearance.cs.meta deleted file mode 100644 index 51cfdd04..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/LineSegmentWithClearance.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: fdad88f454070c84d91ea61e5041129d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/Utility.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/Utility.cs deleted file mode 100644 index 1bad5451..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/Utility.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; - -namespace PathBerserker2d -{ - internal static class Utility - { - public static T WeightedRandomChoice(IEnumerable values, IEnumerable weights) - { - float total = 0; - foreach (var w in weights) - { - total += w; - } - return WeightedRandomChoice(values, weights, total); - } - - public static T WeightedRandomChoice(IEnumerable values, IEnumerable weights, float totalWeight) - { - float total = 0; - foreach (var w in weights) - { - total += w; - } - - float r = Random.value * total; - IEnumerator enumerator = values.GetEnumerator(); - foreach (var w in weights) - { - enumerator.MoveNext(); - if (w >= r) - return enumerator.Current; - - r -= w; - } - throw new System.Exception(); - } - - public static void ResizeWithDefault(ref T[] array, int newLength, T defaultElem) - { - int oldLength = array.Length; - System.Array.Resize(ref array, newLength); - for (int i = oldLength; i < newLength; i++) - { - array[i] = defaultElem; - } - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/Utility.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/Utility.cs.meta deleted file mode 100644 index 6666862c..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/Utilities/Utility.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2d37807132db5f144aa8a58209a65a9a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library.meta deleted file mode 100644 index 48dc3c0a..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: b6c542d4b9468044a94955f41f82e1b3 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/Connector.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/Connector.cs deleted file mode 100644 index 70ab7562..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/Connector.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; - -namespace PathBerserker2d -{ - internal class Connector - { - public void Add(Vector2 a, Vector2 b) - { - LinkedListNode current = openPolygons.First; - - while (current != null) - { - LinkedListNode next = current.Next; - - PointChain currentChain = current.Value; - - if (currentChain.LinkSegment(a, b)) - { - if (currentChain.IsClosed()) - { - closedPolygons.AddLast(currentChain); - openPolygons.Remove(current); - return; - } - else - { - LinkedListNode innerCurrent = current.Next; - - while (innerCurrent != null) - { - LinkedListNode innerNext = innerCurrent.Next; - - if (currentChain.LinkPointChain(innerCurrent.Value)) - { - openPolygons.Remove(innerCurrent); - break; - } - innerCurrent = innerNext; - } - } - return; - } - current = next; - } - openPolygons.AddLast(new PointChain(a, b)); - return; - } - - LinkedListNode begin() { return closedPolygons.First; } - LinkedListNode end() { return closedPolygons.Last; } - - public void Clear() - { - closedPolygons.Clear(); - openPolygons.Clear(); - } - - public int GetNumClosedPolygons() { return closedPolygons.Count; } - public int GetNumOpenPolygons() { return openPolygons.Count; } - - public LinkedList openPolygons = new LinkedList(); - public LinkedList closedPolygons = new LinkedList(); - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/Connector.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/Connector.cs.meta deleted file mode 100644 index 70f07d8a..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/Connector.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: eb67e4c79a6b6a24798f174e0ff3368b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/ExtendedGeometry.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/ExtendedGeometry.cs deleted file mode 100644 index 6c3da2b0..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/ExtendedGeometry.cs +++ /dev/null @@ -1,452 +0,0 @@ -using UnityEngine; -using System.Collections.Generic; - -namespace PathBerserker2d -{ - internal class ExtendedGeometry - { - public static float SignedArea(Vector2 a, Vector2 b, Vector2 c) - { - return (a.x - c.x) * (b.y - c.y) - (b.x - c.x) * (a.y - c.y); - } - - /** Signed area of the triangle ( (0,0), p1, p2) */ - public static float SignedArea(Vector2 b, Vector2 c) - { - return -c.x * (b.y - c.y) - -c.y * (b.x - c.x); - } - - /** Sign of triangle (p1, p2, o) */ - public static int Sign(Vector2 a, Vector2 b, Vector2 o) - { - float det = (a.x - o.x) * (b.y - o.y) - (b.x - o.x) * (a.y - o.y); - return (det < 0 ? -1 : (det > 0 ? +1 : 0)); - } - - public static float SignedAreaDoubledTris(Vector2 a, Vector2 b, Vector2 c) - { - return (a.x - c.x) * (b.y - c.y) - (b.x - c.x) * (a.y - c.y); - } - - /** Signed area of the triangle ( (0,0), p1, p2) */ - public static float SignedAreaDoubledTris(Vector2 b, Vector2 c) - { - return -c.x * (b.y - c.y) - -c.y * (b.x - c.x); - } - - /** Sign of triangle (p1, p2, o) */ - public static int SignTris(Vector2 a, Vector2 b, Vector2 o) - { - float det = (a.x - o.x) * (b.y - o.y) - (b.x - o.x) * (a.y - o.y); - return (det < 0 ? -1 : (det > 0 ? +1 : 0)); - } - - public static float SignedAreaDoubledRect(Vector2 a, Vector2 b, Vector2 c, Vector2 d) - { - return (a.y - c.y) * (d.x - b.x) + (b.y - d.y) * (a.x - c.x); - } - - public static bool DoesLineIntersectBounds(Vector2 pA, Vector2 pB, Bounds bounds) - { - if (pA.x > bounds.max.x && pB.x > bounds.max.x) return false; - if (pA.x < bounds.min.x && pB.x < bounds.min.x) return false; - if (pA.y > bounds.max.y && pB.y > bounds.max.y) return false; - if (pA.y < bounds.min.y && pB.y < bounds.min.y) return false; - - float z = pB.x * pA.y - pA.x * pB.y; - float x = pB.y - pA.y; - float y = pA.x - pB.x; - - float sign = Mathf.Sign(bounds.max.x * x + bounds.max.y * y + z); - return (sign == Mathf.Sign(bounds.min.x * x + bounds.max.y * y + z) && sign == Mathf.Sign(bounds.max.x * x + bounds.max.y * y + z) && sign == Mathf.Sign(bounds.max.x * x + bounds.max.y * y + z)); - } - - - public static bool IsOnLeftSideOfLine(Vector2 pA, Vector2 pB, Vector2 point) - { - return ((pB.x - pA.x) * (point.y - pA.y) - (pB.y - pA.y) * (point.x - pA.x)) > 0; - } - - const float LineCircle_FudgeFactor = 0.00001f; - // -1 = line is completly outside of the circle - // 0 = 0 intersections found, line is completly inside of circle - // 1 = 1 intersection found (i1) - // 2 = 2 intersections found (i1, i2) - public static int DoesLineIntersectWithCircle(Vector2 lA, Vector2 lB, Vector2 circleCenter, float radius, out Vector2 i1, out Vector2 i2) - { - i1 = Vector2.zero; - i2 = Vector2.zero; - - Vector2 dir = (lB - lA); - float distL = dir.magnitude; - dir /= distL; - - float t = dir.x * (circleCenter.x - lA.x) + dir.y * (circleCenter.y - lA.y); - - Vector2 tangent = t * dir + lA; - float distToCenter = (tangent - circleCenter).sqrMagnitude; - float radSquared = radius * radius; - - if (distToCenter < radSquared) - { - float dt = Mathf.Sqrt(radSquared - distToCenter); - float tMinDt = t - dt; - if (tMinDt > 0 + LineCircle_FudgeFactor || tMinDt < distL - LineCircle_FudgeFactor) - { - i1 = tMinDt * dir + lA - circleCenter; - - tMinDt = t + dt; - if (tMinDt > 0 + LineCircle_FudgeFactor || tMinDt < distL - LineCircle_FudgeFactor) - { - i2 = tMinDt * dir + lA - circleCenter; - return 2; - } - return 1; - } - tMinDt = t + dt; - if (tMinDt > 0 + LineCircle_FudgeFactor || tMinDt < distL - LineCircle_FudgeFactor) - { - i1 = tMinDt * dir + lA - circleCenter; - return 1; - } - return 0; - } - else if (distToCenter == radSquared) - { - i1 = tangent - circleCenter; - return 1; - } - else - { - return -1; - } - } - - public static bool FindLineIntersection(Vector2 l1a, Vector2 l1b, Vector2 l2a, Vector2 l2b, out Vector2 inter) - { - inter = Vector2.zero; - var d = (l2b.y - l2a.y) * (l1b.x - l1a.x) - (l2b.x - l2a.x) * (l1b.y - l1a.y); - - //n_a and n_b are calculated as seperate values for readability - var n_a = - (l2b.x - l2a.x) * (l1a.y - l2a.y) - - - (l2b.y - l2a.y) * (l1a.x - l2a.x); - - var n_b = - (l1b.x - l1a.x) * (l1a.y - l2a.y) - - - (l1b.y - l1a.y) * (l1a.x - l2a.x); - - // Make sure there is not a division by zero - this also indicates that - // the lines are parallel. - // If n_a and n_b were both equal to zero the lines would be on top of each - // other (coincidental). This check is not done because it is not - // necessary for this implementation (the parallel check accounts for this). - if (d == 0) - return false; - - // Calculate the intermediate fractional point that the lines potentially intersect. - var ua = n_a / d; - var ub = n_b / d; - - // The fractional point will be between 0 and 1 inclusive if the lines - // intersect. If the fractional calculation is larger than 1 or smaller - // than 0 the lines would need to be longer to intersect. - if (ua >= 0.0 && ua <= 1.0 && ub >= 0.0 && ub <= 1.0) - { - inter.x = l1a.x + (ua * (l1b.x - l1a.x)); - inter.y = l1a.y + (ua * (l1b.y - l1a.y)); - return true; - } - return false; - } - - //https://gist.github.com/ChickenProp/3194723 - public static bool RectLineIntersection(Rect rect, Vector2 la, Vector2 lb, out float u1, out float u2) - { - Vector2 lDelta = lb - la; - - float[] p = new float[4] { - -lDelta.x, - lDelta.x, - -lDelta.y, - lDelta.y - }; - - float[] q = new float[4] { - la.x - rect.xMin, - rect.xMax - la.x, - la.y - rect.yMin, - rect.yMax - la.y, - }; - - u1 = Mathf.NegativeInfinity; - u2 = Mathf.Infinity; - for (int i = 0; i < 4; i++) - { - if (p[i] == 0) - { - if (q[i] < 0) - return false; - } - else - { - var t = q[i] / p[i]; - if (p[i] < 0 && u1 < t) - { - u1 = t; - } - else if (p[i] > 0 && u2 > t) - { - u2 = t; - } - } - } - return u1 <= u2; - - /* - // entirely outside - if (u1 > u2) - { - return false; - } - - // entirely inside - if (u1 < 0 && 1 < u2) - { - return 0; - } - - // 2 intersections - if (0 < u1 && u1 < u2 && u2 < 1) - { - return 3; - } - - // 1 intersection - if (0 < u1 && u1 < 1) - { - return 1; - } - return 2;*/ - } - - public static void MergeCloseVerts(List points, float maxDistance) - { - float maxDistSq = maxDistance * maxDistance; - for (int i = 0, j = points.Count - 1; i < points.Count && points.Count > 3; j = i, i++) - { - float dist = (points[i] - points[j]).sqrMagnitude; - - if (dist <= maxDistSq) - { - Vector2 avg = (points[i] + points[j]) / 2f; - points[j] = avg; - points.RemoveAt(i); - - MergeCloseVerts(points, maxDistance); - return; - } - } - } - - public static List SimplifyContour(List points, float tolerance) - { - if (points == null || points.Count < 3) - return points; - - List pointIndeciesToKeep = new List(); - - int firstPoint = 0; - - //find furthest point to first point - int lastPoint = FurthestPointFrom(points, firstPoint); - - pointIndeciesToKeep.Add(firstPoint); - - DouglasPeuckerReduction(points, firstPoint, lastPoint, - tolerance, pointIndeciesToKeep); - - pointIndeciesToKeep.Add(lastPoint); - - DouglasPeuckerReductionReverse(points, lastPoint, firstPoint + points.Count, tolerance, pointIndeciesToKeep); - - - - if (pointIndeciesToKeep.Count < 3) - { -#if PBDEBUG - Debug.LogWarning("Simplification failed!"); -#endif - return points; - } - List returnPoints = new List(); - foreach (int index in pointIndeciesToKeep) - { - returnPoints.Add(points[index]); - } -#if PBDEBUG - Debug.Log(string.Format("Reduced vert count from {0}, to {1} with douglas peucker.", points.Count, returnPoints.Count)); -#endif - return returnPoints; - } - - private static void DouglasPeuckerReduction(List points, int firstPoint, int lastPoint, float tolerance, List pointsToKeep) - { - float dmax = tolerance; - int index = -1; - - for (int i = firstPoint + 1; i < lastPoint; i++) - { - float distance = PerpendicularDistance - (points[firstPoint], points[lastPoint], points[i]); - if (distance > dmax) - { - dmax = distance; - index = i; - } - } - - if (index != -1) - { - //Add the largest point that exceeds the tolerance - DouglasPeuckerReduction(points, firstPoint, index, tolerance, pointsToKeep); - pointsToKeep.Add(index); - DouglasPeuckerReduction(points, index, lastPoint, tolerance, pointsToKeep); - } - } - - private static void DouglasPeuckerReductionReverse(List points, int firstPoint, int lastPoint, float tolerance, List pointsToKeep) - { - float dmax = tolerance; - int index = -1; - int workingLastPoint = lastPoint >= points.Count ? lastPoint - points.Count : lastPoint; - - for (int i = firstPoint + 1; i < lastPoint; i++) - { - float distance = PerpendicularDistance - (points[firstPoint], points[workingLastPoint], points[i >= points.Count ? i - points.Count : i]); - if (distance > dmax) - { - dmax = distance; - index = i; - } - } - - if (index != -1) - { - //Add the largest point that exceeds the tolerance - DouglasPeuckerReductionReverse(points, firstPoint, index, tolerance, pointsToKeep); - pointsToKeep.Add(index >= points.Count ? index - points.Count : index); - DouglasPeuckerReductionReverse(points, index, lastPoint, tolerance, pointsToKeep); - } - } - - private static int FurthestPointFrom(List points, int index) - { - Vector2 v = points[index]; - float maxDistanceSq = 0; - int furthestIndex = -1; - - for (int i = 0; i < points.Count; i++) - { - if (i == index) - continue; - - float dist = (v - points[i]).sqrMagnitude; - if (dist > maxDistanceSq) - { - furthestIndex = i; - maxDistanceSq = dist; - } - } - return furthestIndex; - } - - private static float PerpendicularDistance(Vector2 a, Vector2 b, Vector2 p) - { - Vector2 ab = (b - a).normalized; - Vector2 ap = p - a; - - float dot = Vector2.Dot(ab, ap); - Vector2 proj = ap - dot * ab; - return proj.magnitude; - } - - public static void RemoveCollinearEdges(List points) - { - if (points.Count <= 3) - return; - - for (int i = 0, j = points.Count - 1, k = points.Count - 2; i < points.Count; k = j, j = i, i++) - { - while (SlopesEqual(points[k], points[j], points[j], points[i])) - { - points.RemoveAt(j); - } - } - } - - public static bool SlopesEqual(Vector2 a, Vector2 b, Vector2 x, Vector2 y) - { - return Vector2.Dot(b - a, y - x) == 0; - } - - public static bool ContainsPoint(IEnumerable path, Vector2 lastPointInPath, Vector2 point) - { - bool c = false; - foreach (var p in path) - { - if (((p.y > point.y) != (lastPointInPath.y > point.y)) && - (point.x < (lastPointInPath.x - p.x) * (point.y - p.y) / (lastPointInPath.y - p.y) + p.x)) - c = !c; - - lastPointInPath = p; - } - return c; - } - - /* - * angle in degrees - */ - public static Vector2[] RotateRectangle(Rect rect, float angle) - { - Vector2[] rotatedCorners = new Vector2[4]; - Vector2 center = rect.center; - Rect boundingRect = new Rect(center, Vector2.zero); - - float rotationInRad = Mathf.Deg2Rad * angle; - float angleCos = Mathf.Cos(rotationInRad); - float angleSin = Mathf.Sin(rotationInRad); - - rotatedCorners[0] = new Vector2( - ((rect.xMin - center.x) * angleCos) - ((rect.yMin - center.y) * angleSin), - ((rect.xMin - center.x) * angleSin) + ((rect.yMin - center.y) * angleCos)); - - rotatedCorners[1] = new Vector2( - ((rect.xMax - center.x) * angleCos) - ((rect.yMin - center.y) * angleSin), - ((rect.xMax - center.x) * angleSin) + ((rect.yMin - center.y) * angleCos)); - rotatedCorners[2] = -rotatedCorners[0]; - rotatedCorners[3] = -rotatedCorners[2]; - - for (int i = 0; i < 4; i++) - rotatedCorners[i] += center; - - return rotatedCorners; - } - - public static bool IsAngleBetweenAngles(float from, float to, float angle) - { - angle = angle < 0 ? angle + 360 : angle; - - to = to - from; - to = to < 0 ? to + 360 : to; - - angle = angle - from; - angle = angle < 0 ? angle + 360 : angle; - - return angle < to; - } - } -} diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/ExtendedGeometry.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/ExtendedGeometry.cs.meta deleted file mode 100644 index 177932ee..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/ExtendedGeometry.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: fb94fa6d3d7bd714cb89e9e11f4e7c1f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/PointChain.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/PointChain.cs deleted file mode 100644 index 1cee4011..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/PointChain.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System.Collections.Generic; -using System; -using UnityEngine; - -namespace PathBerserker2d -{ - internal class PointChain - { - public LinkedList points = new LinkedList(); - - bool closed; // is the first point linked with the last one - - public PointChain(Vector2 a, Vector2 b) - { - closed = false; - - Add(a, b); - } - - public void Add(Vector2 a, Vector2 b) - { - points.AddLast(a); - points.AddLast(b); - } - - public bool LinkSegment(Vector2 a, Vector2 b) - { - if (b == points.First.Value) - { - if (a == points.Last.Value) - closed = true; - else - points.AddFirst(a); - return true; - } - if (a == points.Last.Value) - { - if (b.Equals(points.First.Value)) - closed = true; - else - points.AddLast(b); - return true; - } - return false; - } - - public bool LinkPointChain(PointChain chain) - { - if (chain.points.First.Value == (points.Last.Value)) - { - chain.points.RemoveFirst(); - AppendRange(chain.points); - - return true; - } - if (chain.points.Last.Value == (points.First.Value)) - { - points.RemoveFirst(); - PrependRange(chain.points); - - return true; - } - return false; - } - - private void PrependRange(LinkedList list) - { - var node = list.Last; - do - { - this.points.AddFirst(node.Value); - } while ((node = node.Previous) != null); - } - - private void PrependRangeReverse(LinkedList list) - { - var node = list.First; - do - { - this.points.AddFirst(node.Value); - } while ((node = node.Next) != null); - } - - private void AppendRange(LinkedList list) - { - var node = list.First; - do - { - this.points.AddLast(node.Value); - } while ((node = node.Next) != null); - } - - private void AppendRangeReverse(LinkedList list) - { - var node = list.Last; - do - { - this.points.AddLast(node.Value); - } while ((node = node.Previous) != null); - } - - public LinkedListNode First { get { return points.First; } } - public LinkedListNode Last { get { return points.Last; } } - - public bool IsClosed() { return closed; } - public void Clear() { points.Clear(); } - public int GetNumPoints() { return points.Count; } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/PointChain.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/PointChain.cs.meta deleted file mode 100644 index c3c70fd2..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/PointChain.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d85c6281176d71c4c99634fd33cc0bcb -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/PolygonClipper.cs b/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/PolygonClipper.cs deleted file mode 100644 index f7edaa19..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/PolygonClipper.cs +++ /dev/null @@ -1,684 +0,0 @@ -using UnityEngine; -using System.Collections.Generic; -using Priority_Queue; -using System; - -namespace PathBerserker2d -{ - internal class PolygonClipper : IClipper - { - public enum EdgeType { NORMAL, NON_CONTRIBUTING, SAME_TRANSITION, DIFFERENT_TRANSITION }; - public enum PolygonType { SUBJECT, CLIPPING }; - - private SweepEventPriorityQueue eventQueue = new SweepEventPriorityQueue(50); - private SweepEvent[] sweepEventPool = new SweepEvent[100]; - private int usedSweepEventCount = 0; - private SweepRay sweepRay = new SweepRay(20); - - public PolygonClipper() - { - for (int i = 0; i < sweepEventPool.Length; i++) - sweepEventPool[i] = new SweepEvent(); - } - - public ResultType Compute(Polygon sp, Polygon cp, BoolOpType op, out List result, bool includeOpenPolygons = false) - { - result = new List(); - if (sp.IsEmpty || cp.IsEmpty) - { - return ResultType.NoOverlap; - } - - //Trivial case: The polygons cannot intersect each other. - if (!sp.BoundsOverlap(cp)) - { - return ResultType.NoOverlap; - } - - //Init the event queue with the polygon edges - usedSweepEventCount = 0; - eventQueue.Clear(); - InsertPolygon(sp, PolygonType.SUBJECT); - InsertPolygon(cp, PolygonType.CLIPPING); - - sweepRay.Clear(); - SweepEvent cEvent; - float minRightBounds = Mathf.Min(sp.XMax, cp.XMax) + 0.01f; - Connector connector = new Connector(); - bool intersectionHappened = false; - - while (eventQueue.Count != 0) - { - cEvent = eventQueue.Dequeue(); - if ((op == BoolOpType.INTERSECTION && cEvent.point.x > minRightBounds) || - (op == BoolOpType.DIFFERENCE && cEvent.point.x > sp.XMax)) - { - //Exit the loop. No more intersections are to be found. - // Create a polygon out of the pointchain - return EvaluateResult(connector, op, intersectionHappened, includeOpenPolygons, ref result); - } - if (op == BoolOpType.UNION && cEvent.point.x > minRightBounds) - { - if (!cEvent.Left) - { - AddEventToConnector(connector, cEvent); - } - while (eventQueue.Count != 0) - { - cEvent = eventQueue.Dequeue(); - if (!cEvent.Left) - { - AddEventToConnector(connector, cEvent); - } - } - return EvaluateResult(connector, op, intersectionHappened, includeOpenPolygons, ref result); - } - - if (cEvent.Left) - {// the line segment must be inserted into S - int pos = sweepRay.Add(cEvent); - SweepEvent prev = sweepRay.Previous(pos); - if (prev == null) - cEvent.Inside = cEvent.InOut = false; - else if (prev.EdgeType != EdgeType.NORMAL) - { - if (pos - 1 == 0) - { - cEvent.Inside = true; - cEvent.InOut = false; - } - else - { - SweepEvent sliEvent = sweepRay.Previous(pos - 1); - if (prev.PolyType == cEvent.PolyType) - { - cEvent.InOut = !prev.InOut; - cEvent.Inside = !sliEvent.InOut; - } - else - { - cEvent.InOut = !sliEvent.InOut; - cEvent.Inside = !prev.InOut; - } - } - } - else if (cEvent.PolyType == prev.PolyType) - { // previous line segment in S belongs to the same polygon that "cEvent" belongs to - cEvent.Inside = prev.Inside; - cEvent.InOut = !prev.InOut; - } - else - { // previous line segment in S belongs to a different polygon that "cEvent" belongs to - cEvent.Inside = !prev.InOut; - cEvent.InOut = prev.Inside; - } - - SweepEvent nextEvent = sweepRay.Next(pos); - if (nextEvent != null) - intersectionHappened |= HandlePossibleIntersection(cEvent, nextEvent); - if (prev != null) - intersectionHappened |= HandlePossibleIntersection(cEvent, prev); - } - else - {// the line segment must be removed from S - int pos = sweepRay.Find(cEvent.other); - switch (cEvent.EdgeType) - { - case EdgeType.NORMAL: - switch (op) - { - case BoolOpType.INTERSECTION: - if (cEvent.other.Inside) - AddEventToConnector(connector, cEvent); - break; - case BoolOpType.UNION: - if (!cEvent.other.Inside) - AddEventToConnector(connector, cEvent); - break; - case BoolOpType.DIFFERENCE: - if (cEvent.PolyType == PolygonType.SUBJECT && !cEvent.other.Inside) - AddEventToConnector(connector, cEvent); - break; - } - break; - case EdgeType.SAME_TRANSITION: - if (op == BoolOpType.INTERSECTION || op == BoolOpType.UNION) - AddEventToConnector(connector, cEvent); - break; - case EdgeType.DIFFERENT_TRANSITION: - if (op == BoolOpType.DIFFERENCE) - AddEventToConnector(connector, cEvent); - break; - } - // delete line segment associated to e from S and check for intersection between the neighbors of "e" in S - SweepEvent next = sweepRay.Next(pos), prev = sweepRay.Previous(pos); - sweepRay.RemoveAt(pos); - if (next != null && prev != null) - intersectionHappened |= HandlePossibleIntersection(prev, next); - } - } - - return EvaluateResult(connector, op, intersectionHappened, includeOpenPolygons, ref result); - } - - private void AddEventToConnector(Connector connector, SweepEvent ev) - { - if (ev.WrapWiseLeft) connector.Add(ev.point, ev.other.point); else connector.Add(ev.other.point, ev.point); - } - - private ResultType EvaluateResult(Connector connector, BoolOpType opType, bool intersectionHappened, bool includeOpenPaths, ref List result) - { - if (!intersectionHappened && (opType == BoolOpType.INTERSECTION || (opType == BoolOpType.UNION && !includeOpenPaths))) - return ResultType.NoOverlap; - - Contour[] contours = new Contour[connector.GetNumClosedPolygons() + (includeOpenPaths ? connector.GetNumOpenPolygons() : 0)]; - - int fill = 0; - foreach (var closedPoly in connector.closedPolygons) - { - contours[fill++] = new Contour(closedPoly.points, true); - } - if (includeOpenPaths) - { - foreach (var openPoly in connector.openPolygons) - { - contours[fill++] = new Contour(openPoly.points, false); - } - } - - if (opType == BoolOpType.UNION) - { - if (connector.GetNumClosedPolygons() == 0) - return ResultType.NoOverlap; - - List holes = new List(contours.Length - 1); - Contour hull = null; - double largestArea = 0; - - foreach (var contour in contours) - { - double area = contour.Area(); - - if (area > largestArea) - { - if (hull != null) - { - holes.Add(hull); - } - hull = contour; - largestArea = area; - } - } - result.Add(new Polygon(hull, holes)); - } - else if (opType == BoolOpType.INTERSECTION || opType == BoolOpType.DIFFERENCE) - { - for (int i = 0; i < contours.Length; i++) - { - if (contours[i].IsClosed) - { - for (int j = i + 1; j < contours.Length; j++) - { - foreach (var cp in contours[j]) - { - if (ExtendedGeometry.ContainsPoint(contours[i], contours[i].Verts[contours[i].VertexCount - 1], cp) - ) - { - goto label1; - } - } - } - } - result.Add(new Polygon(contours[i])); - label1: - continue; - } - } - return ResultType.Clipped; - } - - private void InsertPolygon(Polygon polygon, PolygonType polygonType) - { - int sweepIndex = RequestSweepEvents(polygon.TotalVertCount() * 2); - foreach (var contour in polygon) - { - Vector2 cVal; - Vector2 cPrevVal = contour[contour.IsClosed ? contour.VertexCount - 1 : 0]; - for (int iVert = contour.IsClosed ? 0 : 1; iVert < contour.VertexCount; iVert++) - { - cVal = contour[iVert]; - if (cVal.x < cPrevVal.x || (cVal.x == cPrevVal.x && cVal.y < cPrevVal.y)) - { - sweepEventPool[sweepIndex++].SetData(cVal, true, false, polygonType); - sweepEventPool[sweepIndex++].SetData(cPrevVal, false, true, polygonType); - } - else - { - sweepEventPool[sweepIndex++].SetData(cVal, false, false, polygonType); - sweepEventPool[sweepIndex++].SetData(cPrevVal, true, true, polygonType); - } - sweepEventPool[sweepIndex - 1].other = sweepEventPool[sweepIndex - 2]; - sweepEventPool[sweepIndex - 2].other = sweepEventPool[sweepIndex - 1]; - cPrevVal = cVal; - - eventQueue.Enqueue(sweepEventPool[sweepIndex - 1]); - eventQueue.Enqueue(sweepEventPool[sweepIndex - 2]); - } - } - } - - private int RequestSweepEvents(int count) - { - if (sweepEventPool.Length - usedSweepEventCount < count) - { - int i = sweepEventPool.Length; - System.Array.Resize(ref sweepEventPool, usedSweepEventCount + count + 10); - - for (; i < sweepEventPool.Length; i++) - { - sweepEventPool[i] = new SweepEvent(); - } - } - usedSweepEventCount += count; - return usedSweepEventCount - count; - } - - private int FindIntersection(SweepEvent se1, SweepEvent se2, out Vector2 pA, out Vector2 pB) - { - //Assign the resulting points some dummy values - pA = Vector2.zero; - pB = Vector2.zero; - Vector2 se1_Begin = (se1.Left) ? se1.point : se1.other.point; - Vector2 se1_End = (se1.Left) ? se1.other.point : se1.point; - Vector2 se2_Begin = (se2.Left) ? se2.point : se2.other.point; - Vector2 se2_End = (se2.Left) ? se2.other.point : se2.point; - - Vector2 d0 = se1_End - se1_Begin; - Vector2 d1 = se2_End - se2_Begin; - Vector2 e = se2_Begin - se1_Begin; - - const double sqrEpsilon = 0.000001; - const double epsilon = 0.00001; - - double kross = d0.x * d1.y - d0.y * d1.x; - double sqrKross = kross * kross; - double sqrLen0 = d0.sqrMagnitude; - double sqrLen1 = d1.sqrMagnitude; - - if (sqrKross > sqrEpsilon * sqrLen0 * sqrLen1) - { - // lines of the segments are not parallel - double s = (e.x * d1.y - e.y * d1.x) / kross; - if ((s < 0) || (s > 1)) - { - return 0; - } - double t = (e.x * d0.y - e.y * d0.x) / kross; - if ((t < 0) || (t > 1)) - { - return 0; - } - // intersection of lines is a point an each segment - pA = new Vector2((float)(se1_Begin.x + s * d0.x), (float)(se1_Begin.y + s * d0.y)); - if ((pA - se1_Begin).magnitude < epsilon) pA = se1_Begin; - if ((pA - se1_End).magnitude < epsilon) pA = se1_End; - if ((pA - se2_Begin).magnitude < epsilon) pA = se2_Begin; - if ((pA - se2_End).magnitude < epsilon) pA = se2_End; - return 1; - } - - // lines of the segments are parallel - double sqrLenE = e.sqrMagnitude; - kross = e.x * d0.y - e.y * d0.x; - sqrKross = kross * kross; - if (sqrKross > sqrEpsilon * sqrLen0 * sqrLenE) - { - // lines of the segment are different - return 0; - } - - // Lines of the segments are the same. Need to test for overlap of segments. - double s0 = (d0.x * e.x + d0.y * e.y) / sqrLen0; // so = Dot (D0, E) * sqrLen0 - double s1 = s0 + (d0.x * d1.x + d0.y * d1.y) / sqrLen0; // s1 = s0 + Dot (D0, D1) * sqrLen0 - double smin = Math.Min(s0, s1); - double smax = Math.Max(s0, s1); - double[] w = new double[2]; - int imax = FindIntersection(0.0, 1.0, smin, smax, w); - - if (imax > 0) - { - pA = new Vector2((float)(se1_Begin.x + w[0] * d0.x), (float)(se1_Begin.y + w[0] * d0.y)); - if ((pA - se1_Begin).magnitude < epsilon) pA = se1_Begin; - if ((pA - se1_End).magnitude < epsilon) pA = se1_End; - if ((pA - se2_Begin).magnitude < epsilon) pA = se2_Begin; - if ((pA - se2_End).magnitude < epsilon) pA = se2_End; - if (imax > 1) - { - pB = new Vector2((float)(se1_Begin.x + w[1] * d0.x), (float)(se1_Begin.y + w[1] * d0.y)); - } - } - return imax; - } - - private int FindIntersection(double u0, double u1, double v0, double v1, double[] w) - { - if ((u1 < v0) || (u0 > v1)) - return 0; - if (u1 > v0) - { - if (u0 < v1) - { - w[0] = (u0 < v0) ? v0 : u0; - w[1] = (u1 > v1) ? v1 : u1; - return 2; - } - else - { - // u0 == v1 - w[0] = u0; - return 1; - } - } - else - { - // u1 == v0 - w[0] = u1; - return 1; - } - } - - private bool HandlePossibleIntersection(SweepEvent e1, SweepEvent e2) - { - /* - Vector2 ip1, ip2; // intersection points - int nintersections; - - if ((nintersections = FindIntersection(e1, e2, out ip1, out ip2)) == 0) - return false; - - if ((nintersections == 1) && ( - (e1.point == e2.point) || - (e1.other.point == e2.other.point) || - (e1.other.point == e2.point) || - (e2.point == e2.other.point))) - return false; // the line segments intersect at an endpoint of both line segments - - if (nintersections == 2 && e1.PolyType == e2.PolyType) - return false; // the line segments overlap, but they belong to the same polygon - */ - - if (e1.PolyType == e2.PolyType) - return false; // the line segments belong to the same polygon - - Vector2 ip1, ip2; // intersection points - int nintersections; - - if ((nintersections = FindIntersection(e1, e2, out ip1, out ip2)) == 0) - return false; - - if ((nintersections == 1) && ( - (e1.point == e2.point) || - (e1.other.point == e2.other.point) || - (e1.other.point == e2.point) || - (e2.point == e2.other.point))) - return true; // the line segments intersect at an endpoint of both line segments - - - - // The line segments associated to e1 and e2 intersect - if (nintersections == 1) - { - if (e1.point != ip1 && e1.other.point != ip1) // if ip1 is not an endpoint of the line segment associated to e1 then divide "e1" - DivideEdge(e1, ip1); - if (e2.point != ip1 && e2.other.point != ip1) // if ip1 is not an endpoint of the line segment associated to e2 then divide "e2" - DivideEdge(e2, ip1); - return true; - } - - // The line segments overlap - List sortedEvents = new List(2); - if (e1.point == e2.point) - { - sortedEvents.Add(null); - } - else if (e1.CompareTo(e2) > 0) - { - sortedEvents.Add(e2); - sortedEvents.Add(e1); - } - else - { - sortedEvents.Add(e1); - sortedEvents.Add(e2); - } - - if (e1.other.point == e2.other.point) - { - sortedEvents.Add(null); - } - else if (e1.other.CompareTo(e2.other) > 0) - { - sortedEvents.Add(e2.other); - sortedEvents.Add(e1.other); - } - else - { - sortedEvents.Add(e1.other); - sortedEvents.Add(e2.other); - } - - if (sortedEvents.Count == 2) - { // are both line segments equal? - e1.EdgeType = e1.other.EdgeType = EdgeType.NON_CONTRIBUTING; - e2.EdgeType = e2.other.EdgeType = (e1.InOut == e2.InOut) ? EdgeType.SAME_TRANSITION : EdgeType.DIFFERENT_TRANSITION; - return true; - } - if (sortedEvents.Count == 3) - { // the line segments share an endpoint - sortedEvents[1].EdgeType = sortedEvents[1].other.EdgeType = EdgeType.NON_CONTRIBUTING; - if (sortedEvents[0] != null) // is the right endpoint the shared point? - sortedEvents[0].other.EdgeType = (e1.InOut == e2.InOut) ? EdgeType.SAME_TRANSITION : EdgeType.DIFFERENT_TRANSITION; - else // the shared point is the left endpoint - sortedEvents[2].other.EdgeType = (e1.InOut == e2.InOut) ? EdgeType.SAME_TRANSITION : EdgeType.DIFFERENT_TRANSITION; - DivideEdge(sortedEvents[0] != null ? sortedEvents[0] : sortedEvents[2].other, sortedEvents[1].point); - return true; - } - if (sortedEvents[0] != sortedEvents[3].other) - { // no line segment includes totally the other one - sortedEvents[1].EdgeType = EdgeType.NON_CONTRIBUTING; - sortedEvents[2].EdgeType = (e1.InOut == e2.InOut) ? EdgeType.SAME_TRANSITION : EdgeType.DIFFERENT_TRANSITION; - DivideEdge(sortedEvents[0], sortedEvents[1].point); - DivideEdge(sortedEvents[1], sortedEvents[2].point); - return true; - } - // one line segment includes the other one - sortedEvents[1].EdgeType = sortedEvents[1].other.EdgeType = EdgeType.NON_CONTRIBUTING; - DivideEdge(sortedEvents[0], sortedEvents[1].point); - sortedEvents[3].other.EdgeType = (e1.InOut == e2.InOut) ? EdgeType.SAME_TRANSITION : EdgeType.DIFFERENT_TRANSITION; - DivideEdge(sortedEvents[3].other, sortedEvents[2].point); - - return true; - } - - private void DivideEdge(SweepEvent e, Vector2 p) - { - int sweepIndex = RequestSweepEvents(2); - - // "Right event" of the "left line segment" resulting from dividing e (the line segment associated to e) - SweepEvent r = sweepEventPool[sweepIndex++]; - r.SetData(p, false, e.other.WrapWiseLeft, e.PolyType); - r.EdgeType = e.EdgeType; - r.other = e; - - // "Left event" of the "right line segment" resulting from dividing e (the line segment associated to e) - SweepEvent l = sweepEventPool[sweepIndex]; - l.SetData(p, true, e.WrapWiseLeft, e.PolyType); - l.EdgeType = e.other.EdgeType; - l.other = e.other; - - if (l.CompareTo(e.other) > 0) - { // avoid a rounding error. The left event would be processed after the right event - e.other.Left = true; - l.Left = false; - } - e.other.other = l; - e.other = r; - eventQueue.Enqueue(r); - eventQueue.Enqueue(l); - } - - public class SweepEvent - { - public int queueIndex; - public Vector2 point; // point associated with the event - public SweepEvent other; // Event associated to the other endpoint of the segment - - public bool Left { get { return (data & 1) == 1; } set { data = (byte)(value ? (data | 1) : (data & ~1)); } } // is the point the left endpoint of the segment (p, other.p)? - public bool InOut { get { return (data & (1 << 1)) == 1 << 1; } set { data = (byte)(value ? (data | (1 << 1)) : (data & ~(1 << 1))); } } // Does the segment (p, other.p) represent an inside-outside transition in the polygon for a vertical ray from (p.x, -infinite) that crosses the segment? - public bool Inside { get { return (data & (1 << 2)) == 1 << 2; } set { data = (byte)(value ? (data | (1 << 2)) : (data & ~(1 << 2))); } } // Only used in "left" events. Is the segment (p, other.p) inside the other polygon? - public bool WrapWiseLeft { get { return (data & (1 << 3)) == 1 << 3; } set { data = (byte)(value ? (data | (1 << 3)) : (data & ~(1 << 3))); } } - - public PolygonType PolyType - { - get { return (data & (1 << 4)) != 0 ? PolygonType.CLIPPING : PolygonType.SUBJECT; } - set { data = (byte)(value == PolygonType.CLIPPING ? (data | (1 << 4)) : (data & ~(1 << 4))); } - } // Polygon to which the associated segment belongs to - - public EdgeType EdgeType - { - get - { - return (EdgeType)(data >> 5); - } - set - { - data = (byte)(data & ~(3 << 5) | (((int)value) << 5)); - } - } - - private byte data; - - public void SetData(Vector2 point, bool left, bool wrapwiseLeft, PolygonType polyType) - { - this.data = 0; - this.point = point; - this.Left = left; - this.WrapWiseLeft = wrapwiseLeft; - this.PolyType = polyType; - } - - /** Is the line segment (p, other.p) below point x */ - public bool IsBelow(Vector2 o) { return (Left) ? ExtendedGeometry.SignedAreaDoubledTris(point, other.point, o) > 0 : ExtendedGeometry.SignedAreaDoubledTris(other.point, point, o) > 0; } - /** Is the line segment (p, other.p) above point x */ - public bool IsAbove(Vector2 o) { return !IsBelow(o); } - - public override string ToString() - { - return "SE (p = " + point + ", l = " + Left + ", pl = " + PolyType + ", inOut = " + ((Left) ? InOut : other.InOut) + ", inside = " + ((Left) ? Inside : other.Inside) + ", other.p = " + other.point + ")"; - } - - // Return true(1) means that e1 is placed at the event queue after e2, i.e,, e1 is processed by the algorithm after e2 - public int CompareTo(SweepEvent other) - { - if (point.x > other.point.x) - return 1; - if (point.x < other.point.x) - return -1; - if (point.y > other.point.y) - return 1; - if (point.y < other.point.y) - return -1; - if (Left != other.Left) - { - if (Left) - return 1; - return -1; - } - if (IsAbove(other.other.point)) - return 1; - return -1; - } - } - - class SweepRay - { - List s; - - public SweepRay(int capacity) - { - s = new List(capacity); - } - - public int Add(SweepEvent e) - { - for (int i = 0; i < s.Count; i++) - { - SweepEvent se = s[i]; - if (IsEventOneMoreImportant(se, e)) - continue; - s.Insert(i, e); - return i; - } - s.Add(e); - return s.Count - 1; - } - - public int Find(SweepEvent e) - { - return s.IndexOf(e); - } - - public void RemoveAt(int index) - { - s.RemoveAt(index); - } - - public SweepEvent Next(int index) - { - index++; - if (index < s.Count) - return s[index]; - return null; - } - - public SweepEvent Previous(int index) - { - index--; - if (index >= 0) - return s[index]; - return null; - } - - public override string ToString() - { - string result = "[" + s.Count + "] "; - foreach (SweepEvent se in s) - result += ((se.Left) ? "l" : "r") + se.ToString() + ", "; - return result; - } - - private bool IsEventOneMoreImportant(SweepEvent se1, SweepEvent se2) - { - if (se1 == se2) - return false; - if (ExtendedGeometry.SignedAreaDoubledTris(se1.point, se1.other.point, se2.point) != 0 || ExtendedGeometry.SignedAreaDoubledTris(se1.point, se1.other.point, se2.other.point) != 0) - { - if (se1.point == se2.point) - return se1.IsBelow(se2.other.point); - - if (se1.CompareTo(se2) > 0) - return se2.IsAbove(se1.point); - return se1.IsBelow(se2.point); - } - if (se1.point == se2.point) - return false; //Not sure here. Seems like lines exactly overlap each other. Didnt found the < operator though. - return se1.CompareTo(se2) > 0; - } - - internal void Clear() - { - s.Clear(); - } - } - } -} \ No newline at end of file diff --git a/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/PolygonClipper.cs.meta b/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/PolygonClipper.cs.meta deleted file mode 100644 index 2896a1e9..00000000 --- a/Assets/PathBerserker2d/Scripts/PathBerserker2d/clipper_library/PolygonClipper.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 237a9eb53886ee140b07c9b3e311e62e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Shaders.meta b/Assets/PathBerserker2d/Shaders.meta deleted file mode 100644 index a7a181be..00000000 --- a/Assets/PathBerserker2d/Shaders.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 035cbf4ff2241d046806e6a8ee3bed35 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Shaders/UnlitSegmented.shader b/Assets/PathBerserker2d/Shaders/UnlitSegmented.shader deleted file mode 100644 index ebb7e8a9..00000000 --- a/Assets/PathBerserker2d/Shaders/UnlitSegmented.shader +++ /dev/null @@ -1,57 +0,0 @@ -Shader "Hidden/PB_UnlitSegmented" -{ - Properties - { - _SegmentSize ("Segment Size", Float) = 0.14 - _PauseSize ("Pause Size", Float) = 0.14 - _XOffset ("X Offset", Float) = 0 - _Color ("Color", Color) = (0, 0, 1, 1) - } - SubShader - { - Tags {"Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout"} - LOD 100 - - Pass - { - CGPROGRAM - #pragma vertex vert - #pragma fragment frag - - #include "UnityCG.cginc" - - struct appdata - { - float4 vertex : POSITION; - }; - - struct v2f - { - float4 vertex : SV_POSITION; - float4 worldPos : TEXCOORD1; - }; - - float _SegmentSize; - float _PauseSize; - float _XOffset; - half4 _Color; - - v2f vert (appdata v) - { - v2f o; - o.vertex = UnityObjectToClipPos(v.vertex); - o.worldPos = mul(unity_ObjectToWorld, v.vertex); - return o; - } - - fixed4 frag (v2f i) : SV_Target - { - float seg = step(frac((i.worldPos.x - i.worldPos.y + _XOffset) / (_SegmentSize + _PauseSize)) * (_SegmentSize + _PauseSize), _SegmentSize); - half4 c = lerp(half4(0, 0, 0, 0), _Color, seg); - clip(c.a - 0.5); - return c; - } - ENDCG - } - } -} diff --git a/Assets/PathBerserker2d/Shaders/UnlitSegmented.shader.meta b/Assets/PathBerserker2d/Shaders/UnlitSegmented.shader.meta deleted file mode 100644 index 07f63a0f..00000000 --- a/Assets/PathBerserker2d/Shaders/UnlitSegmented.shader.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 02231c64b2135af49a06a478a9b08321 -ShaderImporter: - externalObjects: {} - defaultTextures: [] - nonModifiableTextures: [] - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Shaders/UnlitTransparentTinted.shader b/Assets/PathBerserker2d/Shaders/UnlitTransparentTinted.shader deleted file mode 100644 index 2b5fa311..00000000 --- a/Assets/PathBerserker2d/Shaders/UnlitTransparentTinted.shader +++ /dev/null @@ -1,47 +0,0 @@ -Shader "Hidden/PB_UnlitTransparentTinted" -{ - Properties - { - _Color("Color", Color) = (0, 0, 1, 0.5) - } - - SubShader - { - Tags { "Queue" = "AlphaTest" "RenderType" = "TransparentCutout" } - Blend SrcAlpha OneMinusSrcAlpha - - Pass - { - CGPROGRAM - #pragma vertex vert - #pragma fragment frag - - #include "UnityCG.cginc" - - struct appdata - { - float4 vertex : POSITION; - }; - - struct v2f - { - float4 vertex : SV_POSITION; - }; - - half4 _Color; - - v2f vert(appdata v) - { - v2f o; - o.vertex = UnityObjectToClipPos(v.vertex); - return o; - } - - fixed4 frag(v2f i) : SV_Target - { - return _Color; - } - ENDCG - } - } -} diff --git a/Assets/PathBerserker2d/Shaders/UnlitTransparentTinted.shader.meta b/Assets/PathBerserker2d/Shaders/UnlitTransparentTinted.shader.meta deleted file mode 100644 index 00a13eb2..00000000 --- a/Assets/PathBerserker2d/Shaders/UnlitTransparentTinted.shader.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: d785db0244148c0498e9263bae01787c -ShaderImporter: - externalObjects: {} - defaultTextures: [] - nonModifiableTextures: [] - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Shaders/UnlitVertexColor.shader b/Assets/PathBerserker2d/Shaders/UnlitVertexColor.shader deleted file mode 100644 index 5fe751d4..00000000 --- a/Assets/PathBerserker2d/Shaders/UnlitVertexColor.shader +++ /dev/null @@ -1,42 +0,0 @@ -Shader "Hidden/PB_UnlitVertexColor" -{ - SubShader - { - Tags { "RenderType"="Opaque" } - - Pass - { - CGPROGRAM - #pragma vertex vert - #pragma fragment frag - - #include "UnityCG.cginc" - - struct appdata - { - float4 vertex : POSITION; - float4 color : COLOR; - }; - - struct v2f - { - float4 vertex : SV_POSITION; - float4 color : COLOR; - }; - - v2f vert (appdata v) - { - v2f o; - o.vertex = UnityObjectToClipPos(v.vertex); - o.color = v.color; - return o; - } - - fixed4 frag (v2f i) : SV_Target - { - return i.color; - } - ENDCG - } - } -} diff --git a/Assets/PathBerserker2d/Shaders/UnlitVertexColor.shader.meta b/Assets/PathBerserker2d/Shaders/UnlitVertexColor.shader.meta deleted file mode 100644 index 7f20ad6b..00000000 --- a/Assets/PathBerserker2d/Shaders/UnlitVertexColor.shader.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 61c630180c122d44d861fe528a32f3e5 -ShaderImporter: - externalObjects: {} - defaultTextures: [] - nonModifiableTextures: [] - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/PathBerserker2d/Shaders/UnlitVertexColorTransparent.shader b/Assets/PathBerserker2d/Shaders/UnlitVertexColorTransparent.shader deleted file mode 100644 index 5b28bbbe..00000000 --- a/Assets/PathBerserker2d/Shaders/UnlitVertexColorTransparent.shader +++ /dev/null @@ -1,43 +0,0 @@ -Shader "Hidden/PB_UnlitVertexColorTransparent" -{ - SubShader - { - Tags { "Queue" = "Transparent" "RenderType" = "Transparent" } - Blend SrcAlpha OneMinusSrcAlpha - - Pass - { - CGPROGRAM - #pragma vertex vert - #pragma fragment frag - - #include "UnityCG.cginc" - - struct appdata - { - float4 vertex : POSITION; - float4 color : COLOR; - }; - - struct v2f - { - float4 vertex : SV_POSITION; - float4 color : COLOR; - }; - - v2f vert(appdata v) - { - v2f o; - o.vertex = UnityObjectToClipPos(v.vertex); - o.color = v.color; - return o; - } - - fixed4 frag(v2f i) : SV_Target - { - return i.color; - } - ENDCG - } - } -} diff --git a/Assets/PathBerserker2d/Shaders/UnlitVertexColorTransparent.shader.meta b/Assets/PathBerserker2d/Shaders/UnlitVertexColorTransparent.shader.meta deleted file mode 100644 index 50f10c2f..00000000 --- a/Assets/PathBerserker2d/Shaders/UnlitVertexColorTransparent.shader.meta +++ /dev/null @@ -1,9 +0,0 @@ -fileFormatVersion: 2 -guid: 94d50acc24004424499c21186a02bb71 -ShaderImporter: - externalObjects: {} - defaultTextures: [] - nonModifiableTextures: [] - userData: - assetBundleName: - assetBundleVariant:

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∋!HQ3j;zTh-)9`Bx_Fs;0GQ7p}X<-$CUK+e5D>(8qFM`ishe} z2L}iD$0yM_8%*$sh(Xoy=tGHgVcHzlLK+%e%L5O$3?CR3vnlxai2nTfQ>0Q#MbE(C zyppwFX>f6!N@r|r{PnjKI=jtR!TH62wKakB$8+KPw%HOb6-!PfHz4V@`((M^!@!VJ zibkOjFMam$`$***)ELY4E+`Nk6Ei3f1|dg#w&c6MIt@2BUgcU_-+ZNk5)kflbBRWJ z%}x!Z*=cD%sK>L&x$hC>5OKtAtY)2VG6BSw_j!6w-4UP+Meh4)N{2>*9$;QE{uZFV z6YYMszP&x5C?%sH(OhFXS!5JM^zx!c%_u-}NF4EBxZg%%smJc>-K5xOIRo8s%e&8_tfTZNlivlVj%qsQ4p6&zA)-eh&>fdV-W?H%e6sgqVqz3A27$syeTG32=(ra_Uuia%pJ2V=a zDbd38azF7GqY$oDw*`Ur6tl(7^!Ygi&N993SWF+0JiMN0o;y72t+<=)W0loMooPnYNHndo#^qae+O)JcI)V%sxdc?Kk^Scmf3U~l}3HEI&C-Cs!MZ4 zM$k5zt+4V0T*}{{1)yO!mu?8FYD(TKqH+=OIAINIRA3BYKy~h1nTH(oT^`%7_Rrw6 zVdH#&{XKuT(Xm>jSDG}m=i+?V321{&ha*maKNA{onOVAm9Zjk|HofbKRTk^9BgCYn z!}}~?(teRGDP9D09in$zrjR;K)J%Nw7d_F7Z)jw zhUhUQg1HVpNJvP`HiL#`1}2fkY-U^g7noHvO7C9RNM{=kwhD$dtA}vT+S?KuIBciz zj^-Eg07RlCeOk`;ah%@7DbXl}z1vf)KI;?)RxSVhOOx*o29NtO2*mAujmN0p5+$iH z)_s$#(YHjvIh>rQF-{`0?0dFM>c({fCcO*IoVv>fX6G%~q2YP_5{6p+Z4seKz%RG1 z90);8>sH!fn{gjF6yt--M1ru(408`TW~DXG>y#3Axj)6Qm>~~FV~GZ z)pG`ul>9*53`jhR^}%+0pitUh{(Z~|C0X8SIRl@@1>gKE>^q^>D( zM3!$8LW$!~fats-;D7-U2~?q;EH!lf{yc4X=75Ngj}P((h-C8t(>ypNEZ^lp2K0M7 z$Ve2ZV2#CUa8mH*owYWGE-F$)TbKwv!~Cj}YV*Ue^eU~$}!{gIF6zI}gxDr`sXF5Tpifl=7&#eH(mCz>@=%BHgo}CqsJzcGGOGKtsrK!AZ9(cRqLLuc3r3gW!{5XM%%c$SI5)z4q zcmLw-V|ZqVM98YSZB0g@OudJWn@69L?l&&ibl`A=+wgv&-JKK`nUMT_KAl=gIA^(b zu1LtG$ICAAlG|}qvYp+cz*_Sa?!;B2;Ks>G(9ch@d4MVriCei^<#jn+())aF{q0+@ zh?$v)dLV!o2&t)`Uy`Sx62vIF?!mA92EPgsDl31~a}aRY_yb1`0&??)(9L44g&|A8 zSF zzNhQIaeE}87G~wb3jP_C(2Dh{o_Lc1bOM}E2*E3yXj`llkpqY3=I0092fr^{uft#U zd1ojyPuI!3?`&ACY&{{7$rBYOxPU?`@_7a92!sjD$MuA?wFwY#X#87Tt@2%m zlOT8xBqSg{dVt`Of&O*udA^ShvXq|&mfdQFi=L0@gvT{B`h>tcIszaW4k=HR+RAQh*=K-3=E9Pa&vnkZWlaDOG{>UcCl><{TE46Kx|p_#Q?!kms-p0u<0%_MkvFtc&o0CMQhpTjWKbVFQ+eF zi63Yd>%T9%LE=9)BZCYl5~A=4W-7x%kq-fF?fCom@6NF`sI08B1d^lue^EH)%U!Q? zw&8uoSf6$A027TCm=9P{JPtR$Kcg9mro7#h6ccr(gez68ABc&GHMO<7>kNexUk2}k zJ?gBMq0GlJ!vMwf_vfdAd7TQu_@6%mp+rNCrV=dS;o*a0Vo*xdivuAss9LNXC-u>x z$p?->yHVwPt)AKRobCQXJugva2C!U4W>zKMzIIF7tGoxJ-g?9b3$g;$#r_cy%6|XM ztwIEyTto`(_&07ggP7M6M!6GWpgnuW)`U;C^|HZ2fO>GeyvB#jZDa-unQ%rD$SorP zcYsuacuOBRq@kKhJS?o>KMczobD6E(HYST+5byEpj~pZ|)C4%0nb8`K=C)^#<{`O> zZEekNH-iSCeNSg62*4S)TNDT=t+n}-Uf<`Yb{z~B(JYvw!+Bgx$?p%N5VJ~ccL-uc z_TjPlQoLsI5F2!O2S|Oy=-7p)Cl?fE?9@RPZk?VgF>Sr1OiEKTeGSAp;Crbs(cIsQsU*eJa%=Fu^czG%wVMSmyIUl7x&Y1F5rdv4yYS${%*s^8|l+ z)&I!R0OWVyd#gC-4Joi-PzWQH7cLi@%y8p#CX6HDQ)-n%+D*HIK#lfnIxV7=6?;Tf>8k; z5yc-EwfBc}@gC9|S4^-^PcOJI2Y^72lUt$=(sjgn6F}I3{3}^lH0^4&cbrqPn7c+S zRW=W|g2Us;np(Jf4!Zd7eZ5fu1`YPFyfR6qpBDk*5ATZ^(cye)s7$xcHx6N(ecK?W@zOmxkFWJXcsixKdVkgoXE}NXFSkE zRlwnhWolFu5)uIq(J4t~PGMn~sVolp$4*qHEP>GNmsa@emneSTMo7#7J`|7BDoQ!b z?dVT*k-8dBkm*!HvCKMo>3l_xsN_MOStRb5WaRE>!je*%g%UmRFzr_i$k+!-6*Gx9 zuQy1Z+Xc7s_Xx?aj=TG0X@eg9*+m}#%L4MBW6**804&lr5H|N-e!Zu}%V=0wQRTes z=CVxMEvk5YC?wnkwK7%A}LMary3t$N41`_7dlE}xY#-{2^mj+mdiX; zD>Vjm6fj{V`$~5QM{jryT=QVR54}OWjb8yp45Sn4X2)(B^@k0itfr)XIQzH9S2VfM=J+Bb#`SrJ6ZQ=M_-NbUv z%L_ALHI|P+RVgf7z4FVoln5blol}+R*tqx%L zje3?i;E^xG&Iazn;XiaAU=GDD*SPYw`FQ`H?;R)f&2B@(A@b)%aqAYS-D5!eX)l37 z3JYY@`C$Pa(b;;)c$j-ts~gO2UnC`fqtKy9qPpH~Q&$;a2Xw$eV2q7FOjDy{>=(ND z_D2zX&d8QYq@|$e1`VM2fTjITF2xI8!&}PEj#D_?1%6=Dg?cp}hg|IL-DNd7>|!CL zq>wQ%Am{f-seI2D{P^)b`0gMK09=TqppGSxkjfz?5%lz@R)|IWw-*h5O9O$bYTY|& zm+RA(ScCa%x6nof%`a610xXvY_7w+YsOp$YVuYep=ka&Mua$PhKuSacaCGnO5jH{QS6-Pe zEcOOw-cZoi$QAi+#FJ%HqH)7>^R-%r1BsLa76O@($#z<6nQvO9b7i7{_yeS>!%nvr zyX};wk=HQJsN=y3z;fR*+mWPdvY;iXFZQOSHVA}W8P?k6cGkx3Kdm&ESaJYs8a#vKYjNQxq z9#!R#f`YQzBb7aTrP_yAm&Z@NILmpJr{3{u2^)+4E9k?A2+c;vU;XoHfRW02mx=Ur}COe3o_&@Va@-9*})l(K0PtO5HQrB^juF zjNRP@usN>h?LG66jw zV>IZuiULyxfBDxZ6%7sCU)1uwc`#QABy{6_JD)+8U*bRey}>|3_t67#g}Bao8a52| zcv!8taC~j8TRt7IkX9>q{|?w3hLFbW7n?{BcgK_lX{P{Q1G2Q*^%pzYAs~yqP)TTs zAkwQahBTnM8XeHCEEWs!Muz7Tljx=MWzZlOi+LPp^HJ5s7>-igDvMXX#Od1{GGoCxk3=j{z$~4HMH?qMIr)P71{x?wzEmBu zqZCJsBDG#im&^ni2nPu@JH1?r{&KxDwJx6*!On29%0eM<-72sfHWk$aIxcA}a(ZJC zzrOJn*G#zzAyn=|Jw_|fLv-bPeW{e zF=Yz+jc?7%gl1!za6(I!>0fLQne3Ft@CXRDVuCWe zksSeP4nZo)FjQ!=QHR-t@Z6zoYDJKgxhrFupknb%u+&G9D>M0O^SxW$%GkWID_o`! zWm3Yq3Z+LvB+w_>q~5ZF=?SnwHW8`dmoNBiX5%oR6dd~Sr^e$8oilxzmj<4CYltV` zpDNDpKI5`oqg}~atn+2)kH#-|n9c=4&7sLrZ9j-!uS40im^&5lZpX{*m@2QYvbpTB zB~DBiA3kW-$}FAz6g;c(;n#1+c+@tLjO||262SD)W3fTSPOcsWiECtZl}Qokp&S#N|TdK zZ|Ct-CZ!ssp|X2pIbQRO%&f}KHU~#XCf9@L3+p3_u zyB#l;-+BN6QdLJEv3%=hG1U~$%t&u&d^wC`PnGuu3%l}Ju}sS}Xh#;8&Lt2UI>_Pi z_{&HJ8}6ufz3}3XL>Bul3V=i{Umh?qFhZg>_4&PM-v9bHTd9Go*Ge;gu3|p<+$@uc zim!EY2dKpYg0&^Lo-u`ei_tU|y%XcSX{tAdgmG@qt>4`Z&kxZT17~2UIM~2^u&>&8 zB&}PaNec0alQ8WBz$W4TIjYd9)wU&TbU9GQ<5VRm1AFh3^#7z9#$g({H5Q1(9nnCb zA0Dib^cE3`fpccfXN3y}B(~Df%FE>Qm)hC6jpX`I0L7fG(an`~xIV==Fqn^LRNU4p zX0v|Mah1BVT7CcE`6xK2`!;#nK818#qE=!tfzW$`_NdTAVA+GFmnxT20b~e#gc#k2xoSwa``g=K)X!Wd{~Tv2-Vc}XO$WK z^@#0(k{6_Roez=8A%szgyW>jBYvNaXR^AL@F+|v~{YP_U>aF&RHKxoSIdz;z1;ZNb zYxLR;->R3!zq)B@YUVia%6}>xi1j)@HXG_aRt489;LMANcKE+ztJ_ zHixyb;hV2j<8Wi|AbhEMN!G;&5a7;m-|Zwb8YnHeJsffbhlD|c zcE{868#wPOCrZsx$s@KU!8fO$Mu_-aAIn6*^p8gx8KX#isD!MVCrc`zDvOS5SX}`1 zxK~=r-M|8V&lPb^zb9}Qyl)?0AHpW6-CW$%ml#XGXC)LZ)RGC0+waK7C3aNkP;Jn(l;q*qMr3*f+ZAYOMQn~gAg&CB?# zf_Q(nHcYvSmVy-{y}?d2^D&xz?qC?%9Tk;)ShwLkn@7twdA>qVr+#_JZ0-O$=hm*H zp^5J$OMXJ9Pb7r(;c^EPhX5G`MV*$3{0Ob!_wSA4FFPnoQd01zYknZm{(5EXR5uqY z8yn?NB3)^maEZ*-pDCCWKvbv^g63yu#g{p4*-0cNK4Ms|G};^-8^i*}$Km@WmPV!C z01%8JZ)?L0p8vKBTSi$=mP_nqEs<@%?>_3@H|K}S5t*1!CYq{zE73?Eb8v9-je?0x zvUrhD|JHlwW<7-WM1TqH9;*TJx6|XXrZ>nhEv2LXSXx34Plh~%3b+7JmHQi1-O&OJ zd2a5+ozWn~NuNNqWE z-^^17SXfy_hIdD2Pc=$ZKdY82i=W)Wq5jV1qAQi5t-amhuwHuaf9*QV^!j_|bgmqj zC#0g8oh^9E?~&tx!UPE6-}X~|-~4oYC<;%_$6S~>IYnAI%Q;S$%Ob8h{uCDWP+sxF zNm(xpKYRT8nw6DB!t)kKEG2er&+OhMLcXw2E^A)T*8DoU)Hs?h;Cy2>^%}F+>Yl=9 z8!93qq+hCE|6`&umD!S&C^Ms8ds|DL78L}0dz79(;QM?nz5jG`xTd#_9I)Z;I6nd!90!h5%y40 zoO@;ao_idmneN)S!3@6$C(fd%Q@7%a!otE5@P>!{3yhPN9^$yD`@1d(@@JQA2Q&@A zT_S4m)58-Y;yp+R@S$G;O?!WTztvkjox<&#(QTrb^@T3M1fTO;_*8W}D=w6LxMF8# zZVz@tK|ujI3%Sz0`}O=8$3Niis%9rC>FK4qA^OsMJez(k zj$)R;uoL-YljdloG0r^Ned2hV)T?vC1Nf545UjV$LuBdgUP_wdAtc= zhdM(?b*jEEyRjD;pqA@2h&|ofPUdN`8EvkugvWcmz^KwYeZIQbrry+DYkvdz3brwI ze4?V@xbgb?X;B_o9{Th|hZ9o!^}fGXO5tbq8?&h!?jKEc-eWS{PAcz~2gw_oY-7C= z6VbnrOioVzWsMvv$$LCQU(D;@8BQE#rL0sg_;K!C*alAkGMZdnNYN}9*8!A5$0uLR zR|dbHPka<2o6bxsHNQiqU=pki$t}l_~n4nWLPlFM`{4LnnP2ba# z2V)CtUPJxS_w5S>8y(44q(>bc>kgLqSvQJ2zon@ix@yyO7ri)$zrT(!`TkQrbDn(_ zjfsApNk-jZN-QzHC)9Yafg(__GBr~G;();slYkO=Zkz>yAMceK(Pkje{qK?SyiQ6TMgMuX82-% ze_sf&tMdjg(U(p;H3nh&(;c5bf9_u2Ra{$>@ks#$=f~mb%s|#Bc}TsU0FyEbwcY3U z-awnjMK;g)ck)uPa9XEjpXcXb|2l7{@tDlkU@Zhz$LeadNbveh{Ebg{4`oiwAC?Fp z#UW*MRhPP@3oA$!ro66er&J@Jj4Me+Tn()F5yNPILs+xM28K_+y+6It9(xEnR8kC{ zjqdU0(bXNT{D1EAa=2lfvS^Q;nS zMN%VhnO4uu-vS^tXh6ofoh^oaigfDm_(}W0X$R(VPeTt@WWlcNduvqIT4iPntztv? z*RFRkwYs3`k>e-%zy;F4eu{W_QCQ?&g!EaD*R4-$Uf(}|TObi6Ke?VQ(kFI3qEVEO zdZ1+p!NA8ZsQDPqv;MQA_}RxT=mg~JNnTdI>~4J9_RtN6RA7`pF&L>2A^{8!*@7tA zx6tjN(CbxJBlf_Lmr6J)9*sy9RyN5m!yQdD{Z*t~tSrvw>eicZz~=b2Df;c(w~f>z zXFg}27*|5BE6B^&!qGw9oXaG7e_t7^BnSKcxMv)CZ5SG$*#H?Qi;ec5j2fW40b*Vq*gKR%5nqYtGWr())8qTzqcvb0Zw= z>|*sLYG3Q5&{ME!Kgxk!eO}*HuD4CzfBB2DXe}rAoYZrcaK=@$wFO3ftw|%vP)j04 zpA`J-w(7ZH#<;suCG4Zy;-GG8S?H*HG+R>2!Q>KPM^z(745#OhEuIoEgG>otsO6iIf z139_fhX>r(6GqLi&VD^JBXajzuNedV-fvo*rQEzfRp~uwuh>j}bJ?%wsmzmzG$-eY z|HyGNrNd%n3rbB*J@;|h-1^kp+g~EDNxg9)GQ4b` zrp$&ZmJ!L@<-L28kVs7hrQz`Wl>Uh*hF^kLhfK^4&sjPTQE8Ky6`SOcWVG(;KvKFP~KE6vhm#o4Z~K=>QN>WmxSZyhs&IxOx8SL(6t*(B^{q z?)1Ajj-mW>(#;dIfUr*vVO$bHHP{imtE;QYahe2`IP-izo{}Oz4-JzrlK<&;doGjL z!Pi4@pjP?^){B0=u3ozzh?)65i-q5LN!4Y4f>CE+ys%KD{>)Tny3>E450zX6GG zzFh4I4^Sr}RqbAl6$|yYkwYP|j0VlL?^pc3{nTOud?XA$K0bkc$)LGD9Vzt{0d)zu zn2gdO@>vr0@li@zTDbO)d=;cE;_0QxY?Of3FFSL5Iq8Hq*zhT^*_qjE7b%fV)@&>_ za^8OJTdVvb-o9)t2Az7DKd}y%`IF-%zMMqpI(Sc6S%m|()G19%S}Z}M!DcxC(D3hs zb_3^Qn332EsI?=yy^a~Aj|z&4%B_<4cl3s1xGnVQ`z=U?*= z)aK^iarjkg9GnxJ5BP9^unxH}ku-m*?u+y@=v^I@dL;Oza_L6pX!rZ~Z>u#%T(ab| zo$KLerPF8KRgV(=$?lqY$7^uVw44W|i-?8n|;g z6KHRI2zK|z*DO|R3YL5XcP`!)e$TZqtGc$9Lo(jpVmGT9G>=bU*2pr}Y_P$vvzmN| zN=)o{Iigjj+3>!lrG?v3W(glqo;{sVCAe~|TwIdhRI#?Uwm9YvpBtM!b`YkfrpPcN z9G=g~>rKClyalx66tESFP*M5zBr_SPD!3**Tpu_$#8_HdMqHQ-7y^rj7TM=Yp|Il8cw2DZe34CJMmVRNx>b^ zQB)L@6wkLknro)b|0-u!MSzD_#1hF*#{8t^CMNdXbnmo1rPYuelw%f6(DeO<7U8dH z?@y~wBcm*y|KOuYzP!VTc+a%DVpO|?!$oXI{*fJvPGi}4{WSCYdc^Ze#-a-_{Z!=`K}UtTa!6!) z`O@lKe67}-&q!=4DtP$#rf?S<$kZJ<6$iLQ%R_pHR_&BmvBA zp4U7hq>Cahhs8x|3`aKcv$h-$N=(!b5fPER{_&J8Zp|BtFqEdWmp%XN zskvS=>kpiGv!3O3WfcbjI7rv_+L{1bgcxM2RDp;$@N#EZm?GZrI2b%Lhjn*z14B0Y zI6s4)Y>;y-2`S+Ex-}KNE&=(xA-rpxUBYfhqld@&g+zdaT7$FJQJqKJpIKRQ&kCY4UvzpY1zQ9uMY?pT%t;Cw;O((lgzxL>*p1?EGA82Fi;JQ!QrgNM_Z4Cbw(GqgE^{Sr z&W^1A>SKZyc%Qw&59asZZXZCSFCBYK`esK2fJqXSLilA`Km1w=Xs0gd$Gwuwn!7Sh zdYrLRo*G|YC``=g2sR*E00F2Rmyq!O|2E=V>h^xc1pXOvpp&NC;w^sP3=Fv0Q$X!< zk4vI5iys7X<2t$6DmYAB(aYkS#rroyrNyvWG+0D5U;3;xe!3bwqNufqq^6t27jkrk z3$fa*C8K38?e6wQOP3eFs2!)*go{?WbVY6316~SJ&w$JvR^O#JdDQrs8Ma?(Fq`xM zkBB-@y-j`9#*oS5h6X!##A&CzoOMGuV?T^SNl8hbPsPvAKM*@VJBw{s)g<6o;U-8- zOniMd4+lD*8YP~$U)ag3SB66&?td7Oy8%;0iB^upJVj83D0T9C70Jt-mj9S zTT;BVl`FSqa~>Q@!4(DwcUj$i@x4?{VoUf|FJJrE%9>+uK+X;BHgipi#4nwyb2Kq3 zx#@roo5?yeuNa?wwT+{GN>7;$tQHgd;<`VmB$q0H39JI7{@!(}9V6Qz{Sjl+>oB_o z|H&S3{L~{PBl3QG=4v!=K0qu~SYPg)wTI+1pS0Y3u>!}(qw|=}MT6hY(bqgn6k-5O zUuY0byUAuU5O6tL`Xp&P!k|S;1>iSfqs`x0mdEGUcENhjlNKTag9rRBrT9a0>)rn1 zY4eb!Ey2q>)J}OXIM9?Y*xSta#%lI!shK>evrAOc*U~`LHv{i??s}uI%B{>RKnuC! z*?yq7n1P<|9>?9|?;xRp+Y{9!&yg7Y)mFsqjT7FPaYIKZ->77}Q_%07PtL7tIOs}t zEE@_4x>*7tuF=|66-tO#I7LjPIe%x5xD55$anvjI!a&Uj&Vnrt7eASOaPG5A%NZhf z$3p=51?dQvTz_qHKJ)q$E=CdXQog*;Yxp(hkM(QRVd^51lRK zKpM$Fpu+L2o|Om0*}25=!9joEMhk7WUYrJ|Yw_|ASdo2IdaVkUUaBtakH|!2Rf8(} zfSKwI{O$||5)kOve=#QwS$y~R?_WrV|D4@I5sQk~*fY$z$BoR18$_qc`z|6yWc*C@ zzr4DV^biYvY#7NPUlD_Jp&Z*Sm9BD8apEkypQ;bB`yCxbq&n|H#pzdalyv#`h`-( zdo{p`H`uL5n9|v>>!)Mv?xwIi@_`QItAu+b$mHy3?Yu?anT=!xshE#h@hL3Nl}{F^ zNP;@6F{!I9{<0d$+{XgzZ)kp&a}lcRHZwZnP}6FO>W;c|H!mtFIWp9ykfvHm_40b< zQShBykFHb(kKgG%=%9tfq+e0hD_@!-zH{=gmZqGBgniyG0XB^ru2)DQW61bl12}&yv2@q?^I& z?U}6X0Y=4yF~vmMIgy;(f2p;L+K6YZoc8(1Al~FfYvZLZ|@F8opf$rqNO^kf>}=0Qf=&IPWxU+^C1CF=xMvJ=-;28l&13D2L^%3 z0J-&WMQF0!QlG+X$qM>+ka;Emev1M80R=$S&|xT&eWt@kN_oLmQX2(V=1!`S4#WL7 z9=nGKes7?Kg$f|ob@mtYc}L_%&re^xGI*RN_JbLrdr8+XlNfXamk*mRWClzf8pVSQn^9b zbT>!SaKjoEB2pGKbG9q*=l7TQQA7erVX-8`SGRI$+$4;O z*;`u$!wxP^5{YT`N{d4X{rwX6*AHwM7#K>e>I{&ADS)>ypn|12Kt6RQ+433!T1UIy zCV+Ns4zj7M>&=(dED*LT?*&9%j(zhd(*81BWD-538eX9X4q(ZbC|Mcr?tWLO zK-5R-^F+zXhyuPliG{s6$`x&OtE!?2sH<}c4hh*TNaxMa(~V0@`++Ih;V1YB5dAs1 zl)$0{zoVk!c0DfY&Qk_4yIy|eb8-pJY=`EwSqq#i*ZJV83T1dbxVcc{!;66lHoC0C zZ}Pb#(dM*AF)^WR^L&9V9Lwlxw3o(Xv7w0};;p#lh{fZ?iq*^7Scv%LvHM8Gam4Ab z_Q^6eZ9Kaj(DA58Ly41jBtw&StRB*1!WT(diCb*Z7-Pe=4(4l_n=Wjvf>= z=^G8!1rC`kIOSfvFo-fUAU$|y%1wb=*9(U1@yc-j3}M2DCHm9 z2!M9D-)H$=)uY_|;-A6re+&o{lfq_)HH-(U_w&r@) zTS1-_0Q7Bb0-ci&EP+8mkgi*L{hX%o;}J_0$CF27$Oa4GJ|G1OpVwz-NHGc!6x0e? z5J<&x?_vObOQZ9bXL!K-+B*pHDw6B;>ukkpRnHPKp;CwU zmpa>30<}_A$h#GgGUn(iu||cSq_Q#w5;8K2{jFTNKw~9XaCgig{Giq>UvIggNTn1< zCaDh6Kl=_k$YJx+l-$yI=r{Ol)7M-g!LagCnI^BcZj)qcZof?m5`L#%`*yF~nndiW zsp*ZQqcCd4?9I{TMsDY=6p`k^-O)7T+o%K0RwGJC7q;7r1Ri&eU>Ti;#Pz&|Zif@H z{aObMS$kKz-KbT0M)L7sG85@owm^hiX6x2)GE)kR7mC}-YNVYWPrmM=69mV^#NO+J zeIg}ei6B1j3!6C&vH2)1p+}o1ax%3d1Uvb>?_ZvO|0$r&$aXGNpvlOl2tmxZP9Cdj zwTuOxq*BFCj-f<4L^hQJ&kvaW(ZXl?&8?QRjpNyn2_16S{SbzJ?8y`RaR2bIeP29% zf4L*Odocjn#g&OYnaSl>XEgXBE}OIoB=aGsP2dpHtdjDRj-1e5QsY3z3I0rtDUKB#3bZHr4yjjKx3(c!Y~yuxKdLqiM4<}3yDFBHF* zOPHmwibsc67(lr2Tu4cb`r$nFv-9)R6hm}KO~2+i>}Jq1dENZ;uS`CE`qTvkXTAI3 zsGNMYMVGf+7CVdL606fab4q%;$!D5iqlll|I^+j?lX=?^YyEj>pwr$ z7MIT%0=`%(W+P&ThG=c=J{u<|ls15}(K-mu6aUe9u||wU{DmM!Va(%Tmr*YL7YobZ zSZvwkturvyx9@E@qv^Tc4^9Y+v!Zb3nLb|!N01=>n2=Xqj(eqpgM$s%1A?rU=?!Y1 zH6Uk3?u~84cDz7nAS@;Z0e{ZZ(^IqA`*Vxi>2>V;6;~G*hv#$QnKC8fbWVG500srT zpW#8w%*>rtP)RZb#?l|RB1w`-17V3Qn zY1PYeuJPiff?vGc^Npr);89Te2PaJ~o)1hkzcCi6m8b%XHl~<`w3OyRi9XPkW)h$Q6zC^Rt4!Wbi7hdZWuzsR%zCKm1(-Ox^wHgZs>RHl& zfIzR%YY8`{(=c8S5S5aV3EXRS2mPLRKKv(LrPYB%IUvJUJIfHP``f{Yo4+kAwRUey zY?n+y4OWn>oO-!P7&>verqn$4RI}RVLsEH_u#;2GRP^#xf$Zi?b$*l6O zgm-JOIj8)aSJq)cK$Kn8hL0<8>Y=S|=5{fh%P4KlhH1sFb zU^404$OR}Y6jH}S@(~pkg}fs~5ie!ZsplJDXg&A(k>YXZ2QFRcoxZ*ZKC#+R!sqCq zr(5^}p1K05&2C8Vu<;gGfp3UhhxY@s$srbGZ&YL4$j}hzrXYEL-mlO1mLe1$}~eGwrjH{rNk0&#fl>w1vTW-UOBP^ zoW&ig9zCrE4=??WSKU=H7jfav?e}TO;NfYeN@2W2#d`y30vGz$mY0UL)%EW7wC7sf z=JnCN&amkhluD+&kUu4S?Kz8$V+r_3Ms|GolCk|ICAFI8uJtW)w$$6b@p%r9X`KbyV}1Wab8|t z_V#!0IHh`f*lIV1MnqIMQQ>7jKcit|BY%g1(M(Hc3yOifOY+b18OqXc-F*k4%LoAnD(hJZ5;lec%Lf~lyE4&vOLI-bBccsY6bxcJnFu!7=n9@k^g%Tz|r zJKxvW`^yl)d!BDq>Ajj$Y^>+|lO~|&R1#A-ypWx}z3r3MJ4ik!CE;k-S&WUuVU!uO zaBv7uP_H|U1IgE;VsHN*29EN}7nskVi;F6iN&ocsSJfWHbhLZ1G&7YRPX40a=jw!^ z$3g7!C8gu=c-tyKB@yt9V#*~qEUd{bDuM^x2zzZq=r0ok0OMJnc6Xf|pHSYs^bEv9 zq;o0$?lBo`7-;v-E-fL9mX(V)P=BJ{{&&FU@pQ^x!%bviZJqC03QW(1nSjeKDmeH( zfQQhas>U<&`mcJz!cc4NZ~nc#VixQ(LRV&^DY~sH<|Ew~zY23o^Mm%!(IRX?&mvZ5 z0&Q@-iO7(~!kTI$<-aZ`lb8Ve2L-kBpRObbgcD<9N2fQQZLB`s8P+b2+>MURVDTTf zA5!{xrCPdK)BM2 zi;s_Q`B6|+h35PEoL3oA0Hd0ikoajgPF_x?yL{RG{P2eGW8rTyK_=8R?KEai_P}ym z-0Nc_4ZEA5s-HhGR$6@Exa?LXY;5RNXJ;nbQaSpg2w+4-p~WO5Hdnn~VbV<2J9d;G zAwB!2+f*P>7GD#!@=6q%NXho?s@LEsdNztEhNI8j)|T<^A9K@JJKsn;jmq4nCOqVs z*~#Tx^N^>o&`=i3o=4uBUrkPIf`Zw_xl=>^ux4g|D3+mv0@1K~72&ox2kTdcs*8#& z_%1F3{e*-p{itDvZVtN^2GLe+Y&U1dl@8ZoErXxPw=5zpss-D zs@w8EicB1E_lL8UsItz^+&9h%kB#)ddb)z(P@zD?OO0Ux!YUC@yE{89me97^4Oj=` zY9DF1@fy$8dI}YNfk$UptvN9@6&Moo#gmsiM{k)E_(FLZ9yPY}|FHI!VNph1+wcI= z0@B?I(%lWxNSA~(NOz}nNJ@8#AQGa4bR#Vx-O}APz`Mu$eva>XkN5BA4-OfwnQQO0 z*E-jE?!DGEKS=pj?@o&P?UWjp70n1@bxt2I{&Y|Ax%a&9eT|2Q*FH0&Yi9u9qyA{2XL#Q887?jYqO>#-DY2<| zApOkz?E4kRr1#)#Log>YiS>EjiR8es3;Nt-KBBIzr|%^ zTWGq17)eSc=A|LCu&}rtPGUQR81%e-L~Ztcgah7(|5gJ>Qcml4kkHLeV|-Q+Iw4!Z z`%IFgwZfiHAymbc&W#4?y1Hj)gIJ`DNx?;R7cOqWSG8N|JZ2;wc8ls(&QN_keEg2) zH;UaoJtjdKVg{{Fl?n&XpVM^?l?$Muqt|$K_*EEP$@ZwwEKlt>o;e>MWAk6`#O~?5 zym(3-`b-jqIy52rcR$Tdfjna`EmeQ%)5tstDLMPHZ3Dx$6E@4)y|HoldUuPnUJMW} z9jirs*rcTTr8Se`(V|&jg&r)m3FY;7sJ`ZacmS$BI^%-nE4jLFu9r73mC0~a^eoZvhs({8JNXmp;Ub7C*-9VLdJlVqfxSJ;=dv;hWo674FJ7RaJncSR);4pr#vG}$*E3tc zb$9o1l~Yk6#7<1~dh8%lhq+5|m4JuqzB9MTU`Ea7`ZI``}h_I9<|>cNg` zFklr8MD3uOeh=_Y&M-m>=v@IUi}&2Mhe0>Kc4@ zf@h%F|Fyj&%FR^~@!{VHx+*FxRz56-Ukv>lE{SP*@y$>_2vnlB!y&{8+Ara@XQSVj zn3PA3&ir?4gO-BmB2 zF)>Qis0}evpx~AAIEf>$D1sz3euecw0!*4ZJ0+jf(ZPVN(SS8NI=bDoW~})Q7qj8_ zXF~Ok(g+OFt^YM2aFZh$u7zJJv_eA23=9nYzlPsic7=~kO(Dkgl{aBFD|Mx5GZ3zGG+qhShQU3QulMoUo`v3hVNgD`8 z1MdHR6E#l|(gNy@yhz{)PAZF?@oXnj)!VkRJ*NjAFJTJN>wxZ*FVidDhw!-~fpDy8 z`XzO1>+84sYGbkvvNl_T%3z&+1Vd^IR#~c*-zz#!BM!qtMNRxs#Uoz zVfJBRVP=QHVP4nQs9+9f4TXg?GEYgPSpw}teL|4b=V7hZpOo_$a1@*B?453}InvXK z(&m@j^BLxT*vGhTv8`N*{aI~aTEy>_|7WEDyI%|p$7ff_knfJum>^`!r{1c&a6%E_ zArNvQx1jQ9g&$^6?2^(_K=N>aLz&joKYvaI{{NbUuM#$|4?{|ubKe>o8XQ6Z!Ue)* zt}3J4?BL_$n>5@JF+aEybG3i1s={JYRD8+ENW&yVD&%<-=6@vGKQNLymwMC}zx{3= z-qbSwM^OBhS+#`1_zhT z&CMB?l2TnZRFW_R0e3tMO~_lCd%Tabopyw*jM6+F_ad+6A)M^olXgponLR8RK_IP^ zVkUD#vpDm=hBr+6Bh|pr!<(ChJq~8VL(}E1?^>no%!xLKSH<|axu4?FtE9|~sm_%3I0*nFN0RxQU4grXhI_NnG8j`mEh^;8?V@xFjUI)!(awnw$Mn<``L7W#rzy zRM(gV$}l3OQycp8JS#77>rmwH#s(b3QYnjuqyBclLecqpnpWz1s$xp1So5|!%NlD3xjf_MAvz2O-$0Z^mnUu?h=fQVm%!(ZwV+TpB zV{8mEr>CbC#{d@j1Qm7V#Oq!8@)ID!wQM2=H)v=$ajdO(-c8Dp5^Qd2#g$b$eftLE zSiC|Qo0gw|uxF}Q2?!8fTgQDyNQnjJ$8BG3L_b{%c@)8lkA!69Ah};4vGZ_9-``%? zh{OS$2@MaU=1GYS$KWxxutp`$7#J-W>K}R~C-)K{(Nhczn++d95n2Rn?8N@j(TK!? z_cNn9y4t+&mrp{OO78-o zx~mTsIlwD$OO>R|5X`uF*=3rP>$W$xL+i+!#G7hFW#aQ96B1OTMn?w+&Enc@M@2y( z*xmWkD=}A?Ow=Ke-Cjy%Vdj_^o5qm~c@`BHzp@bqQAWh!!%RX-)b(eC!UMC#;8Zhg3;SQ< zH3HtPoGloeXx1yCSdaQtY3O&Et>^jvI!aa@dHzH4}mNDyL7y7fe%#Z)oR-`!#}{mIk|X*wI(v`llj0*4nF1$?z@95j@-(Rqln6nDJ_v-jv_8YoeGXupTt{>(-kKPY%nC_h7 zv$J!^?p@}rjMY=>eRn_}B;alE+Hq;z0_w5@FoS@M`XFz+?(G_-tl+>>krC~+#f>X> z7X2CHjh*HAiHUn-uoJz@^NV9#ie-)&Z26F4qEvulvIe5#0ZJ`4$7em7?R$3z(Q@*S-9{k**%g8egJ98 zZtfd?@22*UyBV0FG4QUIyT`I)-PKiWB2H60;JHO0uC|wI34sTgEH|+&HTy>Zd9mr$ zbahyDYKudFi#ur0<#}is0oJ>HYzPO_|1QcPP(CR&H*SMTrvo_hAKtI9cmA9e5?}7e z%lYZS=9%++A4vG2JyevZuRtXCs$|l*EV10#r}Vo5*>y5n(DiPy6&L1oKV(&4P6xt; zy{@|V4|!k_@YT5^bbuog07t0aOGr3Ta6hT3fhH4xGyz~((!_)sPzoS{aogDc2H)tm z9bzSJdHgsCF3oDj#>S3X8O<}Xux2>nkIxnEnTMrbMM4(l`o*m&+ou$~@MU(q5OE-o z0222P4@=WUAmr&(akN`Jop;ut*s3MKA4Iw5;cdN?{ zr?A&K5pCaxu9@G5?0kG(wN|6fXP4weq@*Uhf92KZkH#Bu<0!=5hjzbu@&u_+`fOAE z3MK*M4iuD>I+J&}G9H{KBh;~MFCAxQj){$l1$ipH>@b)fuX*TTC6Qd zK*q&|697RMAj|2~y&Ib_83^*R6D1#99~wG`P51OK4a6{`JT|IBBxTD_*VlssqoZuo zZ~grI8t?hvycrsWraXmiJqdjHuu~ggQi+WS6B%c)8WHP3?ajws3=;9iw<6D9ym;TY zzIv9%md;~E(cGN3dYvdm^F_?v-7SB)7!~%yN&&5Is~hUaIkjvJE8+B++shp-hr0q= zSq{$*8a#Y_xRpF)5)zUj&+~yPTd(V5Y}V|v>reP!;89UgfgF1Eu{UYh^Do*wQ9c&#)Y=WXN03UUq4P^geE*vWCD6DC;wVHkdUvtw^vfSM6}LsF7kRC zrTbMV4F@k8<#LP6@)9(zJM}=wY4<}!|5;z0hm|06sj_dft=qTK~2hw5GnpGj^hldGw#2U{=&bmjP7l~CB;4$T5$ zIMeKmK-2n!T1*HRC>sus??Ss%8oe_dhmdQoxRPPWsrNp-M;N+rXdKdMle}69% zrBlgy`*n60ki6|9PL#w%HC1ix-rkG7XN351GyUwJo^3-)10dIYT+i`OD=PC>j6nh? z*c{f&2b_=JW9>Po09myz^Nh#Nhn)F(8peIa6m-n8&!5@F=u3;`7Sp~wjfnD$j1 zfJ|~q%E@S}h%tRHHRC=y?0O~^#D~_SYRjnso05PXn|Va!%R`xWs*v%dYYvy0Uns}^ zqe>8<#{1Sv1{v*aFBfj)%t}pwfRu}im#{Gk{Jw|6yben=KU${R9^u3uAr*$T zXdKuDa*7J#zyz4&GsqSe7C^TcudbB<$Q^QJW?@diBaAhRz~YQwZ1z9|4odS#r$S~_ zc2#E)LjYTMvAaw5c##IzF9yD53VWz2JhmgkPG=3U+#8CBOar_$k-B4O3m)?A+czRX zbM_J6Y#B+V=Sk~k>7!$JCsK6FH?yu=&imcJT>6OkEV&^Mc2{>;l=6No!W3Ag!q?Ny zVCC5Oj(zWYUk~L9QNnWQQU!6PVQc?mKv)2h5C>-3NRIS+Z|oO#HQoQI1xN&%M6IZg znw7Ou{m4XXU(D$lpW|Y0_AD1R&i1GQ-&@h6U&Z`-Z6|E6Wc!kR9e`bFW#Xmvd<6gg z{ad{{`bf<|7v1R4?0tad=I+jJk$J6|uEpcg`5dU!weH_tAeLT%6~r;6sc~8|fIx|% zifK`89*PRey%2y5eSK0|(uniCk71$da+U^NR|ia%g^Rtz`mjegm(>hqv^~qNV1}OD z*@Qm1r3E%pGcjWK?RA4dT|4}T_=PVnkz#r}hju28U$n;)cST}ibuF9j1 zoZFfF?9{ao?uxQIdRd!RRFnb`g$DNn#?1##bPOKu^n*Xz+6^uz!awIc;2_XC%dc{b z=o%WhmfDvL@wFS{7AQbJI$hjiK!Wzft+-V+aA!pwS7`vHkp#nzr(EbMMqQUiLY}X) zjuqmoEXw%7qoANr?J`ADmSf`qD|Tv)^mer@lK)5tJB*l~mW{YPfIucbDS=_ba&TOZ z@QWJq4rAD950~5{i!L)k@V%(%&G?IIAX?1pLhDiqEJw33Rj?jnBWGrG4Su?4+4!PH zMd|)974UFaMl&;`g+MVa+gkmd&e;Rs7&|-H%wTq(d@Mb_K@Uv0j9=C<10SZUp=GhQ zKU;)+xY+z22p=26>WYVZEU=_78aK^m)ZOXrDt&sSpPscIT#8J#e*gz*d#tJKB*jQc zNzVR|({xp+F@5-Ms*;x1es%zl_D9{f&N-eh$Fq;Pxxx(*#1o$+6*X!H`Z#%RGC#7t z+^+4u=j7zVCL!pBw(YMp8~=a{LOY{I+iFeY?mzlFLrDET!0Yx{lr>u<1k2Iy_nA)ojI{yq!GAcu#{G`o||SX<-F zE6OQ#pL8MD`0e1(#Ww=y=#3?gb+-*fZf|q=>A%H#M)u~-8$gkZ0$QqSowc+y^9w3j zPgT@Oy1#YTm6q%6T!P%=+%bU=LpUTm@#z+L-@Ao|n*M>Yl)=EB4BWnzT~5`%Kc#?# z%@OoyAGS^V-3Y6Tjmv2oBsV+Gmrw;X5W??$`=NXKbaFn6IG^C@IJ#4#!4TAf6}b3V zp|`7-NI+14{~i0qPXGlg!ueu{%Rk@WUhGi=F`HFq_wjZ~OBUpYhk6f;x`!W8jhG1^ zKXwH@C|_HNiQy{)2_np9@bYRQBqE+lSQs8sZGE4o%N&fnN&2GutVA&Nu(-1)Z@%D5nB*L^RB=zexMwGm~s-|XlPS*6vUNBX!+#D?95wN9W1+}5kUf2G$m61fj&IdRm&X_g)7n4lPLT*0-jX${$FDWX$#D#4@o&m`#U^-G}r{OoPnpipugGT?&84)1LFC#nf(%boJPyd>H;(eLZb) zy)roZW4XcEj5%Ehxys0EeZ6TKFxx0O+0TNv=N`t|!ejy-26oEskQvVv%ES=^ZSA`L z%l-YTM;+~?xA_&hV~921g$n`NZUgyZfFxMtU2Ca6k4HyKi|}=vm@ODj<3DFcz$d;` zZ6lI`ttK>#+^06^9o745bv(fTjd(Vx3;Sa~|{~K^$;lKyU-B#Lg3=5>j0TLe5 zCug+{4~`aow#}mh3*C^`%Ub=}8RPEb0@L|-({&i(n9d))J`@(x>`(IveDRRV9?@WXqx4**ksage9}k8b81VHQNC318KaUF;rEx)bG&?f|M1h( z(`$>(=`1b)xis@yn!8=YDUSim4c;;G^_qWvX+S%?fMVVJ6cMy_gFYmFy!m?XMI|#2 zka3~TW^fQIknwgoY$*_^k z?P@uir2B5Nh5Gd|e?d1~t{9jKyf{btoaf1Z>Df^5V`Ax}#Mg&Km<@c0aN002)Bve@mp{lu=x z&C-&*Ip9pjd_JMWVW>h^VlMsL6E4K_i;Gobw#+Yw9YwN3A9kbHstJ7#_xK!N9P&Ad z2bLW`+P^bEH!9TBew(IY=AImzyRd5~-~Ig7V89wI7T9}-)k^co&3#Rto1pruM*}WD zO-kkE%a@Uhy{0wkv*;F9XaJEpLdN{>&Qs?Y+$+0%>3;z+l1|DLvWO(VSnuCdrzCqm zwa2G^m0~^u4SQ!}7wwEozdq7(2grmZ0uPT85g&o4qoM5embl&AF}+^BjaJEJNlo21 zQ$dq}hlg}-`=4@$@i4!}1|_!#5`?>nw`2+2 zX24fERI;i&2A7wA&iB`Uzz8aTdxj$!z^ci8fxJTbtRL#P_Sf2=*-d))Az19WynJC` z@|30)M}H5Z)rim9?gigl@-@3om*I_ z=-g_0>K2|`$%=!6>%85s#(%lP^354_TG&?(WXB1;m9$SFAciK`Hq+#1C+A zD5$82F+IV9;#LMsugf&+*wc?s=c3j3P#ks2*hDCOwX8p%S#_7xykJwIgKfVo!cN7u zaz&2$eK9-o#1vm6_G5qSG@ncUrQ7O)kAs5)+YB8VQu^TAAJpo8W zGvDlmSPg!vua*laBlhr-D(*b;PL2gtR4_-!#B>aQ_3=TMXeMMcG8xBKQ0HCh-+sBd z6@B|#TYD`=1pXOAlF$7nOIgT!NP@=CxtjfzqH44%auRD=CLvOR#zyt4FN&6*KBdf! zicvwb>K*zHgglv)7C$mrHW}7Czz!pToL0^irA?xxfUp`ib{d$ayrxHh1O!0$s6ax4 zayq`BTt_#$d;XkGff-(pJeG7%esM`ID^P=#Ue;~O&d!e6wZ+C-t>ea^=AJH*q`*qlE;E2?bvW}UR`^klzIFka-@ul0!F3) ze$V{gILk*bPe6c9lBJ~3z9^BgK%#{~i}%`-iuvk9BVitn#9xUl2F&gQ#Zf77Wfc|s zb`1>}9cP3_XC`~Q+v0|X|Pnw5t5}!hl6cs-o9c%`&<>Mzt=p(>H#vvrBSFsvCk(O`kZejoP?p1i#jgN@>?~CwEJ%qCPwv_DT z^sp`#-;Zk7O|F|2RweQD2Tip0!V=e+S0@vtUQkUxy+xP4K?bonASf(;2i;+bdwI{K zz9!B1&W_K)#UwV^zBGdQI%^kpZcML|XM(g4#?6i~yb89LZo& zzg9OsK2B_KKGRN#*TC**7lk-6rAz1N$IeQ0ZcT=ZJ?iXq_?np&F_MoS-Rr|npG$>D z)EwYjEjd73teMJ0{m-9Ylco%+*;NmRvGP>Bu5)i73-@a-ylUv|!_sqJ!|& zeWTl6<46g{5;NrU&cclL)X$98Y;$XS``vfjd6~7EC(@bMqg>^Ugw(H8y%g_+Hr!!# z9CA~`M&F+Rg##r~wAD5Nfn#b_?D_pbn{~7X@*j!K?l45O5O@r!KU@f#uC+qJiWdh8 zHrLC075E0wXR*Vie0~~!!W3BRbjlJ6HjI;`-0hcNvsO2E^$rD#ii@9IO!2hoKkN>y zop=!mnQ#J$@>~2h#(cd)?}|i7_gliUckiMM%gT$P?iLmlIzD28X-wWuTH2eoVm=$+ zjDEiwuro4Qt7Hjyj&C^K)7@>_yDtDc3{NR};c++@q0ZA9a7M7WPhMQd)9a7- z$9^Uf_+PfLJJO?m6B0zsJ^_pz>Ms+Emt`sa>6`;d%1`|c7AQ8}_xdP#cMCSzqd(-Y z&t~dw*j_SdRpwV6W2Ag5&hhN*%i^$SwA0f*;`9iIG9C{RSMhDK zxvxn}OzhD0^sHDuCw$v{F5%_%L`mtx>OEATu<%;(b2m#1LMy8k6C-0M$mnC%lb;8i z{l3t>&dhJq5Hn~BK#+|i?;Dp!hi%B55#H3+Ml@iQpMKM$i0{Mu(n$f>btGjiP&1AaUMlgTgd?8anS!v;z>(OKXq~Mpwb~ME-77y zhQ;u^{=pTkdP_@94HtMc7t-c=@II_jKqihTT&*iYk-1yLu(OeS&}Vm;jk{vvvsz;o zdZ%K{Jp%j-f`0fQ6-fr)Vix&IObNz}IVc4VtR%v8hnRRMx-ny-)by9+FKecxB&I|C zKUGHYJF;-%AjJT6*IsuJNGn2%0K1`yRCvBw#AQm{$wgK@?2$U858c~pv^|Gusky8k zsm}Jk02XkMdN20adkvwlvd%v|r4uoG6MND6=@2FUL$Z&s_5HDo9`{oqD$kLhZ5A4Am68%Ea_3p=~e!^NMSgLlNrc^BPtJYT42X+tz9D29d$YRm?z zW{|EwYOSrUwKJ`1*@n3pPT&gW(Uv=lPSe>RRP9*$2+VZN4eSb09_@Kf4UC_P-FxFo zKKOrrw~Ljp(T6!S8cf4B1=~sn0y0oW+&WRSBdGS{%L)m3 zY#=JJC`5XR<7W-Ex+8m#+(yIHzMS!c}0bpccg+7*T)}L+5qaeVpruCd( z9$AfMbSf3e#xnEi7b=!2D~)(t=e-UH5Y0^^;I*|d>%!yvDi8F_P|}cx{rn%VyMGBr zu;Zy)P}@(BaG7+I)3Sjc!2+~9j8S|%{W*flx%1h6;+h_bgA z6`(+AmB;8cKQY}>)87_5E-$IF3=_7v-!0=<#rv_fko#~V)JDXS^%T(dK_J6fJZ5iI zv{1HEKk^pAo{xdgI{gJzDxv{y#S@;*sFBelFFV^{f2pZzpl^Gul{}Mo3K_C5=A`<3 z%gdgVgQK?`e-Qip7oiH}Qr~%*MmpT?wBwTLYElV1XKiTh7t+IprpLv#{?XCCB#S|~ zW2^Nvmewc7XX=+MEHig&CGm0{%qE1ahB7|Z4*eYtNmd;?eWV3z1|A-Zt%Dr@N&^L5iYAg!KK};WX|z?Dy367z<2-?HcVIXf7#QGW!UOqy z;4dm06E*ewj1SM_%F0mn>eossgq=^_QXDcTpW_z@O6^DreEYJrH0?$bEHBR^aoi#| z+Mm#1L-Vn#BTA!`X=(`oa(eR#y-H4ROqwVPIyy3ycMmV*DY0=| znA*tbvQe>U3cIp4!6hZXZkCDsWXl(pT0zh0r4}XU`J$#8OVrVD!GKvw21NROFb&#Nt#n9S+v zDe+uz<>s0q=e6XC^v${NmAhvTWCA4DsCJzjnr(PgJ$LW}^e;S?EUde`Tt_7>Ev;`i zg$Z(OrHDnk%KAepCnqNa#2Kxk67^E%c!?|h{#*@)nu(Fq?+Jtu14BRpBG=YT7krPa z$8#K=JG*F~VX6N7_XgUHsA!CYq!g7RFN0^6(24_$kiWKzd zpTS{olVX;->An-xR9HwOh(3%*{ZC$S@$s3Rs#6NO;Dv>SZCp0G-Jo3_KFXSsa&Xk} zd#n{tK0r$bb<*>)_#7`^bMONFAF$*p?guN7sBlZ{IQshSM4S7g=Sk;{s=7LSd|#K- z6^GZ=LrDK6i1-FfVr>(al4YGL*vTre`$BlExSwBhxBuDMne*Qn=dwG^h!WL+J<@uI z>36>M4$Ea8zVN~4)L?Ct$XQK*NKI$Aj-JfY?9}|XDH4dVv3s#MQ~L;k1W^Amk&2M> z%WcUahwUUEx8>=3LJcb$N~_1l*vZ7a%hfri>Sk*##arOosCK)5X=I$I!vlaK61IDy zKD+-DrHahL!h%`<=M%_d6R*vXZW(SHV7D`^u4yyN1t}Nvr$*FlZ1KSEPsw-URz~w) z9O@ewe27V7NM7z-yF0EP5v2@8n?Bo_czE{X_lY zUgppJ-nR6HM8vmmxNumEzj~?gS&GxVnv{U~ZSaBtD_25URTUQU9fkV3ZjBwo+cxiz zrYp)7kV?HSp@_X7NTRfPS$?Z(;OR#pfcKW6scT0Gu1Kqht!5BD52T{-Q3K<1vD z`aLwKw`P}~S@^XiECl(|c|3i4+YCG1JLw)oAJ(f2zx#~6JyU@2{l|}vUqi3Jyun;ze6NmZ`O;$4 zXd?n6beI(+B;XKokd5=tAjMYZE1f-xfG^Z4RH?OJt;>EOnV zpnR&$A8_qs)FBzc&1=A@1hrPmeTOY~Czp%9Zr=~Wf8o;Sm$iz*`gVbwubvohH?67m z-`ixI#{b+uJRU=t_I^ZFyV3yL;@>WR9FmOhU@G+40(((^|C%?%lc0)-7`~G2TlwDi#>-nwsw!9HWWNW! z4B_!df#E#wyZKK%OM%Bdv#wi-Nl9o|YP4ewH57$KW=_3bxPWZ08au`lii!^XkbIL$ zKrnMVEdyjT9N-nkwpQ_V_Ih3Y{V2bF{qov5Ljz1~=KHD&^rzno$ZtF*`1?D7wdtOi zYUeY8=Es#70{c0WzsIZ92jj%CBs`K1%9w?PX2+Y0LJKXvSQ%uPqAh_T11UQ9ys@Nw zGHD|@=>hk9e2ykIHk}LS8SDuY?;^N#U5XIcwla_=>=o8QvNPYL(rU>gneZMLIfr?H}_N6!2aYkrP#Rc6M1F} z`y;_NNnhTJK6Rr|HKBxF|CWN0j?bUp!5*GqB{FKZ{ftjnUr$m(4SQ#22L%PCd%aWz z<^Zt%j}vvePgD3JhK6J_O{9nGbW|)N`+I2Z!+U?{3Yoc!yaAA^LC?$R!()Q_Sd?SvTD=<>T9 zLxzTjkEc`ZjY~^Rwj6#9s>a5~QZX^z#Fu53Ga@xMtN`5Dtl=n<(Y{93)z&6R8}T*W z*yWk2J%Zri;J}_o8g<84TRAKFG82Ooc6&Op<*|;CjHcVE8q-;IzvGLZ9N#NgEmfFe zYP8+-#6-x}&PM=Y)1H)0$U$(*_f8k%h(k~du-t{%&xj&}+QlJ3<wT0)H`a4hBt9-qF6X&* zW)QFVO-5i%omTfV99!W=O>1D)_xyrQRDkjU`pc?A*n(VN{!P8{GzT1|Sem4)2jIKQ*O(qJx#4 zYxD9BK}yP1qw!4wp{*o9w3}^|^8k^|{My@FbHCNc$LF(A)kA&jzJk#AK+5nqH(6CD zb|?b;D{T*tqdENTGy4N_0WV0GOk8hT!ZW|qGhF$e-}43Z#*YUayWBRRxU!gLL!nXq z!y9Y;HS4fi$9~a?Qss{88Z$Cq3$ey{DafsGpScqVzov z*MR?DUxQWl2kGlYWxze36Y1Y*#VrvI-$TFd-rmm9<-Cl7#eb3)8U}KtpGcloci!la zFrZ+%6Q!!T`T92P=Mx7k*N+T+pC7U{aJ(VcpnLs_*4`d=5)M)%KxGYcvRCPrUE#|m zNQBgX`??tWSLNPPN?x)TxArc!>qPRM)H%^b)2RF>HuDBV>aC3Nr!v z?Q4=Em7^shE+0H@Qr_+#dwjwQoV)v=c_5iv=AX^Y72bX7!Tq?~Tu%2vE^wWnvJ2Z$i& z!!>D0d%sCndiKE@Y{zIzQ&SUHZj0*wnp-c@rr zYfersSixsQ;3M@K&RW5zax`3A+=j-d-NyA22`MQ(0O$aj4uw79*9zpQgdkbh~6LS;cn9$K- zP0b#8Nl7@({#O)m@88pSANmUM=fB=_JnB315^nas!<6Xgpg9n@+`-67Wq~`UuSG%X zqmQHPEAC0A1E_ZQaDxon+IYc(FBnTwknw{@CY~h9!O&iMiBNv}W9Q*gVEe)|Sa%^* zppBicf^mI#-m}5wf&|8ck|#Cs@CaZfo3JKqfK~ih+wn4Ua~rwz>G!O_E@5Yzsq=@c z-k3Gc&SQ?_Pl{wBD{)2!2fHfAeGEJnf6BMywm6;O&=eNte<`B9u!NO$z+zB!%nIhT zq{N*Cr6S2GDcD4Kp??m9;2_FmA|DdFBD8i}urD_cgoIB{;UPo090(V?QEk7{QgUMN zACFyouXZ-5E=V}3Ij|{mw~qI3(7U_4IoC+u|5MA`ClebSoF9fGyp0b&Hd18(?F#b!y<8_7fS{v z|86sl-H|8O^~pl9`NI3{H1$-5lx!SlZOKxz9}I2X$*^yh0Qau8`-2127MYmKXM?Sr z|F(VYElb3lu-f%7 z<;@4qFL6a>LfI9}bSd$GxNM}~$?wnA5`xbMOtMaaOXFXQR-~J=v-9=VmjdAk;Kw+PG*ztNg{32N){9ktu8Ya0wv{71BH^>Qzecr+purC74 z^}mBvG5`=$BxEZudWl+=4HSmiVX!of_a)rJfD_x1mDBbFR!vO}B*-X@xzH8`Bv0yO zzi4Qww2X|&-}IW7FJHcTr%MD#Is_8<)d(38F-$P-@b1^hhzS}S0~1qM|JbvE0RF9AQzu(==+#GLwd?MrilX7k-$6?VfyE;Ipnz10E80{i~Bda>0KR56tG7LY`FX@9$Xw4$5A9;f#C?Z;wn9C zx7L3Cd*vSczZH6z0GtzHo;By>c39usYKw}BJz=)jv}UaCwQYsLB@+n$sxFw_EdTte zuCMJH)T!!z%UAbqi41&Z{+tR}!LHBm7{P$dEmj}yks%Nf5fN@%ON=J3lbF*;1?TC^X;<3+1zm5KJ)4$;-)oRww=Pry>m8CLp6e zf57>f`Wr6GQCJV*pNFGSn;%`uie@ACU#2UkRo$kpb}zC>ZX7;RPP8CnWt`E9indmE zQ5P%sPq{<>F0%nd#-bEUZCC`-QP>YkM4UlvTJP&CCItvANS2LD%*E*4CWRVwj$wywZXyg-90Bl<#Tg$AOMWM zUd~us4;{IA=;@`*%PT8b&ixt~Dc4q79_;EY^Ea+7mY_iK*P(63CS-jLFLh!I`XK< zQ!_9iLqkI=Fi;`>DJbYp9;aFLwoO9Zm@0XXA#GmUz~IC7HW4I9MhfFI-#e;iuO0D$H+Q1<%azZ#rJS8Fh6hAHlK;+A{{1b_~tB z?g}Q`$dC3Lk9-WAU~JxE^G|PhdwuuHSt$hr;fR+dPj5yC`iEXADKP`~)3)Os78Vv66C~c-K}IC{&m^9`LbOw>#>cPLx9d4PbdZ(pbLgvS5~@brCv#PLs*sTEaCp^sL2>7Xgz6IXl8nSylPf?K|1Su;wsnAw=;~LnE2$$lZ2$Cq&-(?;B#u~ z)usIgoK!zk{>22_4V1-kw@!xIuW>yyt1;kzASJ2 zEl$c^HohBKKY|`1`Expkpy?cBm6lzdnCcv`IEkJ3&uf8F>f04$iwlX z(g8s*tM7YbQQ&Vi_I=7>-*TF+Q2GMD{65!j^xorL^ttS<@IqB$sinkZOJ)7QSnGyPvpAbb{GN_&ZISk)$(H9jp ziaRkqy+6~P^z*@FP_VQTgS8IkU=lBE>Pw}RkIi0*waS_yuV_{$ceuV=FT;V!=_bE? zasJgXOyNTgdm=K{qqZ*;cr1~aH7D-|qp_W39Qac@9#fqCP4rMY&sGGP*q6DXXYhjkeyymIIhWcRsme?$gs=OM>t2d;J%rd?|7A3JQhNdmbN%M6|CR zPR2JB?rXjG>KuRe0kr!xnjNdfpugikm)g_a%|mvRdzDJhvxWx6Yzb^zz}xjYz+Nn@*RmQi(L4++O4>{a7Xv>p1Yz-e-t{5Tn^ z`0CZ)t!l3f&D1M$b~y`gNlEyxb9IE~8pg)?13thnOTa{wG6i2-cpDf92QnMVq}cE< z7)(CRa=~Y3dKVK|ZMl6>vmNw&=i{8uH_w#j!&K7T$1^O4oF-Fq8|5<2 zjWExJ&$2AoA=9IzzkV zQ??uzM`8m)kkB8i3?EC!g?umOE*RteFQEd!Zruyz&n(nRl( z#|zzs2w303xBnmV-uf?#sOuL-QIVEzkZzFfknZjj>28n~Bt*KqySqye>6Y&9?&jUs zbME_j&;M}d7w3a>&FtBGt#9mEduFR7z1Heq_@fww#zOqxY!T|$uV4G$LpmCp57RP* z8AOxZoYXZ4JkfMNvDh-B(J_>qMlewG2jrBLHP53Rg$utm$41Mf<{)`v!{>3axu;y$ zJK%U%ObN20H&?^{m!_6-v(;OJbatyvv$soT&nF>}d~WxiVDh+G_R4EN8gH?!FNZ%} z`y;-_d2%qLIz88DUZY^Tm0U-2u-Nh3P?~p_-l18Y@Wd?N)8D+D^rHiH0a< z*Ah(E8#6Jp6@bxhYHt`4@xJTw?^mv*QiLl}s*k0z7GKLYfxu)0k(Z>TB+9Yt$uqQ6 zuSaUf$5?X=xaM+(gOgT|Xhp zbRxhp9dS1@*M};q(pNi~JwwACMMK4<*?sw2CT(b=ifXw~oru|xt={nrc*=M#f;q|B z$|UP!4Hly|14C-?Pft+<>I?YD^z;!7dHLn`3xoaKV5u#_9me-K*{_ycy`*t?cmlYQ zU%b1U;IUp|^E*`v%{|-@p@+Y4NJvT=4BZA>#0&twsq#4Cw^?Z$455rbAHZbP?E!$L zLWqTiH#q0GbH?f8JI7MMVz`eUclGRjnRviq6P=jr7Pl<$QE<0}41@NbR4hW(5gPp8HEhfNxfaGRpx4G=08qy8Eg&QL-od;$W3ymO?qmSR@Ip6(up!&_LnRNlYq0UazRlkfAm zi_D9JUZyJaBZ&WqS9|R+1aSBF_v3T9hiW&Rta{y%U}A1J-t6@T#}uINlarG}lIU3A zTVI)Fy2ZoBpP-0Z`-8re2HUs+K(w5mn^cr?>0d8;5HEM9RkygRg#oFy-Cv@mv$#!6 zOq^a_8UE>!^?ckN49*FP+fU{83S54IDI7XK29jX{gOH#Us`Z4y1dLZ07iFH8c{VtrXc@dO`_{PG0~bna@qj=Dk||S0G>d za>00gxHLL03}dFSLcIWgK!Cq+)IS7VgxPX&*@RF}LLt@jd}~0>&d9|~pmP`Bx#zfm06)iUm&H;@uA!im>b_8#@{Uwl zH0{52L_vwtk9mCu|Nh)-?a@s`LxU=IrP)!uGkEh?0alwwGwmecmaiAnM`UDVtGf!S zd${fG-nCXUdU=mM?IzDVnlx?`{SJj*(Cv-udy?P$tH-5CqTb&qmY5&{z8bEMD^W?^ zpa#@lw3>2i<#!0XTjnJ1YGviA3@<%agt=Huc4vm zn!RA;)A_fi*%+bH`F+YW(ErE@zyB~~0CkEK-)47@s^otkU% zKt_IvAEAYQ4UNO0#ie+VR70q9cG*2P7O6xoO%uD+=9=N7*ZNU@nHO$Fzr$PjbHnAC zTTsL(fR`T8SRYfIA3}=FKJ?wNap?P#xEFmSMv@fqJr&L}( zLK6`oFOex3qPEyvmT1Pt#f1}bfz{};@h)M+O<{Qa^VS(tRn_J0Tnc;w18p22AjiM| zVrbLTL-F{231BkxIqPu=2>9T#*=89jgh$9jUg4U`cW_($ zC(A5$yPw{Qe-d1~yEtzToBRGM znSIKW5S$$Ha(uFk^$j%6Z@cf8muH%e-QHRrpwd)0PjBFZ!7qxPtJxmfnAoCqIx5v- z#6-D!@!ws0hF{%ZN04}Hx}CuGy`Z3>>qVWfE%xA>^ug}#uEGl*f{Fk{Lc#aA@bGBY zTR+3ExY|nm3@2ON;Ng|a$Tf{P#>T}i=52Q=OD@%D_HW^+K*L2Bv@*hGOy~VNb6qw& zH%AgBackWvG@{>n`R90TBCf=*s?Ff(UgwlkwvW;WvJCQN_0Q44@*}@bx|ZQyxNZv$ zj{ylV6)IHv>1{j>8#mANXNoATp7)97F_c+3Ie%gbbB;m z21PuPNSL9$UOulw%HIY*7kQ)B?> zqASa7jeAFunI|4L?j92b2~Hg1f`U+>ca`13e)dV=HkkDTm>!>*F+KM`@({tWM)*W138n44Qe>K5@ozy9lJB9rEqo=yldvG!y# z>E=XWb3Z*NJIDTD5pwHJ&dy0p&T#yUFT`97xcV70U{DDS3=9zPig@p$DapwL>TL*` z>@P62w6rcy7J?RL+U`*AllmgRjAZbMrp?zyN{|gbS-*Nf!bcBhV`W_(39~$0POp;S zupObxdyYEkNM&}rN6>3`hkVHT+tnd#zx}wU=ff{emVDT!-RUCfau@kl&#PY}OYR@= z@Pe|kh#gHwHEUX?)`h)2>}V(k4Pc zKuF{^Cy^&yM%(<8<>gUXS4YgnmGt~0$PS_;54wAL#>)*&ySo02kB=J+bi;OWx<9OQ z#q>n{nVE@DG>mJb7Znll*45F)h0EY;i*waC=B~Fv0dx0b_4~D(HJ(aSrqn&Lnu(!A2w}tPY z-5xnM#3F>WwNqMdj{mjT`h*#16Fxt2{4*Wt8JUi!_j&4%3A*`qf8*t1wItL2cn5_I zJP6?Fz7!7R!34T($Y^=NQqmlzMFnoTMJw42!w4C!3Djh<*0b%mp3%b2GQ#1VbVW0rx&CQ=%+^41Ma03mshzXYG{*(hc|%3fSboKx~A+v z_8U5$&qJFjU-@!Yy+sp&^?DC2jU#|@O7`RoUITibGXV{Cfk zzR>eC(k1WEGATkzsqi{l=Z~(tGrgEm+wFr5cg~6~> zC0yt0Thb6yu$CjP+4i+bDC3n(IyV6r#mmb}PPfBPfaLs{g@uLZ>&?Srl=&=p*j6{h z^#R58$eyI0T+cR|hkU3nG=$-Bv0eF9ZWDOR#=!w0np*QEDRTsX(BrnNAAoLlr1=y&psZzwtm*yPZX9ETt>N}uA z8uBp*XP11vG;UVQsX*YRJ~`jZa5vZW{{9VRZEcNDP@J6;b56hdC zlxss!|5>9s6!>V(RwJB_QFR@B?Uprp18t86hP1hMDYiK$VYyRfVo6L%e(LFSAdz&#qDi&7OT(6dTKhM*P3)A!3 zy>I%8I<>k@?qMI|P4|dGu(>=76-=yk{Z@8H{{V=y=6wG@W&;G_R~s9KE0T`=V2>Lc zxGiSVbQ#y1%X2Z3D5`JH1EJ^d-o2YFE87idvN+<_Yx73@4R}+d-Ka{z#K54l+upF~ ztF3&>H37t0PtMvmP1v@>D4PtC5fi@xT^CNkRk&)dQzi8F`fxVTx1ApV(}TISJ1`Dj z9yjY1hzIERo@3vi(b<@?q$ASF$jPg2et&+;*PUg75#SaZ7nj%LdJP;w61yYjM`sl- z`^yiYJwi=sY4jmjPjbPiS1y(j zGGsIg*{x23ziA;s5%?Hgx~vZNYqM+6QjXb}!^sobn#ut;?t2q?P<@6}W!i;bI&G(e zbkfp5YX4BL&__c@_it)yQrJH7g80Uv;bCfxOejDBYsCo-ew|!2+*+sKU8A%`2H_qC z;xJs=G&MAg9`qnHyP!|wF3+lR#G@JY^~6F6rB$3*d&4s_eOCDAY+~Bm`2m(;;L}-I zTRTjaFD*1sA70abwHi7n50R9RFdD2s;`Kg{1+=`XQ1`2=Dy6{&jkn@OqwzanJKETp z673)s%82nSM|Gg5yHnjd#!F0*;V`Kpj~<|B>r5*ue=-}dzu6ug)R?3KXZ`*BR9T^e zv(qD6<0VIw;d;1GCrnK2SfoTAFe;r;@gdcRLLPh6Z)F?KI6gjJCWSY60E2d-%F-1T z4Go9K8#Q4hV|d(aEAWPh-)`;DJaymrP>PvGCy_v#0}TbGGeA0l>%cyIl$ba%DVYYJ z$9bFXvk4KOr{HISa*eFlEe*DR1Xl##50jIezu=7jdBVyBiu^Nd(|%r~kk7@nb#!#} zCvY~{jXeAB#&G_j-Q6NKOHuB}19&Gdw52+A?;_nv4(IDtKl={JnEas0oS0>Rh*xYL zDctJy=_4Kix;61hb$Mub_z*h2kIZ;A9M;QHo}RCPy0p4?Y#VrZv%B<9cec2}aV8zV zL2(;Vu~|hjY&pAlfZciyPQs_)%2JIQr$Vs!G=hlZU8IdEe>ycnC~v-K2#7kJIOC^# ziH5@bf&xQhuR;$unjS@;nY@jgo#AVBdn_EM#{7k6VF%m;+v73g3Ql5d0y zv$4|}9F&ATO~g!0QMxU81KLg1#z~wur33DK&CY-GvYgf(k00NXBiEJ!k=&)WG!RDv zn?9RlzEWQ17oC&@#O!q03)=Udat5g$7aWjhbegpvBHd$kZhd*InU%Bs;|3Irpq}n8 z^Tn<#pbqETIK+cvygZj-c?tkolrihP`aQI#Tvc8DCYMQO%XJ$_75FNf;o;#s$0e;e z2hl+8CMtOuD>|FB=1RvK!rI!}Td!x{=~A6?r)BvJe*4qP$p@R$-_I64rZFUB!>*Q^pFR_=66#)i7&bE;q%o<=09VE2h| zX9RjIPgy+9fDbC3K`)jb=cSEGr|`pI0)rY(eYSPVbe9d4Do=_-*L@hCq@0|XynKYL zPr3T1`au@Y-7f?2)X=}f>6}`pXyZ%LXhlU$zwzy;6u`qHVE6}J^e(V^I zXCUGAx|T7&>HamPl*Vbh%zHRnuep)BEB>-wokoEgEV9QH`*bo<`6^5&?bTKq#Z0*_ z*7l@;C6cwdd4DTcjY|BL!wGR{mMuXFSDxEH3Jc)_MBFj`ThE&k(oBRsUP)Y{4tF+i zA0C3-9kKNIV!hpk!#SC-NjCbE-TpZLRDz<)G;^9KUKdhm)mdeIu}Yxi<4Y@BaD`Ix z^0*$_qdBOvnNk{yX{*pzhr2i@-Cb#j@T<}d1eyKmL{eHB4Kvp0jn6Y(-yyKLg;Nm; z40xEIQsdLJ>%qKc&RLzhd=ZS2yF2%cYPZ}>_rnd5e{RXqLftqvW%Unj zp0J}QeAL&1H+1VSGlhDx8u*j3g@+y+)8+K;?(PsVMradwoQoiE9ZJ=`BdU-+Y(NOML zv2YXQ?K+TVWxEwbwt7Y)^K5Ng$VKv`aW@y~Movsm=S%N|b2VcDMeyQfL`)0~4UOR> zpM)~ns=;J2Q%wCWaUiJeXLv9Q>MzsjrIj`hMmknkJIjLc%()uzz=m>)v_o+JTkAZcVZ)cYgABtn!lq(tNwM zHu>mWhU}fgmOs9HQrKSg3tm(6`wJ`MoYu>vN5bXnxjfa7ZHp^*AY*@FC5)JN%PI~mDqoUHtIvieT@Pql*z@W>zzv$vp-&K?F?^6aWEUe#Iqv(Z+g{uZM*MRtx zW>^(LE?0q&kZ|4=x0AyAsMsVuzGnCgpFp~it5Oer^o#RS;89gq?SYb`He_?6LA%TFGB_r6eVd_kP9UR$N?KV%|13erp#IHLx;@Jz{q` znn=?1xQ>pD6g+UTQK@Pu(2VI}HB%reXm*}*PrkjogJ0mUQQ|BsrK7g^DrBaC&8Xj| zq&?c~zfVU0-7le`_}h8${@=g7w6T2dscZI*XA{N-oq`1O^YZ}iFZPs2&}U6Y)8R85 zFFg6YNzxLrxBLH`tCp}$$8iM0cq=X9KF~WI%qO{B`0M~%aab~y=^KL=@X4=VP=($DB{++;oIJ z!-*-7cWjgX#j1x~Zu^%JHmFeKY`d9I`TB@|SE^~*+1cgB7S`7{swYqMJK`Az{QU!? zQ&USPzNu%WZZ9d_op0pF?HOQ=CRE77_l_5W#y;yt&&B+WgB(C zzDdZ*sePK|^LW( ztI+Gfbjj<-?A)JmooMv9^2lZg&I|o&V$$mK;+r@-n=wI%Gd(@f|J@j!PT_m2+r z3_+RFukD0xl)owEGfeLA`!@AVgzeOB?;ha8)i7u+rjKYXN|U8`pv&xvwG(V~ zdH&UiyS^O_DBLyceAwy#S0Hrw_wWN6K@8~+4?}e<2#z+w#()c=mp2&Q!JTjR|B(Lk z?(%pqT>HTVj`00?u$#=UeZ{E#5``_Xc~ukIa!%B)~MJ` z^!RcONhzsctm%j9O^V&KiQB`;%uc5tEv8D(mdcBM74C+5FjFgu80y}&kC=Cjnl+v2 z6jpAhVv30cOvU%VT>DrrM;{&ZiuiP_Fwln9yl*038I6jX(+>^(HP9GD!gX7=S%E_M zY&{yzYsxnQo8gnfqn%SlfWGy|PjoIqmk2G5DJnK0MDxl~&5MkLHE)g1kNpADz-9Pwj@3jmtW_UES|XH-zJ%FnWxaDM3bwf&5rX5 zo;sE(5*J)S>&amAh|NZ8wSKejwCtIhOX9lN zhBq)mjfr-MJKQoQW;}JoC48Gp{Klxq1s)!Ldo)cJL>~F*$^nPXM4@Jgt&Oc3&`Ljd zA_yJU)q^%aTZc{njyF=3Q>mnl`I# zk7k5pD*r)e7#;^KEFw9u<`EZIr<^{%F4hZ`wlhcu1|JJLVoFCk^3VqwK5J{Iz#8@% zJv25uTbSxfA_cTZZF(XM&YN3W{?J~ipW`2ym#Tr0ksBKyH#j~_LfD;2h$$FdwLivh zI9VoVU`Rjx`TqJ?;CDMTOcIObyMF~T&o(o|p_n-E^qOHTcju`+@d+7bl#~T#r75ww z-oA3)B>ZNAFIJSf49a4TvxO&;YCV37*M@RNevgjC9f{Xv=lbdFW!h&qIlXV*y<;}M zmnkhPGoNcs3S^gj5ET~}r*=!A*zf=QXGoFAbK@!a=g&vm_5H)ph*6%;rpU0cD7=%# zgs03w*qVMlT5Oi9cWee0UIp$_>2+{D(R4;3A|xow&@X{<*DsoK106mG(?zmv+|Jcr zrCGlFZ+#D23*fP6y2Hy-k~qETDCN?&*YgH>A0JStsi^^7LJCD@>kYA5>a7*u^AN8r zL;6meGI9myhHvFy1>ViDsUV?Ya`l-lHFU@TF&8%UMBrPWDkEbcGC^p<4O^DH&dU$S z-4~3_URA~$LZP1-rDL^!G%?;egzIQ>&5)Cu3YaRoIHo`KxebnrXwyDi%)bnjUB=Wa?eqq%&5@T=491U5%`RT(SoS8Iy_ zA*D-|uYl&YS!o)4T)~2qL=S_*!fcI@N?;g1x!5sw3$x9$%MxmIJqh%ctP=9_rbD|? z0z?1Ayb*R-@ew8XNV2nYsC5d*8486phkUY4;G`qM_c2sB#bW|^h0tu+S>7q&p-0Zv@Xta z7MyN=;g?OybtE6S7cvw=|R6F=AZ9krLr$(raagZD#>LRPs_P-DdQY6`$2#1z5uG z5YfNZaYS=8wy+xYpJQ~bCj!enG!%NiHSh#a|H2kIbH&|QR{*rMz$SOT!`!c2J6i3SWKdyC|GM=~S0jC)clx`rB#O~;=-i$#beW5v%t$&Ur;Mf5R+ETzJ-QFWCt?iA z0Is))NzGo({{6+yAk0THC6(S34qL}rA@kRXmnsCy*(WjFaV-inG-7t?M{i^TMJ~udM;U-qkw1qFV(po z`-3b-hH~jM0}fu^C%z_0pg;K5YTCTSc>DGps)9Q5UW{Vt%)@s6Uc^?_Kvw~N{ruTiA^9f|@r~htDq{u0=)6pz(;R~e5J;`9tRBIr;|sgM3V1ye{=AT22mM-(4v8$TjE4DyK(ge13ks zGn;G0fw?~X+A~T0ozySwO@ zFCV$Nxq*SuFH~-Du?7)-hl=s{PX`h8mR29NfKtN)=B6ude!&jEk&;Ukk@}4HmuiKJ zuYW(i;HL1FRPA^jEjY_5q&6(JRA^$ZM9l=S{1qEzG@YC#3(?=|LW)xM{+~i!Qpn`O z2f3?#IAVU6lcj>lLs7ycC19Uu4W;+xWv-*qfR;0xuBHCy#Wg^w){oS$&o{Bb+U*t+ zA^&Cc85(z#RQe4XI(q2`ajkUVhvd@uV{)$hl^Yd^iIH{^WU3bCYi+Ks?my#mJFw2o z+^PX-(KVvR&Gqv!8YM_kTN`htqDstmrKu#cl9olg;p789hxz1gFDok^tNEftpJt`W zQy@|PVLX)qIh7m?GQkM5y@|B8m77c;-q##$qLBtEH=eTBZb9^X zy`B;_Ug`WnMqadhP8}sN+wO?Dt@9X$}Gcf@)kd+~?MI z6;yvdHJJ~x6Ia>E^(S!r**$C9;7;dsld_&@sI6sPdmb7dW}{FZ40Zf*-^F9xJF;YP z@VC3iVYgBxUsF>PZf#Vs8Jqe6D12dm<0>?29!OolAQo?-M%L@1qM}PYP7Q3@b5`pK zjra7i+IL@!jj6GfkqEi6UEm#+lu%)ih(^xt0MI?(P=B?e!)~t7yFv~9cAj1rnboq= z?vYTllMBC)FB(!DJBW#i>DPM%z=@S%+IFD|EfV(yx2cgTwx9B|=ap2OqV7_cu}h(P zMfpd|o5O{QdObnG@2k#_`jjW?;>3Mglok)F9XDrg3A8~0M80&cP*n9RQ&XaLep)Tw zKPrW}DS<120`3>;l+%@vD8p3~KP$8pafM~)yHz5)20e)FR+diQ zb-tLkzP*!d%hYAzE14tLUka4Djj9v@e%UeXvO=bU2gUG`c1 zQofL^yFXPzJCwoJfB5^iV7aHRAf#v}6llW$sz`y34+Ebmpav6Y3(zZcwh=E*PsCrO zsuNO~%^x{|Ig6AayWC&UH&iSLE&P&Q01II?Sx|`KiL*O<7r4 zv&N-O$xTZO_m6nkwAlyl1ADoR5O!{gzz!n5`1*wrwJa;Z1VR!&#tnN-_o9ffvHQYO z8d#?l|DK^yvh~!#!@;c&Ywzthm6d(P6GtF;EfJRXBPdM4T&LCk0uztj=5?-=#D$5h z<6_TAfcbbf0uC!wB#j;#h5R_Dn}n?F)^62CQ}c9e@Wh+HkSeCbfAWUe8AFDR%HkZK zQFL#6Q3KN676bRRxxPi)WKocRVgBpth%&#jAZ(s=0w(`TvzNFvpRTTMAOhk0 z?->~a|4fI~G;QySr-W>Nm8bD+(U_0=+Z&EgOppNi&%n1BXC(4XxsR!m@Gx78$=-jhK%wEsInP)tACkcl@Sc%emSV?sftUY^eU2NjCL zr}V!6)3@38>HHq~RqYiO`tdE8tdI|-6AFwUwr)Dp8yX1f6|k@~f8DG!fZ}z3^dH}# zh)gc#pHu)*CmundK0!n&j~fvmj|tH3a(795V^K2hkMN$-M5XXc>$kHd7jO313#EkN zEY;yKV;anuZmEwln=xC@r7pv%6iccoC^(X?H_LFrE~;x@ zPwwFaiBMvQM1kOVFgod853r6}IA>?Dmqfg=kP4#P#p1DviLbXGis+v4Q6Z(vDkBB# z)^jw6xaJG_bsywp0)?lFyM+D)hNY-*;}ZzjN4IHme(*+y!=fSUJG{VRv_DliHm)yd zXvka`d9vrfny0y$V(09#J$=N3V?U>A#YV4Rj{kRP2whKwVFb}z3(pbq z^xtGSv1f4w^K|=28{cBmq`NY!k&`1=0>zO3?c0mvB_1RKE-3}OPmJljsNqM;W$+;h z^py1UVeL;a%;xLg03Ir23VJ`^?Yy;|wq4yWTbL|W)HS4voi5Y*YHltG>?=IxQ|C_P zhsF5@a@+LQR_}|z4tCqMwUvlM^#&vk+amU#^g6Bn?a=SW>t!uY zA;?oRgeMD$=<&>Uw5Nw_gN5)kh*ob#Oif}nz*jAqMZ?1j>TS9x)v1Z!+%$sBKw182 z_F*%p`EBcH;s|gVQkZZr@Ung%rj2m8f+Y?URM8>Jda~TMGo8kh%ITc^^XGeR7rVhT zXKvU1pS^eRhf6-+EoW>M>fB|;5b&gy=If|6DxuoFpIhCZlKDJt42?BY(ZpF=b)B7@ zI4fPT5Dz|Cd;GT+KnE9%08O~Je93&JoIY)FUO7LM;N81-A|fK^j~PCV>wACi;IYh? zOQ~h?d@`1x74@^tmPQbHc(l3eZRN|f*r-(}aG|}R`GfrJwu&iBX3C*+W2(w^xwmd{ zul6T<3hfMv48APBVbH(I_0P-u#D9NzO#KZ`9-kvVr&sQDGz1G${0nZ*^fc2qwwB>D z2oWCFqqX0}<}Vm5EQaGJ7mm&=i2FQDE|U_Fx}2O|`9hUC+~H)lyx2OnSH8Zf9d=QD zjQZFDCakn-(rsBPIQ;JrcSltjZNmu!I`>#ii?nhmfXvU8E7JlQPfWp%DIg$lyyWxy zOu69O%`qQ8+7cuD-$a(W;tzuEP`FR6$cc#SVh zfnh=#EI^`%;_}Pv;U6!xtl2-m4vN6v`c*)wYB_1tJ(e|Dq#N@3?fJ#{OoV!cevRdg z-r=DYSF4Y0{k&TDY$80NsoBAF6p!l(lS`KfDk>WKv14az(_*t%P>_$n*WqSFNCp0@ zr~7q>_2o9|GxWV;wLcq? zrvNZ(?4Zkhfp*75q%SHm_q;tt5uDv3CLuYuTwPxu`ZZ7>hVA5qD=2po5ScH@4}K@VSQyGCxAFDlLuPz+erZ(@EphhEXFEszjYmoja(# zoge!C%6M)-6$B{mO#U!7hdV1fdmbzj(l&51K--ERX|YZ1x6c`L+B!mt2~K~$zemC! zYJ)-EohU-<5fg({C+5+rIqV$s70)hQZ0`Nj(cdx6%F7cC!5oIv?gDD)YO+@@=Hh-I zEN7`wK|v>xl9XKSHAn&YhJ=+4fpSOe@_0{f5OcVS!5~0{gqV&uwKpQeVQrlpQrNeB zSu|O!Nvdw`ad!?`(4|--<~(0-E_-DWj{ahC`Gk(%eTG&rTWd@UrFwW&q+L+obyi~{ zvvEJ10vV5C?FRdY5#4v!C*lAaL&HLUh6k@LwYV+)-Kx=RL8h_48g3No zwJ;1Pv!XcVKfXO@u|ChmzmZl%L!(hI?gn7ToX)6jn&)0VGBUKyktGL|T4g;$mI`A_ zt<9XDtaiP_!8O4?n^TtBFzzN(tUI!LxlXW+F89v;V$GJVA zQ_5$oZI!6=HafB_z^WMo|9{?l0*}pOKmyc&N{MPhzAUbC&vZN(T?U<25s>+4J>dpG z?tHgc;-^F);!YG64+qdHTz|3{P*Fid8ibtZw5R0nA6V_W^2+5XYQG$WLaD}i&;-}{ z)}VBT9^YK0JsJq^Jo}6IP(r3ur93GV$VkN$0RQ;G*<$9NLNir&do<-wQVpShK+r$i zu`kC0DzS5eYUS(KX)T)j^=I~Hel`z$E>*vNK4L)}7xoAuUga0Xz)ZC|?uxv;fDlJv z19-@jbedSkmzv~6T41q5K}b7p4^sk(gh_WVyvA=lJ5S?26Hl)kNFIX8Y(Joqot*}eCMQ)OlO-VujC&k*l}c%l>Q;~#xYHFC zD%UkktgM@lbN>(sn11~c4~I;wiAAJj)_dFV<{4WpH~RX$g|D{%XY%+2oyhH#Kj5ww z|2M9^M4_E`S)Fmb&6G&5&3hPVYA)~f+<8lLsV_0w%k5Wd5qX1?@hRxkU0F{aj&Yvs z^69*fbp`|=xJmf=eM$A(Zj1n)kYO((A|i6RZj;%hHJ<`A@GZ6DJ774eo!Tnu;r^T; zYKyPY8`piehHJ0ScSa$P0E2_WRLv56eP7Wg(C2-Aa`)@h_-H3@%uWfxpTpwh+@~NP-tn6@Ir`K|-W~ufIrRivz zdJ}x1k)-8FIwyk_(J<`x_O=eUPrM5O&&CN+rkcrAnQ{s#%niKWW71reF$Vx7~r+eDinL@p=Hl7CM35FX<(qS1{F0XZL>m_bfAbyga@ib~|eh8)M9rM{0 zt0xfu5#PS&7KjnO@YxtAHAh_p_Mhr-8E>qj;)@+jk@!JyP7ux~v-iYVSyGOnL+E|_ zt0@bR1#)5GVp{|8TYbJ>QsGSZ_xGuMZh#!cY5+Vy)~_GOHPot6rGvBhc|Vte1qqBN+?wHL z(e|!jmfzce)9jUIVb76LoW*v>1k=$BM*toH1Vd>&&X4K{$500|rP*cLlzsv}+mC;x zyX3GVDTW`H-?@HAv{X0LE5!y^hpfi3=zSy6o8{~Kxx5@w+j4p7l*H`yuBysDmETc~ z>K{nL{oLSCq67oG(TtOYZ54NS_f&50*l^uudw{Fv<>3`06z3XRS`O=dpNY|pO}tZh zf)-ql&v(zzjzKCvw0XmAIUh`#EaZ1kX-j&IG@k^>m^7HLd@dVuIav-1MBHcjHv5xk znGhxFg_#?$O3H&RhtTGOfsJ11Smh^tg5vev)!*Nry_i(aglKdcKLoxDNhD-sx`!swv33GW zb=&-wkB_^1DKjf7B65B}52vt^kIpp4LJg;|XZ>p93xLCjrm57@BBP*)7SQKEJUq0s zTnQJLDa$W;w^f{5$0iJe*j@e2zP7gZXGjDk7Z;9~m)FqHP@!fU_m6kiro+Fs;08Qh z%xCi1;%L+|1)m?yEDth)Fz^(54YD*_=+43EWIkXRk7G0?d#NeUekzkW?7kRh>5H@_~ZQiJRpLY#MqzZrX<0mK z?H&eoFKC5w9nE)0yYhDqTad@dTLW=_$2*BPl44mlcSbWZyuI9&i;X0sqoaR@gpe{( zOU|cTgoom=Ma$w%8^jBbCJX^bHD3AI>;BTAH{Zz|Xj=PX?Sy5%r8~zbtyH|po&JBO zhYz?c_PeW};p{Pu%`7ed)!G|2JMI7UZGR;xDVdv}3pW}c7KSK`+r;cOVDzlh5Kkf+ z8aHBKW!1gv3tgyKhHHFy2${J925Vz?RS>$sJ(e-U%TV0Gfti}R2$CJyn#y8f*kXXV zNk~a0B_ab6s0>Ye$2xz^RvEM8=NDrsqN2q>KAkt->1zUn$*JYKk(-RHEY4(yKu=Fk zH)VHBVx$B(pGkf`t6g#L(B40d`(B~*B8}3>tehO-63k)q@zNxfV=#J`S98>w)nrrn z#mqKCR1~3jB~Iz9tD~IUDsk6}TwDATGcyH_y-2xa1qxL{Z@(HER#jGhK()ld#vUvB zfhUX0A*8OJkV{tNDIqD@IotQs!FX^iUzK)yIO*?zv9!wZJheh5l$Xa1iS2T$e~|bG zG(6#F&$}X(s@G^eVa7+r7`yxXs6<4N{0h_24LBH-ke1&VOrQe!S*Th<0gRdAf<7RV z7wz4H1K)U7&meGQo5yvg1_ch365mH+;?FcU2R!3>%Hm-=Y^gwtOtV|qXKuDuj`n!=SN3+8O z-;c0Lo2IXCjxkQNB1iy$ecjssonbe`X_27 z|KzEXnlH=v`SNKpz*{#rH&3|A{iDEL!Q21&^Jn+KKy)&jWuX)P-6NOCuKryrNm6iV zXm?kaUouLkSc#J;hy=m-dx)M};Jbrve7AQ(%v+oHFJlc{tWS;=D0w+0j&veNl*AU}T%rzl_jfaj%g1?tH4s42*%>Urz3jZQu(&vK)uSUEey8`2CUWW% z^Z@Q4FR3omuInBdiT{N$pxmTH4jE3xvScB>tkf??Mr6CJ)>;ipcP$o{mN@`i>zrZ1 z0d{~n(Y2`d0Blr#V-unp2*KX3bp>GR~ru~WO=&b7pp~$wBWM;-nOLb z+uS6Zn3(9`UkLleuEu8q1z8IX@cimvN;%0xNLm_xClJx@WExReSXfC(NkUSNn3&jC z=qd*FNR?w1-1|h*S6k*qoUH#)Gp4mWIM*$!w5s+5qy-1Uou`^o!c~{wFG|`%5K9< z+em`~g$)@}$pkZAr_t)S9~a<%s{IMs`WX9C-7Yk1ji|M>v^eNi;RZ-0Sn8DTNyhW?++!fg+~q^-PY$fWbS zRn}E?&Nsi|=H|Y=ZQb}gm>@wmF|z}(S);*yt7B0M<^SKDA@79g{3DiGP!LoWhL|U% zWtd2bOvLZGx>vK4o0sOhD6OhN3=bJN0gS|2t4!un<&V) zVqefOmqy9`sRys#?JY{ZOtRnBQ8LSesqjIxB6}9&pw6|;J+6e6mPVuUHC#2iZ<%Di zDMgI=&W$*GjU@X@4NL##kj(YfWmUv*|IX%+soDlv#$Eai78DfJF8a;Vjq8%zjP9@A zjRBJyxOYF?`=-md?{b6sPi`8T`JgP{K)XWyXG{K`=l0)y)>r@c-+g)hyD$6uH^F~) zzf*i!Mf%UaAlfH8nE&i&!eTc<|7U;f4Z`B9|LmK+es}!e)BHbn`dh6fD7Ed;hDW&* zpFwTyrFY-|29g<*V<6GB9sMDij3-5MZ6O8M%XDpfCRuWOI4ZM&7KG-%@mY!M?Jb0c z8slz-d-dC*QAkNcNpd1K*B=PA)XR%CqW$s-eT=GXI8DVXw|n%Oz^SryH5UYMO()if z-anNDP-70QsILTT+{oVEcpWC7&)t}25FNnO{J0f;R1-9yEw02+&A9*nnD!2Es{8)` zuiUs(xVuZT?~G)ZS$4_HDC5{v_BhDiRCi=&?~&|tIQCv8WE^B1o5UfGL$-s%|NA{X z&+q?S*SRj~az5idUhmg?eCX@)A~vLHO`h(TT3q2TEw)uP_cb^t*#heqhCgeXC;$MI zioz&GEs|A4-RtSq12#>&p$9{F-Sf8bZTB~Xcb{QMiA*|^xas@J$nFeCXi^&9-rfik zP!ynm#LRs5**S`Mu^YT4KLX4<)^&!dd6C7G$O;aa-UEK*a9gacJcI6&n*>4FAKgpwls3i}3tO_X7wKfBWi$ zsm^}4*qkuE3u>lfEK;%_f3(7cVy7Zyc2Y^?#>IsPMey`v$C@jKyu(-KQ{zJ}rLxo}{|bzG+^4T8YNZ zC)P=cRaez{KbRem$EdVMQ7853m|TQ7J3Kp;At0uVEr&ymE$46uE?glRtx8DhXQ7U1*ay&l?2 zf5^{zVy>$`9X|DHzfIm=n%iW2+^OA~+UtRTjiNuFG_Bv}X$zrIHA9X@;K+0`;uos91i3EFFjWVY#9bYxyv*`b^U5Q@1lFUw=Av+6)+YI|yp4!qnfZhZTpD zboMB@3IGF;O(Z0pusFNp%?R-Fz;%P1anxPM>Lp(#e`Q}yL8bwoL|s^~Z_Z=b5+9=G zN89wc>3o3TNcS&`*ahl=nP1|ia{J?yyI1&|ToNYby2SFF5i_kkkiDyo44Pf-PPaB% z$J=WE11R9`x>AMQN*`pf3LB_zjG=XMElUBf64JD8+-T;Kui33t(xl7@2YrGUEjRQg zjon^UGCy`8vN~;sOJbcd-k@yiF}UorvZ-qS5yRc%8!iAaO^#9pq!O%qWKc5oHmt$E{cmS?s>pYLtd^Noave|J_yd=F7& z?!2%WZ>Fa;MSSCnXCL5MrNLc2_?J4}YwKczlh8=_HEYox7XpLRsY66fxUu5;Q*a2)p^lSyv$LZ^2LPCN9)5j>%zt{FeZCHKOn0~}0>h6I3KA=?->&#p*z3jt zcN;eqbP00C252=-SIEJOtWb+B1e-_G8w*?#dGG1t3KUmqZh~OxTUh05DR?8iVe%pX z*pSZjH~lWWyj98B9Ucmr(Hp#yan<8K-f9KZiN$*>(_OjOa_FU6c%0Tp8o#pePkA>xNZ>A({Ed+xwzv|ZW)M-)8t@@ z5#>sv?=Gd1zl}vA`t(!4!~52bzPr_N5(%Zn8zZ8w27)8X7x7i>t}+uY6f0#hu^0~c zO6dNFz@A6bARgNA4JJm_eu}&DTW1Te!IQh0@2am=bivE+8Q5j? z5Gc$A7B5g9!x3Kl7v(yB0C zM`s8l@_A3b$4RUOW_&K!@9)jXiL6PBt_l~tF)&n)ls{qy!_G5!ua#RooEi7=KfVhI z(<9&EL$Sa4nX@JFowhkgzxVt1Tl!Bn#CxJId$R{9K0&g|5p2V{G^1+NKqu=D;P))b z=+8hYP2X@^Wl)*kD?v%5f_ts)?(r60@icLQT?RUgE8Ke;Ds9x5ICLn1;aem(*6X9! zf4wqes&b5Jo}`iLRp*57q^C2$MNfDvi}bihY#!vJXWz?-2oKr_dCP$wb@)tr`vMS> zJXJmV{QKti*QJ~3w7@VMX)!AiU7g8*3|!OMU54gQ#`>UxDp_0O_uBM#)vWO~e;?#m zsqrl+Fyd7IxkFMG7Ly+<3zo&;yMmTg(^S@A{*L%d=lHn1x`bUZs zh;NUls%=LMFL`)2LdG^o+H3>O#T6!P^wFxJQ^}lg(1m0P7!T+b;wy3z9I=t`4w7&Q z5*oP$;@ju!Cl5x2Jhs{*_-dQUHz!&zITTIDV(yYbjG{(|BU=K~5$cHIBbm*Jx5R zVI2~j;>IRU)l13UciEk2a2uZ*LYL>}IQ6>9Ie}*Ya>w0#ce6#~CO>VBkOLipkYRCY zdn>2}tm|0L?SPlIfvJPq_kTRQLY;afc!RL#6&I{Ualbe2U3V)Oy6MsbmNz7 zxv6;3UdxAoz8L-@Q@CMHoo;g#s^pxHM+M#R`mxcI+e_s|V87Hy$7%bwz)jT%n1j zLgu#2{`DuI@EAXR*BNP)T(CKB&d>}Z1awKe*8y$+NL#g`J!^sox|{(q4(p;QaS06y zAa~zuO9JJ3Nbs>_0fx;XRbAyuu;;Zar}IR)qZk32-pPxWf&xFRKoVQq`*PROGZ)bh zUHRUaMzq0_Mvi3;dqSl>5O4AKW1x^v# zI1z|V+qF7L*&_GD8klMRds>Y|Fp_6E=ggP}`z=KuFXfye4aG{qk1AK5q0_>`x7&=V z_qgs`H_-VUakBv-uzo8v`Qej)C40yK{M%k?Kr2A?-lLa*{Q??ja&4wTPOaT?%`9h z+`NC^8f9`+=@qg!UXdJl_yV*p1^$9j-73~~=6a`>2zmfm{|rV4l^qX4Ep{j61}=GG zj@d_D7W6o(W@XcjFH^I_0fW3eIr%D?2fv!y>Ws_y;xwu%`7nu5I#o37-TqkJ_VFz@ z6);G&vC?h4MD~P+nXdlJnz5$1hUjW4CY^s-*mzGo}WY@^#K;A!Z| zGvwL$AzN(Ghuv3N@2k+vg_LC#0waf@5ths~^F)iICU6iX9Sd9FAba*!WG&MvY%Dyk z?ci$?5{6JO7`-IN5FOVOqiE87vt8EdO3ojE0zz{`y#4+r-5(HEf=2*Bj$S=qM<=I| zZM&|g^p_Q1frICHs4iQq%Hosax2$AkDQ>fOk|gsX%MVurE#F%^7P8zY>>Sp>v$r75 zqFpRt1!Vj`9prEIe)((x`~2a(OmDHylbG?WkL z{d1__zNQwXfKSyJg|XIIE5%+EOW5tmqR|DdyH>-k4}{?xu8jd6)eVSeo zbEUgV5)HjgMECTsUlqS~e~TKB((Qtsxg6FvT~gDT7Fk%4dR9LKFArB@+?+5EeiJ(3 zqUUr6*8eP4`D27KXLYbjUWC%eh)1@LpuVvo`rEtii{2ZPC9y#pSL5@8eU>@*jxSjt zdgNBVG5y>!Xf(wfG;d)f+xOw{$vbu5na)qJMf?rX;{Y)ksrg#$scReY=nL5Xu zcA{|bw>0gbi1M?+`u)isnWoL)H##NxE`cY~$6xi?N7>JgiYO*B&r?^k{A0||Mi_9Z z@R{{C2`OE5TK-wa268aP$Le$$GMn$Ya{~Y#%C?bD=Dok?`e;oW6Zm#)j9NaM#p|rq zfS=8hCES8rZ-z&27sGf=KelQljfgmTToBK-Mlb9iUf%M~$7~31xZUugS!;aB*X?Z%b5ph^ObYe?f ztZ&DxpfhNv&kyk4IE$QJnK`c$e9UUWh&}PpR=!9$V6ES82`4nh?b2k|mC>IUXw51z zYqSWWmt#`@I5&gpfKj{s$H+O7vi<}r9=_dVv=m%-$uaHiV%&^2W_ggHdW-Ie;^%-U zn|DXW99K#|ZXx?*>ryD*rQug?({_*iSmSD@8FSrZ9SaLo_URX%pH1whWsrRxxS82HXxs>kd_HBClWcab03 zW_g#_u?8mo9scj%;maEfz4<@De{KI8U-FhenC?b{a8tImk>9Gc5XxWtC`|77DSp1S z+3R$6H>b?o^bFR6suXza64=ju+|TO$)8F7chifezS3ZFcCPc3J_B_;(>S3*xlo-k`T>+j1jh4`Phq-{l-;?(T;pU z%N2obOR>^g27yO!YL_;~66H?b3S;Kjr4*+nTvC}FJ`%w!{hpqtR;mS}xw-jw;Hvx# z#^kC~xw7Ei>H$xb^cIhnRl*3&y)_Hg%XY`r(EfE)h__oOjl8jIK=;yFZ5U;EF)?%w;h^13SQo{5{MGYed57U$jddn=Li zldd^-7QA6Jx-)D33?Qx7=ZFKD((&={gMbu$I8FeiLM&n#U6-igacM)3>sF3^1bOGn zIv*uJ0VdH*qa4tRqnRZ!#9Ht9T33a$K7)4Hmd`3Zh>Q`+91$dljCf=dYx%91<6H5I zle0&8SN8We&+E+`6esnh%5sRO47E#^b?{MpI{Dg7HtschZC^L|_n?Ube4m!4eQtaE z2glq%Yb$echU-va)mShqTLeS-khVVU0x=?cGxSUSS|Fsfx2SdfIHQ4U%VMqc`I4Fp z8Xk`vOTleZPAhm6s!0pMGXO zXW-rbct3g&V!R;-uypVGA1@R?eiZV$04NYacHTj4CF^S`XvKc-59cJG00QEh=HI*J zYlkQFEXC(El)=x=Bla{T5DvAa+1YH-(b4u!PRL5Rcs1<4#7pS9J1))JuAD20gKh=Wno!9uenML z1%wRm%hwyrfx?huM3q&c%8(27J95(R!-8M23ikDf<`UdCFnAA0l{s{my zAcxN7oWe$Qw|kXU%AIZ$_3ik@!~7>uesufBy_7|_ z!YRlPyD5)WGl>HfJvpa)wt6Lcu-Vao9ya%Z*GuvXekQu8*uj;=h54c&LK(T_4+;R- zoN9IaY`A;eLQ<+FBxDh59i#h#ugxZAMUvub*E_aoOB1mF_b}8%m zevI_qJY9gRlB}Qv1H0&ID07h2y{ln)i30@u15!TOxV`;v{qt)io7?{=QdTujYSV)({5KX^mT*j8Ne{lt#Q%wjM zK4_n0^`0+5$epRl9z=- z`5Q!~lEg8`l$0b8?XIxr0|Z9r*BUBUvbIYR^?}Zwf$Ir5`9*RBHO*%8TM7E!-rn%r zZL{>dDQ#;ndXwkR2EE7SyhqXPBbt)u>T`2*QakTBYpnZi2*jWyb#DA@qi*o|3Gou; znXUXTV>hn-M}hFSiMBKJbl-tIkpPp$t_=-Ow4HW^N@%nm&Y#qH;-2^WgxVRTmHLjG ze(fY>v~UN9wdNb#yw_IHF9C%UC^_sGdn)46bR%^$8S`sk^KNWVqR943teY=)!o~fA zeZdpsls3W(*5KJnzd0oa+$$A}=S+0fr`9;QG zj%t0+NA*NVrGS9J0D~7|7`boJ03ZO>F~O*4-j(eeO88@FoyUf|)ZVhJzU7q6gJ%tg z)3>nLia_lS*k%^+$ZlUe-Z5w|bRiCT??q-f>lEnR&EDGfslosJxWCLJ_aIi9=+WcI z?!8fYyiGH)Zf~1aChLEwo{kO-J`a;a9tQvH1e2NRD(h;>;}iWdSgrR~gV)wn^>-$1 z|Gor+Q)7XQRn$NN|$u8R9F%%OYTU)}doCcuM zjooE1P#PBU=76wtC+-^m-_(?zeZ4$upx-)7i>ri&?XPJEXrKc3`SNA5V7E2zinJ7brBTsJo5F zB$r?C*nI)15N1ZGSt2=AeSEw; zyR3XSBc++Z^A==D_pp)*%wrHzK+U24XESwufe^qoO*Br@BqNH7ROn>Sj$rj0WA@!$U<({rJ7Q=B~aCSwteZm$a! zkc+*=gGP;;nVFG5a_LK#3n^H;6{0n3ldvLnI&^p$IXOz)CvXRZkj;f|Cu@lVr zV<97cBm;Fuep65AVx;(St1YOtk}YVqB)+HFA-0`I(!NdQYn|A$w=jGq8B$~V`FA#` z7zkzU_bmmlt*kl$3jPppO@8ij*BME;6y)nGf7Q-}G3@eTMILl0AX!9Q9FC;mY=Myj z)69_mLmy2AWH=sbKs60JJ>$WQ!V5qMhEHSYhT|K>H@|N}(qeuoqh%TDQ90M};E2~} zLrX~E#wbHRM#oN^iWv#Tpo+2e*Q3Iy+T5>6e@v&17M47qV}y!S>1MTHjIN~lpY@gl zDJ%sypt4nnvNa3k=5q;63Lv-OM*{Cuo$vRy#R|dl{R=>cTLpq0au!)?xt$NRJcfwl zBZ4KG{IK_|_1K;uMdOdLul7tm7KF8s<6m@VKm7zISMj7Y5I=i&(~wTdr;HM)k)+%N zq~fuM_H&m8oqH`))UBslSM((hDK|%2yPB^D3_AK^4N@+w>*S21D(GQjOk=s?dGGU> zcAdsxTTiKPS4`u{!^DbCz1r!YJCOkzgFl<9Xn7RiLxNU$UeUkRWeDh zpJ?#F*Lox03-^h8sM@NRKPMpBLKcR4jR|=O)4S`a`rvKtAk%27?MDf}y04w*Z^>!g z`&?{0A(^@ad_Fav8z0A#x~+7hOn}`Jk)${bYOoeQ#fQkRGSm4q$X}wSb|~muZeUJW zHmD!}DCekflRrO~{@Z(Tc02W?AsC$SO0~{2>2_USdJt zE88I~)QQ?FZBLezXRxpSRIOxg{&4u!2$*8MqbHR-D-uhhe800rxk@qtxga=_g;3)6 zGbGJSFFE+`)~aR{ps{H0lE;Ct9KSL$C1mmE?BdX}r)9gy3FRRejX0AJ9g>3-7F-|- ze4Ula4O%rhj0Cs_aO}BTY~{T7tRk1Ar<;X(czmUezU+?w1wKS^X(?jo2%ncMiHdhS zNVM7-UnnRrK=&7gU_tRBm)7*ZM)29tjB~(WFpYqc^<93s z&6t~2fKRNvPJ*1r^wbnnb#NqVrsi9hGXNN}fetpDYu~O|o*ztTj8|m(_TKgpRR+x} z;=ZO`y%&sqjLpADM4i`J`!<{>v9db7ZkKO{J4qjNR4DOuh!(!>n`ZKY@jd) zi*2GG4xxvAiLf7L!c^3nUvYUvx6M-UKCfJks-Zu*EUL3ZR)AFf9w}$N8neI8EYSeP zgnlRmVR~kO;5$eYouz6vkTK*6MPYqw)=$7gx>?q~2&^5$hgF4>fmx!2bghkyqEu`Xv?=lgLI zz3NpY%TF+PAbL>K$Hy)eC(*}m$x~}WC*(VCnjby1GqJO>$^m~(4gQpbkf9%LqB?WY zvdo}$y{gF+Y7_}bwDEx8PCS*N0DfL>c|oQ?KC;Gpzd-BDDWd&zVC@*YeZs`QURUfz z8SE`nR=S*XabsvI!X~^( zRvzkA7HX5%wh*RNGdQn3sgE3b0e2m6IYbh-%s_TvCX+3JIX*u5|EqKQUI>CW?Om8) z_vT1R)b;TG_1BFC$vmSt2?~1siXwfTmuQt~fv*|f?`q->R{sw?wDZxgGGPs2NAqCB zz*ePYR$jkcIYABNivD802Z%j$`IO1O#_Kya*I&AXbr2i5Relj)vI%Oo`MSNR8JgdA zRqSJ$IJ-S3n$&F;fD5_I^N!ejv_*u9{djS>*{_G@pH*~9r3Paw)@`)g_@4SHGq^el zZEq~IeVA%mg`qeVpn#x{RI-How4R(uk^vPg_-*DpfXBNi+djif zQ^@yttKYr)UYO|blSS}32Hk6)Rn1`2Mv=l$F=*JM@4*n%=Uy>$9rlmluCmicI{*ex zeT2R~V&z`PeuhL7)Xx9yS?_o0qr@f5WIV=lBy&dp^_t*-i>Qy2Ot#NUjXnwEF@5@j zG$bnF=UN3viI38eU}sgY_?#BJZXf)?@wLuel;-QhGR zlLEC}2mSNm^~*!lb1SC3hR^Ku*{)_GCPpPQBp06LYZ`|e&!3v+qob(#rbJ82xAk`~ zalrG5zPs+~C-Rw)(;`St_P-vh_f*L!Ottt9sWRkn81vHoTb0;f)J+qY0f4^)${9)r z6FnA`*hMh0N6Xw*0rQ1&D+3x&lgM^g(iLTK>Bm0zYQ~uDb@iS$Bk1hBJ&O(|n-hy; z_?@-+91Fy(wRv4u^{Z_4U`ocLxRq6<>DybWk}kcRIRV}8*dMde7;gAn1{C=5^YECW zUEhoocUb^Hgujvo#(1;R<5{kMqV*Pa?ODHcI~SdO3`4IXd^PPR9&p0@_#6f4R^j^k z@xE6jdXrPw!=ct!cD47_YsZq_yv(X!g z;;SPF#cE;eFZ`z?FY`Pm2#3dcLSX_HN;*NB`s0}aPYJU}JP4@0U*)CeZRg?{<~7xv zIOdeE*_5s~Kgd^<8R7MmKFQkqYbhZF4cRcPKfkKmc%dT%YKT-oec4>CCBnZ}?_z75 zcz-5Jk|VFM5o&s?l`>>ZX#Jeq(kIwti&+nd>BXD+vup-=OcRM&PhpH`J7Xn!{aS<| z>)@d=G960JMW#T9rrvdz0CL?Smy?Q4iSJH#=@t&oS?F>OIheq$jl)^Y{oN7 z9AGc;Wh7>?EUw?5VNs^a{JW=3O?dr(6aYrbxv*6r3$Ej&^#_gpYgE#crx{3^|VF2`rRYvzQLAT{j) zSU1$+&DGWLWp(4mzXK&%tdipAk-F+CJMA4BkW7e4O$dl}t>gzKY}ocB5uS1A&N$QX zJLE!Vcv7?$a^FDYN91oBUAiKB0bS-=0R7o78`I-<3D7cg_;%ci7hj(rAnU*Ry_F)q+(tyqNvzklmOg{cd02!w%AiwG zk%^7T4I!Azok_X*AaZ65YEbJ`Iw5JIe@`jE%3G7IE+}O58G~pY)ZF^Riiqel+F|cdXThdc2 z=~I?=A3rkyja(=uVQqa~C-}V2ZACbsQ|WkXC`jwmD>5a^r*lUinZ=}}_-5+%N10v5 z#?KD}=R7C8G_h`c*CVGZp1;ZVKCAY`jGo&o#a=?{ncq*^$gBK48REE=-B7u*f42$% zJlM=z0gqe#@xmK}4k;dd{BP0wi{)1gj*BOL+)MjOZBYMMhvR<6tE^s|q+XlxnTaCl z^8-oQ^S8nn!S)j(+3NXXZ16~27`rn|!%Q927+EEi&)CoRY_WxI@%d-3f>=GjTp_il zuI9KFo(7#q`1gDe#J^vdFJtpGGJ`5J!1bBt2^Jz|ybC7=*RDBlVWQ5Zi^RrR|T)zd;*lfu1g`18`!;$9k=C}dQe}TaM z_I32!wi$6E6CpijLN2dJcAxig z5D_Ypub%bndg9>qYU!*^?I(SQYgLaIHjYgBk|KlxI+^z?wFCOLTL?jZOVLt|<7)x)DMnF?I`S{$XRQz31y5(uA9RO{gU zS-oTX``;!%4;%&r8H4a}N$&9Yl7%Hpov>F=miIcRL12rQ%#Fyk9!XOKXY9StN8&Rv za>kOTCxNoZ>_fwI-V2;+O*=&PVTz&iVB_|n)@_{mZj%*4mlN8w{EtdJWraOL69-&UDFjKf zH-1@Y1;QxO{l7PX;!pD4_u#;8!v&8uimCwgl%1$$2GuwbdsZl;EGlTecosTgQ9RMQ zGR~LMAHnmt`mKbBo~!Cyf2(sPK)-&unjY1YqcrFAx58=lw?B5Yx%YRyF0S0T2Bp1f*)OrTtja%dRCqgH`czgQW(m=fnc z4PUjcZqv#%&Y>rawNB}L2f4c*w80~DcA3>{@;a!P1#Y#4^H1WBX=lMd^y@bfMzNj{ zgUpES3z&~*i*enKCjoM;`+_OAQ-;-kW-I^6-Y&VolD$ zUbZ4hIwGFmBe3U$18)a*P)e;ou)<}{J=xi8vbYv^ho1H`v`dnD5$?>dM%YB(nw8_j zXDetXNT=CL`-UT1tO^^uB$gbIqC=Sj-~UO-j(@mv?5ceNUrsb+;k|0I*b(?Gf}qS{ zU$@{s^m+-}=KAHHRovRzQ?9?Cl4jrZxuj0E;q?n`-&^|fGKZ+xXFtdj37F~aULIMe zPw(5ZMJvk1&B zK>hKlr$@#C&&M11k7u>gAFF}ZHHd8Nc z-nn%+MEisDiqgj`N$Ld@`)~F`2H$&4-_ghKw_XA|KHN_0V{#0PysioW!@M^d$bYKB zI#4ty|MJF7_~3Q=59&1;h?6oAW^}YkETu|Ls9DY22o*R*Bxo{Ps&cE4xM2{MYVsI}7{! z@YFt1@|U5m&FJ{yuWv3u$lw=J(@iGXuO4o;-;?&02b(B$#e>?%3$)VH`rs?!bCJX-}i#gRVi&hdf{cqt}SrCMVl)D zM7YQ1qF;r593M{K)Cncc3Q8vBNMJs{!86SL2`I>dmk)UpUgi62mH!yK1xKMXuhY#M zF!68-MkTJ{aPZsOyB~VkQMllvkJH;O&W&9!zqheOiq6H#oVv;qbFyI*6NRFTT|7%v zmzQIuZA^6iA30iOa##z5p&21UZ&PR+Rr~3~P10ndFKM?&;+Dw$-z>Sei+|Rj;dyDz z9UYtPl{~85pDOa|25sl$wM(c#BD3FM^*Ovt7F}<@R7lZtNF<&$wM$&P%y;dw0}j)f zK7Dms5hA(|=txD0GCk8{XGJw8Mw6}I26nR+^fk*gs!j6ogPE`P;vClTyByX`W_QoO zh_a)inI*?!g7*?~)*0Gc?7>~UKP$#sxSk>wP76yWR94juvS1DM6K9to;!-+ZT1v}2 zj#{Ycg__@4&`>><5ekI2$x!lU8~DCdH;oo zJO6r3ts+B^+$s>*wMUI~aV>j)}SS_O+1z%nbA9Rma%T4p{*X>)$=W11860 z>yr9*;tysrpqPpg%FNC991m^V9Fei+t}y~zee=4RgA96X#W!$@bDaE5XATW}nhdxR zNi*b&%3?5M%FfQFHxo`XyjNj57y-?92?w2t`b`_z;xIGL30%?I8b24#cPae(XM`q< z&iBN!d_G^C_M3dZ4q_bWB;{t!9t*@n+zQA$CFeYlVUp8+enzzyhmbR$5YLownyaz@IPZ;Z-v6A^f;?!PXgi}h zMhmu&&j>ebnAACWwRp+NmpPWV!sJi4wfA~s18d5IhUZ1pdod&4PkgZBA>%>*cL2ck zcG?Zeg>cM&8df9=xT9K7$U?P=PhFgM0{O16@3%`CZe^~w^UqH4**D%BDC4SI53z0YpjGw5rL>>v8w8(I9rs&o4IkiVz<`*fUN{Ek zU!M#$G9=(*+dXUuT`f7abD!h2brfgMZhWNhNNDBV*2O$Y-lS|I_h22IxKdyLQ?k7k zn`_ZNqG|I@4jQetBz5(Kp?S1p#otrTjS!YR;7CY1Mth3n8mvrO#(b;nVHw@SfgCv- zQ6z`$^_ys3_=pN#GKt_B;LlpU6!uVxxYr}r%3c$?6j~CnbpaT5)17LmydL$-m;^?2@?f1rX~A9_i9~($Tl;J2Z^Fa_Fe#PeBobFjo5rq z-x6rf(EQ2mC_paDw|mKBg)!FAlixK>H~%u}l}Bq@T2-ZlSkoYB)IjKW|8>{l=(H#u zH=pG4F16Gqs7`Hqs{T=wuEG9Yk?hP$ ziDzN3eW>}Zyz2)7S#`E0mLb%8{AccJ1GcYeH4 z&ny2gqCd?=0jBu!bc1>-q|kox1XRE4c#)8>GO=Es%|dwy}X{UUr7(QjX-Yz zBA{H|STH3+0>e?6O432VqduVH?_26C(U~p!v3}#LFC+n`xH#YMzY80vd%9wnP-SIO zOJ@a|$awtDV5HmlPy;0(C|^$5v95mqQQsf`DWOIbfF>a$MXEuGL7ig5hu!I*SMWn# z0g9b8Dp2OoDA4S{jQhwe*#I#wG}L)Wem|Re7jvOa2wS@HN+ty3HZ3Opg>(XkiR=c; zK;nufsfn--&7l~69(dAg=wERn*IM%n70-pjCRvzK|EHH{_|);q8_c_h5e@^@Pfc1? zZs$7J8&lEx4#tU)5ID&Te?t-@(68g-f`Up;!vX)_3d5u`D^8>K!F-{4As_=6K;N7f zvBP&86_qvSEZg8AUA3H~E!U4?Ll``O+VQ2S;`zCsjcudt!L68OO_mqW(_dLvTk~6H z96tNgCdsgyDgXiPpDuNtAy*`4&GPuw&9z=R;Po+_-qD_RgALHM@z*M}*PE|(UjrNlOMfXaTnMFiIozby%Jz?PogD0~`V4sHCbw#9J;9!PJwprB?HK{W%u z;_UgWj7)QYw>|3~Nc5P5Q_`x+C^~1uDFM464SfKV3m+$eX|AgqfkjVnz>_6&B<0!d zM=cL9J1eW4@E=UWLhhh-kRuXa-e?G$x&ub*(0=Ttx?0!7t#Qy1Ad|hWHZZNCGjLa| zzO6-kd}k&0(eyxBvPHV2%h&hzsXK_rbL+4tHz}gt=h?JVMhUJ<*4s5#J~pXUY_&n* zhRE@}j#I(J&;h6^0EA!%uGu&_R=x^?u;Ll1E28wb(g}SPD^@E|#^dA8cqXlJFy_NL zS+ogfdQG=@LFNd|SQln4im6fO>(d$U8l1E4m1=S@rzl9u^k@CN!aJlg?NRzTP+8#$ zr%q(eMgBtg3N7oZ^wTW#`&IIxKD~sx+S_p;1c}W$eG78m{q&)XRCQl@_MJAD*C?rU z$NLmh#};r@691fKv^HTJ2`@v9@u*R!KFG=+^^D)zqen@8xXW5RU(`8%CEDa;pMJHv z(M2q>rVz=Cc7W0A8~fc8E^)q>Q>()?{>pkNBerJk&gpLrz2^XbvaY-ov2HpQ`0fej z>Nnp&&n?A_YpVuq6jd%e&#XXJ<^)+;db~cL<6aZ96Yf=5rohLg$=8$Bg`LV;m}yBj zrr})5fd^$`%tCraVjrHema+{$$Gxvo=YOtw+mbt})-An`n$LtgNgrnNXxgxV!gse{ zX<9X&Hzxo*K<<^NWAFIwLLGc}n+F0TB4-k2-h$x`LMbtrkcsOluUF6JoO3NGl|pE2 zHF7!dfcd`C0GfGnKRs}|pcOG45m}!l8MxLHj;<^#`@O! zj=sA~m`T%@X+`j_i56Mw5`HWk@PiWFIU%`APGUuxx{9PHd7P{=cN|Paxs*c6hTU>P5?4x`ztkQ_zwP|l` zY_A@Lux1i^>+m`JBl%7KfTpGPGY+GhpU_gn)gGc@%(8(zUBjh@q7S6 zWqKfbrOZ=ldXKj_$TG6-M(4E6=CJd^_BssJto`w=Rap%_i>XlKZB*^nCjbB>2EXJJ zv+U+%Wq%teNitRyX#zKp8&t7XD}ksjhn(6yJ4+iA%uwidC}FQ#Y~ zxsCK5?EguAC@!5$GFnq{ll}~OCVO3b!eT&IX>s1?*Qyy<^eVK$UTW)a%Wj~o>69rK z08v1$zYIk)_Mb_3nhSvW*mjjs*w6ag{$(JBl7m4}vv=>LmN*{VxHzF{U8OVJ#%5zz zUjoaJl-EZ)>Vz3wvDZy9zW1^%Su&Vw#73ykrm=-^teWBM`5T<_+KOW&we<|q%o&N5 zlOQw!!Wr4=m1RmNze5Zfn)(_E2~ahUC!E#+8I>!WGp1GD^S4>6Y@^R=Js z;6hU4zfI|XpkW8IVq+in%Kxj~Jj36h3DJ*MSJ&0P`Xu;2lGlK3h~_q{&+Tjv*^J&C zvB5jUN$}lUfu!JZL^EF}i+{la8NGrjSLZ>7!w7{>}TP9s!Mhi#R+~ra$ z4A>bbN#eClak6B4|7=l14AE;RDpNv}TZa+|QRYiQlo}t%Gtjs!Y(fu~oS@;Q3WfR1 zsfKYq}M` z=h?Kg*311fM+-|x)iXm*svZ{HjMpaVX_o|)7TxUPLv$QyN^fF``K9w!km=CtYLaS39(y=o_|u%`dK zae~$cVpI#NW5^HhFb>=OKepZiDyp^ZA0FT+&!H401OyJ}iwBaUp?dWmW-1Ra%qu zjq?PNIa9?(Lka~^2(duMP#qB!wTP#!UOn^3*$frAkOA$`&rQ4}xO{BB+QTpKuD9L4 zZ96#gZDO@vO{T8uzUgLj&0)I*uvDAXoc^)~s5 zpb#r7*DSq`(==#fgryN4;wn)&0#H)kQv#n3y=UzMe1t;zc|x-KU#_ zXlCe0KxYa82AP2!)U=6Zurmq28(Ycr{Q-p8aztF;^ui}#jp8Ip|AU3uO3;Op8Gmr3 zjbj}5iiM1G#OLcy;Oy-EcNgjUl9G})k_JwReveUG$^HzLviEU)6R$GXY142ee4W8n z>J=B&6%*B!eXlD!svzcG^xrJu5A!rQSnesZM2u#>a*`H(Q#MFju?mdyZdja zUG37kZ@f1VOpYeNwSVqna|9w_Sf^TKP+>Ck_8enZrz4RXeLOWTOV<~u#(dAc6Z0-a zm)PE!hA+to>|Z}v2WzYF=+}Tqn z3}B=@J>5|s?;qO+8h$Rvc_=v3ZbT12RE=`IIPEHXzy;ZRg3}II)_ji<-WGKs(4Tua z!9uxGjgJ@P?i5%jc3+zM%er={H%$6;F=9%Zm0JI5H}5qss-x6jmHvFa>imqhS^Kq=J7^bZA%Dn*Sm?)P zM&?A)Hea{VyS2Nf<@x$w7cJn@TxRYGS78YEmm?4zv#+ucBHnhASdIVu7@I7~R847*%lj&MhVg#ETf9i34AH zx(eCxd9F5VLq28DLl>de6~P%yPE9u%G1+x*1QRLip}AkQY~qd zfbqcj-SPcS+Puj>#V(U6toOed@I?1*w(~)20j0fKyuM1;zNU>)Vu3Cyn;@I7rt#fR zoct@d#B*&ow>lro^Lg)wx^)SrHEr5ud0T)|8)zLC1|WI=;B81C1z3#H6sVW1I%(6L zM23;f7na5)m~w;=u3#F)^6e9NTDi}QPRiL^BA>wle3vR(+mAO{@>?L&&M|!*iws1N=l|W zck6fkq04osBY+l$p~$d*rjb=T499$dJ;?9@ro93$QYqXw#xDP-r;jT zzo4tbkoocFl*VPtl!Z&-(^)4ChqUKY#3m(%EZ5z-&GMR>w>k&V_172^sXzSId{l@# zM<=Kmwv;Su;{zh8{S;TY<(rHW|3ldP&@FY}y5Yp$uLJmf40bt|wr7%BM2Q5{BqlQu z$eR(C`^Pe#=)bU8z(7fWJsI1U!``;lP^mvd3SZmtPV!Ptn5C9BD7hk4IQbJ_3dCwK zCTej4zeZ{aBx(VFEZ2)+ZqGyy6dAyHzZ7_nXqTGYqcUFu=YV%E(MDBEY-z6H(x*WI zk){vABP4fc*fy^*OJhD5ZC&N0(2le2FwxDkfU_CP0eTwx@e$ryc**#Px}@r^Pv`W} z$4(iwT<@c*<+oLZ(@iJP#&hA)5&E4*-Ke7;li7m!D-0L9cEIng_5k7BDjC~-p=SsC zS%BLnj_p&ML_S-@E;L&p@h7}Bcs#sOy!>5)^kBUOy8relM0%N_Xv$3}et;`hrJ$(Z zzulWPSsSePguH)hu&?T~5QM2(BIFY@F{!x{>~XBIOv+8W%yvcproVooUc11E`4it9#SC2ura_Mn z1f-=M{bDOVKl_23t6x{yM#ON+(WOXWlsTDPxhPha5{|MCo=AG`3@*f-_r1~VI>)&(r^DoHKkrg-EgD`6nT$GGe<7v8mhLuONXON;;+b}m z?P}NQdHIL3g4?dk+jACLEq(Hd4;g;4H3>t>pt~$Xwh2GUG8kPKs3T#>>)%!5usRtp zU8LzJ-(MTCLIBmiPA2M48~F7EIuJtwtw7*Bot&VkDB@d8EkJg(KFC|kuE9!YGEeZM zomBYZc-shV-h6?fA0_@h;61a1ygXAEGd0;Bn0&34m6fI3fA%X+8uk`#V|;S$J2JMp zy{$inj*z($lRBhQFQuJ7Po4hl;)G*6xodg%U_I0lbhDFYT?m9FN(Z|%jur?ZY9Se(LH2GfHO@Go0sHTqyIZ zSai9K*8S*c_wj_JifgBc)$i}Rolo}0`2dHyFc`$&>Eo43C=Y?`F#@1_$^h_>_NCAg zi<#zg?K#InEl%a&$#QqA8osWNCT)CAf?ow(F73|d{`kS5%}LG@1&|wy{-PCGGz)4Y zSk~s$S??*aQusZN9X>jOXO^FvZa`0Foi5Ju^74cM#}FAAseSTzyt@2AaS!e`=D(l@ z)_KE(B_wPO4`Bz6S`bJQ)@$-acX!#Uk0u1PG+H75iB%hSpxZn=BO`(FU0J;gzA(7G zV>COfd`?469W}5v5*LKyK&3Z5Z~o&EEG_NaPK`WwGkoCj5)u0Nm_1TVU{IYEb)}{= z=Bc~Z&GvJoA`X*VfKAAkcXVzwt9u@}K7eFA2bWDChpEUg~wGjE*1h_L%Jiz;V=< z?0YYChS>nhM7!?V(JM0xC4$Qj-l7&3_)k7}aOpoMUncu|rLWWkK#R}KTCddLJ9F3| zvPFt$1_xfH!U;MeV?Bp`_s7lr!&G7~Z-yz9-$^Dba_fMPD@gN2x=W(*Q zPokCc4#T--Wa(%D1{<1K``2sHbKL(sWIU$mEQU=+|Hqp$kINMr$I(UpHPs5_CR|e; zCV4fM>gl+S9`X}#>30&9la~Sb7t^B(*l(J$H-AAOd}f~j&9d+~t2(5=Mj{+fbxwTD zSfisK`XeL60MyT(SV%9_f&50qT2vgqZm$DbSHGJWkUmRKperO%6-woiQ$?f+Yp(!069DKQb znw#u2H69&=g7neyFawrAEW3HLT^D08f6UoF> zo+;#?4~E#qh$m&Ov`-9`V@4{JQy+25K4n^Vlr1`1KJ3?i^kC3}@rRZ`PDl!R!QH4- zkDD`DGO65~8}9_b`w=E5ucR=E@dbJ*7b}}wqBHr|=cU(3E|Yy1BbWX5sYc)Ns7^rH zFq{1*s1TW}@}{GeQk%|j+PcNio;$-P=YN{V!b~s*+oxz$EL=L%dZoMMM?7i4E97|Jc8Zvz$bRc=8y1#(_NH0t0#23eiPPbOyOcd2|PG^m&_< zr!u%@Ln-Hg-vrg*nx3D2xfX#g4DfzX;d_n~*y?I)wOr_8z3s zHvHnyV3h-n6|wtX%K?ATVK6180ib9RcsU3Cu|fhPK?FMA2}2Vp!URC{=K1ClyA-e1 zzw0(=OhzIcn~h8^hjow8PJWtzIYz7j&>ht)s5b7smR1CU;-#t&L4l6-E7Nt$6+P}3 z0av=)OY==DI?#(aLl#9TDXC5Aip003K6Q?_8kx5zD=!k#C>z?}jc7$Ug5y8+Vs19A z2rKGf35f?UAP|H5^NSET>~%@T+x)kN5oh?Xw{nH0cD5?fHI)O%kkYe2`8)JT5Sm5b zkLHZ$s<0?%ZZ?^&Cbrw%?=0PjFL7qiHgr1AEy0{bpwj2hMRJDGLyRLMBS~p#2~#m=(}qtMKRUp&T%n-=ef9*v^o>T9*6_Np2^@B(`HvD6t#qfIg@AV# zgD|VrF}8o1hLhb|UNcS%Qk{9n? z{vGH@viMSA0D2tjvr}0b!<;j0yFK4*604*gXUXw^$i~_E<>JfypQ&a{R^bKKa&+{Y0}u5QI8=`UH@Y}j z4vT}u{AEgzViVsK~t#i`#?DG-N|x5v7% zeWms&2Zx@U{c#Im{%lI8BB>m9R!o8}1RDa1pCfG-cHB?|5Qy{hs<)HKV9%X@pA3kH zlA;!O2M0rW%S$hG{H6F=Lc&rwgUmMx10{!*rjXC?Fh{WkrgS#kK-s2<#}2sr`0 zWeibz!2*-I$++-A6UVf{Z$>=oy^3PlU`ZM}Fi9Ok@({sC9sGXryKf(GF9AkN2s~$U zGV?3+xHhUh+@G=@r%cBd9L;a3lz+kIU`H#B-P^e!4L*SeYifM!F}fx_NOHkaEjc$B z+|8>L>#BO25{~!z@9)Pxah;M+u|UqjnP9O1828e z@3^|)gd>CG3=7$~c+AHNnif{%wC*-9)?4lG%aLrKdv@U=UzD7UV@{b zk-Pctlsfgs!qvOZbELyGb_Hh#Xd1Wm#tN-uE5p~cw1=`njdr8{~{B;4R3!i ztmCTpj@Tx?*0aqA&mht@SQ6~3p|&-9Y-)&F-@@h>sj)$U#VPcwi5CL%cP@s4Jkd?< zZA)5y9Cxg?hCYj`zIOqm;t8Mlz;}j`M=QGVbz`u=X9Uy?&-?s|9~h20k-QBlSN4A35P&ho+WO@IPj4DQ4<0T6{tYl*_z@7 zqwBmgx}orLCBlQ%c=;)X7dm~0sha{mWG|mQWh(wmHAZ3n@||lDf~H=mn08b6Vg`E8 z##fCd_jXtrkuf(eU|e$#Mi5obDUCXi8)_h;Ro7V3p&0M0_}@`EieX%@Xmz`lIIS(U zUK&>>X?JlJaw=EoTTTh!7GbtLI@FbsEmx9HAO%K|w4s^vfI7IFZefzN2^Q-Dr3 zAx;sOa#L^cEQ+%ocv^$OoX<>eZ?S{Jo1P48@6iL$a-;&t@YXi!&W6`$p-TpvP%hrs zMNDD#P5A@30K0XLa8{;OF}N?mlCo(Ims^osTgZW22=;zh=h-k`Pa2BM_P&OkVVHw! zo40GVN|V%2`3~DQEv$CEF3>~3h>0BBZ)EGsZQwDvtu5mvO!b1_cWhR$;0xvBxDFm0 z91@JZXBEo)$m&)jk@?O}>u(!?=~Tkt!SsBXs2;& z<=>tLTOIPEiXT!wT{ERN+OgW&Sj7l4Gr)fxFwOmORm5P4#0g#0C^6e>@&!>(!GZKbM{msiLY%BX_U?fdaK05NpcqiYnu0;X=Bw`Xtr1-=6ccT>qVsn?3 z05a9RWv`fHeDS&~pAVoT>i(k-5{h{!=J}2AwOH-p8sWk= zy1Wj$^*?*{anNcHW1Fks_~5v^r_nxa@_FcfROEmPa9k zvF#VdU-&PAd_Ar6{?7qgoNVB%DgD=bwv`_4ks`xG4QJjtSpg{#@C_|p9w&e4VblMmF7@O8iapGy74O~HSXv!J+QigCDu zvmk?mh4a1vFJK$8wdJO^_)j91vDSWKR z?IjXCJ|YXb|IJdSVVK~=BO=BYZd|Ee5BKbg6rp0dq4x7Wx~}BXnn7>#-p1v!p-2(7 zd`+VrsV~9`l8y=8U>ZzlO3SnZL9y#}MR|<_(Idt>c>rDQDf1d0E)5r?EVW3r4wl$H zRL)i{j4H%h;@RO;Y@=Ne`*vs33QPh zc?vY?eqev!w=6AHU;yGVe)>5MzNXlM2|0maxZxJj?%ay8An-7Ev8QD6JcZrC1x`YXRpKgpfb+j_31OY@MA4bHLtVaM8<@eAU~6L2(DeJ4r-aW&1=_o1)eE zCWdaobemo~-v}gL(+(xLD}=yasp_oh^jR0f33QA{IBk$g+S;*k^!@SLI+L75faDc_ zAs-mf*Qcz*g+M&yNy4U)DkCwIKTmNWgLJ3i_!$lsg5LThg6OMow6zKzY6xb$Epqa< zIz_in+3pLxpnLynhhoV5NCjh8kU;sQht=~l4fVcf7=3^c&jGa-Vky!a{(0gzg=pHHDzbDt-IR_~T+1%Q2zLd_ z7yVE3om=PO*Q6l@bcTE(zOWUoMn%$Kws1*9q)vag9TK1mXF*}q8nV}E>{z}U0(oMn zoa2h9dh*Z0|2&BUQ{^y$C)1{}U?9GGp)c>S6?xGr;TVUi4V=O@TH65Y|MWxQ9ANWY z91u`Xe@jii5{Ezn8~s?F3<;m>P2k?VrT`uWM0wkY(vZ~LePR(oK_J*Fun{UuqpK(! z@@lk7_psefVsa2ry6Il}nj{q^Y9gL%46s;GUmPFuglUBk03r$jGwuH?3^E7H?WUi!Vo&;x&L1-xH-|yDju%x#>SOR<5L?xx{3`3o$u)!F0 z==@9IkyKclpJjjZ6jfDaiLR0v=24SgsM^RsY z+Q7O>*+_oer+!MPzztKj|MQN7rghr8;Co%!8U-=;zGO#X`va76hAYNDKX1Hvk6RY? z+Wkz7O7ZK1x!C|5NT7$am(Zdf{ajb*5+v~WC$_36iJ8I-@ad13AFKk9)8fOZJ$>$|!*ZZ+)kTRlDoKSoMkOakg*8@znf!~_g*dJnSSG#+53@o#9PENk z+3ylzSIdNfk-K36FJNP>)48b7-lEM$QLJnzUE=nochj!2KQo^F%<$NqtD1DcDd_@y z8765ibo5nMZ&WE`t7 z5s<#Ky?uiZu`u|1*D`ZR;_Kf_kz}FxJ43(EZ-3iRk;lJ7r}g7eV+ji4n4h1S5?cui zA#w`9;6esB1rh;Ud6(p7y=f=-tO|K9{gDE6^b;)iLm4fRwXK-*0e|DpRIjg$cpnJb ztJe{`P!n*czhmQe{dqEFv)mo%vbozITkG{-BmIMI^ccNHjM1*~_}X9L+DN4y4fn|; z4o!v+#6e)Qh+n@y=?nJF?et0<$b`+7F>Z#qeq47V$F$1}=9iu+fVB|Z=384KuZUH8 zo@kHQF~?R9dOxNoCcb)fcMx-Otv?X3IKR#&gPE*|prWI$Xf&=e7z4-iF?%60!(eAl zMQyQ_b?D~i=I9r;l#GxR_c-4AqkF^-vvnm+Luo08(`^F!G7vB&fz6L#=H|Hmh6ILn z{M#(%HeWPvZ8-0_JtiRGSGAI7aND_U<=dV~=zZq8dM?Zc;YS$;^d}-g@ ziOzv-Tg>@nXPg%T**5b)*c;M3F#CB6lF`NcfzA82V}J}jIn!wg0EWb=w$7f3jsID*ye{ichf z)aj-oy<-0|eQpW>!ZfIjL${WSeCPlYgGDd5Y0u`o{*N+Vdl~P80;SK&QAhAl-q$XTq7BEw?&TtJmK!X50iUjxD$|Q3cZ>056ewl3 z8B;yFIX1UZV~cI(V24EkAN1^Yn7WEWR0kXD(I_Dwa$Dv!?Raalv9&VYb)>Hv+eWg} zd_AE2wz9IaZmqg`OsW|J!{)?oY!v7($4^k1gnW8qRf|wHF5sc&_Z~n3b>asonR_Z= zPScIkAhO?sJW~f0x;U~DhSu^OV`vVYEmjq&F3BY^U)gLc;HKFY5e{0@a8R z`qO|>^Hv#juJu9ko!5sy>P&r^A0jDbF6hs@0AU#U9m1RiC$IbfwQtta_vqYupQ#?vDBtliwS1{yAvFo%ZoO@)VxPwlwyJyo6tYciafhxWc6FXsT_I1?!X)g1IugqzXV-s4^XES=B5;`+Ik9KTCHKO$~5&ol0=oGHfLH#@a zWoAS92b$iP)wJ5NZP8gjm4Uubi;y?EtiAg%_~1-!@^Z2kbb!w zBNnOj|0>2o#biUV^B96|d)>1$eZ^~l|sT<{$o z!vTKBt_ZvnL#K<9xy!ifvGDr3I=Af*8NF%^|GAC4)LbsUfVd`T56tJ-L|Xk*E1Y?w zP_$8TO=hJFthf}W(>HW-v`Lw9L!SbMwZ__y8|+H;J>k`WKtu>ZFxImtUL2=iW@5t{ z8?D(}IgalUs$0{!gvJERGJKL{p!J+d(*|ojNaEg*;9$3ojl9y$azF`sMCbG*cTlJ? zfL!fGKE=!qv=2wm)S+J;FE_`T6{}}_inx0WDt_AKXbhp|_T=>m51y1>kFvS#kMO!Q zT%D?U2qbB`i8tw97)R8weR*C|4-dEwn%ZBY zKdGs+KN<5{m+dbko;f_@pcQj|De1YBFS%xCavkh{Q9nNx&Ies(;Ubw{GrEL_9{qCd zA3E{h!&4j%Gr=TXp`p94)YS))&Odru6oP%r3)+crjIkm#2)oy7ffz(^4Jxc`c?riE zow~ny`wb(WkBh!h;i0Z6WpP~TH<{P=e9X`Pqq+e@`}Mi`*G_YAn}1((JMeql)vP1c zgM3N=kYM2{b(;l%56+aY4}6` zgcb}v8Y5dWJ12=)_r`B%{Jj3+ZeO(Pf00M}s29R-S>35@wR;i|b zg~ay6J-Y`B^kQDls_8`ru(tw{U@_6xp`SnOocju&Zld({)w&Wmak+LiMo1RgPrRKq zly6p^Z}#H$X}O-(5R-8F0Gr}hZUa?e0fD;QrbSw{vu%dw7B=qh6d;f{uD$)eQ^?zh zVt-S72n6;Xyh6O%TC&eVlb9=XmTP95-?>x=rJL1!VzjHpPNv0}sAVSbLr$Q;f-?sI z+ZHZ6P~fl1_27+G>}17~O(*IBg_3I40_O+1j(XYwi!T+*y;Opv51tu5*Ez=XEOi2l z36kuwoQNu(wwo6yWP(7+d&6Ewt>8XGo^1m@bM%+GB{YB==oVg#KXNu{sNH0uyLu$` zXYr2V{=2iw(V4r_v7;7@1r~qSo&7t*&o7VLLhh8-rMC-A77I*nMMWg%*7i=?+z#iO zA$AJb27yxH%0bjEDnjDz32Zvd3yf=d_$)2Jbeuu%dwJ)xOnen}^`e*g^N$253{5Cj zeFPRg?Mtt7Hd=!4il}SwaiIi%oyXaS*HM>3(M4{6(HbCLrz}oU&(-KDE>`D0yNH@7 zD@wG4!5#Wgo_P@9PCC^Tu3D3TdAGDHT$DHlHkh z*B7O0hU#RU93ACXS6ds6zgExgrOHd!@w|*q$Ed_hA4a*OD<}Sptv5m&eU_Q%nl?Lu z;9!(^Ir>YsniM*Qc$;+Rox$P`8Vg3wO!AbCnq z%juEU)pMOtCq#SO{<_4HMRrc4K)Eo{%z*!v`RLHl4;Sy9-J?*G^RIJPaREBk)@yYa zN!8XTJ9SGkSNrNc={8yQ^@eS2ZPavhb7g6RVpL%EX|K2~BpOjg(manfJ|w%msJ{Y< zzbmdi6jcd3YiQi~3Dr@wl|}p)Li_I^cyxLddP0^PxBi=&h`%Htkk zi8nV*Srgc{93Gw}s?fONusc}oczz7rpOWO$QT_|*Ob@?#=n3jY^?Z}*_zTx}uNQg$ z#nkt{eEXluUjtYYh>Po5rp4beHer|sXmbB}TQlG>?}!k2sM8j~N!72eUSGgO4x_FX z$Eub9)$1wo3kNIYN;%u2HLty{M4Qfd8aLAC?0x$~jZfd#EsZx_agv9UkUq0fjN`Vn zyuOYZZ}taSR{O2ZSnos ze83Z#<|Pu$0HCJ@1@F_m`o$6B&0C4_>n769VLNpfj*7#n%}vSxN)J6Mh%m}4DJe1E zr0UDd;D{}ba+pPV=7W;$a`xVVhYWo@FbRR!QvmM8z<@P6UJX$yI!!P+H<#uvHCMq6 zwyS|XFM!b+)CtjLdg$inwmvU&Zn`~FF1zbLe_>ZNU~OgP1_Ha>WGDT7>Y)V8Jk;7c z55SLh==El?7XZqO%BFF=EcCy=kXd(d@~-TcJo$2P=7)$-2aL=y@RKqn*C|b>XDD)l z+vBH1i?`I?2}o^f$NvoF11nrAU^;HTqWwk`Z~WlOc$#NZE5gyOm)Kmez+Th3#!0B{ z5$Iv3%Iq*pW4aq(d-z6V0Jeb#*jRO3#g}|KKleeGg-HL}PXYTKO)%Z@N5x#}FhBnt zkCpiu*9hLGWeo?a2ZNK=GCCLGGR8j#XC6W89>MUBcgJU&&p^_O7U~pjuCKrRemR)C zBIJB0c^h3t2nnR@qv%0Y1;MZj(F1Q9!iZ$Af@1L<6Wv^`YeYW)A~!-=a{aBMHpQ{& zOa}w_=%Wyst5-l^Se$x4Oiow`uAP_W^Oep8`2n5(;<1_b(4#f!#fP&Vht=rJX5RvT z*8!=jhzNC+^0D!NxH2vRE%=1 z1$(fl?JO*Y5mx7Z+z2ub-Hn?Nzu}Vt6-2ebfO})1UdF+2 ze*e5#hcz`?bMr4Q3mm5&G5e%$uoN8@t2DhEJ4*Q7QsN9078a(&R>53D2*4ld0UKyKY#WplxSHJ3Qb3%;!UPCrymXPaZCZK7><~!V zM)yi#VVorp?YQP)9nuZmEcor}h2adc48b0O);X~iu<};yK#RE8sviARQy-Y7-J`>O zi6g|4HB#zO>IYV4f21T<^LQFI9?)E=t`oJ$J9j%K1fTa$SQ`$k5pv>hyRuMC z;LNSYEYbdkOSg zMuy`se6!g04D*~Q{b_?Y_pN6R+q`o$IO!gj{W)uDsx@ukdsHnkM<4cki;!1ObzW4o zW_LG!@zB9|2@;3^WlOm`+f`$tiH;wLF}?J$n~>6C!Da|Mqs68~PEE~16;;^g>#R!G z$(b{jwllBS^7vU~kU*&>Wr&U9hMV!%>2cZHTr)VOochnnEv|dsO>7*KgZw_w96?k` z@AgiQTfk}$izdmCl*v75_z*ZH=r1%xqNBsBODmsI?3H|L3oej$XMgk8ze~uC63St> zq~NX4O8cqYvgLlfC(1XI;W-r@(iqigAD_DQ8e2|4ZFakVORKS3$XWb$1IJLx^vd-r zVCY1@bYmOUUu6(Zu9`Q+=vyXUH)JId#WeulA`!bX;gC*xsyoO1$OSULQop(tRwl9RS*j0lPZ3qI#0K(~8v30QTr;zkq{*$kU8xbB%P1C4ItUUA zDq_kHT$EBz-B(CDJ1@f2o`2KZ=6NeOmiK11lkr9H5$irhOR$o@;6^uqiF_BT1>3V>&JY4gd29qQ#5eKt}ln z$44>&;Xk*lTE2pNN?PhWUcHMo>6iLf4Qg4+3{08%q?#{Z%+Z)W|CY}vufo72aAItF z7S79_-k_tILoX|z{2rF}&fv%>gQ->yuHQOZvpaX2$0S8Y;MOL4za z^SAfnoWc7$AQA7VYhHZI$F4GH*8s2^PfG(Wm!9&D-wSqT!G}68*tt!(Gs9o%S+O$* zaOW;e2K;B{}AwM%M?Qou% zh6Lxz#b(ISA$|I$(e?K$Jw}JsO#4-ANntevP0CbQMjHEc?s3u+ga5wq^5uqBKca)c z(>~ipgv+v$v+#;iq)mw2Z)S;RgbY%Qi!JA@?{WCdWyQfTn}~EykCTpo{!g;!W1MG{ zM1SzO?raD~R&~zyzL=VLJ~?_WDnYJM!`sAaCPyyR>dr3;kYDY?cFCZaIM^SvSNyu) z-`yoW6q*4&d;hdz0mq9PjBnVIyST0@X&dmCO~ zY08v~iA(Xx458WjI=lGd%zH^MTPx<*3z5}BwQt=0iYaUb=`97D743Vs;v<|`CZ60P z7qaV{LNZzP{##4c6hsK?)U**dJtBMr@uJbZ2b`PQ&oQ^o8Xj57_({;!$&Q~~tU{xy z)Sm^@I)>H^%HrA>dDZ1|3eC45kJZtz?eW(v_9i_1w@`TTAW}pRR@`>&Y9#-^uYLSu zKZKxoL{(#cc*Y3$4eW>~a8CC|jJ)V#MbqWXw1NF7z?*~BtQWz1RmI+iHb}o;pNrIk zs-&pk-`vKeD>+pBu_JSw@eX#Ef8mRsw*CMMRNZF?!Jay3d2QFKr-rZEg)O&c)Q+k^TC5vVQlJwOfW{A-%^Y zn$dFD0Uc zinx~i1G0%#r<65qbj}(~N*lIjU2A=X+7>2Q6?fqbl=Ra)EVa*@oJu^4om*W6ws< z>okJNv*KgVI9F)HTfWcPAKyChcro^U?zOA%$;Oin+#`y4uGc>qpiiFA-<^?sY2*Bl zy5|E&7D&XehwlxhY%=!o56O8Pgan9(KdJEk(eHd#6{ARgdin^w%L-lT@v9e*!0@qc zGM3juv7i6Y;(0O_dXi=Sr*mig!mwg4|4CP`PJ50Bt0gd}zL8?#P}C zhzVPXRaxl~wJ_klQNHzf?9!ytMLGHF_qmq^sjAQCy|apOmWKlb3SO_%?G!t+F*1J5 zdGEJzt!|f4tr_!sMDOEMx&1JJDr1t}cQ+6=LbwNF#8T?4*?c@wq`kTykE{g$il%a& zz?1cr5qnLeP>RFA-Ck;l+JmoI4hV8m2`}EcZ@qVWx8C+ zJ#WOZeUH;>d;U@ccp}EkQ%jL)=1zFAa~}Jv|DpOO?I%$=tyI#&dS6^6wcv!5-tW>% zoFPZ5;U7=ZfX6WVi-4F!Oej21`beC5!HMam9_er%j=-mT)a#dH`{&(18@A*gIo+lH z=N3m~;|4ny86ivOgPQxKr0sFDtQfbPIB&`4AO3lgmPC!xzf1b*7xqZY&+SU>w}~^w zqQ$f+85$>v5_(rII6obc|7@J?|K2pyr9E8lw{8E;ij111?T7eK$Xxa<1Xa*8yag2; zC3hvSBZ=&8b$B_y)>})>a)shoaX8*7*G?uMDLsZb#ruIHKC>gXjv2f7b!s$)ersy{ z!ya3ncANB-!agQhlype(Kjby(qwfpcHW?b*HRygxX3P2{6Fb*qnd-sNNEk@Pn^W8H zb&j%EQYcUrZ~3$c6{G>XC*Z&tBf&%#tg^n+QS;W;oYG-0<6H(0_pj{tgchX0BWu_y z7Az+KVC*>#r3y=?TnkpLGrlvyrax&PUpLy(yG@>bfBTThs;pJ&EkI=+gHa;|C&cM9 zpAft<1Dpu9Vb7?$F}(i>j-N!W;=bVw*bY+u68Qb9=JrG$&etjdvb>^KW(q;iib6E( zo>Y|JXa#pDyjs8f*?a(hamKIA24T6pjoM_Ce}`Rs8@J=p+HK(N2*Z!DClzTW0d zP?Gx+h*kTi3@?yUn8K~}li`Q({a}TM`ipe)YAo5JhJG-|hk$-HnFX{<2Os$lGc-~L zR$j)^Kl(Eohkr!95Ja)aGc-8#G1gSWR5=_fULfJNz8EQ@>AGm36>r0UR zhcyq%wWtQAIe$*V&H(frAxr$(Y5IjC^du1QDT7V;Yhu__})}@ zch85(oAPhjrM*VAJzRE=*4lErHxV&s zbj6AL2Io7iv%Mq)3W;ICIo4|Vam(H|&}d}qt28|~=h7WFJV5=vqU95xpj~ZK^{+>a4svpGWZvT9x1!9q=GBHW6_zw3 zYQTjLD;h*S_UTZW2Zd1m($;yihIZVb1zxQ&Zp*D9E;%dBu+p6E}Lek z6#s|I{rM3E3?4+hr|FWzXCu{t^57UF*$<3U+{lkF(yXl&Z_gxz$yYPqB2u z7iD^0xG913V0^QnCil0ZTkSjh~ zmkmX58}66F+41qsoUYpUhwD|n*#&836KDSt+uD=ZzWb1bIWcuG;VXmZ*eu_CSE4Fv z>oveVEnkn2qxXA&Ew)+AEcma0WD-U0egQ7F=qRFm(gBxzSSI;U%x&E{mjCJ9!763z z$H#lJH9J#wtxa=_Op{*MA8N0*DcK$mw4@g5sw(i|WpD=EI>goO=gSk#e91R{_0iz50FFU-g354^FMB4t874SPui2F8_Ke^Cxl|0RhI<|L zJmtf^Jet}^EMp8+)R_jvLcP!KO)+u&`q6rYY55&eM9Ve8B3l%G&87v&-e%?Sus|0- zF{Nq_`x{9rMkTVFbCiyp@FDy-6h=fOE%?L@#3ysEl-yQ?1S+fvy;cc*RtYLr7S{Cb zi0x@p#9zE`s%-Y}>Ge`@n^fFYRQ$oH)2}dR<^D_Z-)OFJ zMV!w1ngeDdWd1aYyYg@TBxNY2e2AnOK{b&tm59n(s5 z_|E{Ncn84T=aJo@&&A^c<%yje&Sc@2^bdIjMNe0?SNW9v?;MM7r z^ai+^)bsq&KdpLw?n`>?$obTf-u{52E`7|7wMFjl*`Ga9)a_^K##*`aZhM4cxb1@) z0J@>=Ib{EpB0?SIb%GPQbsQrNjsM5qTL#71E$zaC6C_Bm0D&Mug9o?ZlHl%^;7)KE zAi;wK4M~9DZo%DxYj9_9cNt`Wa}Uq6_kQYozpC@&)T#4luNtTcb1&&$-B(}TYY`B0 zD;SK^{*dgHAo^Zh5g&Oq-R&!G{y_4@#>CWkJa6;lbwoy}LyOTzsfZ*<&C>mAMa9P; zBepBeV%?P=6~kTr-yOtR0ugPm_T7Eh4<#z?7cd-#egrHEdw+60 zP;NA2E8;P7O<>}GYVEo|yMzpNEIlN=P0+Y2Yx_AR5n3Vtib_=S{-W~L^E?fFfC@<^ zjp+b8lE_KG0?#3Ue@g@0LJgdpLR$?0)1p>VW}?!{ z{q036DQRK?M-Vvzl|+{eCQTttf92!+uOQ){ADPP*?0NlW%hEMBm6;N19kz@cg^pkJ zte=cbaeYUuwy|bB-OU-Sb)R;OPfWaqT2+zGi`tT0pKYV~exvB@?7X~<7CpX0b2(m0 z6$bh2TNr+WaefeZM&awBt_?M*nmO89RWiLx!bF^1Q&0S!6f)l^RCIGJ(|9yWtN&pc z#pABd;t#YyWP-whbE5fMOLJZ$pS_n*wZ$Wq6upCCir$|Tg4_Ol$iyqw zs}cW*Y^jEPDN>tn*@;AJ7$nHqZq)4$xIA?SjS2_>q-*|@0402UTw5t1l)?5PiYR+! zBe^FTMqg@Ia{>4Y8{ish)$sLdd&k*fTHgAOr^B|q)%N7J!WlF9*DuaS{+nmEvyCVY zgWtkVhXrdU0j$a{Y+m}#MJy9daqeL8-hAbILjRY9WS#wE`E2}BB``{z=aqJ)M;JIt zNmTIho91iP6M^oiXA&)B4qabpX6}3gpF?&;nw+}#YgXr7hQ)MsNrmirFAkQX6~5OP zclK#apUfSC#A`b9VaQ^&8jB7?erQUfH{^YNeXyI7h6~aG-}{A_!@06!3){;p3s{va z8Mzx8=ykT{@@Kbw$KFoj(=8eww}$83o*O{RXo=W#c9wF1fHjJ_dVEQP z^M+NR{=h`BK0?T zbnl8ohCA}apFREFa#}G^5>GTmvMzRqh89iLT!M0q4UQNd!FDM1ye6}dCi8p{Q7wyk zZLwx83-E@>qbSIcn5f;3r_HWP{6n3o3k|(kY8M=1(H=0CVANA^4Vz5bfjam3Jc#^= z<$9*XK(EqfiU_*sODyvJ9_4`S`1!m&Z+Jw6(^S*Pa;sIZN{1=M6Y}M1Ahw&yyhdOA z^&WHHXDo7g9-oxk`qOv&t>`NwRuITTh~nkF7fLYpQ~mYnQmrDaEuB);{4&!Se7LJ~ z8*Vnb40mdsiWZKdwTL@5q$)4X+0E6MK~mh!mYQ$xd?U$tyDTUNB{rE^OD}}8v$H); z^2a&O{cYfQ0@eSwE1xi(kF)sq$Vq9bd7QO0L zev7n7LDa=yvTGxpNO@C<97~STUx-8&55ME>%ta)F?~@qz}?$=CNB0bZEXEGO}y2yK&R^ zzKzs|-tx*~o23L~%0!!vEI?PL6uuV@EVl-HoL;Ii&UrAZ7~jnet8gRA4l?+jkqa*tN^JZ2r`n zV!eZ6QSgv=J3Au|5xTRyKar@6;~?>eEM~#edW~xFhBXrAd73vR6B)~8%jK!4px4Sw ze<0O!e_)+*G5P8$EzLsklHrTT0EoxOyz7;(OywXgw)oujlJVN>7xIURQ3k8m)LJ+a`azZ@pdDO zNWid^IL(j8=;X3|I1&?mt%8&5xc{1xeRX1cYqAPcx5_#!>X`uKV$Qzvn}g=^gq0c< zI^x|z6B(C9(^JP14;#iO&TZqU`s@jzp$wA`l{?gfFWHAKgzp$#wLYm5S8f{l(?v(4 zX21?p;gZ9{SNu^pMv-y|iBdd<`y1uCxU;xC$srsJHVF+2t;gx-R#wWg>iFJ)6i*ct z1qa?ioQFvccfi&i}f9pXgezgmW-5mhDc*3Gnsx#J1{}uNyRRQ_?M&dX5 z2KCg%HZ^&MYN=gPYGDjc4`gh!ms>8XEO}J@-@wjq-B4-E=rI@{;VQVuH zi>@q%5&tKiPg`*;)Mere2K}j#Xpbo{rtK#ytrEH6_DF zeQ9`vLZ{@Ta`G|6ShQpbcZ4E$$#sgFpTAD?w0>{&&8^YlLJbaUQehv5L(5Gw_=^UJ zgu_Q$JEB(vI-vb7OUt)Dvl?7Nt-t_J)9_S;m|2RiPvuZFYh@BS7cpKi^^)*0SWn@< zb2uU zdEt2p4Pjopd0OKe%TONfiJ3YZtyZ@=9y@EFXmP_D--eHK=WFDm2lu*kaVG00+3-?` zwd)W-8o7)G*+eN1n?=!#SoA+tiNgGg=c<>FmT4UMe&Abx0G@Yi1f(3~!d^vv9L!qa z)q7oFqlKK`X`hZ+bJzMpiV<#9RmYVJC4_PCkx)h{zlLpNJ)E8l?kBQVLo)Keth2C0 zo)ggK>sAN;5;Gq}n?$H%B@_>(2T1h_wiY!_#;4p$0orb%>&t?T1k*>lt*=P1me#p;hHKN zF#2@KymWS;I2F$HV|xjgg20;zXv2Z7kHKPl=kEE+ANthaHOyMiU%Y^^djZiNVUAg| zq&+;Lut1oHk@1oAM+6{?-QJca!9pd$M%|lf;DyveE`$M=+Oc#GTU`>_+^hKWEBj0h zv(4*bD}Z;=Yp%uaRo9Xi>fQs7Y>}6jFDU9(OV%_-Czb1LxDVQxKQ$G`mXlNX)|!x} zbsCT>%UV83fTz-E3a_uR^)fDK;U|avK@zC#uASQLT+1Jev3~_GjtJ8ubhDE-G*xW3IMvC4e zf~FhSdFP#=!k0S{!yR`&R{>)%F={C)!s>Q$aT4O?U2|%~?7LI5;?M$Zjb5FUl|BO5 zee_zMy2ua9Gsc0Rm((WsY74wgK#(;F@|M)$Et2WFw~x3+%wEP{JNbrFfD~Rio~IuY znpXmM+21e1ahnXcM|` z>pEqK1V|Gbiw|lA5T?xiP^8jM&&B3z5?u>9?w*ma2BqaI4euQwx1ut>2}zq=-S}=_ zbPQWAn5SI&YX3<-yFCNN=%>tK;Vt1BV9+1G;E0C1FM4Il9~nH0<}D-jy&h*|U}6pI zv<>LB4W2O#m;t`;-Q@P#mZ-K-ye%9Lh0vo^#TpAOXWed2?QNoUG)+PNp&rF zm=-@tj5j�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%0DAj6|>? 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π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

LIZDyj451uDQEVv3d$dVhBV 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 z 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