From 9ac752b23c95b7e059d557bcacd4c0c3d9aa8c4f Mon Sep 17 00:00:00 2001 From: Savya Bikram Shah Date: Thu, 28 May 2026 17:45:58 +0545 Subject: [PATCH 1/2] Refactored and Animaiton for HOlder --- .../GameplayFlow/IGameplaySceneRefs.cs | 7 +- .../ShapeBuilder/ShapeBuilderStartedSignal.cs | 4 + .../ShapeBuilderStartedSignal.cs.meta | 2 + .../Installers/ColoringFeatureModule.cs | 12 +- .../Code/Features/Coloring/Systems.meta | 8 + .../Darkmatter/Code/Features/Coloring/UI.meta | 8 + .../UI/ColorPaletteHolderPresenter.cs | 32 +++ .../UI/ColorPaletteHolderPresenter.cs.meta | 2 + .../Coloring/UI/ColorPaletteHolderView.cs | 76 ++++++ .../UI/ColorPaletteHolderView.cs.meta | 2 + .../Coloring/UI/ColorPalettePresenter.cs | 19 ++ .../Coloring/UI/ColorPalettePresenter.cs.meta | 2 + .../Features/Coloring/UI/ColorPaletteView.cs | 8 + .../Coloring/UI/ColorPaletteView.cs.meta | 3 + .../Features/Coloring/UI/ColorRegionView.cs | 37 +++ .../Coloring/UI/ColorRegionView.cs.meta | 2 + .../SceneRefs/GameplaySceneRefs.cs | 14 +- .../Installers/ShapeBuilderFeatureModule.cs | 12 +- .../Systems/IShapePieceFactory.cs | 11 + .../Systems/IShapePieceFactory.cs.meta | 2 + .../Systems/ShapeBuilderController.cs | 50 ++-- .../ShapeBuilder/Systems/ShapePieceFactory.cs | 42 +++ .../Systems/ShapePieceFactory.cs.meta | 2 + .../ShapeBuilder/UI/ShapeHolderPresenter.cs | 35 +++ .../UI/ShapeHolderPresenter.cs.meta | 2 + .../ShapeBuilder/UI/ShapeHolderView.cs | 77 ++++++ .../ShapeBuilder/UI/ShapeHolderView.cs.meta | 2 + .../Colorbook UI/ColorBookUI/Arrow.png.meta | 13 + .../ColorBookUI/Artbook Topic.png.meta | 13 + .../ColorBookUI/Background.png.meta | 13 + .../ColorBookUI/Btn Blue Small.png.meta | 13 + .../ColorBookUI/Image_Border.png.meta | 13 + .../Colorbook UI/ColorBookUI/Topic.png.meta | 13 + .../Aeroplane/Aeroplae Wing back 2.png.meta | 13 + .../Aeroplane/Aeroplane Outline.png.meta | 13 + .../Aeroplane/Aeroplane tail.png.meta | 13 + .../Aeroplane/Aeroplane window.png.meta | 13 + .../Aeroplane/Aeroplane wing 1.png.meta | 13 + .../Aeroplane/Areroblane Body.png.meta | 13 + .../Aeroplane/Areroplane Reference.png.meta | 13 + .../Aeroplane/areoplane front screen.png.meta | 13 + .../DrawingItems/Apple/Apple Leaf.png.meta | 13 + .../DrawingItems/Apple/Apple body.png.meta | 13 + .../DrawingItems/Apple/Apple steam.png.meta | 13 + .../Apple/apple reference.png.meta | 13 + .../DrawingItems/Ball/Ball Outline.png.meta | 13 + .../DrawingItems/Car1/Car1_Body.png.meta | 13 + .../Car1/Car1_Bumper Middle(1).png.meta | 13 + .../Car1/Car1_Bumper Middle.png.meta | 13 + .../DrawingItems/Car1/Car1_Bumper(1).png.meta | 13 + .../DrawingItems/Car1/Car1_Bumper.png.meta | 13 + .../Car1/Car1_Front window(1).png.meta | 13 + .../Car1/Car1_Front window.png.meta | 13 + .../Car1/Car1_Inner wheel(1).png.meta | 13 + .../Car1/Car1_Inner wheel.png.meta | 13 + .../Car1/Car1_Outer wheel(1).png.meta | 13 + .../Car1/Car1_Outer wheel.png.meta | 13 + .../DrawingItems/Car1/Car1_Outline.png.meta | 13 + .../Car1/Car1_Rear window(1).png.meta | 13 + .../Car1/Car1_Rear window.png.meta | 13 + .../Car1/Car1_Reference(1).png.meta | 13 + .../DrawingItems/Dolphin/Dolphin.png.meta | 13 + .../DrawingItems/Donut/Donut.png.meta | 13 + .../DrawingItems/Earphone/Earphone.png.meta | 13 + .../HalfOBJ/semi circle.png.meta | 13 + .../HalfOBJ/semi oval.png.meta | 13 + .../HalfOBJ/square.png.meta | 13 + .../Shapes/REAL rectangle.png.meta | 13 + .../Shapes/Real Oval.png.meta | 13 + .../Shapes/Real circle.png.meta | 13 + .../Real right angled triangle.png.meta | 13 + .../Shapes/square.png.meta | 13 + .../DrawingItems/dog/dog body.png.meta | 13 + .../DrawingItems/dog/dog ear 2.png.meta | 13 + .../DrawingItems/dog/dog ear1.png.meta | 13 + .../DrawingItems/dog/dog outline.png.meta | 13 + .../DrawingItems/dog/dog reference.png.meta | 13 + .../DrawingItems/envelope/Envelope.png.meta | 13 + .../Colorbook UI/MainmenuUI/BG.png.meta | 26 ++ .../Colorbook Logo Final-stroke.png.meta | 26 ++ .../Colorbook_Playstore_graphics.png.meta | 26 ++ .../Colorbook UI/MainmenuUI/Grass.png.meta | 26 ++ .../MainmenuUI/Turn_Left_Arrow.png.meta | 26 ++ .../Colorbook UI/MainmenuUI/board.png.meta | 26 ++ Readme.md | 247 +++++++++++------- 85 files changed, 1392 insertions(+), 147 deletions(-) create mode 100644 Assets/Darkmatter/Code/Core/Data/Signals/Features/ShapeBuilder/ShapeBuilderStartedSignal.cs create mode 100644 Assets/Darkmatter/Code/Core/Data/Signals/Features/ShapeBuilder/ShapeBuilderStartedSignal.cs.meta create mode 100644 Assets/Darkmatter/Code/Features/Coloring/Systems.meta create mode 100644 Assets/Darkmatter/Code/Features/Coloring/UI.meta create mode 100644 Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteHolderPresenter.cs create mode 100644 Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteHolderPresenter.cs.meta create mode 100644 Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteHolderView.cs create mode 100644 Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteHolderView.cs.meta create mode 100644 Assets/Darkmatter/Code/Features/Coloring/UI/ColorPalettePresenter.cs create mode 100644 Assets/Darkmatter/Code/Features/Coloring/UI/ColorPalettePresenter.cs.meta create mode 100644 Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteView.cs create mode 100644 Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteView.cs.meta create mode 100644 Assets/Darkmatter/Code/Features/Coloring/UI/ColorRegionView.cs create mode 100644 Assets/Darkmatter/Code/Features/Coloring/UI/ColorRegionView.cs.meta create mode 100644 Assets/Darkmatter/Code/Features/ShapeBuilder/Systems/IShapePieceFactory.cs create mode 100644 Assets/Darkmatter/Code/Features/ShapeBuilder/Systems/IShapePieceFactory.cs.meta create mode 100644 Assets/Darkmatter/Code/Features/ShapeBuilder/Systems/ShapePieceFactory.cs create mode 100644 Assets/Darkmatter/Code/Features/ShapeBuilder/Systems/ShapePieceFactory.cs.meta create mode 100644 Assets/Darkmatter/Code/Features/ShapeBuilder/UI/ShapeHolderPresenter.cs create mode 100644 Assets/Darkmatter/Code/Features/ShapeBuilder/UI/ShapeHolderPresenter.cs.meta create mode 100644 Assets/Darkmatter/Code/Features/ShapeBuilder/UI/ShapeHolderView.cs create mode 100644 Assets/Darkmatter/Code/Features/ShapeBuilder/UI/ShapeHolderView.cs.meta diff --git a/Assets/Darkmatter/Code/Core/Contracts/Features/GameplayFlow/IGameplaySceneRefs.cs b/Assets/Darkmatter/Code/Core/Contracts/Features/GameplayFlow/IGameplaySceneRefs.cs index 35bd7d1..7eadc6f 100644 --- a/Assets/Darkmatter/Code/Core/Contracts/Features/GameplayFlow/IGameplaySceneRefs.cs +++ b/Assets/Darkmatter/Code/Core/Contracts/Features/GameplayFlow/IGameplaySceneRefs.cs @@ -5,9 +5,4 @@ namespace Darkmatter.Core.Contracts.Features.GameplayFlow; public interface IGameplaySceneRefs { RectTransform PaperRoot { get; } - RectTransform SlotsParent { get; } - RectTransform PiecesParent { get; } - RectTransform RegionsParent { get; } - RectTransform HudRoot { get; } - RectTransform TrayPanel { get; } -} \ No newline at end of file +} diff --git a/Assets/Darkmatter/Code/Core/Data/Signals/Features/ShapeBuilder/ShapeBuilderStartedSignal.cs b/Assets/Darkmatter/Code/Core/Data/Signals/Features/ShapeBuilder/ShapeBuilderStartedSignal.cs new file mode 100644 index 0000000..88144ae --- /dev/null +++ b/Assets/Darkmatter/Code/Core/Data/Signals/Features/ShapeBuilder/ShapeBuilderStartedSignal.cs @@ -0,0 +1,4 @@ +namespace Darkmatter.Core.Data.Signals.Features.ShapeBuilder +{ + public record struct ShapeBuilderStartedSignal(string TemplateId); +} diff --git a/Assets/Darkmatter/Code/Core/Data/Signals/Features/ShapeBuilder/ShapeBuilderStartedSignal.cs.meta b/Assets/Darkmatter/Code/Core/Data/Signals/Features/ShapeBuilder/ShapeBuilderStartedSignal.cs.meta new file mode 100644 index 0000000..6e8f403 --- /dev/null +++ b/Assets/Darkmatter/Code/Core/Data/Signals/Features/ShapeBuilder/ShapeBuilderStartedSignal.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 40f2733e19ad34fe5ba5d63aa2e9a39b \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/Coloring/Installers/ColoringFeatureModule.cs b/Assets/Darkmatter/Code/Features/Coloring/Installers/ColoringFeatureModule.cs index c1ee051..748ad2f 100644 --- a/Assets/Darkmatter/Code/Features/Coloring/Installers/ColoringFeatureModule.cs +++ b/Assets/Darkmatter/Code/Features/Coloring/Installers/ColoringFeatureModule.cs @@ -1,14 +1,22 @@ +using Darkmatter.Features.Coloring.UI; using Darkmatter.Libs.Installers; using UnityEngine; using VContainer; +using VContainer.Unity; namespace Darkmatter.Features.Coloring { - public class ColoringFeatureModule : MonoBehaviour,IModule + public class ColoringFeatureModule : MonoBehaviour, IModule { + [SerializeField] private ColorPaletteHolderView paletteHolderView; + public void Register(IContainerBuilder builder) { - + if (paletteHolderView != null) + { + builder.RegisterComponent(paletteHolderView); + builder.RegisterEntryPoint().WithParameter(paletteHolderView); + } } } } diff --git a/Assets/Darkmatter/Code/Features/Coloring/Systems.meta b/Assets/Darkmatter/Code/Features/Coloring/Systems.meta new file mode 100644 index 0000000..d415ddb --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/Systems.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 569e45483f54348a593b6571740cd8a2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Darkmatter/Code/Features/Coloring/UI.meta b/Assets/Darkmatter/Code/Features/Coloring/UI.meta new file mode 100644 index 0000000..67f34e8 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/UI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 416f96737010f40c085ac404743fa8ef +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteHolderPresenter.cs b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteHolderPresenter.cs new file mode 100644 index 0000000..f55864e --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteHolderPresenter.cs @@ -0,0 +1,32 @@ +using System; +using Darkmatter.Core.Data.Signals.Features.ShapeBuilder; +using Darkmatter.Libs.Observer; +using VContainer.Unity; + +namespace Darkmatter.Features.Coloring.UI +{ + public class ColorPaletteHolderPresenter : IStartable, IDisposable + { + private readonly ColorPaletteHolderView _view; + private readonly IEventBus _bus; + + private IDisposable _assembledSub; + + public ColorPaletteHolderPresenter(ColorPaletteHolderView view, IEventBus bus) + { + _view = view; + _bus = bus; + } + + public void Start() + { + _view.HideInstant(); + _assembledSub = _bus.Subscribe(_ => _view.Show()); + } + + public void Dispose() + { + _assembledSub?.Dispose(); + } + } +} diff --git a/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteHolderPresenter.cs.meta b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteHolderPresenter.cs.meta new file mode 100644 index 0000000..e0314be --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteHolderPresenter.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: cc0590d8f6fce4487943575bfb96c32a \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteHolderView.cs b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteHolderView.cs new file mode 100644 index 0000000..f6ef091 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteHolderView.cs @@ -0,0 +1,76 @@ +using PrimeTween; +using UnityEngine; + +namespace Darkmatter.Features.Coloring.UI +{ + [RequireComponent(typeof(CanvasGroup))] + public class ColorPaletteHolderView : MonoBehaviour + { + [SerializeField] private RectTransform spawnRoot; + [SerializeField] private RectTransform animatedRoot; + [SerializeField] private float showDuration = 0.35f; + [SerializeField] private float hideDuration = 0.25f; + [SerializeField] private Vector2 hiddenOffset = new(1500f, 0f); + + private CanvasGroup _canvasGroup; + private Vector2 _shownAnchoredPos; + private Sequence _activeSequence; + + public RectTransform SpawnRoot => spawnRoot; + + private void Awake() + { + _canvasGroup = GetComponent(); + if (animatedRoot == null) animatedRoot = (RectTransform)transform; + _shownAnchoredPos = animatedRoot.anchoredPosition; + } + + public Sequence Show() + { + KillActive(); + gameObject.SetActive(true); + _canvasGroup.interactable = true; + _canvasGroup.blocksRaycasts = true; + + _activeSequence = Sequence.Create() + .Group(Tween.UIAnchoredPosition(animatedRoot, _shownAnchoredPos, showDuration, Ease.OutBack)) + .Group(Tween.Alpha(_canvasGroup, 1f, showDuration, Ease.OutQuad)); + return _activeSequence; + } + + public Sequence Hide() + { + KillActive(); + _canvasGroup.interactable = false; + _canvasGroup.blocksRaycasts = false; + + var hiddenPos = _shownAnchoredPos + hiddenOffset; + _activeSequence = Sequence.Create() + .Group(Tween.UIAnchoredPosition(animatedRoot, hiddenPos, hideDuration, Ease.InQuad)) + .Group(Tween.Alpha(_canvasGroup, 0f, hideDuration, Ease.InQuad)) + .ChainCallback(() => gameObject.SetActive(false)); + return _activeSequence; + } + + public void HideInstant() + { + KillActive(); + animatedRoot.anchoredPosition = _shownAnchoredPos + hiddenOffset; + _canvasGroup.alpha = 0f; + _canvasGroup.interactable = false; + _canvasGroup.blocksRaycasts = false; + gameObject.SetActive(false); + } + + private void KillActive() + { + if (_activeSequence.isAlive) _activeSequence.Stop(); + _activeSequence = default; + } + + private void OnDisable() + { + KillActive(); + } + } +} diff --git a/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteHolderView.cs.meta b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteHolderView.cs.meta new file mode 100644 index 0000000..a8f6909 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteHolderView.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c960fbf3dc5a54f5399178665d20b1ce \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPalettePresenter.cs b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPalettePresenter.cs new file mode 100644 index 0000000..5b44f03 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPalettePresenter.cs @@ -0,0 +1,19 @@ +using VContainer.Unity; + +namespace Darkmatter.Features.Coloring.UI +{ + public class ColorPalettePresenter : IStartable + { + private readonly ColorPaletteView _view; + + public ColorPalettePresenter(ColorPaletteView view) + { + _view = view; + } + + public void Start() + { + throw new System.NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPalettePresenter.cs.meta b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPalettePresenter.cs.meta new file mode 100644 index 0000000..5156058 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPalettePresenter.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 0146ec43f1205479194de6448b58407e \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteView.cs b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteView.cs new file mode 100644 index 0000000..ba60d1c --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteView.cs @@ -0,0 +1,8 @@ +using UnityEngine; + +namespace Darkmatter.Features.Coloring.UI +{ + public class ColorPaletteView : MonoBehaviour + { + } +} \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteView.cs.meta b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteView.cs.meta new file mode 100644 index 0000000..fff2ccd --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteView.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0db39fd358084d4caa1fb8f030523c4c +timeCreated: 1779969088 \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/Coloring/UI/ColorRegionView.cs b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorRegionView.cs new file mode 100644 index 0000000..4fde295 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorRegionView.cs @@ -0,0 +1,37 @@ +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +namespace Darkmatter.Features.Coloring.UI +{ + [RequireComponent(typeof(Image))] + public class ColorRegionView : MonoBehaviour, IPointerClickHandler + { + [field: SerializeField] public string RegionId { get; private set; } + [SerializeField, Range(0f, 1f)] private float alphaHitThreshold = 0.5f; + public Color Color => _image.color; + + private Image _image; + + private void Awake() + { + _image = GetComponent(); + _image.alphaHitTestMinimumThreshold = alphaHitThreshold; + } + + public void Initialize(string id, Color color) + { + RegionId = id; + _image.color = color; + } + + public void SetColor(Color color) + { + _image.color = color; + } + + public void OnPointerClick(PointerEventData eventData) + { + } + } +} \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/Coloring/UI/ColorRegionView.cs.meta b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorRegionView.cs.meta new file mode 100644 index 0000000..31f2528 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorRegionView.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7667901d8aea645d28b5125a2ed546ce \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/GameplayFlow/SceneRefs/GameplaySceneRefs.cs b/Assets/Darkmatter/Code/Features/GameplayFlow/SceneRefs/GameplaySceneRefs.cs index c964211..161f67c 100644 --- a/Assets/Darkmatter/Code/Features/GameplayFlow/SceneRefs/GameplaySceneRefs.cs +++ b/Assets/Darkmatter/Code/Features/GameplayFlow/SceneRefs/GameplaySceneRefs.cs @@ -6,19 +6,7 @@ namespace Darkmatter.Features.GameplayFlow.SceneRefs public class GameplaySceneRefs : MonoBehaviour, IGameplaySceneRefs { [SerializeField] private RectTransform paperRoot; - [SerializeField] private RectTransform slotsParent; - [SerializeField] private RectTransform piecesParent; - [SerializeField] private RectTransform regionsParent; - - [SerializeField] private RectTransform hudRoot; - [SerializeField] private RectTransform trayPanel; - public RectTransform PaperRoot => paperRoot; - public RectTransform SlotsParent => slotsParent; - public RectTransform PiecesParent => piecesParent; - public RectTransform RegionsParent => regionsParent; - public RectTransform HudRoot => hudRoot; - public RectTransform TrayPanel => trayPanel; } -} \ No newline at end of file +} diff --git a/Assets/Darkmatter/Code/Features/ShapeBuilder/Installers/ShapeBuilderFeatureModule.cs b/Assets/Darkmatter/Code/Features/ShapeBuilder/Installers/ShapeBuilderFeatureModule.cs index fd6df8f..78a5be9 100644 --- a/Assets/Darkmatter/Code/Features/ShapeBuilder/Installers/ShapeBuilderFeatureModule.cs +++ b/Assets/Darkmatter/Code/Features/ShapeBuilder/Installers/ShapeBuilderFeatureModule.cs @@ -1,6 +1,7 @@ using Darkmatter.Core.Contracts.Features.ShapeBuilder; using Darkmatter.Core.Data.Static.Features.ShapeBuilder; using Darkmatter.Features.ShapeBuilder.Systems; +using Darkmatter.Features.ShapeBuilder.UI; using Darkmatter.Libs.Installers; using UnityEngine; using VContainer; @@ -11,12 +12,21 @@ namespace Darkmatter.Features.ShapeBuilder.Installers public class ShapeBuilderFeatureModule : MonoBehaviour, IModule { [SerializeField] private ShapeBuilderConfig config; + [SerializeField] private ShapeHolderView holderView; public void Register(IContainerBuilder builder) { if (config != null) builder.RegisterComponent(config); + + if (holderView != null) + { + builder.RegisterComponent(holderView); + builder.RegisterEntryPoint().WithParameter(holderView); + } + + builder.Register(Lifetime.Singleton); builder.Register(Lifetime.Singleton); } } -} \ No newline at end of file +} diff --git a/Assets/Darkmatter/Code/Features/ShapeBuilder/Systems/IShapePieceFactory.cs b/Assets/Darkmatter/Code/Features/ShapeBuilder/Systems/IShapePieceFactory.cs new file mode 100644 index 0000000..4a54934 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/ShapeBuilder/Systems/IShapePieceFactory.cs @@ -0,0 +1,11 @@ +using Darkmatter.Core.Data.Static.Features.ShapeBuilder; +using Darkmatter.Features.ShapeBuilder.UI; +using UnityEngine; + +namespace Darkmatter.Features.ShapeBuilder.Systems +{ + public interface IShapePieceFactory + { + ShapePiece Create(GameObject prefab, ShapeSO shape, SlotMarker slot, Vector2 trayPos, bool preSnapped); + } +} diff --git a/Assets/Darkmatter/Code/Features/ShapeBuilder/Systems/IShapePieceFactory.cs.meta b/Assets/Darkmatter/Code/Features/ShapeBuilder/Systems/IShapePieceFactory.cs.meta new file mode 100644 index 0000000..e191ccb --- /dev/null +++ b/Assets/Darkmatter/Code/Features/ShapeBuilder/Systems/IShapePieceFactory.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7eac815466c2c48b3b37bede20218b99 \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/ShapeBuilder/Systems/ShapeBuilderController.cs b/Assets/Darkmatter/Code/Features/ShapeBuilder/Systems/ShapeBuilderController.cs index 005eeca..f137ef2 100644 --- a/Assets/Darkmatter/Code/Features/ShapeBuilder/Systems/ShapeBuilderController.cs +++ b/Assets/Darkmatter/Code/Features/ShapeBuilder/Systems/ShapeBuilderController.cs @@ -4,11 +4,9 @@ using System.Linq; using System.Threading; using Cysharp.Threading.Tasks; using Darkmatter.Core.Contracts.Features.DrawingCatalog; -using Darkmatter.Core.Contracts.Features.History; +using Darkmatter.Core.Contracts.Features.GameplayFlow; using Darkmatter.Core.Contracts.Features.ShapeBuilder; using Darkmatter.Core.Contracts.Services.Assets; -using Darkmatter.Core.Contracts.Services.Audio; -using Darkmatter.Core.Contracts.Features.GameplayFlow; using Darkmatter.Core.Data.Signals.Features.ShapeBuilder; using Darkmatter.Core.Data.Static.Features.ShapeBuilder; using Darkmatter.Features.ShapeBuilder.UI; @@ -30,38 +28,32 @@ namespace Darkmatter.Features.ShapeBuilder.Systems private IDisposable _snappedSub; private readonly List _snappedPieceIds = new(); - private readonly ShapeBuilderConfig _cfg; - private readonly ISfxPlayer _sfx; + private readonly List _pieces = new(); private readonly IEventBus _bus; - private readonly IUndoStack _undo; private readonly IAssetProviderService _assetProviderService; - private readonly IEventBus _eventBus; + private readonly IShapePieceFactory _factory; + private readonly ShapeHolderView _holder; private readonly IGameplaySceneRefs _refs; public ShapeBuilderController( - ShapeBuilderConfig cfg, - ISfxPlayer sfx, IEventBus bus, - IUndoStack undo, IAssetProviderService assetProviderService, - IEventBus eventBus, + IShapePieceFactory factory, + ShapeHolderView holder, IGameplaySceneRefs refs) { - _cfg = cfg; - _sfx = sfx; _bus = bus; - _undo = undo; _assetProviderService = assetProviderService; - _eventBus = eventBus; + _factory = factory; + _holder = holder; _refs = refs; } public async UniTask InitializeAsync(CancellationToken cancellationToken) { await TryLoadPiecePrefabAsync(cancellationToken); - - _snappedSub = _eventBus.Subscribe(OnPieceSnapped); + _snappedSub = _bus.Subscribe(OnPieceSnapped); } private void OnPieceSnapped(PieceSnappedSignal obj) @@ -88,13 +80,15 @@ namespace Darkmatter.Features.ShapeBuilder.Systems await TryLoadPiecePrefabAsync(ct); int count = template.Pieces.Count; - float trayW = _refs.TrayPanel.rect.width; + float trayW = _holder.SpawnWidth; float pitch = trayW / (count + 1); _currentTemplateId = template.Id; _expected = count; _snapped = 0; + _bus.Publish(new ShapeBuilderStartedSignal(template.Id)); + CreateShapePieceInstances(template, preSnappedIds, count, slots, pitch, trayW); CheckIfShapeAssembled(); @@ -117,11 +111,8 @@ namespace Darkmatter.Features.ShapeBuilder.Systems var trayPos = new Vector2(pitch * (i + 1) - trayW * 0.5f, 0f); bool preSnapped = preSnappedIds != null && preSnappedIds.Contains(shape.Id); - var go = Object.Instantiate(_piecePrefab, _refs.TrayPanel); - go.name = $"Piece_{shape.Id}"; - - var piece = go.GetComponent(); - piece.Setup(shape, slot, _cfg, _sfx, _bus, _undo, trayPos, preSnapped); + var piece = _factory.Create(_piecePrefab, shape, slot, trayPos, preSnapped); + _pieces.Add(piece); if (preSnapped) _snapped++; } @@ -159,6 +150,17 @@ namespace Darkmatter.Features.ShapeBuilder.Systems public void Clear() { + foreach (var piece in _pieces) + if (piece != null) Object.Destroy(piece.gameObject); + _pieces.Clear(); + + if (_drawingInstance != null) Object.Destroy(_drawingInstance); + _drawingInstance = null; + + _snappedPieceIds.Clear(); + _snapped = 0; + _expected = 0; + _currentTemplateId = null; } public void Dispose() @@ -166,4 +168,4 @@ namespace Darkmatter.Features.ShapeBuilder.Systems _snappedSub?.Dispose(); } } -} \ No newline at end of file +} diff --git a/Assets/Darkmatter/Code/Features/ShapeBuilder/Systems/ShapePieceFactory.cs b/Assets/Darkmatter/Code/Features/ShapeBuilder/Systems/ShapePieceFactory.cs new file mode 100644 index 0000000..a001779 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/ShapeBuilder/Systems/ShapePieceFactory.cs @@ -0,0 +1,42 @@ +using Darkmatter.Core.Contracts.Features.History; +using Darkmatter.Core.Contracts.Services.Audio; +using Darkmatter.Core.Data.Static.Features.ShapeBuilder; +using Darkmatter.Features.ShapeBuilder.UI; +using Darkmatter.Libs.Observer; +using UnityEngine; + +namespace Darkmatter.Features.ShapeBuilder.Systems +{ + public sealed class ShapePieceFactory : IShapePieceFactory + { + private readonly ShapeHolderView _holder; + private readonly ShapeBuilderConfig _cfg; + private readonly ISfxPlayer _sfx; + private readonly IEventBus _bus; + private readonly IUndoStack _undo; + + public ShapePieceFactory( + ShapeHolderView holder, + ShapeBuilderConfig cfg, + ISfxPlayer sfx, + IEventBus bus, + IUndoStack undo) + { + _holder = holder; + _cfg = cfg; + _sfx = sfx; + _bus = bus; + _undo = undo; + } + + public ShapePiece Create(GameObject prefab, ShapeSO shape, SlotMarker slot, Vector2 trayPos, bool preSnapped) + { + var go = Object.Instantiate(prefab, _holder.SpawnRoot); + go.name = $"Piece_{shape.Id}"; + + var piece = go.GetComponent(); + piece.Setup(shape, slot, _cfg, _sfx, _bus, _undo, trayPos, preSnapped); + return piece; + } + } +} diff --git a/Assets/Darkmatter/Code/Features/ShapeBuilder/Systems/ShapePieceFactory.cs.meta b/Assets/Darkmatter/Code/Features/ShapeBuilder/Systems/ShapePieceFactory.cs.meta new file mode 100644 index 0000000..5d420d8 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/ShapeBuilder/Systems/ShapePieceFactory.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 34f1057e9a8774bbbaf0aac5ac1ae1a8 \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/ShapeBuilder/UI/ShapeHolderPresenter.cs b/Assets/Darkmatter/Code/Features/ShapeBuilder/UI/ShapeHolderPresenter.cs new file mode 100644 index 0000000..c543628 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/ShapeBuilder/UI/ShapeHolderPresenter.cs @@ -0,0 +1,35 @@ +using System; +using Darkmatter.Core.Data.Signals.Features.ShapeBuilder; +using Darkmatter.Libs.Observer; +using VContainer.Unity; + +namespace Darkmatter.Features.ShapeBuilder.UI +{ + public class ShapeHolderPresenter : IStartable, IDisposable + { + private readonly ShapeHolderView _view; + private readonly IEventBus _bus; + + private IDisposable _startedSub; + private IDisposable _assembledSub; + + public ShapeHolderPresenter(ShapeHolderView view, IEventBus bus) + { + _view = view; + _bus = bus; + } + + public void Start() + { + _view.HideInstant(); + _startedSub = _bus.Subscribe(_ => _view.Show()); + _assembledSub = _bus.Subscribe(_ => _view.Hide()); + } + + public void Dispose() + { + _startedSub?.Dispose(); + _assembledSub?.Dispose(); + } + } +} diff --git a/Assets/Darkmatter/Code/Features/ShapeBuilder/UI/ShapeHolderPresenter.cs.meta b/Assets/Darkmatter/Code/Features/ShapeBuilder/UI/ShapeHolderPresenter.cs.meta new file mode 100644 index 0000000..8c696e6 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/ShapeBuilder/UI/ShapeHolderPresenter.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bdc42ff3cf54249eba34beb822f4e9fb \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/ShapeBuilder/UI/ShapeHolderView.cs b/Assets/Darkmatter/Code/Features/ShapeBuilder/UI/ShapeHolderView.cs new file mode 100644 index 0000000..30f959c --- /dev/null +++ b/Assets/Darkmatter/Code/Features/ShapeBuilder/UI/ShapeHolderView.cs @@ -0,0 +1,77 @@ +using PrimeTween; +using UnityEngine; + +namespace Darkmatter.Features.ShapeBuilder.UI +{ + [RequireComponent(typeof(CanvasGroup))] + public class ShapeHolderView : MonoBehaviour + { + [SerializeField] private RectTransform spawnRoot; + [SerializeField] private RectTransform animatedRoot; + [SerializeField] private float showDuration = 0.35f; + [SerializeField] private float hideDuration = 0.25f; + [SerializeField] private Vector2 hiddenOffset = new(1500f, 0f); + + private CanvasGroup _canvasGroup; + private Vector2 _shownAnchoredPos; + private Sequence _activeSequence; + + public RectTransform SpawnRoot => spawnRoot; + public float SpawnWidth => spawnRoot.rect.width; + + private void Awake() + { + _canvasGroup = GetComponent(); + if (animatedRoot == null) animatedRoot = (RectTransform)transform; + _shownAnchoredPos = animatedRoot.anchoredPosition; + } + + public Sequence Show() + { + KillActive(); + gameObject.SetActive(true); + _canvasGroup.interactable = true; + _canvasGroup.blocksRaycasts = true; + + _activeSequence = Sequence.Create() + .Group(Tween.UIAnchoredPosition(animatedRoot, _shownAnchoredPos, showDuration, Ease.OutBack)) + .Group(Tween.Alpha(_canvasGroup, 1f, showDuration, Ease.OutQuad)); + return _activeSequence; + } + + public Sequence Hide() + { + KillActive(); + _canvasGroup.interactable = false; + _canvasGroup.blocksRaycasts = false; + + var hiddenPos = _shownAnchoredPos + hiddenOffset; + _activeSequence = Sequence.Create() + .Group(Tween.UIAnchoredPosition(animatedRoot, hiddenPos, hideDuration, Ease.InQuad)) + .Group(Tween.Alpha(_canvasGroup, 0f, hideDuration, Ease.InQuad)) + .ChainCallback(() => gameObject.SetActive(false)); + return _activeSequence; + } + + public void HideInstant() + { + KillActive(); + animatedRoot.anchoredPosition = _shownAnchoredPos + hiddenOffset; + _canvasGroup.alpha = 0f; + _canvasGroup.interactable = false; + _canvasGroup.blocksRaycasts = false; + gameObject.SetActive(false); + } + + private void KillActive() + { + if (_activeSequence.isAlive) _activeSequence.Stop(); + _activeSequence = default; + } + + private void OnDisable() + { + KillActive(); + } + } +} diff --git a/Assets/Darkmatter/Code/Features/ShapeBuilder/UI/ShapeHolderView.cs.meta b/Assets/Darkmatter/Code/Features/ShapeBuilder/UI/ShapeHolderView.cs.meta new file mode 100644 index 0000000..4564a23 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/ShapeBuilder/UI/ShapeHolderView.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7763b07d532494bda8fa4cc10344dbd6 \ No newline at end of file diff --git a/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Arrow.png.meta b/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Arrow.png.meta index ea88d90..aeaf39a 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Arrow.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Arrow.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Artbook Topic.png.meta b/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Artbook Topic.png.meta index 2b49f60..090672f 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Artbook Topic.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Artbook Topic.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Background.png.meta b/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Background.png.meta index 08f0eed..ae5e4e9 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Background.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Background.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 512 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Btn Blue Small.png.meta b/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Btn Blue Small.png.meta index 0a6b64b..ef69b04 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Btn Blue Small.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Btn Blue Small.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Image_Border.png.meta b/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Image_Border.png.meta index 20c2910..2a232ad 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Image_Border.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Image_Border.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Topic.png.meta b/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Topic.png.meta index dc03a16..0e9d601 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Topic.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/ColorBookUI/Topic.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Aeroplae Wing back 2.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Aeroplae Wing back 2.png.meta index eca0a02..63aa51b 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Aeroplae Wing back 2.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Aeroplae Wing back 2.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Aeroplane Outline.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Aeroplane Outline.png.meta index 0a6e6a6..4a2e671 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Aeroplane Outline.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Aeroplane Outline.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Aeroplane tail.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Aeroplane tail.png.meta index 8520813..7b93c80 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Aeroplane tail.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Aeroplane tail.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Aeroplane window.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Aeroplane window.png.meta index 6e4d972..231edca 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Aeroplane window.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Aeroplane window.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Aeroplane wing 1.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Aeroplane wing 1.png.meta index 8e81abb..bd339ed 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Aeroplane wing 1.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Aeroplane wing 1.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Areroblane Body.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Areroblane Body.png.meta index 80ae131..1699858 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Areroblane Body.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Areroblane Body.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Areroplane Reference.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Areroplane Reference.png.meta index f3008a6..93c2a62 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Areroplane Reference.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/Areroplane Reference.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/areoplane front screen.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/areoplane front screen.png.meta index 2f1075b..b463cbd 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/areoplane front screen.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Aeroplane/areoplane front screen.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Apple/Apple Leaf.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Apple/Apple Leaf.png.meta index 0b45198..a399a5e 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Apple/Apple Leaf.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Apple/Apple Leaf.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Apple/Apple body.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Apple/Apple body.png.meta index c215fc9..bec8eb4 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Apple/Apple body.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Apple/Apple body.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Apple/Apple steam.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Apple/Apple steam.png.meta index 3ab6442..04190ab 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Apple/Apple steam.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Apple/Apple steam.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Apple/apple reference.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Apple/apple reference.png.meta index efb579f..3691c78 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Apple/apple reference.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Apple/apple reference.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Ball/Ball Outline.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Ball/Ball Outline.png.meta index 8f5685f..eeb12e4 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Ball/Ball Outline.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Ball/Ball Outline.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Body.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Body.png.meta index 27efaab..6bfb63a 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Body.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Body.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Bumper Middle(1).png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Bumper Middle(1).png.meta index f69fd03..b005768 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Bumper Middle(1).png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Bumper Middle(1).png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Bumper Middle.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Bumper Middle.png.meta index 8a9f4f0..43829b0 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Bumper Middle.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Bumper Middle.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Bumper(1).png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Bumper(1).png.meta index 2c884c6..4b62ad1 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Bumper(1).png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Bumper(1).png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Bumper.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Bumper.png.meta index 039e856..d92657c 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Bumper.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Bumper.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Front window(1).png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Front window(1).png.meta index 8fbedce..38c3431 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Front window(1).png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Front window(1).png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Front window.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Front window.png.meta index 4afd637..1ca1704 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Front window.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Front window.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Inner wheel(1).png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Inner wheel(1).png.meta index ced47c4..a82419d 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Inner wheel(1).png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Inner wheel(1).png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Inner wheel.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Inner wheel.png.meta index cb8ff29..4a2598c 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Inner wheel.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Inner wheel.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Outer wheel(1).png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Outer wheel(1).png.meta index 0fba141..c53250c 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Outer wheel(1).png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Outer wheel(1).png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Outer wheel.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Outer wheel.png.meta index 0b5bdb1..ed00cac 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Outer wheel.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Outer wheel.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Outline.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Outline.png.meta index ffce224..beb1dad 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Outline.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Outline.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Rear window(1).png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Rear window(1).png.meta index aa9c165..7e09e4a 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Rear window(1).png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Rear window(1).png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Rear window.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Rear window.png.meta index d090598..91e46d6 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Rear window.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Rear window.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Reference(1).png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Reference(1).png.meta index ae11dd0..78d4559 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Reference(1).png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Car1/Car1_Reference(1).png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Dolphin/Dolphin.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Dolphin/Dolphin.png.meta index 0e9dd33..5dad4e5 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Dolphin/Dolphin.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Dolphin/Dolphin.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Donut/Donut.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Donut/Donut.png.meta index 7595603..aa515fc 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Donut/Donut.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Donut/Donut.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Earphone/Earphone.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Earphone/Earphone.png.meta index a2ceaf7..6e7807d 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Earphone/Earphone.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Earphone/Earphone.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/HalfOBJ/semi circle.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/HalfOBJ/semi circle.png.meta index 17bad6c..e2035a8 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/HalfOBJ/semi circle.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/HalfOBJ/semi circle.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/HalfOBJ/semi oval.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/HalfOBJ/semi oval.png.meta index ed48fef..b0ae17f 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/HalfOBJ/semi oval.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/HalfOBJ/semi oval.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/HalfOBJ/square.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/HalfOBJ/square.png.meta index 6413de5..c494d43 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/HalfOBJ/square.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/HalfOBJ/square.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/Shapes/REAL rectangle.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/Shapes/REAL rectangle.png.meta index 44ebf6d..1e6fde8 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/Shapes/REAL rectangle.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/Shapes/REAL rectangle.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/Shapes/Real Oval.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/Shapes/Real Oval.png.meta index 293918c..1f35817 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/Shapes/Real Oval.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/Shapes/Real Oval.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/Shapes/Real circle.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/Shapes/Real circle.png.meta index 31fb590..ccc7bb8 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/Shapes/Real circle.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/Shapes/Real circle.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/Shapes/Real right angled triangle.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/Shapes/Real right angled triangle.png.meta index f91b3c7..644d5bd 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/Shapes/Real right angled triangle.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/Shapes/Real right angled triangle.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/Shapes/square.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/Shapes/square.png.meta index aa1a48f..b618ffd 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/Shapes/square.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/Shapes-20240915T101909Z-001/Shapes/square.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/dog/dog body.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/dog/dog body.png.meta index dfd1827..0068339 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/dog/dog body.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/dog/dog body.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/dog/dog ear 2.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/dog/dog ear 2.png.meta index 0bd55d3..0e0de73 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/dog/dog ear 2.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/dog/dog ear 2.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/dog/dog ear1.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/dog/dog ear1.png.meta index 2777e69..4f2011f 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/dog/dog ear1.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/dog/dog ear1.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/dog/dog outline.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/dog/dog outline.png.meta index 876f5bf..086e709 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/dog/dog outline.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/dog/dog outline.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/dog/dog reference.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/dog/dog reference.png.meta index f790a91..3c1b476 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/dog/dog reference.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/dog/dog reference.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: [] diff --git a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/envelope/Envelope.png.meta b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/envelope/Envelope.png.meta index 681d03a..8035ca2 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/envelope/Envelope.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/DrawingItems/envelope/Envelope.png.meta @@ -119,6 +119,19 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: diff --git a/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/BG.png.meta b/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/BG.png.meta index f2742d5..459e133 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/BG.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/BG.png.meta @@ -109,6 +109,32 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: diff --git a/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/Colorbook Logo Final-stroke.png.meta b/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/Colorbook Logo Final-stroke.png.meta index 7e8cfa1..524f0d4 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/Colorbook Logo Final-stroke.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/Colorbook Logo Final-stroke.png.meta @@ -109,6 +109,32 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: diff --git a/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/Colorbook_Playstore_graphics.png.meta b/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/Colorbook_Playstore_graphics.png.meta index 8460524..ee258e7 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/Colorbook_Playstore_graphics.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/Colorbook_Playstore_graphics.png.meta @@ -109,6 +109,32 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: diff --git a/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/Grass.png.meta b/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/Grass.png.meta index ccf1d60..8c4cbbd 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/Grass.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/Grass.png.meta @@ -109,6 +109,32 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: diff --git a/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/Turn_Left_Arrow.png.meta b/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/Turn_Left_Arrow.png.meta index fe607bd..4d0b1e0 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/Turn_Left_Arrow.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/Turn_Left_Arrow.png.meta @@ -109,6 +109,32 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: diff --git a/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/board.png.meta b/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/board.png.meta index b6b9fb0..d349dc2 100644 --- a/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/board.png.meta +++ b/Assets/Darkmatter/Content/Colorbook UI/MainmenuUI/board.png.meta @@ -109,6 +109,32 @@ TextureImporter: ignorePlatformSupport: 0 androidETC2FallbackOverride: 0 forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: iOS + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 spriteSheet: serializedVersion: 2 sprites: diff --git a/Readme.md b/Readme.md index 8fe340d..c3b80ea 100644 --- a/Readme.md +++ b/Readme.md @@ -440,7 +440,7 @@ public interface IDrawingTemplate { public readonly struct ColorRegionDTO { public string RegionId { get; } public Sprite Sprite { get; } // assigned to Image.sprite - public Vector2 AnchoredPosition { get; } // canvas units, relative to RegionsParent + public Vector2 AnchoredPosition { get; } // canvas units, relative to PaperRoot (region's authored parent) public Vector2 SizeDelta { get; } // canvas units public Color InitialColor { get; } // usually white // Hit shape comes from the sprite alpha — set Image.alphaHitTestMinimumThreshold = 0.5. @@ -496,27 +496,26 @@ public readonly struct PaintCommandDTO { ### Scene composition (no Paper feature) -The paper area is just a `PaperPanel` GameObject in the `ColorBook.unity` scene with child `RectTransform`s for slots, pieces, and regions. There is **no `IPaperSurface` contract** and no Paper feature. Features that need to parent UI under one of these roots read them from a small `ColorBookSceneRefs : MonoBehaviour` that the scene scope registers as a singleton: +The paper area is just a `PaperPanel` GameObject in the `Gameplay.unity` scene. There is **no `IPaperSurface` contract** and no Paper feature. The single cross-feature anchor — `PaperRoot` — is exposed via a small `GameplaySceneRefs : MonoBehaviour, IGameplaySceneRefs`: ```csharp -public sealed class ColorBookSceneRefs : MonoBehaviour { - [SerializeField] public RectTransform PaperRoot; - [SerializeField] public RectTransform SlotsParent; - [SerializeField] public RectTransform PiecesParent; - [SerializeField] public RectTransform RegionsParent; - [SerializeField] public Camera CaptureCamera; // disabled, used by ICaptureService - [SerializeField] public RectTransform HudRoot; - [SerializeField] public RectTransform TrayPanel; +public sealed class GameplaySceneRefs : MonoBehaviour, IGameplaySceneRefs { + [SerializeField] private RectTransform paperRoot; + public RectTransform PaperRoot => paperRoot; } ``` -Registered once via `ColorBookLifetimeScope`: +Scene refs hold only **what must be shared across features**. Everything else — the shape tray, the color palette, the drawing-instance prefab (which carries its own `SlotMarker`s + `ColorRegionView`s as children) — is owned by its feature's **holder view**. This keeps `GameplaySceneRefs` from becoming a god object as features are added. + +The drawing prefab is instantiated under `PaperRoot`; slot markers and color regions are pre-authored as children of that prefab, so neither `SlotsParent` nor `RegionsParent` needs its own ref. The `CaptureCamera` will live on a separate scene MB (planned, owned by the Capture feature). + +Registered once via `GameplayLifetimeScope`: ```csharp -builder.RegisterInstance(_sceneRefs); +builder.RegisterComponent(_sceneRefs); ``` -Features inject `ColorBookSceneRefs` directly and read the rects they need. This keeps the scene refs visible in the inspector while avoiding a one-feature wrapper that adds nothing. +Features inject `IGameplaySceneRefs` (or their own holder views) directly. ### History @@ -618,16 +617,21 @@ public readonly struct PaperSavedSignal { - Listens to `DrawingSelectedSignal` (raised by the Colorbook scene before scene change; resume reads `LastOpenedTemplateId` in Gameplay scope startup). - Loads the per-drawing prefab via `IDrawingTemplateCatalog`, instantiates it under `GameplaySceneRefs.PaperRoot`. The prefab carries the `SlotMarker`s at their authored poses. -- Spawns one **`ShapePiece` MonoBehaviour** per `ShapeSO` in the template via `Instantiate(piecePrefab, tray)` and calls `piece.Setup(shape, slot, cfg, sfx, bus, trayPos, preSnapped)`. If `progress.Phase == ShapeBuilding`, pieces in `progress.SnappedPieces` are pre-snapped (start locked). -- `ShapePiece` is a single MB handling all three behaviors inline: drag (Unity UI `IBeginDrag / IDrag / IEndDrag`), reactive preview lerp when within `cfg.PreviewRadius`, snap (PrimeTween — `Tween.UIAnchoredPosition` / `UISizeDelta` / `LocalRotation`) on release inside `cfg.SnapRadius`, otherwise tween back to tray. No FSM, no factory — just the MB. +- **`ShapeHolderView`** owns the tray `RectTransform` + slide-in/out animation (PrimeTween — `Tween.UIAnchoredPosition` + `Tween.Alpha` on `CanvasGroup`). Default hide direction is right (off-screen +X), tunable in inspector. +- **`ShapeHolderPresenter`** subscribes to `ShapeBuilderStartedSignal` → `view.Show()` and `ShapeAssembledSignal` → `view.Hide()`. No controller poking the view directly. +- **`IShapePieceFactory`** (`ShapePieceFactory` impl) owns the per-piece dependencies (`ShapeBuilderConfig`, `ISfxPlayer`, `IEventBus`, `IUndoStack`) and the spawn parent (read from `ShapeHolderView.SpawnRoot`). Factory creates one `ShapePiece` MB and runs its `Setup`. Controller calls `factory.Create(prefab, shape, slot, trayPos, preSnapped)` per piece. +- `ShapeBuilderController` only orchestrates: loads piece prefab via `IAssetProviderService`, computes tray positions from `holder.SpawnWidth`, publishes `ShapeBuilderStartedSignal` before spawn, and listens for `PieceSnappedSignal` to count down to `ShapeAssembledSignal`. If `progress.Phase == ShapeBuilding`, pieces in `progress.SnappedPieces` are passed to the factory with `preSnapped: true`. +- `ShapePiece` is a single MB handling all three behaviors inline: drag (Unity UI `IBeginDrag / IDrag / IEndDrag`), reactive preview lerp when within `cfg.PreviewRadius`, snap (PrimeTween — `Tween.UIAnchoredPosition` / `UISizeDelta` / `LocalRotation`) on release inside `cfg.SnapRadius`, otherwise tween back to tray. - Publishes `PieceSnappedSignal(pieceId)` on lock. Controller counts against expected; fires `ShapeAssembledSignal(templateId)` when all locked. ### `Coloring` - Listens to `ShapeAssembledSignal`. -- Spawns one UI `Image` per `ColorRegionDTO` under `GameplaySceneRefs.RegionsParent`. Each region's `Image.alphaHitTestMinimumThreshold = 0.5f` so taps on transparent pixels pass through to the next region below. -- Each region has `IPointerClickHandler`. On click → `ColoringController.PaintRegion(view)`. -- Listens to palette selection (current color held in `ColoringStateRepository`). +- Regions are pre-authored as children of the drawing prefab (under `PaperRoot`). Each is a `ColorRegionView` (UI `Image` + `IPointerClickHandler`). On `Awake`, the view sets `Image.alphaHitTestMinimumThreshold` from a serialized field (default `0.01f`; tune up to `0.5f` for tighter hits) so taps on transparent pixels pass through to the next region below. +- **`ColorPaletteHolderView`** owns the palette container `RectTransform` + slide-in/out animation (same pattern as `ShapeHolderView` — `Tween.UIAnchoredPosition` + `Tween.Alpha` on `CanvasGroup`, hides off-screen right). +- **`ColorPaletteHolderPresenter`** subscribes to `ShapeAssembledSignal` → `view.Show()`. Hide is invoked from scene tear-down or future phase-exit hook. +- **`ColorPaletteView` + `ColorPalettePresenter`** (planned): view spawns one color button per `IColorPalette.Colors` entry under the holder's `SpawnRoot`; presenter wires button click → `ColoringStateRepository.CurrentColor`. +- Each region's `OnPointerClick` → `ColoringController.PaintRegion(view)`. - Controller builds `PaintRegionCommand(regionId, oldColor, newColor)` and pushes to `IUndoStack`. Command sets `Image.color` on Execute/Undo. - Publishes `ColorAppliedSignal` for SFX / sparkle effects. - **Resume:** if `progress.RegionColors` is non-empty, spawned regions are initialized with those saved colors instead of `region.InitialColor`. @@ -1083,7 +1087,7 @@ Drag the scene's installer MonoBehaviours into `sceneModules[]`: Each registers its own classes via `IServiceModule.Register(IContainerBuilder)`. -> If a scope needs a non-installer reference (e.g. a `ColorBookSceneRefs` MB holding camera + roots), expose it as a separate `[SerializeField]` and `builder.RegisterInstance(...)` it inside the scope's `Configure`. Don't put scene refs inside an installer — keep installers stateless across scenes. +> If a scope needs a non-installer reference (e.g. a `GameplaySceneRefs` MB holding `PaperRoot`), expose it as a separate `[SerializeField]` and `builder.RegisterComponent(...)` it inside the scope's `Configure`. Don't put scene refs inside an installer — keep installers stateless across scenes. --- @@ -1114,7 +1118,7 @@ Convention: - `MonoBehaviour` lives on a GameObject under the scope's hierarchy; dragged into the scope's `serviceModules[]` / `sceneModules[]` inspector list. - Method name is `Register`, not `Install`. There is **no `IInstaller`** in this project — uses `IServiceModule` from [Libs.Installers](Assets/Darkmatter/Code/Libs/Installers/IServiceModule.cs). - Registers only its own types. Never touches another feature's types. -- If the installer needs to wire scene-bound MonoBehaviours into DI, expose them as `[SerializeField]` fields on the installer itself and `builder.RegisterInstance(_foo)` them. `ColorBookSceneRefs` (§32.13) is registered this way directly from the scope's serialized field. +- If the installer needs to wire scene-bound MonoBehaviours into DI, expose them as `[SerializeField]` fields on the installer itself and `builder.RegisterComponent(_foo)` them. `GameplaySceneRefs` (§32.13) is registered this way directly from the scope's serialized field. Per-feature holder views (e.g. `ShapeHolderView`, `ColorPaletteHolderView`) are registered the same way from each feature's `IServiceModule`. --- @@ -1372,18 +1376,23 @@ private void SnapInstantly() ### Spawn loop in `ShapeBuilderController.BuildAsync` +The controller no longer parents pieces directly nor knows about `Setup` dependencies. It delegates to `IShapePieceFactory`, which owns the parent (`ShapeHolderView.SpawnRoot`) and the per-piece deps (cfg/sfx/bus/undo). Tray width is read from the holder, not from scene refs. + ```csharp -var preSnappedIds = progress?.snappedPieces; -foreach (var (shape, idx) in template.Pieces.Select((s, i) => (s, i))) +_bus.Publish(new ShapeBuilderStartedSignal(template.Id)); // ShapeHolderPresenter → view.Show() + +int count = template.Pieces.Count; +float trayW = _holder.SpawnWidth; +float pitch = trayW / (count + 1); + +for (int i = 0; i < count; i++) { - var go = Instantiate(_piecePrefab, _refs.TrayPanel); - var piece = go.GetComponent(); + var shape = template.Pieces[i]; var slot = FindSlotForShape(slots, shape); - var trayPos = _trayLayout.GetSlotPosition(idx, template.Pieces.Count); + var trayPos = new Vector2(pitch * (i + 1) - trayW * 0.5f, 0f); var preSnapped = preSnappedIds != null && preSnappedIds.Contains(shape.Id); - piece.Setup(shape, slot, _cfg, _sfx, _bus, trayPos, preSnapped); - _alive.Add(piece); + _factory.Create(_piecePrefab, shape, slot, trayPos, preSnapped); } ``` @@ -1487,8 +1496,8 @@ Toddler-mode error UI: | `AddressableAssetProviderService` | Services | `Services.Assets` | | `NativeGallerySaveService` | Services | `Services.Gallery` | | `CaptureService` | Services | `Services.Capture` | -| `ColoringController`, `ColoringStateRepository`, `ColorRegionView`, `PaintRegionCommand` | Features | `Features.Coloring` | -| `ShapePiece`, `SlotMarker`, `ShapeBuilderController`, `TrayLayout` | Features | `Features.ShapeBuilder` | +| `ColoringController`, `ColoringStateRepository`, `ColorRegionView`, `ColorPaletteHolderView`, `ColorPaletteHolderPresenter`, `PaintRegionCommand` | Features | `Features.Coloring` | +| `ShapePiece`, `SlotMarker`, `ShapeBuilderController`, `IShapePieceFactory`, `ShapePieceFactory`, `ShapeHolderView`, `ShapeHolderPresenter` | Features | `Features.ShapeBuilder` | | `AddressableDrawingTemplateCatalog` | Features | `Features.DrawingTemplate` | | `DrawingCatalogController`, `DrawingCatalogPresenter`, `DrawingCatalogView`, `CatalogItemVM` | Features | `Features.DrawingCatalog` | | `ColorbookFlowController` | Features | `Features.Colorbook` | @@ -1579,11 +1588,11 @@ Comprehensive index — every script (existing or planned) grouped by its module | `Features/DrawingCatalog/Installers/` | `DrawingCatalogFeatureModule` | ✅ | | `Features/DrawingTemplate/Systems/` | `AddressableDrawingTemplateCatalog` | ✅ | | `Features/DrawingTemplate/Installers/` | `DrawingTemplateFeatureModule` | ✅ | -| `Features/ShapeBuilder/UI/` | `ShapePiece`, `SlotMarker` | ✅ | -| `Features/ShapeBuilder/Systems/` | `ShapeBuilderController`, `TrayLayout` | ⚠️ | +| `Features/ShapeBuilder/UI/` | `ShapePiece`, `SlotMarker`, `ShapeHolderView`, `ShapeHolderPresenter` | ✅ | +| `Features/ShapeBuilder/Systems/` | `ShapeBuilderController`, `IShapePieceFactory`, `ShapePieceFactory` | ✅ | | `Features/ShapeBuilder/Installers/` | `ShapeBuilderFeatureModule` | ✅ | -| `Features/Coloring/Systems/` | `ColoringController`, `ColoringStateRepository`, `ColorRegionFactory` | ⚠️ | -| `Features/Coloring/UI/` | `ColorRegionView`, `ColorPaletteView`, `ColorPalettePresenter` | ⚠️ | +| `Features/Coloring/Systems/` | `ColoringController`, `ColoringStateRepository` | ⚠️ planned | +| `Features/Coloring/UI/` | `ColorRegionView` ✅, `ColorPaletteHolderView` ✅, `ColorPaletteHolderPresenter` ✅, `ColorPaletteView` ⚠️, `ColorPalettePresenter` ⚠️ | | | `Features/Coloring/Commands/` | `PaintRegionCommand` | ⚠️ | | `Features/Coloring/Installers/` | `ColoringFeatureModule` | ⚠️ | | `Features/Capture/Systems/` | `CaptureController` (light wrapper around `ICaptureService`) | ⚠️ | @@ -1604,7 +1613,7 @@ Comprehensive index — every script (existing or planned) grouped by its module | `App/LifetimeScopes/` | `GameLifetimeScope` (placeholder, empty), `GameplayLifetimescope` (typo — needs rename to `GameplayLifetimeScope`) | ⚠️ | | `App/LifetimeScopes/` | `MainMenuLifetimeScope`, `ColorbookLifetimeScope`, `GameplayLifetimeScope` (final) | ⚠️ planned | | `App/Boot/` | `AppBoot` | ⚠️ planned | -| `App/SceneRefs/` | `GameplaySceneRefs` (PaperRoot, SlotsParent, PiecesParent, RegionsParent, TrayPanel, CaptureCamera) | ⚠️ planned | +| `Features/GameplayFlow/SceneRefs/` | `GameplaySceneRefs` (PaperRoot only — per-feature containers moved to holder views) | ✅ | --- @@ -1689,7 +1698,7 @@ public interface ICaptureService { #### Removed contracts -- `IPaperRig`, `IArtInputBridge`, `IPaperSurface` — paper is just RectTransforms in the scene now, exposed via `ColorBookSceneRefs`. No contract. +- `IPaperRig`, `IArtInputBridge`, `IPaperSurface` — paper is just RectTransforms in the scene now, exposed via `GameplaySceneRefs.PaperRoot`. No contract. - `SavedArtworkDTO`, `IGalleryService.ListAsync/LoadFullAsync/LoadThumbnailAsync/DeleteAsync/GetLatestThumbnailAsync` — no app-side gallery store. - `ArtworkCapturedSignal`, `ArtworkSavedSignal` — replaced by `PaperCapturedSignal` / `PaperSavedSignal` (templateId only, no DTO). @@ -2018,53 +2027,59 @@ public sealed class ShapeBuilderConfig : ScriptableObject } ``` -#### `ShapeBuilderController` *(Systems — planned)* -Spawns pieces for the selected template, tracks snap progress, fires `ShapeAssembledSignal` when complete. **Replaces the old `ShapePieceFactory` — spawning is now a 5-line inline loop, not a separate class.** +#### `ShapeBuilderController` *(Systems — ✅ exists)* +Orchestrates per-template build: loads piece prefab, instantiates drawing layout under `PaperRoot`, computes tray positions from `ShapeHolderView.SpawnWidth`, publishes `ShapeBuilderStartedSignal`, delegates per-piece spawn to `IShapePieceFactory`. Subscribes to `PieceSnappedSignal` and fires `ShapeAssembledSignal` when count matches expected. ```csharp -// fields: IDrawingTemplateCatalog _catalog, IAssetProviderService _assets, -// GameplaySceneRefs _refs, TrayLayout _trayLayout, -// ShapeBuilderConfig _cfg, ISfxPlayer _sfx, IEventBus _bus -public sealed class ShapeBuilderController : IAsyncStartable, IDisposable +// fields: IEventBus _bus, IAssetProviderService _assetProviderService, +// IShapePieceFactory _factory, ShapeHolderView _holder, IGameplaySceneRefs _refs +public sealed class ShapeBuilderController : IShapeBuilderController, IDisposable { - private readonly List _alive = new(); private GameObject _piecePrefab; - public async UniTask StartAsync(CancellationToken ct) { - _piecePrefab = await _assets.LoadAssetAsync( - "shapebuilder/piece", null, ct); - _pieceSnappedSub = _bus.Subscribe(OnPieceSnapped); - } - - public IReadOnlyList Alive => _alive; - public IReadOnlyCollection GetSnappedPieceIds(); // for save records + public async UniTask InitializeAsync(CancellationToken ct); // load prefab + subscribe + public IReadOnlyCollection GetSnappedPieceIds(); // for save records public async UniTask BuildAsync( IDrawingTemplate template, - IReadOnlyCollection preSnappedIds = null); + IReadOnlyCollection preSnappedIds, + CancellationToken ct = default); - public void Reset(); // despawns all pieces; called by GameplayFlowController on Teardown + public void Clear(); // destroys current drawing instance + resets counters } // sub: PieceSnappedSignal -// pub: ShapeAssembledSignal +// pub: ShapeBuilderStartedSignal (before spawn), ShapeAssembledSignal (when all locked) ``` - **Slot discovery:** after the per-drawing prefab is instantiated, `GetComponentsInChildren(includeInactive: true)` finds all slots. Each slot's `_shape` tells which `ShapeSO` it expects. -- **Pre-snap on resume:** if `preSnappedIds.Contains(shape.Id)`, the spawned `ShapePiece` is initialized with `preSnapped: true` → `SnapInstantly()` lands it in the slot at scope start. -- **Snapped count:** subscribes to `PieceSnappedSignal`, counts against expected, fires `ShapeAssembledSignal` when count == `template.Pieces.Count`. +- **Pre-snap on resume:** if `preSnappedIds.Contains(shape.Id)`, the factory is called with `preSnapped: true` → `ShapePiece.SnapInstantly()` lands it in the slot at scope start. +- **Tray width source:** read from `_holder.SpawnWidth` — the controller never touches `_refs` for HUD geometry. -#### `TrayLayout` *(Systems — planned)* -Tiny stateless helper. Given (`index`, `total`), returns the tray slot's `anchoredPosition`. Either uses a `HorizontalLayoutGroup`'s computed positions or a hand-rolled even spacing across the tray's width. +#### `IShapePieceFactory` / `ShapePieceFactory` *(Systems — ✅ exists)* +Encapsulates piece instantiation. Owns the parent (from `ShapeHolderView.SpawnRoot`) and the per-piece deps so the controller stays focused on flow. ```csharp -public sealed class TrayLayout -{ - [SerializeField] private RectTransform trayRect; - public Vector2 GetSlotPosition(int index, int total); +public interface IShapePieceFactory { + ShapePiece Create(GameObject prefab, ShapeSO shape, SlotMarker slot, Vector2 trayPos, bool preSnapped); +} + +// fields: ShapeHolderView _holder, ShapeBuilderConfig _cfg, ISfxPlayer _sfx, IEventBus _bus, IUndoStack _undo +public sealed class ShapePieceFactory : IShapePieceFactory { + public ShapePiece Create(GameObject prefab, ShapeSO shape, SlotMarker slot, Vector2 trayPos, bool preSnapped) { + var go = Object.Instantiate(prefab, _holder.SpawnRoot); + var piece = go.GetComponent(); + piece.Setup(shape, slot, _cfg, _sfx, _bus, _undo, trayPos, preSnapped); + return piece; + } } ``` +#### `ShapeHolderView` / `ShapeHolderPresenter` *(UI — ✅ exists)* +View owns the tray container `RectTransform` (`SpawnRoot`) and a PrimeTween `Sequence` driving slide + alpha on a `CanvasGroup`. Default hide direction is `+X = 1500` (slide right off-screen), tunable per inspector. Public: `SpawnRoot`, `SpawnWidth`, `Show()`, `Hide()`, `HideInstant()`. Presenter is an `IStartable, IDisposable`: +- On `Start`: `view.HideInstant()`, subscribe `ShapeBuilderStartedSignal` → `Show`, subscribe `ShapeAssembledSignal` → `Hide`. +- On `Dispose`: dispose subscriptions. + #### Removed / not needed +- **`TrayLayout`** — was a stateless tray-position helper. Tray positions are now computed inline from `holder.SpawnWidth` (~3 lines). - **`ShapePieceFsm`** — was a per-piece state machine. Replaced by inline drag handlers + a single `_locked` bool on `ShapePiece`. -- **`ShapePieceFactory`** — was a wrapper around `Instantiate` + FSM wiring. Replaced by a 5-line inline loop in `ShapeBuilderController.BuildAsync`. - **Five state classes** (`InTray`, `Dragging`, `Preview`, `Snapped`, `Returning`) — gone. Their behavior maps to: `_locked = false` (idle/dragging/preview all share the same handlers), `_inPreview` flag (preview boundary detection), `Snap()` method, `ReturnToTray()` method. - **`ShapeBuilderInputBinder`** — never needed; UI handlers on the piece are sufficient. @@ -2087,15 +2102,15 @@ public sealed class ColoringStateRepository { ``` - **Why a repository:** presenter and controller both need to read/write current color; an event-emitting POCO is simpler than wiring two signals. -#### `ColoringController` *(Systems)* — implements `IColoringController` -Builds and pushes `PaintRegionCommand` instances; spawns `ColorRegionView` per region. +#### `ColoringController` *(Systems — planned)* — implements `IColoringController` +Wires pre-authored `ColorRegionView` children, applies saved colors on resume, builds and pushes `PaintRegionCommand` instances on click. ```csharp -// fields: IUndoStack _undo, ColoringStateRepository _state, ColorRegionFactory _factory, -// GameplaySceneRefs _refs, IEventBus _bus +// fields: IUndoStack _undo, ColoringStateRepository _state, IGameplaySceneRefs _refs, IEventBus _bus public interface IColoringController { - // Spawn regions on the paper. Pass non-null savedColors to restore colors - // from a DrawingProgress record; null = use ColorRegionDTO.InitialColor. - UniTask SpawnRegionsAsync( + // Initialize regions on the paper after the drawing prefab is instantiated. + // Pass non-null savedColors to restore colors from a DrawingProgress record; + // null = use ColorRegionDTO.InitialColor. + UniTask InitializeRegionsAsync( IDrawingTemplate template, IReadOnlyDictionary savedColors = null); @@ -2104,39 +2119,52 @@ public interface IColoringController { // Snapshot current paint state for save records (see §13). IReadOnlyDictionary GetCurrentColors(); - void Clear(); // despawn all regions + void Clear(); // detach handlers } // sub: ShapeAssembledSignal (via flow controller, not direct) // pub: ColorAppliedSignal (via PaintRegionCommand) ``` -Spawns each region as a UI `Image` under `_refs.RegionsParent`. No `Physics2D`. +Regions are pre-authored as children of the drawing prefab (parented under `PaperRoot`) — the controller does not spawn them. Each `ColorRegionView` sets its own `Image.alphaHitTestMinimumThreshold` in `Awake`; the controller subscribes to each view's click event and routes to `PaintRegion`. No `Physics2D`. **Autosave integration:** after each successful `PaintRegion`, the controller calls a debounced `GameplayFlowController.ScheduleAutosave()` so the flow can write the new color state to `IProgressionSystem` 500 ms later (no thumbnail, cheap). The flow controller cancels and resets the timer on each paint — only the last paint in a burst triggers the write. -#### `ColorRegionView : MonoBehaviour, IPointerClickHandler` *(UI)* +#### `ColorRegionView : MonoBehaviour, IPointerClickHandler` *(UI — ✅ exists)* UI Image with alpha-based hit detection. Tap routes through Unity's EventSystem directly to `OnPointerClick`. ```csharp +[RequireComponent(typeof(Image))] public sealed class ColorRegionView : MonoBehaviour, IPointerClickHandler { - public string RegionId { get; } + [field: SerializeField] public string RegionId { get; private set; } + [SerializeField, Range(0f, 1f)] private float alphaHitThreshold = 0.01f; public Color Color => _image.color; - public void Initialize(ColorRegionDTO dto, IColoringController controller); - public void SetColor(Color c); // setter only; no logic - public void OnPointerClick(PointerEventData e) => _controller.PaintRegion(this); + + private void Awake() { + _image = GetComponent(); + _image.alphaHitTestMinimumThreshold = alphaHitThreshold; // pass-through transparent pixels + } + + public void Initialize(string id, Color color); + public void SetColor(Color color); + public void OnPointerClick(PointerEventData e); // routes to ColoringController.PaintRegion(this) } ``` -- **Required sprite setup:** sprite import inspector → **Read/Write Enabled = on**, **Generate Physics Shape = off** (not needed). `Image.alphaHitTestMinimumThreshold = 0.5f` on Initialize so taps on transparent pixels pass through to the next region below. -- **Sibling order matters** for stacked regions — top sibling gets first crack at the click; with alpha hit-test, transparent areas defer correctly. +- **Required sprite import:** **Read/Write Enabled = on**, **Mesh Type = Full Rect**, keep alpha channel (RGBA32 or Automatic-with-alpha). Without these, Unity throws `UnityException: Texture is not readable` on first hover/click. +- **Threshold tuning:** default `0.01f` is very permissive (any non-fully-transparent pixel counts). Raise toward `0.5f` for tighter hits when regions overlap visually. +- **Sibling order matters** for stacked regions — top sibling gets first crack at the click; with alpha hit-test, transparent areas defer correctly to siblings below. -No `ColoringInputBinder` class needed. Unity's EventSystem fires `OnPointerClick` on the topmost UI element under the pointer that consumes it — exactly what we want. +No `ColoringInputBinder` class needed. Unity's EventSystem fires `OnPointerClick` on the topmost UI element under the pointer whose `Image.alphaHitTestMinimumThreshold` is met. #### `PaintRegionCommand` *(Commands)* Source in section 23. Holds `view`, `fromColor`, `toColor`, `bus`. Symmetrical execute/undo. -#### `ColorPaletteView`, `ColorPalettePresenter` *(UI)* -Sources in section 25. Presenter binds `ColoringStateRepository.SelectedIndexChanged` ↔ `IColorPaletteView`. +#### `ColorPaletteView`, `ColorPalettePresenter` *(UI — stubs exist)* +Files exist but bodies are empty. Target shape: view spawns one color button per `IColorPalette.Colors` entry under `ColorPaletteHolderView.SpawnRoot`; presenter binds `ColoringStateRepository.SelectedIndexChanged` ↔ view highlight, and view click events → repository. -#### `ColorRegionFactory` *(Systems)* -Mirror of `ShapePieceFactory` for regions. Pool-friendly. +#### `ColorPaletteHolderView` / `ColorPaletteHolderPresenter` *(UI — ✅ exists)* +View owns the palette container `RectTransform` (`SpawnRoot`) + slide/fade show-hide animation (same `Tween.UIAnchoredPosition` + `Tween.Alpha` pattern as `ShapeHolderView`, default hide off-screen right). Presenter subscribes `ShapeAssembledSignal` → `view.Show()`. Hide is invoked externally (scope tear-down or future phase-exit signal). + +#### Removed / not needed + +- **`ColorRegionFactory`** — regions are pre-authored as children of the drawing prefab. The controller wires existing views; it doesn't spawn anything. --- @@ -2219,7 +2247,7 @@ Pure in-memory holder used by the service. Separated so tests can inspect state // IColoringController _coloring // CaptureController _capture // IProgressionService _progression -// ColorBookSceneRefs _refs (panel roots to enable/disable) +// IGameplaySceneRefs _refs (PaperRoot only — panel show/hide owned by holder views) // Fsm _fsm ``` - **State table:** @@ -2250,7 +2278,7 @@ public sealed class AppBoot : IAsyncStartable { #### LifetimeScopes - `RootLifetimeScope` — ✅ exists ([source](Assets/Darkmatter/Code/App/LifetimeScopes/RootLifetimeScope.cs)). Iterates a serialized `MonoBehaviour[] serviceModules` and calls `Register` on each `IServiceModule`. Persists for app lifetime. - `MainMenuLifetimeScope` — planned. Same pattern as Root (serialized installer list, no hardcoded registrations). -- `ColorBookLifetimeScope` — planned. Same pattern; installer list includes feature installers + the flow controller installer. Also has a `[SerializeField] ColorBookSceneRefs _sceneRefs;` and registers it via `builder.RegisterInstance(_sceneRefs)`. +- `GameplayLifetimeScope` — planned. Same pattern; installer list includes feature installers + the flow controller installer. Also has a `[SerializeField] GameplaySceneRefs _sceneRefs;` and registers it via `builder.RegisterComponent(_sceneRefs)`. All scope classes are thin: a serialized installer-MonoBehaviour list (+ optional scene refs as separate fields) and a `Configure(IContainerBuilder)` that iterates and calls `Register`. @@ -2258,23 +2286,38 @@ All scope classes are thin: a serialized installer-MonoBehaviour list (+ optiona ### 32.13 Cross-cutting types -#### `ColorBookSceneRefs : MonoBehaviour` *(App — planned)* -The single source of scene-bound Unity references for the ColorBook scene. Registered in `ColorBookLifetimeScope` via `builder.RegisterInstance(_sceneRefs)` so features don't `Find` things. +#### `GameplaySceneRefs : MonoBehaviour, IGameplaySceneRefs` *(Features/GameplayFlow/SceneRefs — ✅ exists)* +Single source of the one cross-feature scene anchor (`PaperRoot`). Per-feature UI containers (tray, palette) live on their own holder views — see §32.X. Registered in `GameplayLifetimeScope` via `builder.RegisterComponent(_sceneRefs)`. ```csharp -public sealed class ColorBookSceneRefs : MonoBehaviour { - public RectTransform PaperRoot; - public RectTransform SlotsParent; - public RectTransform PiecesParent; - public RectTransform RegionsParent; - public RectTransform HudRoot; - public RectTransform TrayPanel; - public Camera CaptureCamera; // disabled — used by ICaptureService - public ColorPaletteView PaletteView; // optional inline ref - public HistoryButtonsView HistoryButtons; +public sealed class GameplaySceneRefs : MonoBehaviour, IGameplaySceneRefs { + [SerializeField] private RectTransform paperRoot; + public RectTransform PaperRoot => paperRoot; } ``` -Replaces the dropped `IPaperSurface` contract — features that need a paper-area RectTransform read it off this MB. + +Replaces the dropped `IPaperSurface` contract. The drawing prefab (with `SlotMarker` + `ColorRegionView` children) is instantiated under `PaperRoot`; the `CaptureCamera` will live on its own scene MB owned by the Capture feature. + +#### `ShapeHolderView : MonoBehaviour` + `ShapeHolderPresenter` *(Features/ShapeBuilder/UI — ✅ exists)* +Owns the tray container `RectTransform` (`SpawnRoot`) and the slide/fade show/hide animation (PrimeTween — `Tween.UIAnchoredPosition` + `Tween.Alpha` on `CanvasGroup`). Default hide offset is `+1500` on X (slide right off-screen), tunable per inspector. Exposes `SpawnRoot`, `SpawnWidth`, `Show()`, `Hide()`, `HideInstant()`. Presenter is an `IStartable` that subscribes: +- `ShapeBuilderStartedSignal` → `view.Show()` +- `ShapeAssembledSignal` → `view.Hide()` + +Registered in `ShapeBuilderFeatureModule` via `builder.RegisterComponent(holderView)` + `builder.RegisterEntryPoint().WithParameter(holderView)`. + +#### `ColorPaletteHolderView : MonoBehaviour` + `ColorPaletteHolderPresenter` *(Features/Coloring/UI — ✅ exists)* +Same pattern as `ShapeHolderView` — owns the palette container `RectTransform` (`SpawnRoot`) and slide/fade animation. Presenter subscribes to `ShapeAssembledSignal` → `view.Show()`. Hide is invoked externally (scope tear-down or future phase-exit signal). Registered analogously in `ColoringFeatureModule`. + +#### `IShapePieceFactory` / `ShapePieceFactory` *(Features/ShapeBuilder/Systems — ✅ exists)* +Encapsulates piece instantiation. Owns the per-piece dependencies and the spawn parent so the controller stays focused on flow. +```csharp +public interface IShapePieceFactory { + ShapePiece Create(GameObject prefab, ShapeSO shape, SlotMarker slot, Vector2 trayPos, bool preSnapped); +} + +// fields: ShapeHolderView _holder, ShapeBuilderConfig _cfg, ISfxPlayer _sfx, IEventBus _bus, IUndoStack _undo +public sealed class ShapePieceFactory : IShapePieceFactory { /* Instantiate under _holder.SpawnRoot, run piece.Setup(...) */ } +``` #### `IServiceModule` *(Libs/Installers — ✅ exists)* ```csharp @@ -2307,10 +2350,12 @@ Implemented as `MonoBehaviour` per feature/service so scopes can drag them in th | `ShapeBuilderConfig` | Core asset | Tunables (radii, durations, curve) | — | | `ShapePiece` | Feature.ShapeBuilder | Draggable piece MB (drag + preview lerp + snap + return) | shape, slot, cfg, sfx, bus | | `SlotMarker` | Feature.ShapeBuilder | Slot anchor MB; `RectTransform` == target pose | — | -| `ShapeBuilderController` | Feature.ShapeBuilder | Spawns pieces, tracks snap count | catalog, assets, refs, tray, cfg, sfx, bus | -| `TrayLayout` | Feature.ShapeBuilder | Computes piece tray positions | — | +| `ShapeBuilderController` | Feature.ShapeBuilder | Orchestrates per-template build, delegates spawn to factory, tracks snap count | bus, assets, factory, holder, refs | +| `IShapePieceFactory` / `ShapePieceFactory` | Feature.ShapeBuilder | Instantiates a `ShapePiece` under `ShapeHolderView.SpawnRoot` + runs `Setup` | holder, cfg, sfx, bus, undo | +| `ShapeHolderView` / `ShapeHolderPresenter` | Feature.ShapeBuilder | Tray container + slide/fade show/hide; presenter reacts to `ShapeBuilderStartedSignal` / `ShapeAssembledSignal` | bus | | `ColoringStateRepository` | Feature.Coloring | Current color model | — | -| `ColoringController` | Feature.Coloring | Region spawn + paint cmd + autosave hook | undo, state, factory, refs, flow, bus | +| `ColoringController` | Feature.Coloring | Wires pre-authored regions + paint cmd + autosave hook | undo, state, refs, flow, bus | +| `ColorPaletteHolderView` / `ColorPaletteHolderPresenter` | Feature.Coloring | Palette container + slide/fade show/hide; presenter reacts to `ShapeAssembledSignal` | bus | | `ColorRegionView` | Feature.Coloring | Region UI Image + `IPointerClickHandler` | controller | | `PaintRegionCommand` | Feature.Coloring | Undoable paint (sets `Image.color`) | view, bus | | `HistoryController` | Feature.History | Undo/redo facade | undo stack, bus | From b3c096a15023e4dd9c702a19b750361bafcf454e Mon Sep 17 00:00:00 2001 From: Savya Bikram Shah Date: Thu, 28 May 2026 19:45:15 +0545 Subject: [PATCH 2/2] Game flow and coloring done --- .../Features/Coloring/IColoringController.cs | 17 ++ .../Coloring/IColoringController.cs.meta | 3 + .../DrawingCatalog/IDrawingTemplate.cs | 4 +- .../GameplayFlow/IGameplayFlowController.cs | 12 + .../IGameplayFlowController.cs.meta | 2 + .../Contracts/Features/History/IUndoStack.cs | 6 +- .../Progression/IProgressionSystem.cs | 3 + .../Features/Coloring/ColorRegionDTO.cs | 11 +- .../Progression/ProgressionRootDto.cs | 3 +- .../DrawingTemplate/DrawingTemplateSO.cs | 4 +- .../ShapeBuilder/ShapeBuilderConfig.cs | 1 - .../Code/Core/Enums/Services/Audio/SfxId.cs | 1 + .../ColorbookFlow/Features.Colorbook.asmdef | 7 +- .../System/ColorbookFlowController.cs | 44 +++- .../Coloring/Commands/ColorRegionCommand.cs | 22 ++ .../Commands/ColorRegionCommand.cs.meta | 3 + .../Installers/ColoringFeatureModule.cs | 8 +- .../Coloring/Systems/ColorButtonFactory.cs | 30 +++ .../Systems/ColorButtonFactory.cs.meta | 3 + .../Coloring/Systems/ColoringController.cs | 146 +++++++++++ .../Systems/ColoringController.cs.meta | 3 + .../Systems/ColoringStateRepository.cs | 33 +++ .../Systems/ColoringStateRepository.cs.meta | 3 + .../Coloring/Systems/IColorButtonFactory.cs | 9 + .../Systems/IColorButtonFactory.cs.meta | 3 + .../Code/Features/Coloring/UI/ColorButton.cs | 54 ++++ .../Features/Coloring/UI/ColorButton.cs.meta | 3 + .../Coloring/UI/ColorPalettePresenter.cs | 19 -- .../Coloring/UI/ColorPalettePresenter.cs.meta | 2 - .../Features/Coloring/UI/ColorPaletteView.cs | 8 - .../Coloring/UI/ColorPaletteView.cs.meta | 3 - .../Features/Coloring/UI/ColorRegionView.cs | 13 +- .../GameplayFlow/Features.GameplayFlow.asmdef | 8 +- .../Installers/GameplayFlowFeatureModule.cs | 7 +- .../Code/Features/GameplayFlow/Systems.meta | 8 + .../Systems/GameplayFlowController.cs | 230 ++++++++++++++++++ .../Systems/GameplayFlowController.cs.meta | 2 + .../Code/Features/History/Stack/UndoStack.cs | 15 ++ .../Systems/ProgressionRepository.cs | 11 + .../Progression/Systems/ProgressionSystem.cs | 4 + .../ShapeBuilder/Commands/SnapPieceCommand.cs | 2 +- .../Systems/IShapePieceFactory.cs | 2 +- .../Systems/ShapeBuilderController.cs | 40 ++- .../ShapeBuilder/Systems/ShapePieceFactory.cs | 4 +- .../Features/ShapeBuilder/UI/ShapePiece.cs | 14 +- Assets/Darkmatter/Scenes/GamePlay.unity | 7 +- Readme.docx | Bin 77646 -> 84334 bytes Readme.md | 151 +++++++----- 48 files changed, 850 insertions(+), 138 deletions(-) create mode 100644 Assets/Darkmatter/Code/Core/Contracts/Features/Coloring/IColoringController.cs create mode 100644 Assets/Darkmatter/Code/Core/Contracts/Features/Coloring/IColoringController.cs.meta create mode 100644 Assets/Darkmatter/Code/Core/Contracts/Features/GameplayFlow/IGameplayFlowController.cs create mode 100644 Assets/Darkmatter/Code/Core/Contracts/Features/GameplayFlow/IGameplayFlowController.cs.meta create mode 100644 Assets/Darkmatter/Code/Features/Coloring/Commands/ColorRegionCommand.cs create mode 100644 Assets/Darkmatter/Code/Features/Coloring/Commands/ColorRegionCommand.cs.meta create mode 100644 Assets/Darkmatter/Code/Features/Coloring/Systems/ColorButtonFactory.cs create mode 100644 Assets/Darkmatter/Code/Features/Coloring/Systems/ColorButtonFactory.cs.meta create mode 100644 Assets/Darkmatter/Code/Features/Coloring/Systems/ColoringController.cs create mode 100644 Assets/Darkmatter/Code/Features/Coloring/Systems/ColoringController.cs.meta create mode 100644 Assets/Darkmatter/Code/Features/Coloring/Systems/ColoringStateRepository.cs create mode 100644 Assets/Darkmatter/Code/Features/Coloring/Systems/ColoringStateRepository.cs.meta create mode 100644 Assets/Darkmatter/Code/Features/Coloring/Systems/IColorButtonFactory.cs create mode 100644 Assets/Darkmatter/Code/Features/Coloring/Systems/IColorButtonFactory.cs.meta create mode 100644 Assets/Darkmatter/Code/Features/Coloring/UI/ColorButton.cs create mode 100644 Assets/Darkmatter/Code/Features/Coloring/UI/ColorButton.cs.meta delete mode 100644 Assets/Darkmatter/Code/Features/Coloring/UI/ColorPalettePresenter.cs delete mode 100644 Assets/Darkmatter/Code/Features/Coloring/UI/ColorPalettePresenter.cs.meta delete mode 100644 Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteView.cs delete mode 100644 Assets/Darkmatter/Code/Features/Coloring/UI/ColorPaletteView.cs.meta create mode 100644 Assets/Darkmatter/Code/Features/GameplayFlow/Systems.meta create mode 100644 Assets/Darkmatter/Code/Features/GameplayFlow/Systems/GameplayFlowController.cs create mode 100644 Assets/Darkmatter/Code/Features/GameplayFlow/Systems/GameplayFlowController.cs.meta diff --git a/Assets/Darkmatter/Code/Core/Contracts/Features/Coloring/IColoringController.cs b/Assets/Darkmatter/Code/Core/Contracts/Features/Coloring/IColoringController.cs new file mode 100644 index 0000000..95d990a --- /dev/null +++ b/Assets/Darkmatter/Code/Core/Contracts/Features/Coloring/IColoringController.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; +using System.Threading; +using Cysharp.Threading.Tasks; +using Darkmatter.Core.Contracts.Features.DrawingCatalog; +using UnityEngine; + +namespace Darkmatter.Core.Contracts.Features.Coloring; + +public interface IColoringController +{ + UniTask InitializeRegionsAsync(IDrawingTemplate template, IReadOnlyDictionary savedColors, + CancellationToken ct); + + void PaintRegion(string regionId, Color color); + IReadOnlyDictionary GetCurrentColors(); + void Clear(); +} \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Core/Contracts/Features/Coloring/IColoringController.cs.meta b/Assets/Darkmatter/Code/Core/Contracts/Features/Coloring/IColoringController.cs.meta new file mode 100644 index 0000000..336851a --- /dev/null +++ b/Assets/Darkmatter/Code/Core/Contracts/Features/Coloring/IColoringController.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b5ba5a7108234751ac286a57795fac06 +timeCreated: 1779971202 \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Core/Contracts/Features/DrawingCatalog/IDrawingTemplate.cs b/Assets/Darkmatter/Code/Core/Contracts/Features/DrawingCatalog/IDrawingTemplate.cs index 9e997a5..176dd47 100644 --- a/Assets/Darkmatter/Code/Core/Contracts/Features/DrawingCatalog/IDrawingTemplate.cs +++ b/Assets/Darkmatter/Code/Core/Contracts/Features/DrawingCatalog/IDrawingTemplate.cs @@ -10,8 +10,10 @@ namespace Darkmatter.Core.Contracts.Features.DrawingCatalog string Id { get; } string DisplayName { get; } Sprite DefaultThumbnail { get; } - GameObject Prefab { get; } + GameObject DrawingPrefab { get; } + GameObject ColoringPrefab { get; } IReadOnlyList Pieces { get; } IReadOnlyList Regions { get; } + string ColorPaletteId { get; } } } \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Core/Contracts/Features/GameplayFlow/IGameplayFlowController.cs b/Assets/Darkmatter/Code/Core/Contracts/Features/GameplayFlow/IGameplayFlowController.cs new file mode 100644 index 0000000..ef900f0 --- /dev/null +++ b/Assets/Darkmatter/Code/Core/Contracts/Features/GameplayFlow/IGameplayFlowController.cs @@ -0,0 +1,12 @@ +using Cysharp.Threading.Tasks; + +namespace Darkmatter.Core.Contracts.Features.GameplayFlow +{ + public interface IGameplayFlowController + { + UniTask BackAsync(); + UniTask SaveAsync(); + UniTask NextAsync(); + void OnApplicationPaused(); + } +} diff --git a/Assets/Darkmatter/Code/Core/Contracts/Features/GameplayFlow/IGameplayFlowController.cs.meta b/Assets/Darkmatter/Code/Core/Contracts/Features/GameplayFlow/IGameplayFlowController.cs.meta new file mode 100644 index 0000000..2b93b46 --- /dev/null +++ b/Assets/Darkmatter/Code/Core/Contracts/Features/GameplayFlow/IGameplayFlowController.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: fee5907f5643d492ab8ba177f84c30f6 \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Core/Contracts/Features/History/IUndoStack.cs b/Assets/Darkmatter/Code/Core/Contracts/Features/History/IUndoStack.cs index 196ea7c..1891c27 100644 --- a/Assets/Darkmatter/Code/Core/Contracts/Features/History/IUndoStack.cs +++ b/Assets/Darkmatter/Code/Core/Contracts/Features/History/IUndoStack.cs @@ -7,9 +7,11 @@ namespace Darkmatter.Core.Contracts.Features.History event Action OnStackChanged; bool CanUndo { get; } bool CanRedo { get; } - void Push(ICommand cmd); // executes + appends + void Push(ICommand cmd); + void Append(ICommand cmd); void Undo(); void Redo(); - void Clear(); + void Clear(); // reverts every command via Undo, then drops (user-facing "wipe" semantics) + void Drop(); // drops the list without reverting (controller cleanup — avoids touching destroyed views) } } \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Core/Contracts/Features/Progression/IProgressionSystem.cs b/Assets/Darkmatter/Code/Core/Contracts/Features/Progression/IProgressionSystem.cs index 9ba76a5..e22f21e 100644 --- a/Assets/Darkmatter/Code/Core/Contracts/Features/Progression/IProgressionSystem.cs +++ b/Assets/Darkmatter/Code/Core/Contracts/Features/Progression/IProgressionSystem.cs @@ -12,6 +12,9 @@ namespace Darkmatter.Core.Contracts.Features.Progression IReadOnlyCollection CompletedTemplateIds { get; } void MarkCompleted(string templateId); + string LastOpenedTemplateId { get; } + UniTask SetLastOpenedAsync(string templateId); + DrawingProgress? GetProgress(string templateId); UniTask SaveProgressAsync(DrawingProgress progress); UniTask SaveProgressAsync(DrawingProgress progress, byte[] thumbnailPng); diff --git a/Assets/Darkmatter/Code/Core/Data/Dynamic/Features/Coloring/ColorRegionDTO.cs b/Assets/Darkmatter/Code/Core/Data/Dynamic/Features/Coloring/ColorRegionDTO.cs index 94a4d91..ee882bf 100644 --- a/Assets/Darkmatter/Code/Core/Data/Dynamic/Features/Coloring/ColorRegionDTO.cs +++ b/Assets/Darkmatter/Code/Core/Data/Dynamic/Features/Coloring/ColorRegionDTO.cs @@ -1,18 +1,19 @@ using UnityEngine; +using UnityEngine.UI; namespace Darkmatter.Core.Data.Dynamic.Features.Coloring { public readonly struct ColorRegionDTO { - public string RegionId { get; } - public Sprite Sprite { get; } + public string Id { get; } + public Image Image { get; } public Vector2 AnchoredPosition { get; } public Color InitialColor { get; } - public ColorRegionDTO(string regionId, Sprite sprite, Vector2 anchoredPosition, Color initialColor) + public ColorRegionDTO(string id, Image image, Vector2 anchoredPosition, Color initialColor) { - RegionId = regionId; - Sprite = sprite; + Id = id; + Image = image; AnchoredPosition = anchoredPosition; InitialColor = initialColor; } diff --git a/Assets/Darkmatter/Code/Core/Data/Dynamic/Features/Progression/ProgressionRootDto.cs b/Assets/Darkmatter/Code/Core/Data/Dynamic/Features/Progression/ProgressionRootDto.cs index d01aad4..18fb3f2 100644 --- a/Assets/Darkmatter/Code/Core/Data/Dynamic/Features/Progression/ProgressionRootDto.cs +++ b/Assets/Darkmatter/Code/Core/Data/Dynamic/Features/Progression/ProgressionRootDto.cs @@ -7,5 +7,6 @@ namespace Darkmatter.Core.Data.Dynamic.Features.Progression public struct ProgressionRootDto { public List records; + public string lastOpenedTemplateId; } -} \ No newline at end of file +} diff --git a/Assets/Darkmatter/Code/Core/Data/Static/Features/DrawingTemplate/DrawingTemplateSO.cs b/Assets/Darkmatter/Code/Core/Data/Static/Features/DrawingTemplate/DrawingTemplateSO.cs index 9e10add..0ea022b 100644 --- a/Assets/Darkmatter/Code/Core/Data/Static/Features/DrawingTemplate/DrawingTemplateSO.cs +++ b/Assets/Darkmatter/Code/Core/Data/Static/Features/DrawingTemplate/DrawingTemplateSO.cs @@ -12,8 +12,10 @@ namespace Darkmatter.Core.Data.Static.Features.DrawingTemplate [field: SerializeField] public string Id { get; private set; } [field: SerializeField] public string DisplayName { get; private set; } [field: SerializeField] public Sprite DefaultThumbnail { get; private set; } - [field: SerializeField] public GameObject Prefab { get; private set; } + [field: SerializeField] public GameObject DrawingPrefab { get; private set; } + [field: SerializeField] public GameObject ColoringPrefab { get; private set; } [field: SerializeField] public IReadOnlyList Pieces { get; private set; } [field: SerializeField] public IReadOnlyList Regions { get; private set; } + [field: SerializeField] public string ColorPaletteId { get; private set; } = "defaultPalette"; } } \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Core/Data/Static/Features/ShapeBuilder/ShapeBuilderConfig.cs b/Assets/Darkmatter/Code/Core/Data/Static/Features/ShapeBuilder/ShapeBuilderConfig.cs index 37948e8..5bc1267 100644 --- a/Assets/Darkmatter/Code/Core/Data/Static/Features/ShapeBuilder/ShapeBuilderConfig.cs +++ b/Assets/Darkmatter/Code/Core/Data/Static/Features/ShapeBuilder/ShapeBuilderConfig.cs @@ -8,7 +8,6 @@ namespace Darkmatter.Core.Data.Static.Features.ShapeBuilder { [Header("Radii (canvas units; reference resolution 2048x2048)")] [SerializeField] private float snapRadius = 100f; - [SerializeField] private float snapGraceMultiplier = 1.5f; [SerializeField] private float previewRadius = 200f; [Header("Tween durations (seconds)")] diff --git a/Assets/Darkmatter/Code/Core/Enums/Services/Audio/SfxId.cs b/Assets/Darkmatter/Code/Core/Enums/Services/Audio/SfxId.cs index 9863533..e0de386 100644 --- a/Assets/Darkmatter/Code/Core/Enums/Services/Audio/SfxId.cs +++ b/Assets/Darkmatter/Code/Core/Enums/Services/Audio/SfxId.cs @@ -6,5 +6,6 @@ namespace Darkmatter.Core.Enums.Services.Audio ShapeHover = 100, ShapeSnap = 101, ShapeReturn = 102, + UiTap = 200, } } diff --git a/Assets/Darkmatter/Code/Features/ColorbookFlow/Features.Colorbook.asmdef b/Assets/Darkmatter/Code/Features/ColorbookFlow/Features.Colorbook.asmdef index 31f53e4..1c1165d 100644 --- a/Assets/Darkmatter/Code/Features/ColorbookFlow/Features.Colorbook.asmdef +++ b/Assets/Darkmatter/Code/Features/ColorbookFlow/Features.Colorbook.asmdef @@ -4,8 +4,11 @@ "references": [ "GUID:6a0a834eb41764f12ba55c3fb04a40cb", "GUID:c1c03c0e5b2f4412b9f2be1c20d6a9b1", + "GUID:c176ee863a5e74e88a6517f9f102cf92", + "GUID:b4c9f7fbf1e144933a1797dc208ece5f", "GUID:b0214a6008ed146ff8f122a6a9c2f6cc", - "GUID:f51ebe6a0ceec4240a699833d6309b23" + "GUID:f51ebe6a0ceec4240a699833d6309b23", + "GUID:80ecb87cae9c44d19824e70ea7229748" ], "includePlatforms": [], "excludePlatforms": [], @@ -16,4 +19,4 @@ "defineConstraints": [], "versionDefines": [], "noEngineReferences": false -} \ No newline at end of file +} diff --git a/Assets/Darkmatter/Code/Features/ColorbookFlow/System/ColorbookFlowController.cs b/Assets/Darkmatter/Code/Features/ColorbookFlow/System/ColorbookFlowController.cs index 0055772..abc58c8 100644 --- a/Assets/Darkmatter/Code/Features/ColorbookFlow/System/ColorbookFlowController.cs +++ b/Assets/Darkmatter/Code/Features/ColorbookFlow/System/ColorbookFlowController.cs @@ -1,26 +1,62 @@ +using System; using System.Threading; using Cysharp.Threading.Tasks; using Darkmatter.Core.Contracts.Features.DrawingCatalog; using Darkmatter.Core.Contracts.Features.Loading; +using Darkmatter.Core.Contracts.Features.Progression; +using Darkmatter.Core.Contracts.Services.Scenes; +using Darkmatter.Core.Data.Signals.Features.Drawing; +using Darkmatter.Core.Enums.Services.Scenes; +using Darkmatter.Libs.Observer; using VContainer.Unity; namespace Darkmatter.Features.Colorbook.System; -public class ColorbookFlowController : IAsyncStartable +public class ColorbookFlowController : IAsyncStartable, IDisposable { private readonly IDrawingCatalogController _drawingCatalog; private readonly ILoadingScreen _loadingScreen; + private readonly IProgressionSystem _progression; + private readonly ISceneService _scenes; + private readonly IEventBus _bus; - public ColorbookFlowController(IDrawingCatalogController drawingCatalog, ILoadingScreen loadingScreen) + private IDisposable _selectedSub; + + public ColorbookFlowController( + IDrawingCatalogController drawingCatalog, + ILoadingScreen loadingScreen, + IProgressionSystem progression, + ISceneService scenes, + IEventBus bus) { _drawingCatalog = drawingCatalog; _loadingScreen = loadingScreen; + _progression = progression; + _scenes = scenes; + _bus = bus; } - + public async UniTask StartAsync(CancellationToken cancellation = new CancellationToken()) { _loadingScreen.SetProgress(1f); await _drawingCatalog.InitializeAsync(cancellation); + _selectedSub = _bus.Subscribe(OnDrawingSelected); _loadingScreen.Hide(); } -} \ No newline at end of file + + private void OnDrawingSelected(DrawingSelectedSignal signal) + { + HandleSelectionAsync(signal.TemplateId).Forget(); + } + + private async UniTaskVoid HandleSelectionAsync(string templateId) + { + await _progression.SetLastOpenedAsync(templateId); + await _scenes.LoadSceneAsync(GameScene.Gameplay, progress: null, cancellationToken: default); + } + + public void Dispose() + { + _selectedSub?.Dispose(); + } +} diff --git a/Assets/Darkmatter/Code/Features/Coloring/Commands/ColorRegionCommand.cs b/Assets/Darkmatter/Code/Features/Coloring/Commands/ColorRegionCommand.cs new file mode 100644 index 0000000..f6370ec --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/Commands/ColorRegionCommand.cs @@ -0,0 +1,22 @@ +using Darkmatter.Core.Contracts.Features.History; +using Darkmatter.Features.Coloring.UI; +using UnityEngine; + +namespace Darkmatter.Features.Coloring.Commands; + +public class ColorRegionCommand : ICommand +{ + private readonly ColorRegionView _view; + private readonly Color _from; + private readonly Color _to; + + public ColorRegionCommand(ColorRegionView view, Color from, Color to) + { + _view = view; + _from = from; + _to = to; + } + + public void Execute() => _view.SetColor(_to); + public void Undo() => _view.SetColor(_from); +} diff --git a/Assets/Darkmatter/Code/Features/Coloring/Commands/ColorRegionCommand.cs.meta b/Assets/Darkmatter/Code/Features/Coloring/Commands/ColorRegionCommand.cs.meta new file mode 100644 index 0000000..4585a38 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/Commands/ColorRegionCommand.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: c212dc9aaa7e4445968fee229a715b3b +timeCreated: 1779972906 \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/Coloring/Installers/ColoringFeatureModule.cs b/Assets/Darkmatter/Code/Features/Coloring/Installers/ColoringFeatureModule.cs index 748ad2f..4730c18 100644 --- a/Assets/Darkmatter/Code/Features/Coloring/Installers/ColoringFeatureModule.cs +++ b/Assets/Darkmatter/Code/Features/Coloring/Installers/ColoringFeatureModule.cs @@ -1,3 +1,5 @@ +using Darkmatter.Core.Contracts.Features.Coloring; +using Darkmatter.Features.Coloring.Systems; using Darkmatter.Features.Coloring.UI; using Darkmatter.Libs.Installers; using UnityEngine; @@ -17,6 +19,10 @@ namespace Darkmatter.Features.Coloring builder.RegisterComponent(paletteHolderView); builder.RegisterEntryPoint().WithParameter(paletteHolderView); } + + builder.Register(Lifetime.Singleton); + builder.Register(Lifetime.Singleton); + builder.Register(Lifetime.Singleton); } } -} +} \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/Coloring/Systems/ColorButtonFactory.cs b/Assets/Darkmatter/Code/Features/Coloring/Systems/ColorButtonFactory.cs new file mode 100644 index 0000000..54f202f --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/Systems/ColorButtonFactory.cs @@ -0,0 +1,30 @@ +using Darkmatter.Core.Contracts.Services.Audio; +using Darkmatter.Features.Coloring.UI; +using UnityEngine; + +namespace Darkmatter.Features.Coloring.Systems; + +public class ColorButtonFactory : IColorButtonFactory +{ + private readonly ColorPaletteHolderView _holder; + private readonly ColoringStateRepository _repository; + private readonly ISfxPlayer _sfx; + + public ColorButtonFactory( + ColorPaletteHolderView holder, + ColoringStateRepository repository, + ISfxPlayer sfx) + { + _holder = holder; + _repository = repository; + _sfx = sfx; + } + + public ColorButton Create(GameObject prefab, Color color) + { + var go = Object.Instantiate(prefab, _holder.SpawnRoot); + var btn = go.GetComponent(); + btn.Setup(color, _repository, _sfx); + return btn; + } +} \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/Coloring/Systems/ColorButtonFactory.cs.meta b/Assets/Darkmatter/Code/Features/Coloring/Systems/ColorButtonFactory.cs.meta new file mode 100644 index 0000000..265df0e --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/Systems/ColorButtonFactory.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 1bba9a928a76471391068acd46c4f684 +timeCreated: 1779970637 \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/Coloring/Systems/ColoringController.cs b/Assets/Darkmatter/Code/Features/Coloring/Systems/ColoringController.cs new file mode 100644 index 0000000..a98b6f1 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/Systems/ColoringController.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using Cysharp.Threading.Tasks; +using Darkmatter.Core.Contracts.Features.Coloring; +using Darkmatter.Core.Contracts.Features.DrawingCatalog; +using Darkmatter.Core.Contracts.Features.GameplayFlow; +using Darkmatter.Core.Contracts.Features.History; +using Darkmatter.Core.Contracts.Services.Assets; +using Darkmatter.Core.Data.Signals.Features.Coloring; +using Darkmatter.Core.Data.Static.Features.Coloring; +using Darkmatter.Features.Coloring.Commands; +using Darkmatter.Features.Coloring.UI; +using Darkmatter.Libs.Observer; +using UnityEngine; +using ZLinq; + +namespace Darkmatter.Features.Coloring.Systems; + +public class ColoringController : IColoringController, IDisposable +{ + private const string ColorButtonPrefabKey = "colorButton"; + + private readonly ColoringStateRepository _repository; + private readonly IColorButtonFactory _buttonFactory; + private readonly IEventBus _bus; + private readonly IAssetProviderService _assetProviderService; + private readonly IUndoStack _history; + private readonly IGameplaySceneRefs _refs; + + private GameObject _colorInstance; + private GameObject _colorButtonPrefab; + private readonly List _regions = new(); + private readonly List _buttons = new(); + + public ColoringController( + ColoringStateRepository repository, + IColorButtonFactory buttonFactory, + IEventBus bus, + IAssetProviderService assetProviderService, + IUndoStack history, + IGameplaySceneRefs refs) + { + _repository = repository; + _buttonFactory = buttonFactory; + _bus = bus; + _assetProviderService = assetProviderService; + _history = history; + _refs = refs; + } + + public async UniTask InitializeRegionsAsync(IDrawingTemplate template, + IReadOnlyDictionary savedColors, CancellationToken ct) + { + Clear(); + await TryLoadColorButtonPrefabAsync(ct); + ct.ThrowIfCancellationRequested(); + await TryLoadColorPaletteAsync(template, ct); + ct.ThrowIfCancellationRequested(); + CreateColorButtonInstances(); + InitializeColorRegions(template, savedColors); + } + + public void PaintRegion(string regionId, Color color) + { + var region = _regions.AsValueEnumerable().FirstOrDefault(r => r.RegionId == regionId); + if (region == null) return; + + var from = region.Color; + _history.Push(new ColorRegionCommand(region, from, color)); + _bus.Publish(new ColorAppliedSignal(regionId, color)); + } + + public IReadOnlyDictionary GetCurrentColors() + { + var snapshot = new Dictionary(_regions.Count); + foreach (var region in _regions) + snapshot[region.RegionId] = region.Color; + return snapshot; + } + + public void Clear() + { + _history.Drop(); + + foreach (var button in _buttons) + if (button != null) UnityEngine.Object.Destroy(button.gameObject); + _buttons.Clear(); + + _regions.Clear(); + + if (_colorInstance != null) + { + UnityEngine.Object.Destroy(_colorInstance); + _colorInstance = null; + } + } + + public void Dispose() => Clear(); + + private void InitializeColorRegions(IDrawingTemplate template, IReadOnlyDictionary savedColors) + { + _colorInstance = UnityEngine.Object.Instantiate(template.ColoringPrefab, _refs.PaperRoot); + var views = _colorInstance.GetComponentsInChildren(includeInactive: true); + + foreach (var region in views) + { + var id = region.RegionId; + var authoredColor = region.Color; + var resumeColor = savedColors != null && savedColors.TryGetValue(id, out var saved) + ? saved + : authoredColor; + + if (resumeColor != authoredColor) + _history.Append(new ColorRegionCommand(region, authoredColor, resumeColor)); + + _regions.Add(region); + region.Initialize(resumeColor, () => PaintRegion(id, _repository.SelectedColor)); + } + } + + private async UniTask TryLoadColorButtonPrefabAsync(CancellationToken ct) + { + if (_colorButtonPrefab != null) return; + + _colorButtonPrefab = await _assetProviderService.LoadAssetAsync( + ColorButtonPrefabKey, progress: null, cancellationToken: ct); + if (_colorButtonPrefab == null) + throw new Exception($"No color button prefab at '{ColorButtonPrefabKey}'"); + } + + private async UniTask TryLoadColorPaletteAsync(IDrawingTemplate template, CancellationToken ct) + { + var palette = await _assetProviderService.LoadAssetAsync( + template.ColorPaletteId, progress: null, cancellationToken: ct); + if (palette == null) + throw new Exception($"No color palette at '{template.ColorPaletteId}'"); + _repository.SetPalette(palette); + } + + private void CreateColorButtonInstances() + { + foreach (var color in _repository.SelectedPalette.Colors) + _buttons.Add(_buttonFactory.Create(_colorButtonPrefab, color)); + } +} diff --git a/Assets/Darkmatter/Code/Features/Coloring/Systems/ColoringController.cs.meta b/Assets/Darkmatter/Code/Features/Coloring/Systems/ColoringController.cs.meta new file mode 100644 index 0000000..5993764 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/Systems/ColoringController.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 0849f8cc757842278c38ee6f4d61b985 +timeCreated: 1779971175 \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/Coloring/Systems/ColoringStateRepository.cs b/Assets/Darkmatter/Code/Features/Coloring/Systems/ColoringStateRepository.cs new file mode 100644 index 0000000..e42d3ce --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/Systems/ColoringStateRepository.cs @@ -0,0 +1,33 @@ +using System; +using Darkmatter.Core.Contracts.Features.Coloring; +using UnityEngine; + +namespace Darkmatter.Features.Coloring.Systems; + +public class ColoringStateRepository +{ + public IColorPalette SelectedPalette { get; private set; } + public int SelectedIndex { get; private set; } + public Color SelectedColor => + SelectedPalette != null && SelectedIndex >= 0 && SelectedIndex < SelectedPalette.Colors.Count + ? SelectedPalette.Colors[SelectedIndex] + : Color.white; + + public event Action SelectedIndexChanged; + + public void SetPalette(IColorPalette palette) + { + SelectedPalette = palette; + SelectedIndex = 0; + SelectedIndexChanged?.Invoke(); + } + + public void SelectColor(Color color) + { + if (SelectedPalette == null) return; + var idx = SelectedPalette.Colors.IndexOf(color); + if (idx < 0) return; + SelectedIndex = idx; + SelectedIndexChanged?.Invoke(); + } +} diff --git a/Assets/Darkmatter/Code/Features/Coloring/Systems/ColoringStateRepository.cs.meta b/Assets/Darkmatter/Code/Features/Coloring/Systems/ColoringStateRepository.cs.meta new file mode 100644 index 0000000..d78264e --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/Systems/ColoringStateRepository.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a288824e4f554000994bec451c09957c +timeCreated: 1779970861 \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/Coloring/Systems/IColorButtonFactory.cs b/Assets/Darkmatter/Code/Features/Coloring/Systems/IColorButtonFactory.cs new file mode 100644 index 0000000..2e67f9d --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/Systems/IColorButtonFactory.cs @@ -0,0 +1,9 @@ +using Darkmatter.Features.Coloring.UI; +using UnityEngine; + +namespace Darkmatter.Features.Coloring.Systems; + +public interface IColorButtonFactory +{ + ColorButton Create(GameObject prefab,Color color); +} \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/Coloring/Systems/IColorButtonFactory.cs.meta b/Assets/Darkmatter/Code/Features/Coloring/Systems/IColorButtonFactory.cs.meta new file mode 100644 index 0000000..5256ee4 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/Systems/IColorButtonFactory.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 91b71be7f45a41cbb17492f82a3f0967 +timeCreated: 1779970564 \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/Coloring/UI/ColorButton.cs b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorButton.cs new file mode 100644 index 0000000..c64d29c --- /dev/null +++ b/Assets/Darkmatter/Code/Features/Coloring/UI/ColorButton.cs @@ -0,0 +1,54 @@ +using Darkmatter.Core.Contracts.Services.Audio; +using Darkmatter.Core.Enums.Services.Audio; +using Darkmatter.Features.Coloring.Systems; +using UnityEngine; +using UnityEngine.UI; + +namespace Darkmatter.Features.Coloring.UI +{ + [RequireComponent(typeof(Button))] + public class ColorButton : MonoBehaviour + { + [SerializeField] private Image swatch; + [SerializeField] private GameObject selectedUI; + private Button _button; + private Color _color; + private ColoringStateRepository _repository; + private ISfxPlayer _sfx; + + private void Awake() + { + _button = GetComponent