76 lines
1.7 KiB
C#
76 lines
1.7 KiB
C#
using System;
|
|
using UnityEngine;
|
|
using System.Runtime.InteropServices;
|
|
|
|
namespace Obi{
|
|
|
|
public class ObiEdgeShapeTracker2D : ObiShapeTracker
|
|
{
|
|
private int pointCount;
|
|
private GCHandle pointsHandle;
|
|
private GCHandle indicesHandle;
|
|
private bool edgeDataHasChanged = false;
|
|
|
|
public ObiEdgeShapeTracker2D(EdgeCollider2D collider){
|
|
|
|
this.collider = collider;
|
|
adaptor.is2D = true;
|
|
oniShape = Oni.CreateShape(Oni.ShapeType.EdgeMesh);
|
|
|
|
UpdateEdgeData();
|
|
}
|
|
|
|
public void UpdateEdgeData(){
|
|
|
|
EdgeCollider2D edge = collider as EdgeCollider2D;
|
|
|
|
if (edge != null){
|
|
|
|
Vector3[] vertices = new Vector3[edge.pointCount];
|
|
int[] indices = new int[edge.edgeCount*2];
|
|
|
|
Vector2[] points = edge.points;
|
|
for (int i = 0; i < edge.pointCount; ++i){
|
|
vertices[i] = points[i];
|
|
}
|
|
|
|
for (int i = 0; i < edge.edgeCount; ++i){
|
|
indices[i*2] = i;
|
|
indices[i*2+1] = i+1;
|
|
}
|
|
|
|
Oni.UnpinMemory(pointsHandle);
|
|
Oni.UnpinMemory(indicesHandle);
|
|
|
|
pointsHandle = Oni.PinMemory(vertices);
|
|
indicesHandle = Oni.PinMemory(indices);
|
|
|
|
edgeDataHasChanged = true;
|
|
}
|
|
}
|
|
|
|
public override void UpdateIfNeeded (){
|
|
|
|
EdgeCollider2D edge = collider as EdgeCollider2D;
|
|
|
|
if (edge != null && (edge.pointCount != pointCount ||
|
|
edgeDataHasChanged)){
|
|
|
|
pointCount = edge.pointCount;
|
|
edgeDataHasChanged = false;
|
|
adaptor.Set(pointsHandle.AddrOfPinnedObject(),indicesHandle.AddrOfPinnedObject(),edge.pointCount,edge.edgeCount*2);
|
|
Oni.UpdateShape(oniShape,ref adaptor);
|
|
}
|
|
|
|
}
|
|
|
|
public override void Destroy(){
|
|
base.Destroy();
|
|
|
|
Oni.UnpinMemory(pointsHandle);
|
|
Oni.UnpinMemory(indicesHandle);
|
|
}
|
|
}
|
|
}
|
|
|