More efficient draw order when bind pose order is keyed.

This commit is contained in:
NathanSweet 2013-09-24 11:10:10 +02:00
parent 90877fe14c
commit 2b86668f4e
6 changed files with 66 additions and 61 deletions

View File

@ -513,7 +513,8 @@ namespace Spine {
drawOrders = new int[frameCount][]; drawOrders = new int[frameCount][];
} }
/** Sets the time and value of the specified keyframe. */ /** Sets the time and value of the specified keyframe.
* @param drawOrder May be null to use bind pose draw order. */
public void setFrame (int frameIndex, float time, int[] drawOrder) { public void setFrame (int frameIndex, float time, int[] drawOrder) {
frames[frameIndex] = time; frames[frameIndex] = time;
drawOrders[frameIndex] = drawOrder; drawOrders[frameIndex] = drawOrder;
@ -532,8 +533,13 @@ namespace Spine {
List<Slot> drawOrder = skeleton.drawOrder; List<Slot> drawOrder = skeleton.drawOrder;
List<Slot> slots = skeleton.slots; List<Slot> slots = skeleton.slots;
int[] drawOrderToSetupIndex = drawOrders[frameIndex]; int[] drawOrderToSetupIndex = drawOrders[frameIndex];
for (int i = 0, n = drawOrderToSetupIndex.Length; i < n; i++) if (drawOrderToSetupIndex == null) {
drawOrder[i] = slots[drawOrderToSetupIndex[i]]; drawOrder.Clear();
drawOrder.AddRange(slots);
} else {
for (int i = 0, n = drawOrderToSetupIndex.Length; i < n; i++)
drawOrder[i] = slots[drawOrderToSetupIndex[i]];
}
} }
} }
} }

View File

@ -29,8 +29,8 @@
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/ *****************************************************************************/
using System; using System;
using System.IO; using System.IO;
using System.Collections.Generic; using System.Collections.Generic;
@ -372,27 +372,30 @@ namespace Spine {
int slotCount = skeletonData.slots.Count; int slotCount = skeletonData.slots.Count;
int frameIndex = 0; int frameIndex = 0;
foreach (Dictionary<String, Object> drawOrderMap in values) { foreach (Dictionary<String, Object> drawOrderMap in values) {
int[] drawOrder = new int[slotCount]; int[] drawOrder = null;
for (int i = slotCount - 1; i >= 0; i--) if (drawOrderMap.ContainsKey("offsets")) {
drawOrder[i] = -1; drawOrder = new int[slotCount];
List<Object> offsets = (List<Object>)drawOrderMap["offsets"]; for (int i = slotCount - 1; i >= 0; i--)
int[] unchanged = new int[slotCount - offsets.Count]; drawOrder[i] = -1;
int originalIndex = 0, unchangedIndex = 0; List<Object> offsets = (List<Object>)drawOrderMap["offsets"];
foreach (Dictionary<String, Object> offsetMap in offsets) { int[] unchanged = new int[slotCount - offsets.Count];
int slotIndex = skeletonData.FindSlotIndex((String)offsetMap["slot"]); int originalIndex = 0, unchangedIndex = 0;
if (slotIndex == -1) throw new Exception("Slot not found: " + offsetMap["slot"]); foreach (Dictionary<String, Object> offsetMap in offsets) {
// Collect unchanged items. int slotIndex = skeletonData.FindSlotIndex((String)offsetMap["slot"]);
while (originalIndex != slotIndex) if (slotIndex == -1) throw new Exception("Slot not found: " + offsetMap["slot"]);
// Collect unchanged items.
while (originalIndex != slotIndex)
unchanged[unchangedIndex++] = originalIndex++;
// Set changed items.
drawOrder[originalIndex + (int)(float)offsetMap["offset"]] = originalIndex++;
}
// Collect remaining unchanged items.
while (originalIndex < slotCount)
unchanged[unchangedIndex++] = originalIndex++; unchanged[unchangedIndex++] = originalIndex++;
// Set changed items. // Fill in unchanged items.
drawOrder[originalIndex + (int)(float)offsetMap["offset"]] = originalIndex++; for (int i = slotCount - 1; i >= 0; i--)
if (drawOrder[i] == -1) drawOrder[i] = unchanged[--unchangedIndex];
} }
// Collect remaining unchanged items.
while (originalIndex < slotCount)
unchanged[unchangedIndex++] = originalIndex++;
// Fill in unchanged items.
for (int i = slotCount - 1; i >= 0; i--)
if (drawOrder[i] == -1) drawOrder[i] = unchanged[--unchangedIndex];
timeline.setFrame(frameIndex++, (float)drawOrderMap["time"], drawOrder); timeline.setFrame(frameIndex++, (float)drawOrderMap["time"], drawOrder);
} }
timelines.Add(timeline); timelines.Add(timeline);
@ -415,4 +418,4 @@ namespace Spine {
} }
} }
} }
} }

View File

