Fix sprite atlas serialization after editing

This commit is contained in:
Wojtek Figat
2021-05-12 16:19:59 +02:00
parent a4a3074bb6
commit 480947e0a9
4 changed files with 22 additions and 33 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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
/// </summary>
public void Reimport()
{
ImportSettings.Sprites = null; // Don't override sprites (use sprites from asset)
Editor.Instance.ContentImporting.Reimport((BinaryAssetItem)_window.Item, ImportSettings, true);
}

View File

@@ -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<SpriteAtlas*>(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