From c430ba71782527587834a08634f6e671c834e8cd Mon Sep 17 00:00:00 2001 From: stilnat Date: Tue, 17 Oct 2023 14:58:38 +0200 Subject: [PATCH] Partly make dinnerbooth work --- .../Furniture/Generic/Seats/DinerBooth.fbx | Bin 0 -> 55340 bytes .../Generic/Seats/DinerBooth.fbx.meta | 106 ++++++++++ .../Furniture/Generic/Seats/DinnerBooth.asset | 22 +++ .../Generic/Seats/DinnerBooth.asset.meta | 8 + .../Generic/Seats/DinnerBooth.prefab | 142 ++++++++++++++ .../Generic/Seats/DinnerBooth.prefab.meta | 7 + .../Tile/Connections/AdjacencyShape.cs | 5 + .../DirectionnalShapeResolver.cs | 182 ++++++++++++++++++ .../DirectionnalShapeResolver.cs.meta | 11 ++ .../DirectionnalAdjacencyConnector.cs | 181 +++++++++++++++++ .../DirectionnalAdjacencyConnector.cs.meta | 11 ++ 11 files changed, 675 insertions(+) create mode 100644 Assets/Art/Models/Furniture/Generic/Seats/DinerBooth.fbx create mode 100644 Assets/Art/Models/Furniture/Generic/Seats/DinerBooth.fbx.meta create mode 100644 Assets/Content/Data/TileMap/Resources/Furniture/Generic/Seats/DinnerBooth.asset create mode 100644 Assets/Content/Data/TileMap/Resources/Furniture/Generic/Seats/DinnerBooth.asset.meta create mode 100644 Assets/Content/WorldObjects/Furniture/Generic/Seats/DinnerBooth.prefab create mode 100644 Assets/Content/WorldObjects/Furniture/Generic/Seats/DinnerBooth.prefab.meta create mode 100644 Assets/Scripts/SS3D/Systems/Tile/Connections/AdjacencyTypes/DirectionnalShapeResolver.cs create mode 100644 Assets/Scripts/SS3D/Systems/Tile/Connections/AdjacencyTypes/DirectionnalShapeResolver.cs.meta create mode 100644 Assets/Scripts/SS3D/Systems/Tile/Connections/DirectionnalAdjacencyConnector.cs create mode 100644 Assets/Scripts/SS3D/Systems/Tile/Connections/DirectionnalAdjacencyConnector.cs.meta diff --git a/Assets/Art/Models/Furniture/Generic/Seats/DinerBooth.fbx b/Assets/Art/Models/Furniture/Generic/Seats/DinerBooth.fbx new file mode 100644 index 0000000000000000000000000000000000000000..8480374ba32015f96b50abf1f4bd705f617ecaba GIT binary patch literal 55340 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

