diff --git a/Source/Editor/Content/Import/TextureImportEntry.cs b/Source/Editor/Content/Import/TextureImportEntry.cs index c276dce1b..db1e3ae8c 100644 --- a/Source/Editor/Content/Import/TextureImportEntry.cs +++ b/Source/Editor/Content/Import/TextureImportEntry.cs @@ -483,7 +483,9 @@ namespace FlaxEditor.Content.Import { if (settings is TextureImportSettings o) { + var sprites = o.Sprites ?? _settings.Sprites; // Preserve sprites if not specified to override _settings = o; + _settings.Sprites = sprites; return true; } return false; diff --git a/Source/Editor/Managed/ManagedEditor.Internal.cpp b/Source/Editor/Managed/ManagedEditor.Internal.cpp index 66f5a3c67..a312b38c4 100644 --- a/Source/Editor/Managed/ManagedEditor.Internal.cpp +++ b/Source/Editor/Managed/ManagedEditor.Internal.cpp @@ -96,10 +96,9 @@ struct InternalTextureOptions to->Sprites.EnsureCapacity(count); for (int32 i = 0; i < count; i++) { - Sprite sprite; + Sprite& sprite = to->Sprites.AddOne(); sprite.Area = mono_array_get(from->SpriteAreas, Rectangle, i); sprite.Name = MUtils::ToString(mono_array_get(from->SpriteNames, MonoString*, i)); - to->Sprites.Add(sprite); } } } @@ -125,7 +124,7 @@ struct InternalTextureOptions { const auto domain = mono_domain_get(); int32 count = from->Sprites.Count(); - auto rectClass = Scripting::FindClass("FlaxEngine.Rectangle"); + auto rectClass = Rectangle::TypeInitializer.GetType().ManagedClass; ASSERT(rectClass != nullptr); to->SpriteAreas = mono_array_new(domain, rectClass->GetNative(), count); to->SpriteNames = mono_array_new(domain, mono_get_string_class(), count); diff --git a/Source/Editor/Windows/Assets/SpriteAtlasWindow.cs b/Source/Editor/Windows/Assets/SpriteAtlasWindow.cs index 879358f8b..e26288814 100644 --- a/Source/Editor/Windows/Assets/SpriteAtlasWindow.cs +++ b/Source/Editor/Windows/Assets/SpriteAtlasWindow.cs @@ -100,18 +100,16 @@ namespace FlaxEditor.Windows.Assets } [EditorOrder(0), EditorDisplay("Sprites")] - [CustomEditor(typeof(SpritesColelctionEditor))] + [CustomEditor(typeof(SpritesCollectionEditor))] public SpriteEntry[] Sprites; [EditorOrder(1000), EditorDisplay("Import Settings", EditorDisplayAttribute.InlineStyle)] - public TextureImportSettings ImportSettings { get; set; } = new TextureImportSettings(); + public TextureImportSettings ImportSettings = new TextureImportSettings(); public sealed class ProxyEditor : GenericEditor { public override void Initialize(LayoutElementsContainer layout) { - var window = ((PropertiesProxy)Values[0])._window; - base.Initialize(layout); layout.Space(10); @@ -120,14 +118,13 @@ namespace FlaxEditor.Windows.Assets } } - public sealed class SpritesColelctionEditor : CustomEditor + public sealed class SpritesCollectionEditor : CustomEditor { public override DisplayStyle Style => DisplayStyle.InlineIntoParent; public override void Initialize(LayoutElementsContainer layout) { var sprites = (SpriteEntry[])Values[0]; - if (sprites != null) { var elementType = new ScriptType(typeof(SpriteEntry)); @@ -186,6 +183,7 @@ namespace FlaxEditor.Windows.Assets /// public void Reimport() { + ImportSettings.Sprites = null; // Don't override sprites (use sprites from asset) Editor.Instance.ContentImporting.Reimport((BinaryAssetItem)_window.Item, ImportSettings, true); } diff --git a/Source/Engine/Render2D/SpriteAtlas.cpp b/Source/Engine/Render2D/SpriteAtlas.cpp index 217c950c4..c43f9f26f 100644 --- a/Source/Engine/Render2D/SpriteAtlas.cpp +++ b/Source/Engine/Render2D/SpriteAtlas.cpp @@ -54,13 +54,12 @@ Sprite SpriteAtlas::GetSprite(int32 index) const void SpriteAtlas::SetSprite(int32 index, const Sprite& value) { CHECK(index >= 0 && index < Sprites.Count()); - Sprites[index] = value; + Sprites.Get()[index] = value; } SpriteHandle SpriteAtlas::FindSprite(const StringView& name) const { SpriteHandle result(const_cast(this), -1); - for (int32 i = 0; i < Sprites.Count(); i++) { if (name == Sprites[i].Name) @@ -69,16 +68,13 @@ SpriteHandle SpriteAtlas::FindSprite(const StringView& name) const break; } } - return result; } SpriteHandle SpriteAtlas::AddSprite(const Sprite& sprite) { const int32 index = Sprites.Count(); - Sprites.Add(sprite); - return SpriteHandle(this, index); } @@ -108,10 +104,8 @@ bool SpriteAtlas::SaveSprites() MemoryWriteStream stream(1024); stream.WriteInt32(1); // Version stream.WriteInt32(Sprites.Count()); // Sprites Count - for (int32 i = 0; i < Sprites.Count(); i++) + for (Sprite& t : Sprites) { - // Save sprite - Sprite t = Sprites[i]; stream.Write(&t.Area); stream.WriteString(t.Name, 49); } @@ -122,7 +116,7 @@ bool SpriteAtlas::SaveSprites() // Save (use silent mode to prevent asset reloading) bool saveResult = SaveAsset(data, true); - dataChunk->Data.Release(); + dataChunk->Data.Unlink(); if (saveResult) { LOG(Warning, "Failed to save sprite atlas \'{0}\'.", GetPath()); @@ -136,53 +130,50 @@ bool SpriteAtlas::SaveSprites() bool SpriteAtlas::LoadSprites(ReadStream& stream) { -#if USE_EDITOR + ScopeLock lock(Locker); + // Sprites may be used on rendering thread so lock drawing for a while - if (GPUDevice::Instance) - GPUDevice::Instance->Locker.Lock(); +#if USE_EDITOR + GPUDevice* gpuDevice = GPUDevice::Instance; + if (gpuDevice) + gpuDevice->Locker.Lock(); #endif - // Cleanup first Sprites.Clear(); - // Load tiles data int32 tilesVersion, tilesCount; stream.ReadInt32(&tilesVersion); if (tilesVersion != 1) { #if USE_EDITOR - if (GPUDevice::Instance) - GPUDevice::Instance->Locker.Unlock(); + if (gpuDevice) + gpuDevice->Locker.Unlock(); #endif LOG(Warning, "Invalid tiles version."); return true; } stream.ReadInt32(&tilesCount); Sprites.Resize(tilesCount); - for (int32 i = 0; i < tilesCount; i++) + for (Sprite& t : Sprites) { - // Load sprite - Sprite& t = Sprites[i]; stream.Read(&t.Area); stream.ReadString(&t.Name, 49); } #if USE_EDITOR - if (GPUDevice::Instance) - GPUDevice::Instance->Locker.Unlock(); + if (gpuDevice) + gpuDevice->Locker.Unlock(); #endif return false; } Asset::LoadResult SpriteAtlas::load() { - // Get sprites data auto spritesDataChunk = GetChunk(15); if (spritesDataChunk == nullptr || spritesDataChunk->IsMissing()) return LoadResult::MissingDataChunk; MemoryReadStream spritesData(spritesDataChunk->Get(), spritesDataChunk->Size()); - // Load sprites if (LoadSprites(spritesData)) { LOG(Warning, "Cannot load sprites atlas data."); @@ -194,7 +185,6 @@ Asset::LoadResult SpriteAtlas::load() void SpriteAtlas::unload(bool isReloading) { - // Release sprites Sprites.Resize(0); // Base