@ -594,7 +594,8 @@ public class Animation {
return drawOrders; return drawOrders;
} }
/** Sets the time of the specified keyframe. */ /** Sets the time of the specified keyframe.
* @param drawOrder May be null to use bind pose draw order. */
public void setFrame (int frameIndex, float time, int[] drawOrder) { public void setFrame (int frameIndex, float time, int[] drawOrder) {
frames[frameIndex] = time; frames[frameIndex] = time;
drawOrders[frameIndex] = drawOrder; drawOrders[frameIndex] = drawOrder;
@ -613,8 +614,12 @@ public class Animation {
Array<Slot> drawOrder = skeleton.drawOrder; Array<Slot> drawOrder = skeleton.drawOrder;
Array<Slot> slots = skeleton.slots; Array<Slot> slots = skeleton.slots;
int[] drawOrderToSetupIndex = drawOrders[frameIndex]; int[] drawOrderToSetupIndex = drawOrders[frameIndex];
for (int i = 0, n = drawOrderToSetupIndex.length; i < n; i++) if (drawOrderToSetupIndex == null)
drawOrder.set(i, slots.get(drawOrderToSetupIndex[i])); System.arraycopy(slots.items, 0, drawOrder.items, 0, slots.size);
else {
for (int i = 0, n = drawOrderToSetupIndex.length; i < n; i++)
drawOrder.set(i, slots.get(drawOrderToSetupIndex[i]));
}
} }
} }
} }

View File

@ -320,26 +320,30 @@ public class SkeletonJson {
int slotCount = skeletonData.slots.size; int slotCount = skeletonData.slots.size;
int frameIndex = 0; int frameIndex = 0;
for (JsonValue drawOrderMap = drawOrdersMap.child; drawOrderMap != null; drawOrderMap = drawOrderMap.next()) { for (JsonValue drawOrderMap = drawOrdersMap.child; drawOrderMap != null; drawOrderMap = drawOrderMap.next()) {
int[] drawOrder = new int[slotCount]; int[] drawOrder = null;
for (int i = slotCount - 1; i >= 0; i--) JsonValue offsets = drawOrderMap.get("offsets");
drawOrder[i] = -1; if (offsets != null) {
int[] unchanged = new int[slotCount - drawOrderMap.get("offsets").size]; drawOrder = new int[slotCount];
int originalIndex = 0, unchangedIndex = 0; for (int i = slotCount - 1; i >= 0; i--)
for (JsonValue offsetMap = drawOrderMap.getChild("offsets"); offsetMap != null; offsetMap = offsetMap.next()) { drawOrder[i] = -1;
int slotIndex = skeletonData.findSlotIndex(offsetMap.getString("slot")); int[] unchanged = new int[slotCount - offsets.size];
if (slotIndex == -1) throw new SerializationException("Slot not found: " + offsetMap.getString("slot")); int originalIndex = 0, unchangedIndex = 0;
// Collect unchanged items. for (JsonValue offsetMap = offsets.child; offsetMap != null; offsetMap = offsetMap.next()) {
while (originalIndex != slotIndex) int slotIndex = skeletonData.findSlotIndex(offsetMap.getString("slot"));
if (slotIndex == -1) throw new SerializationException("Slot not found: " + offsetMap.getString("slot"));
// Collect unchanged items.
while (originalIndex != slotIndex)
unchanged[unchangedIndex++] = originalIndex++;
// Set changed items.
drawOrder[originalIndex + offsetMap.getInt("offset")] = originalIndex++;
}
// Collect remaining unchanged items.
while (originalIndex < slotCount)
unchanged[unchangedIndex++] = originalIndex++; unchanged[unchangedIndex++] = originalIndex++;
// Set changed items. // Fill in unchanged items.
drawOrder[originalIndex + offsetMap.getInt("offset")] = originalIndex++; for (int i = slotCount - 1; i >= 0; i--)
if (drawOrder[i] == -1) drawOrder[i] = unchanged[--unchangedIndex];
} }
// Collect remaining unchanged items.
while (originalIndex < slotCount)
unchanged[unchangedIndex++] = originalIndex++;
// Fill in unchanged items.
for (int i = slotCount - 1; i >= 0; i--)
if (drawOrder[i] == -1) drawOrder[i] = unchanged[--unchangedIndex];
timeline.setFrame(frameIndex++, drawOrderMap.getFloat("time"), drawOrder); timeline.setFrame(frameIndex++, drawOrderMap.getFloat("time"), drawOrder);
} }
timelines.add(timeline); timelines.add(timeline);

View File

@ -300,17 +300,7 @@
{ "slot": "eyes", "offset": 3 } { "slot": "eyes", "offset": 3 }
] ]
}, },
{ { "time": 2 }
"time": 2.6206,
"offsets": [
{ "slot": "head", "offset": -12 },
{ "slot": "eyes", "offset": -12 }
]
},
{
"time": 3.5862,
"offsets": []
}
] ]
}, },
"jump": { "jump": {

View File

@ -307,10 +307,7 @@
{ "slot": "eyes", "offset": -12 } { "slot": "eyes", "offset": -12 }
] ]
}, },
{ { "time": 3.5862 }
"time": 3.5862,
"offsets": []
}
] ]
}, },
"jump": { "jump": {