?O-PHV8=}pd2-iz36^R%-eFuAz?*|*S{ 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 literal 0 HcmV?d00001 diff --git a/Assets/Art/Models/Furniture/Generic/Seats/DinerBooth.fbx.meta b/Assets/Art/Models/Furniture/Generic/Seats/DinerBooth.fbx.meta new file mode 100644 index 0000000000..75d9f3bc6e --- /dev/null +++ b/Assets/Art/Models/Furniture/Generic/Seats/DinerBooth.fbx.meta @@ -0,0 +1,106 @@ +fileFormatVersion: 2 +guid: bcf01b0847ef6d843ae7613281a81df1 +ModelImporter: + serializedVersion: 21300 + internalIDToNameTable: [] + externalObjects: {} + materials: + materialImportMode: 2 + materialName: 0 + materialSearch: 1 + materialLocation: 1 + animations: + legacyGenerateAnimations: 4 + bakeSimulation: 0 + resampleCurves: 1 + optimizeGameObjects: 0 + removeConstantScaleCurves: 1 + motionNodeName: + rigImportErrors: + rigImportWarnings: + animationImportErrors: + animationImportWarnings: + animationRetargetingWarnings: + animationDoRetargetingWarnings: 0 + importAnimatedCustomProperties: 0 + importConstraints: 0 + animationCompression: 1 + animationRotationError: 0.5 + animationPositionError: 0.5 + animationScaleError: 0.5 + animationWrapMode: 0 + extraExposedTransformPaths: [] + extraUserProperties: [] + clipAnimations: [] + isReadable: 0 + meshes: + lODScreenPercentages: [] + globalScale: 1 + meshCompression: 0 + addColliders: 0 + useSRGBMaterialColor: 1 + sortHierarchyByName: 1 + importVisibility: 1 + importBlendShapes: 1 + importCameras: 1 + importLights: 1 + nodeNameCollisionStrategy: 1 + fileIdsGeneration: 2 + swapUVChannels: 0 + generateSecondaryUV: 0 + useFileUnits: 1 + keepQuads: 0 + weldVertices: 1 + bakeAxisConversion: 0 + preserveHierarchy: 0 + skinWeightsMode: 0 + maxBonesPerVertex: 4 + minBoneWeight: 0.001 + optimizeBones: 1 + meshOptimizationFlags: -1 + indexFormat: 0 + secondaryUVAngleDistortion: 8 + secondaryUVAreaDistortion: 15.000001 + secondaryUVHardAngle: 88 + secondaryUVMarginMethod: 1 + secondaryUVMinLightmapResolution: 40 + secondaryUVMinObjectScale: 1 + secondaryUVPackMargin: 4 + useFileScale: 1 + tangentSpace: + normalSmoothAngle: 60 + normalImportMode: 0 + tangentImportMode: 3 + normalCalculationMode: 4 + legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0 + blendShapeNormalImportMode: 1 + normalSmoothingSource: 0 + referencedClips: [] + importAnimation: 1 + humanDescription: + serializedVersion: 3 + human: [] + skeleton: [] + armTwist: 0.5 + foreArmTwist: 0.5 + upperLegTwist: 0.5 + legTwist: 0.5 + armStretch: 0.05 + legStretch: 0.05 + feetSpacing: 0 + globalScale: 1 + rootMotionBoneName: + hasTranslationDoF: 0 + hasExtraRoot: 0 + skeletonHasParents: 1 + lastHumanDescriptionAvatarSource: {instanceID: 0} + autoGenerateAvatarMappingIfUnspecified: 1 + animationType: 2 + humanoidOversampling: 1 + avatarSetup: 0 + addHumanoidExtraRootOnlyWhenUsingAvatar: 1 + remapMaterialsIfMaterialImportModeIsNone: 0 + additionalBone: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Content/Data/TileMap/Resources/Furniture/Generic/Seats/DinnerBooth.asset b/Assets/Content/Data/TileMap/Resources/Furniture/Generic/Seats/DinnerBooth.asset new file mode 100644 index 0000000000..b3ae6ae014 --- /dev/null +++ b/Assets/Content/Data/TileMap/Resources/Furniture/Generic/Seats/DinnerBooth.asset @@ -0,0 +1,22 @@ +%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: 4584c35d672b8a74797cc5efa123ce16, type: 3} + m_Name: DinnerBooth + m_EditorClassIdentifier: + nameString: + prefab: {fileID: 8085678556641831659, guid: 85fa4c9b76b4b23458dcf24a745a1dfe, type: 3} + icon: {fileID: 0} + layer: 7 + genericType: 5 + specificType: 0 + width: 1 + height: 1 diff --git a/Assets/Content/Data/TileMap/Resources/Furniture/Generic/Seats/DinnerBooth.asset.meta b/Assets/Content/Data/TileMap/Resources/Furniture/Generic/Seats/DinnerBooth.asset.meta new file mode 100644 index 0000000000..894faf575b --- /dev/null +++ b/Assets/Content/Data/TileMap/Resources/Furniture/Generic/Seats/DinnerBooth.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: befbc886dd0869a438a66ce949a10f9a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Content/WorldObjects/Furniture/Generic/Seats/DinnerBooth.prefab b/Assets/Content/WorldObjects/Furniture/Generic/Seats/DinnerBooth.prefab new file mode 100644 index 0000000000..1c77aaf50f --- /dev/null +++ b/Assets/Content/WorldObjects/Furniture/Generic/Seats/DinnerBooth.prefab @@ -0,0 +1,142 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &8085678556641831659 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1750478436839435592} + - component: {fileID: 7418334817260183665} + - component: {fileID: 1740478804813226977} + - component: {fileID: 7950383285113202337} + - component: {fileID: 8031370004641457100} + m_Layer: 0 + m_Name: DinnerBooth + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1750478436839435592 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8085678556641831659} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 9.950995, y: 0.52496845, z: 0.5001033} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &7418334817260183665 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8085678556641831659} + m_Mesh: {fileID: 559316708432223863, guid: bcf01b0847ef6d843ae7613281a81df1, type: 3} +--- !u!23 &1740478804813226977 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8085678556641831659} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 695c4de41b9578049a93f19b1eef7213, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!114 &7950383285113202337 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8085678556641831659} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 479fbe67c0de04b449f924bc5462ede3, type: 3} + m_Name: + m_EditorClassIdentifier: + _componentIndexCache: 0 + _addedNetworkObject: {fileID: 8031370004641457100} + _networkObjectCache: {fileID: 8031370004641457100} + AdjacencyResolver: + o: {fileID: 559316708432223863, guid: bcf01b0847ef6d843ae7613281a81df1, type: 3} + uLeft: {fileID: -8315600635035084004, guid: bcf01b0847ef6d843ae7613281a81df1, type: 3} + uRight: {fileID: -8218306467633424491, guid: bcf01b0847ef6d843ae7613281a81df1, type: 3} + i: {fileID: -2434755278463371002, guid: bcf01b0847ef6d843ae7613281a81df1, type: 3} + lIn: {fileID: -8550456321050019914, guid: bcf01b0847ef6d843ae7613281a81df1, type: 3} + lOut: {fileID: -819412828331094011, guid: bcf01b0847ef6d843ae7613281a81df1, type: 3} +--- !u!114 &8031370004641457100 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8085678556641831659} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 26b716c41e9b56b4baafaf13a523ba2e, type: 3} + m_Name: + m_EditorClassIdentifier: + k__BackingField: 0 + k__BackingField: 0 + k__BackingField: {fileID: 0} + _networkBehaviours: + - {fileID: 7950383285113202337} + k__BackingField: {fileID: 0} + k__BackingField: [] + SerializedTransformProperties: + Position: {x: 9.950995, y: 0.52496845, z: 0.5001033} + Rotation: {x: 0, y: 0, z: 0, w: 1} + LocalScale: {x: 1, y: 1, z: 1} + _isNetworked: 1 + _isGlobal: 0 + _initializeOrder: 0 + _defaultDespawnType: 0 + NetworkObserver: {fileID: 0} + k__BackingField: 0 + k__BackingField: 0 + _scenePathHash: 0 + k__BackingField: 0 + k__BackingField: 3148903556074791268 diff --git a/Assets/Content/WorldObjects/Furniture/Generic/Seats/DinnerBooth.prefab.meta b/Assets/Content/WorldObjects/Furniture/Generic/Seats/DinnerBooth.prefab.meta new file mode 100644 index 0000000000..4b1fe376b9 --- /dev/null +++ b/Assets/Content/WorldObjects/Furniture/Generic/Seats/DinnerBooth.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 85fa4c9b76b4b23458dcf24a745a1dfe +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/SS3D/Systems/Tile/Connections/AdjacencyShape.cs b/Assets/Scripts/SS3D/Systems/Tile/Connections/AdjacencyShape.cs index de6d7625b4..92a9334cad 100644 --- a/Assets/Scripts/SS3D/Systems/Tile/Connections/AdjacencyShape.cs +++ b/Assets/Scripts/SS3D/Systems/Tile/Connections/AdjacencyShape.cs @@ -38,5 +38,10 @@ public enum AdjacencyShape TSouthWestEast, //Vertical Vertical, + // Directional + LIn, + LOut, + ULeft, + URight, } } \ No newline at end of file diff --git a/Assets/Scripts/SS3D/Systems/Tile/Connections/AdjacencyTypes/DirectionnalShapeResolver.cs b/Assets/Scripts/SS3D/Systems/Tile/Connections/AdjacencyTypes/DirectionnalShapeResolver.cs new file mode 100644 index 0000000000..bc57d737cb --- /dev/null +++ b/Assets/Scripts/SS3D/Systems/Tile/Connections/AdjacencyTypes/DirectionnalShapeResolver.cs @@ -0,0 +1,182 @@ +using Coimbra; +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace SS3D.Systems.Tile.Connections.AdjacencyTypes +{ + [Serializable] + public struct DirectionnalShapeResolver + { + [Tooltip("A mesh where no edges are connected")] + public Mesh o; + [Tooltip("A mesh where the South edge is connected")] + public Mesh uLeft; + [Tooltip("A mesh where the South edge is connected")] + public Mesh uRight; + [Tooltip("A mesh where the South & south edges are connected")] + public Mesh i; + [Tooltip("A mesh where the South & West edges are connected")] + public Mesh lIn; + [Tooltip("A mesh where the South & West edges are connected")] + public Mesh lOut; + [Tooltip("A mesh where the South, West, and west edges are connected")] + + ///

