Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,22 @@ public class LDtkDefinitionObjectAutoLayerRule : LDtkDefinitionObject<AutoLayerR
[field: Tooltip("Min random offset for tile pos")]
[field: SerializeField] public Vector2Int TileRandomMin { get; private set; }

[field: Tooltip("Array containing all the possible tile IDs rectangles (picked randomly).")]
[field: SerializeField] public int?[][] TileRectsIds { get; private set; }
[Tooltip("Array containing all the possible tile IDs rectangles (picked randomly).")]
[SerializeField] private LDtkDefinitionObjectAutoLayerRuleTileRect[] _tileRectsSerialized;

private int[][] _tileRectsCache;
public int[][] TileRectsIds
{
get
{
if (_tileRectsCache == null)
{
_tileRectsCache = LDtkDefinitionObjectAutoLayerRuleTileRect.ToJaggedArray(_tileRectsSerialized);
}

return _tileRectsCache;
}
}

[field: Tooltip("Tile offset")]
[field: SerializeField] public Vector2Int TileOffset { get; private set; }
Expand Down Expand Up @@ -100,11 +114,17 @@ internal override void Populate(LDtkDefinitionObjectsCache cache, AutoLayerRuleD
TileMode = def.TileMode;
TileRandomMax = def.UnityTileRandomMax;
TileRandomMin = def.UnityTileRandomMin;
TileRectsIds = def.TileRectsIds; //todo make serializable. tileset tiles
SetTileRects(def.TileRectsIds);
TileOffset = def.UnityOffset;
Uid = def.Uid;
Modulo = def.UnityModulo;
Offset = def.UnityOffset;
}

private void SetTileRects(int?[][] source)
{
_tileRectsCache = LDtkDefinitionObjectAutoLayerRuleTileRect.CloneJaggedArray(source);
_tileRectsSerialized = LDtkDefinitionObjectAutoLayerRuleTileRect.Build(_tileRectsCache);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
using System;
using UnityEngine;

namespace LDtkUnity
{
/// <summary>
/// Serializable wrapper for tile rect IDs.
/// </summary>
[Serializable]
public sealed class LDtkDefinitionObjectAutoLayerRuleTileRect
{
[SerializeField] private int[] _values = Array.Empty<int>();

internal void Populate(int[] source)
{
if (source == null)
{
_values = null;
return;
}

if (source.Length == 0)
{
_values = Array.Empty<int>();
return;
}

var copy = new int[source.Length];
Array.Copy(source, copy, source.Length);
_values = copy;
}

internal int[] ToArray()
{
if (_values == null)
{
return null;
}

if (_values.Length == 0)
{
return Array.Empty<int>();
}

var copy = new int[_values.Length];
Array.Copy(_values, copy, _values.Length);
return copy;
}

internal static LDtkDefinitionObjectAutoLayerRuleTileRect[] Build(int[][] source)
{
if (source == null)
{
return null;
}

var result = new LDtkDefinitionObjectAutoLayerRuleTileRect[source.Length];
for (int i = 0; i < source.Length; i++)
{
var rect = new LDtkDefinitionObjectAutoLayerRuleTileRect();
rect.Populate(source[i]);
result[i] = rect;
}

return result;
}

internal static int[][] ToJaggedArray(LDtkDefinitionObjectAutoLayerRuleTileRect[] source)
{
if (source == null)
{
return null;
}

var result = new int[source.Length][];
for (int i = 0; i < source.Length; i++)
{
result[i] = source[i]?.ToArray();
}

return result;
}

internal static int[][] CloneJaggedArray(int?[][] source)
{
if (source == null)
{
return null;
}

var clone = new int[source.Length][];
for (int i = 0; i < source.Length; i++)
{
var row = source[i];
if (row == null || row.Length == 0)
{
clone[i] = Array.Empty<int>();
continue;
}

var list = new int[row.Length];
int count = 0;
for (int j = 0; j < row.Length; j++)
{
int? value = row[j];
if (value.HasValue)
{
list[count++] = value.Value;
}
}

if (count == 0)
{
clone[i] = Array.Empty<int>();
}
else if (count == list.Length)
{
clone[i] = list;
}
else
{
var trimmed = new int[count];
Array.Copy(list, trimmed, count);
clone[i] = trimmed;
}
}

return clone;
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.