+ /// + /// + /// + /// + /// Neigthbours direction are only cardinal neighbours + /// + public Tuple GetMeshAndDirectionAndRotation(AdjacencyMap adjacencyMap, Direction direction, List neighboursDirection) + { + // Determine rotation and mesh specially for every single case. + float rotation = 0.0f; + Mesh mesh; + + AdjacencyShape shape = GetSimpleShape(adjacencyMap, direction, neighboursDirection); + + + switch (shape) + { + case AdjacencyShape.O: + mesh = o; + rotation = TileHelper.AngleBetween(Direction.North, direction); + break; + case AdjacencyShape.ULeft: + mesh = uLeft; + rotation = TileHelper.AngleBetween(Direction.North, direction); + break; + case AdjacencyShape.URight: + mesh = uRight; + rotation = TileHelper.AngleBetween(Direction.North, direction); + break; + case AdjacencyShape.I: + mesh = i; + rotation = TileHelper.AngleBetween(Direction.North, direction); + break; + case AdjacencyShape.LIn: + mesh = lIn; + rotation = LInRotation(adjacencyMap); + break; + case AdjacencyShape.LOut: + mesh = lOut; + rotation = LOutRotation(adjacencyMap); + break; + default: + Debug.LogError($"Received unexpected shape from simple shape resolver: {shape}"); + mesh = o; + break; + } + + return new Tuple (direction, new MeshDirectionInfo { Mesh = mesh, Rotation = rotation }); + } + + public static AdjacencyShape GetSimpleShape(AdjacencyMap adjacencyMap, Direction dir, List NeighboursDirection) + { + int cardinalConnectionCount = adjacencyMap.CardinalConnectionCount; + switch (cardinalConnectionCount) + { + case 0: + return AdjacencyShape.O; + case 1: + var directionConnection = adjacencyMap.GetSingleConnection(true); + var relative =TileHelper.GetRelativeDirection(dir, directionConnection); + if(!NeighboursDirection.Contains(dir)) return AdjacencyShape.O; + if (relative == Direction.East) + return AdjacencyShape.ULeft; + else return AdjacencyShape.URight; + //When two connections, checks if they're opposite or adjacent + case 2: + + if (adjacencyMap.HasConnection(Direction.North) == adjacencyMap.HasConnection(Direction.South)) + return AdjacencyShape.I; + + if (IsInsideConfiguration(adjacencyMap, dir)) + return AdjacencyShape.LIn; + else + return AdjacencyShape.LOut; + + default: + Debug.LogError($"Could not resolve Simple Adjacency Shape for given Adjacency Map - {adjacencyMap}"); + return AdjacencyShape.O; + } + } + + /// + /// It's useful to draw the 8 different configuration of LIn shape + /// with 3 couch, one in the middle and two other in cardinal positions. Consider the middle couch can point towards any cardinal + /// direction. We don't care about the directions of the two other couches, what matters is their position relative to the middle one. + /// This help understand the code below. + /// + /// + /// + /// + private static bool IsInsideConfiguration(AdjacencyMap adjacencyMap, Direction dir) + { + var adjacencies = adjacencyMap.GetAdjacencies(true); + + switch (dir) + { + case Direction.North: + return adjacencies.Contains(Direction.North) && + (adjacencies.Contains(Direction.East) || adjacencies.Contains(Direction.West)); + case Direction.East: + return adjacencies.Contains(Direction.East) && + (adjacencies.Contains(Direction.North) || adjacencies.Contains(Direction.South)); + case Direction.South: + return adjacencies.Contains(Direction.South) && + (adjacencies.Contains(Direction.East) || adjacencies.Contains(Direction.West)); + case Direction.West: + return adjacencies.Contains(Direction.West) && + (adjacencies.Contains(Direction.South) || adjacencies.Contains(Direction.North)); + default: + return false; + } + } + + private static float LOutRotation(AdjacencyMap connections) + { + var adjacencies = connections.GetAdjacencies(true); + if(adjacencies.Contains(Direction.South) && adjacencies.Contains(Direction.East)) + { + return 90f; + } + + if (adjacencies.Contains(Direction.South) && adjacencies.Contains(Direction.West)) + { + return 180f; + } + + if (adjacencies.Contains(Direction.North) && adjacencies.Contains(Direction.West)) + { + return 270f; + } + + return 0f; + } + + private static float LInRotation(AdjacencyMap connections) + { + var adjacencies = connections.GetAdjacencies(true); + if (adjacencies.Contains(Direction.South) && adjacencies.Contains(Direction.East)) + { + return 90f; + } + + if (adjacencies.Contains(Direction.South) && adjacencies.Contains(Direction.West)) + { + return 180f; + } + + if (adjacencies.Contains(Direction.North) && adjacencies.Contains(Direction.West)) + { + return 270f; + } + + return 0f; + } + } +} diff --git a/Assets/Scripts/SS3D/Systems/Tile/Connections/AdjacencyTypes/DirectionnalShapeResolver.cs.meta b/Assets/Scripts/SS3D/Systems/Tile/Connections/AdjacencyTypes/DirectionnalShapeResolver.cs.meta new file mode 100644 index 0000000000..2ece84b2b2 --- /dev/null +++ b/Assets/Scripts/SS3D/Systems/Tile/Connections/AdjacencyTypes/DirectionnalShapeResolver.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e2470fb8500aed440a5ad3bd78b6c590 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/SS3D/Systems/Tile/Connections/DirectionnalAdjacencyConnector.cs b/Assets/Scripts/SS3D/Systems/Tile/Connections/DirectionnalAdjacencyConnector.cs new file mode 100644 index 0000000000..9240537df6 --- /dev/null +++ b/Assets/Scripts/SS3D/Systems/Tile/Connections/DirectionnalAdjacencyConnector.cs @@ -0,0 +1,181 @@ +using FishNet.Object.Synchronizing; +using SS3D.Core; +using SS3D.Core.Behaviours; +using SS3D.Logging; +using SS3D.Systems.Tile.Connections; +using SS3D.Systems.Tile.Connections.AdjacencyTypes; +using SS3D.Utils; +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace SS3D.Systems.Tile.Connections +{ + public class DirectionnalAdjacencyConnector : NetworkActor, IAdjacencyConnector + { + + protected TileObjectGenericType _genericType; + + + protected TileObjectSpecificType _specificType; + + + public DirectionnalShapeResolver AdjacencyResolver; + + protected AdjacencyMap _adjacencyMap; + + protected MeshFilter _filter; + + protected PlacedTileObject _placedObject; + + public PlacedTileObject PlacedObject => _placedObject; + + public Direction PlacedObjectDirection => _placedObject.Direction; + + private bool _initialized; + + public override void OnStartClient() + { + base.OnStartClient(); + Setup(); + } + + /// + /// Simply set things up, including creating new references, and fetching generic and specific type + /// from the associated scriptable object. + /// + private void Setup() + { + if (!_initialized) + { + _adjacencyMap = new AdjacencyMap(); + _filter = GetComponent(); + + _placedObject = GetComponent(); + if (_placedObject == null) + { + _genericType = TileObjectGenericType.None; + _specificType = TileObjectSpecificType.None; + } + else + { + _genericType = _placedObject.GenericType; + _specificType = _placedObject.SpecificType; + } + _initialized = true; + } + } + + /// + /// directionnal are connected only with other directionnals on their right or on their left. + /// + /// + /// + /// + public bool IsConnected(Direction dir, PlacedTileObject neighbourObject) + { + if (neighbourObject == null) return false; + + if (!TileHelper.CardinalDirections().Contains(dir)) return false; + + // add a check to see if connected to another neighbour object instead of the cardinal connection count. + + bool isConnected = true; + + if (neighbourObject.IsInFront(_placedObject) || neighbourObject.IsBehind(_placedObject)) + { + isConnected &= neighbourObject.Direction != _placedObject.Direction && + neighbourObject.Direction != TileHelper.GetOpposite(_placedObject.Direction); + } + + if (neighbourObject.IsOnLeft(_placedObject) || neighbourObject.IsOnRight(_placedObject)) + { + isConnected &= neighbourObject.Direction != TileHelper.GetOpposite(_placedObject.Direction); + } + + isConnected &= neighbourObject.GenericType == _genericType; + isConnected &= neighbourObject.SpecificType == _specificType; + + return isConnected; + } + + + public void UpdateAllConnections(PlacedTileObject[] neighbourObjects) + { + Setup(); + + bool changed = false; + for (int i = 0; i < neighbourObjects.Length; i++) + { + changed |= UpdateSingleConnection((Direction)i, neighbourObjects[i], true); + } + + if (changed) + { + UpdateMeshAndDirection(); + } + } + + public bool UpdateSingleConnection(Direction dir, PlacedTileObject neighbourObject, bool updateNeighbour) + { + Setup(); + + bool isConnected = IsConnected(dir, neighbourObject); + + bool isUpdated = _adjacencyMap.SetConnection(dir, new AdjacencyData(TileObjectGenericType.None, TileObjectSpecificType.None, isConnected)); + + // Update our neighbour as well + if (isConnected && updateNeighbour) + neighbourObject.UpdateSingleAdjacency(_placedObject, TileHelper.GetOpposite(dir)); + + if (isUpdated) + { + UpdateMeshAndDirection(); + } + + return isUpdated; + } + + protected void UpdateMeshAndDirection() + { + + Tuple info; + + var tileSystem = Subsystems.Get(); + var map = tileSystem.CurrentMap; + + var neighbours = map.GetNeighbourPlacedObjects(_placedObject.Layer, _placedObject.transform.position); + + + List neighboursFacingDirection = new(); + + // TODO not solid code if order of neighbours gets changed + foreach (Direction dir in TileHelper.CardinalDirections()) + { + if(_adjacencyMap.HasConnection(dir)) + { + neighboursFacingDirection.Add(neighbours[(int)dir].Direction); + } + } + + info = AdjacencyResolver.GetMeshAndDirectionAndRotation(_adjacencyMap, PlacedObjectDirection, neighboursFacingDirection); + + _placedObject.SetDirection(info.Item1); + + if (_filter == null) + { + Log.Warning(this, "Missing mesh {meshDirectionInfo}", Logs.Generic, info); + } + + _filter.mesh = info.Item2.Mesh; + + Quaternion localRotation = transform.localRotation; + Vector3 eulerRotation = localRotation.eulerAngles; + localRotation = Quaternion.Euler(eulerRotation.x, info.Item2.Rotation, eulerRotation.z); + + transform.localRotation = localRotation; + } + } +} + diff --git a/Assets/Scripts/SS3D/Systems/Tile/Connections/DirectionnalAdjacencyConnector.cs.meta b/Assets/Scripts/SS3D/Systems/Tile/Connections/DirectionnalAdjacencyConnector.cs.meta new file mode 100644 index 0000000000..0fdf60c325 --- /dev/null +++ b/Assets/Scripts/SS3D/Systems/Tile/Connections/DirectionnalAdjacencyConnector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 479fbe67c0de04b449f924bc5462ede3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: