mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2024-11-26 08:52:52 +08:00
Collisions editing progress
This commit is contained in:
parent
44cf8ee1d2
commit
16982d7219
@ -69,14 +69,11 @@ namespace CodeWalker.GameFiles
|
|||||||
|
|
||||||
public bool RemoveBounds(Bounds b)
|
public bool RemoveBounds(Bounds b)
|
||||||
{
|
{
|
||||||
return false;
|
if (Bounds == b)
|
||||||
}
|
{
|
||||||
public bool RemovePoly(BoundPolygon p)
|
Bounds = null;
|
||||||
{
|
return true;
|
||||||
return false;
|
}
|
||||||
}
|
|
||||||
public bool RemoveVertex(BoundVertex v)
|
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3517,6 +3517,7 @@ namespace CodeWalker.GameFiles
|
|||||||
public void TestYbns()
|
public void TestYbns()
|
||||||
{
|
{
|
||||||
bool savetest = true;
|
bool savetest = true;
|
||||||
|
bool reloadtest = false;
|
||||||
var errorfiles = new List<RpfEntry>();
|
var errorfiles = new List<RpfEntry>();
|
||||||
foreach (RpfFile file in AllRpfs)
|
foreach (RpfFile file in AllRpfs)
|
||||||
{
|
{
|
||||||
@ -3545,6 +3546,9 @@ namespace CodeWalker.GameFiles
|
|||||||
|
|
||||||
var bytes = ybn.Save();
|
var bytes = ybn.Save();
|
||||||
|
|
||||||
|
if (!reloadtest)
|
||||||
|
{ continue; }
|
||||||
|
|
||||||
string origlen = TextUtil.GetBytesReadable(fentry.FileSize);
|
string origlen = TextUtil.GetBytesReadable(fentry.FileSize);
|
||||||
string bytelen = TextUtil.GetBytesReadable(bytes.Length);
|
string bytelen = TextUtil.GetBytesReadable(bytes.Length);
|
||||||
|
|
||||||
|
@ -1133,6 +1133,7 @@ namespace CodeWalker.GameFiles
|
|||||||
{
|
{
|
||||||
BuildMaterials();
|
BuildMaterials();
|
||||||
CalculateQuantum();
|
CalculateQuantum();
|
||||||
|
//UpdateEdgeIndices(); //TODO: reinstate this?
|
||||||
|
|
||||||
var list = new List<IResourceBlock>(base.GetReferences());
|
var list = new List<IResourceBlock>(base.GetReferences());
|
||||||
if (Vertices2 != null)
|
if (Vertices2 != null)
|
||||||
@ -1553,6 +1554,201 @@ namespace CodeWalker.GameFiles
|
|||||||
PolygonMaterialIndices = polymats.ToArray();
|
PolygonMaterialIndices = polymats.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void UpdateEdgeIndices()
|
||||||
|
{
|
||||||
|
//update all triangle edge indices, based on shared vertex indices
|
||||||
|
|
||||||
|
var edgedict = new Dictionary<BoundEdgeRef, BoundEdge>();
|
||||||
|
if (Polygons != null)
|
||||||
|
{
|
||||||
|
foreach (var poly in Polygons)
|
||||||
|
{
|
||||||
|
if (poly is BoundPolygonTriangle btri)
|
||||||
|
{
|
||||||
|
var e1 = new BoundEdgeRef(btri.vertIndex1, btri.vertIndex2);
|
||||||
|
var e2 = new BoundEdgeRef(btri.vertIndex2, btri.vertIndex3);
|
||||||
|
var e3 = new BoundEdgeRef(btri.vertIndex3, btri.vertIndex1);
|
||||||
|
|
||||||
|
if (edgedict.TryGetValue(e1, out BoundEdge edge1))
|
||||||
|
{
|
||||||
|
if (edge1.Triangle2 != null)
|
||||||
|
{ }
|
||||||
|
edge1.Triangle2 = btri;
|
||||||
|
edge1.EdgeID2 = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
edgedict[e1] = new BoundEdge(btri, 1);
|
||||||
|
}
|
||||||
|
if (edgedict.TryGetValue(e2, out BoundEdge edge2))
|
||||||
|
{
|
||||||
|
if (edge2.Triangle2 != null)
|
||||||
|
{ }
|
||||||
|
edge2.Triangle2 = btri;
|
||||||
|
edge2.EdgeID2 = 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
edgedict[e2] = new BoundEdge(btri, 2);
|
||||||
|
}
|
||||||
|
if (edgedict.TryGetValue(e3, out BoundEdge edge3))
|
||||||
|
{
|
||||||
|
if (edge3.Triangle2 != null)
|
||||||
|
{ }
|
||||||
|
edge3.Triangle2 = btri;
|
||||||
|
edge3.EdgeID2 = 3;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
edgedict[e3] = new BoundEdge(btri, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var kvp in edgedict)
|
||||||
|
{
|
||||||
|
var eref = kvp.Key;
|
||||||
|
var edge = kvp.Value;
|
||||||
|
|
||||||
|
if (edge.Triangle1 == null)
|
||||||
|
{ continue; }
|
||||||
|
|
||||||
|
|
||||||
|
if (edge.Triangle2 == null)
|
||||||
|
{
|
||||||
|
edge.Triangle1.SetEdgeIndex(edge.EdgeID1, -1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
edge.Triangle1.SetEdgeIndex(edge.EdgeID1, (short)edge.Triangle2.Index);
|
||||||
|
edge.Triangle2.SetEdgeIndex(edge.EdgeID2, (short)edge.Triangle1.Index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public bool DeletePolygon(BoundPolygon p)
|
||||||
|
{
|
||||||
|
if (Polygons != null)
|
||||||
|
{
|
||||||
|
var polys = Polygons.ToList();
|
||||||
|
var polymats = PolygonMaterialIndices.ToList();
|
||||||
|
var idx = polys.IndexOf(p);
|
||||||
|
if (idx >= 0)
|
||||||
|
{
|
||||||
|
polys.RemoveAt(idx);
|
||||||
|
polymats.RemoveAt(idx);
|
||||||
|
Polygons = polys.ToArray();
|
||||||
|
PolygonMaterialIndices = polymats.ToArray();
|
||||||
|
PolygonsCount = (uint)polys.Count;
|
||||||
|
|
||||||
|
for (int i = 0; i < Polygons.Length; i++)
|
||||||
|
{
|
||||||
|
var poly = Polygons[i];
|
||||||
|
if (poly is BoundPolygonTriangle btri)
|
||||||
|
{
|
||||||
|
if (btri.edgeIndex1 == idx) btri.edgeIndex1 = -1;
|
||||||
|
if (btri.edgeIndex1 > idx) btri.edgeIndex1--;
|
||||||
|
if (btri.edgeIndex2 == idx) btri.edgeIndex2 = -1;
|
||||||
|
if (btri.edgeIndex2 > idx) btri.edgeIndex2--;
|
||||||
|
if (btri.edgeIndex3 == idx) btri.edgeIndex3 = -1;
|
||||||
|
if (btri.edgeIndex3 > idx) btri.edgeIndex3--;
|
||||||
|
}
|
||||||
|
poly.Index = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
var verts = p.VertexIndices;
|
||||||
|
for (int i = 0; i < verts.Length; i++)
|
||||||
|
{
|
||||||
|
if (DeleteVertex(verts[i], false)) //delete any orphaned vertices
|
||||||
|
{
|
||||||
|
verts = p.VertexIndices;//vertex indices will have changed, need to continue with the new ones!
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool DeleteVertex(int index, bool deletePolys = true)
|
||||||
|
{
|
||||||
|
if (Vertices != null)
|
||||||
|
{
|
||||||
|
if (!deletePolys)
|
||||||
|
{
|
||||||
|
//if not deleting polys, make sure this vertex isn't used by any
|
||||||
|
foreach (var poly in Polygons)
|
||||||
|
{
|
||||||
|
var pverts = poly.VertexIndices;
|
||||||
|
for (int i = 0; i < pverts.Length; i++)
|
||||||
|
{
|
||||||
|
if (pverts[i] == index)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var verts = Vertices.ToList();
|
||||||
|
var verts2 = Vertices2?.ToList();
|
||||||
|
var vertcols = VertexColours?.ToList();
|
||||||
|
verts.RemoveAt(index);
|
||||||
|
verts2?.RemoveAt(index);
|
||||||
|
vertcols?.RemoveAt(index);
|
||||||
|
Vertices = verts.ToArray();
|
||||||
|
Vertices2 = verts2?.ToArray();
|
||||||
|
VertexColours = vertcols?.ToArray();
|
||||||
|
VerticesCount = (uint)verts.Count;
|
||||||
|
Vertices2Count = VerticesCount;
|
||||||
|
|
||||||
|
if (Polygons != null)
|
||||||
|
{
|
||||||
|
var delpolys = new List<BoundPolygon>();
|
||||||
|
|
||||||
|
foreach (var poly in Polygons)
|
||||||
|
{
|
||||||
|
var pverts = poly.VertexIndices;
|
||||||
|
for (int i = 0; i < pverts.Length; i++)
|
||||||
|
{
|
||||||
|
if (pverts[i] == index)
|
||||||
|
{
|
||||||
|
delpolys.Add(poly);
|
||||||
|
}
|
||||||
|
if (pverts[i] > index)
|
||||||
|
{
|
||||||
|
pverts[i]--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
poly.VertexIndices = pverts;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (deletePolys)
|
||||||
|
{
|
||||||
|
foreach (var delpoly in delpolys)
|
||||||
|
{
|
||||||
|
DeletePolygon(delpoly);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (delpolys.Count > 0)
|
||||||
|
{ } //this shouldn't happen! shouldn't have deleted the vertex if it is used by polys
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
[TC(typeof(EXP))] public class BoundBVH : BoundGeometry
|
[TC(typeof(EXP))] public class BoundBVH : BoundGeometry
|
||||||
{
|
{
|
||||||
@ -2230,6 +2426,41 @@ namespace CodeWalker.GameFiles
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public bool DeleteChild(Bounds child)
|
||||||
|
{
|
||||||
|
if (Children?.data_items != null)
|
||||||
|
{
|
||||||
|
var children = Children.data_items.ToList();
|
||||||
|
var transforms1 = ChildrenTransformation1?.ToList();
|
||||||
|
var transforms2 = ChildrenTransformation2?.ToList();
|
||||||
|
var bboxes = ChildrenBoundingBoxes?.ToList();
|
||||||
|
var flags1 = ChildrenFlags1?.ToList();
|
||||||
|
var flags2 = ChildrenFlags2?.ToList();
|
||||||
|
var idx = children.IndexOf(child);
|
||||||
|
if (idx >= 0)
|
||||||
|
{
|
||||||
|
children.RemoveAt(idx);
|
||||||
|
transforms1?.RemoveAt(idx);
|
||||||
|
transforms2?.RemoveAt(idx);
|
||||||
|
bboxes?.RemoveAt(idx);
|
||||||
|
flags1?.RemoveAt(idx);
|
||||||
|
flags2?.RemoveAt(idx);
|
||||||
|
Children.data_items = children.ToArray();
|
||||||
|
ChildrenTransformation1 = transforms1?.ToArray();
|
||||||
|
ChildrenTransformation2 = transforms2?.ToArray();
|
||||||
|
ChildrenBoundingBoxes = bboxes?.ToArray();
|
||||||
|
ChildrenFlags1 = flags1?.ToArray();
|
||||||
|
ChildrenFlags2 = flags2?.ToArray();
|
||||||
|
BuildBVH();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2266,6 +2497,7 @@ namespace CodeWalker.GameFiles
|
|||||||
public abstract Vector3 Scale { get; set; }
|
public abstract Vector3 Scale { get; set; }
|
||||||
public abstract Vector3 Position { get; set; }
|
public abstract Vector3 Position { get; set; }
|
||||||
public abstract Quaternion Orientation { get; set; }
|
public abstract Quaternion Orientation { get; set; }
|
||||||
|
public abstract int[] VertexIndices { get; set; }
|
||||||
public abstract BoundVertexRef NearestVertex(Vector3 p);
|
public abstract BoundVertexRef NearestVertex(Vector3 p);
|
||||||
public abstract void GatherVertices(Dictionary<BoundVertex, int> verts);
|
public abstract void GatherVertices(Dictionary<BoundVertex, int> verts);
|
||||||
public abstract void Read(byte[] bytes, int offset);
|
public abstract void Read(byte[] bytes, int offset);
|
||||||
@ -2292,9 +2524,9 @@ namespace CodeWalker.GameFiles
|
|||||||
public short edgeIndex2 { get; set; }
|
public short edgeIndex2 { get; set; }
|
||||||
public short edgeIndex3 { get; set; }
|
public short edgeIndex3 { get; set; }
|
||||||
|
|
||||||
public int vertIndex1 { get { return (triIndex1 & 0x7FFF); } }
|
public int vertIndex1 { get { return (triIndex1 & 0x7FFF); } set { triIndex1 = (ushort)((value & 0x7FFF) + (vertFlag1 ? 0x8000 : 0)); } }
|
||||||
public int vertIndex2 { get { return (triIndex2 & 0x7FFF); } }
|
public int vertIndex2 { get { return (triIndex2 & 0x7FFF); } set { triIndex2 = (ushort)((value & 0x7FFF) + (vertFlag2 ? 0x8000 : 0)); } }
|
||||||
public int vertIndex3 { get { return (triIndex3 & 0x7FFF); } }
|
public int vertIndex3 { get { return (triIndex3 & 0x7FFF); } set { triIndex3 = (ushort)((value & 0x7FFF) + (vertFlag3 ? 0x8000 : 0)); } }
|
||||||
public bool vertFlag1 { get { return (triIndex1 & 0x8000) > 0; } set { triIndex1 = (ushort)(vertIndex1 + (value ? 0x8000 : 0)); } }
|
public bool vertFlag1 { get { return (triIndex1 & 0x8000) > 0; } set { triIndex1 = (ushort)(vertIndex1 + (value ? 0x8000 : 0)); } }
|
||||||
public bool vertFlag2 { get { return (triIndex2 & 0x8000) > 0; } set { triIndex2 = (ushort)(vertIndex2 + (value ? 0x8000 : 0)); } }
|
public bool vertFlag2 { get { return (triIndex2 & 0x8000) > 0; } set { triIndex2 = (ushort)(vertIndex2 + (value ? 0x8000 : 0)); } }
|
||||||
public bool vertFlag3 { get { return (triIndex3 & 0x8000) > 0; } set { triIndex3 = (ushort)(vertIndex3 + (value ? 0x8000 : 0)); } }
|
public bool vertFlag3 { get { return (triIndex3 & 0x8000) > 0; } set { triIndex3 = (ushort)(vertIndex3 + (value ? 0x8000 : 0)); } }
|
||||||
@ -2397,6 +2629,22 @@ namespace CodeWalker.GameFiles
|
|||||||
private Quaternion? OrientationCached;
|
private Quaternion? OrientationCached;
|
||||||
private Vector3? ScaleCached;
|
private Vector3? ScaleCached;
|
||||||
|
|
||||||
|
public override int[] VertexIndices
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new[] { vertIndex1, vertIndex2, vertIndex3 };
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value?.Length >= 3)
|
||||||
|
{
|
||||||
|
vertIndex1 = value[0];
|
||||||
|
vertIndex2 = value[1];
|
||||||
|
vertIndex3 = value[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
public override BoundVertexRef NearestVertex(Vector3 p)
|
public override BoundVertexRef NearestVertex(Vector3 p)
|
||||||
{
|
{
|
||||||
var d1 = (p - Vertex1).Length();
|
var d1 = (p - Vertex1).Length();
|
||||||
@ -2416,6 +2664,30 @@ namespace CodeWalker.GameFiles
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetEdgeIndex(int edgeid, short polyindex)
|
||||||
|
{
|
||||||
|
switch (edgeid)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
if (edgeIndex1 != polyindex)
|
||||||
|
{ }
|
||||||
|
edgeIndex1 = polyindex;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if (edgeIndex2 != polyindex)
|
||||||
|
{ }
|
||||||
|
edgeIndex2 = polyindex;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if (edgeIndex3 != polyindex)
|
||||||
|
{ }
|
||||||
|
edgeIndex3 = polyindex;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public BoundPolygonTriangle()
|
public BoundPolygonTriangle()
|
||||||
{
|
{
|
||||||
Type = BoundPolygonType.Triangle;
|
Type = BoundPolygonType.Triangle;
|
||||||
@ -2494,6 +2766,20 @@ namespace CodeWalker.GameFiles
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override int[] VertexIndices
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new[] { (int)sphereIndex };
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value?.Length >= 1)
|
||||||
|
{
|
||||||
|
sphereIndex = (ushort)value[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
public override BoundVertexRef NearestVertex(Vector3 p)
|
public override BoundVertexRef NearestVertex(Vector3 p)
|
||||||
{
|
{
|
||||||
return new BoundVertexRef(sphereIndex, sphereRadius);
|
return new BoundVertexRef(sphereIndex, sphereRadius);
|
||||||
@ -2627,6 +2913,21 @@ namespace CodeWalker.GameFiles
|
|||||||
private Quaternion? OrientationCached;
|
private Quaternion? OrientationCached;
|
||||||
private Vector3? ScaleCached;
|
private Vector3? ScaleCached;
|
||||||
|
|
||||||
|
public override int[] VertexIndices
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new[] { (int)capsuleIndex1, (int)capsuleIndex2 };
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value?.Length >= 2)
|
||||||
|
{
|
||||||
|
capsuleIndex1 = (ushort)value[0];
|
||||||
|
capsuleIndex2 = (ushort)value[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
public override BoundVertexRef NearestVertex(Vector3 p)
|
public override BoundVertexRef NearestVertex(Vector3 p)
|
||||||
{
|
{
|
||||||
var d1 = (p - Vertex1).Length();
|
var d1 = (p - Vertex1).Length();
|
||||||
@ -2787,6 +3088,23 @@ namespace CodeWalker.GameFiles
|
|||||||
private Quaternion? OrientationCached;
|
private Quaternion? OrientationCached;
|
||||||
private Vector3? ScaleCached;
|
private Vector3? ScaleCached;
|
||||||
|
|
||||||
|
public override int[] VertexIndices
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new[] { (int)boxIndex1, (int)boxIndex2, (int)boxIndex3, (int)boxIndex4 };
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value?.Length >= 2)
|
||||||
|
{
|
||||||
|
boxIndex1 = (short)value[0];
|
||||||
|
boxIndex2 = (short)value[1];
|
||||||
|
boxIndex3 = (short)value[2];
|
||||||
|
boxIndex4 = (short)value[3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
public override BoundVertexRef NearestVertex(Vector3 p)
|
public override BoundVertexRef NearestVertex(Vector3 p)
|
||||||
{
|
{
|
||||||
var d1 = (p - Vertex1).Length();
|
var d1 = (p - Vertex1).Length();
|
||||||
@ -2932,6 +3250,21 @@ namespace CodeWalker.GameFiles
|
|||||||
private Quaternion? OrientationCached;
|
private Quaternion? OrientationCached;
|
||||||
private Vector3? ScaleCached;
|
private Vector3? ScaleCached;
|
||||||
|
|
||||||
|
public override int[] VertexIndices
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new[] { (int)cylinderIndex1, (int)cylinderIndex2 };
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value?.Length >= 2)
|
||||||
|
{
|
||||||
|
cylinderIndex1 = (ushort)value[0];
|
||||||
|
cylinderIndex2 = (ushort)value[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
public override BoundVertexRef NearestVertex(Vector3 p)
|
public override BoundVertexRef NearestVertex(Vector3 p)
|
||||||
{
|
{
|
||||||
var d1 = (p - Vertex1).Length();
|
var d1 = (p - Vertex1).Length();
|
||||||
@ -2977,6 +3310,31 @@ namespace CodeWalker.GameFiles
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[TC(typeof(EXP))] public struct BoundEdgeRef //convenience struct for updating edge indices
|
||||||
|
{
|
||||||
|
public int Vertex1 { get; set; }
|
||||||
|
public int Vertex2 { get; set; }
|
||||||
|
|
||||||
|
public BoundEdgeRef(int i1, int i2)
|
||||||
|
{
|
||||||
|
Vertex1 = Math.Min(i1, i2);
|
||||||
|
Vertex2 = Math.Max(i1, i2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[TC(typeof(EXP))] public class BoundEdge //convenience class for updating edge indices
|
||||||
|
{
|
||||||
|
public BoundPolygonTriangle Triangle1 { get; set; }
|
||||||
|
public BoundPolygonTriangle Triangle2 { get; set; }
|
||||||
|
public int EdgeID1 { get; set; }
|
||||||
|
public int EdgeID2 { get; set; }
|
||||||
|
|
||||||
|
public BoundEdge(BoundPolygonTriangle t1, int e1)
|
||||||
|
{
|
||||||
|
Triangle1 = t1;
|
||||||
|
EdgeID1 = e1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[TC(typeof(EXP))] public struct BoundVertexRef //convenience struct for BoundPolygon.NearestVertex and SpaceRayIntersectResult
|
[TC(typeof(EXP))] public struct BoundVertexRef //convenience struct for BoundPolygon.NearestVertex and SpaceRayIntersectResult
|
||||||
{
|
{
|
||||||
public int Index { get; set; }
|
public int Index { get; set; }
|
||||||
|
@ -1105,6 +1105,9 @@ namespace CodeWalker.World
|
|||||||
{ testcomplete = false; continue; } //ybn not loaded yet...
|
{ testcomplete = false; continue; } //ybn not loaded yet...
|
||||||
|
|
||||||
var b = ybn.Bounds;
|
var b = ybn.Bounds;
|
||||||
|
if (b == null)
|
||||||
|
{ continue; }
|
||||||
|
|
||||||
var bhit = b.RayIntersect(ref ray, res.HitDist);
|
var bhit = b.RayIntersect(ref ray, res.HitDist);
|
||||||
if (bhit.Hit)
|
if (bhit.Hit)
|
||||||
{
|
{
|
||||||
@ -1355,6 +1358,9 @@ namespace CodeWalker.World
|
|||||||
{ testcomplete = false; continue; } //ybn not loaded yet...
|
{ testcomplete = false; continue; } //ybn not loaded yet...
|
||||||
|
|
||||||
var b = ybn.Bounds;
|
var b = ybn.Bounds;
|
||||||
|
if (b == null)
|
||||||
|
{ continue; }
|
||||||
|
|
||||||
var bhit = b.SphereIntersect(ref sph);
|
var bhit = b.SphereIntersect(ref sph);
|
||||||
res.TryUpdate(ref bhit);
|
res.TryUpdate(ref bhit);
|
||||||
}
|
}
|
||||||
|
@ -3136,18 +3136,34 @@ namespace CodeWalker.Project
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var parent = CurrentCollisionBounds.Parent;
|
||||||
|
|
||||||
bool res = false;
|
bool res = false;
|
||||||
if (WorldForm != null)
|
if (WorldForm != null)
|
||||||
{
|
{
|
||||||
lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering...
|
lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering...
|
||||||
{
|
{
|
||||||
res = CurrentYbnFile.RemoveBounds(CurrentCollisionBounds);
|
if (parent != null)
|
||||||
|
{
|
||||||
|
res = parent.DeleteChild(CurrentCollisionBounds);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
res = CurrentYbnFile.RemoveBounds(CurrentCollisionBounds);
|
||||||
|
}
|
||||||
//WorldForm.SelectItem(null, null, null);
|
//WorldForm.SelectItem(null, null, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
res = CurrentYbnFile.RemoveBounds(CurrentCollisionBounds);
|
if (parent != null)
|
||||||
|
{
|
||||||
|
res = parent.DeleteChild(CurrentCollisionBounds);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
res = CurrentYbnFile.RemoveBounds(CurrentCollisionBounds);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!res)
|
if (!res)
|
||||||
{
|
{
|
||||||
@ -3163,8 +3179,20 @@ namespace CodeWalker.Project
|
|||||||
|
|
||||||
CurrentCollisionBounds = null;
|
CurrentCollisionBounds = null;
|
||||||
|
|
||||||
|
if (parent != null)
|
||||||
|
{
|
||||||
|
if (WorldForm != null)
|
||||||
|
{
|
||||||
|
WorldForm.UpdateCollisionBoundsGraphics(parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
public bool IsCurrentCollisionBounds(Bounds bounds)
|
||||||
|
{
|
||||||
|
return bounds == CurrentCollisionBounds;
|
||||||
|
}
|
||||||
|
|
||||||
public void NewCollisionPoly(BoundPolygonType type, BoundPolygon copy = null)
|
public void NewCollisionPoly(BoundPolygonType type, BoundPolygon copy = null)
|
||||||
{
|
{
|
||||||
@ -3218,13 +3246,13 @@ namespace CodeWalker.Project
|
|||||||
{
|
{
|
||||||
lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering...
|
lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering...
|
||||||
{
|
{
|
||||||
res = CurrentYbnFile.RemovePoly(CurrentCollisionPoly);
|
res = CurrentCollisionPoly.Owner.DeletePolygon(CurrentCollisionPoly);
|
||||||
//WorldForm.SelectItem(null, null, null);
|
//WorldForm.SelectItem(null, null, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
res = CurrentYbnFile.RemovePoly(CurrentCollisionPoly);
|
res = CurrentCollisionPoly.Owner.DeletePolygon(CurrentCollisionPoly);
|
||||||
}
|
}
|
||||||
if (!res)
|
if (!res)
|
||||||
{
|
{
|
||||||
@ -3240,8 +3268,17 @@ namespace CodeWalker.Project
|
|||||||
|
|
||||||
CurrentCollisionPoly = null;
|
CurrentCollisionPoly = null;
|
||||||
|
|
||||||
|
if (WorldForm != null)
|
||||||
|
{
|
||||||
|
WorldForm.UpdateCollisionBoundsGraphics(CurrentCollisionBounds);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
public bool IsCurrentCollisionPoly(BoundPolygon poly)
|
||||||
|
{
|
||||||
|
return poly == CurrentCollisionPoly;
|
||||||
|
}
|
||||||
|
|
||||||
public void AddCollisionVertexToProject()
|
public void AddCollisionVertexToProject()
|
||||||
{
|
{
|
||||||
@ -3288,13 +3325,13 @@ namespace CodeWalker.Project
|
|||||||
{
|
{
|
||||||
lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering...
|
lock (WorldForm.RenderSyncRoot) //don't try to do this while rendering...
|
||||||
{
|
{
|
||||||
res = CurrentYbnFile.RemoveVertex(CurrentCollisionVertex);
|
res = CurrentCollisionVertex.Owner.DeleteVertex(CurrentCollisionVertex.Index);
|
||||||
//WorldForm.SelectItem(null, null, null);
|
//WorldForm.SelectItem(null, null, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
res = CurrentYbnFile.RemoveVertex(CurrentCollisionVertex);
|
res = CurrentCollisionVertex.Owner.DeleteVertex(CurrentCollisionVertex.Index);
|
||||||
}
|
}
|
||||||
if (!res)
|
if (!res)
|
||||||
{
|
{
|
||||||
@ -3312,6 +3349,10 @@ namespace CodeWalker.Project
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
public bool IsCurrentCollisionVertex(BoundVertex vertex)
|
||||||
|
{
|
||||||
|
return vertex == CurrentCollisionVertex;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -3261,7 +3261,7 @@ namespace CodeWalker.Rendering
|
|||||||
}
|
}
|
||||||
|
|
||||||
RenderableBoundComposite rndbc = renderableCache.GetRenderableBoundComp(bounds);
|
RenderableBoundComposite rndbc = renderableCache.GetRenderableBoundComp(bounds);
|
||||||
if (rndbc.IsLoaded)
|
if ((rndbc != null) && rndbc.IsLoaded)
|
||||||
{
|
{
|
||||||
RenderableBoundGeometryInst rbginst = new RenderableBoundGeometryInst();
|
RenderableBoundGeometryInst rbginst = new RenderableBoundGeometryInst();
|
||||||
rbginst.Inst.Renderable = rndbc;
|
rbginst.Inst.Renderable = rndbc;
|
||||||
|
@ -179,6 +179,11 @@ namespace CodeWalker
|
|||||||
SelectionExtensionTabPage.Text = "Archetype Extension";
|
SelectionExtensionTabPage.Text = "Archetype Extension";
|
||||||
SelExtensionPropertyGrid.SelectedObject = item.ArchetypeExtension;
|
SelExtensionPropertyGrid.SelectedObject = item.ArchetypeExtension;
|
||||||
}
|
}
|
||||||
|
else if (item.CollisionVertex != null)
|
||||||
|
{
|
||||||
|
SelectionExtensionTabPage.Text = "Collision Vertex";
|
||||||
|
SelExtensionPropertyGrid.SelectedObject = item.CollisionVertex;
|
||||||
|
}
|
||||||
else if (item.CollisionPoly != null)
|
else if (item.CollisionPoly != null)
|
||||||
{
|
{
|
||||||
SelectionExtensionTabPage.Text = "Collision Polygon";
|
SelectionExtensionTabPage.Text = "Collision Polygon";
|
||||||
|
109
WorldForm.cs
109
WorldForm.cs
@ -3841,15 +3841,26 @@ namespace CodeWalker
|
|||||||
SelExtensionPropertyGrid.SelectedObject = item.ArchetypeExtension;
|
SelExtensionPropertyGrid.SelectedObject = item.ArchetypeExtension;
|
||||||
ShowSelectedExtensionTab(true);
|
ShowSelectedExtensionTab(true);
|
||||||
}
|
}
|
||||||
|
else if (item.CollisionVertex != null)
|
||||||
|
{
|
||||||
|
SelExtensionPropertyGrid.SelectedObject = item.CollisionVertex;
|
||||||
|
ShowSelectedExtensionTab(true, "Coll");
|
||||||
|
ToolbarDeleteItemButton.Enabled = true;
|
||||||
|
ToolbarDeleteItemButton.Text = "Delete collision vertex";
|
||||||
|
}
|
||||||
else if (item.CollisionPoly != null)
|
else if (item.CollisionPoly != null)
|
||||||
{
|
{
|
||||||
SelExtensionPropertyGrid.SelectedObject = item.CollisionPoly;
|
SelExtensionPropertyGrid.SelectedObject = item.CollisionPoly;
|
||||||
ShowSelectedExtensionTab(true, "Coll");
|
ShowSelectedExtensionTab(true, "Coll");
|
||||||
|
ToolbarDeleteItemButton.Enabled = true;
|
||||||
|
ToolbarDeleteItemButton.Text = "Delete collision poly";
|
||||||
}
|
}
|
||||||
else if (item.CollisionBounds != null)
|
else if (item.CollisionBounds != null)
|
||||||
{
|
{
|
||||||
SelExtensionPropertyGrid.SelectedObject = item.CollisionBounds;
|
SelExtensionPropertyGrid.SelectedObject = item.CollisionBounds;
|
||||||
ShowSelectedExtensionTab(true, "Coll");
|
ShowSelectedExtensionTab(true, "Coll");
|
||||||
|
ToolbarDeleteItemButton.Enabled = true;
|
||||||
|
ToolbarDeleteItemButton.Text = "Delete collision bounds";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -5100,6 +5111,9 @@ namespace CodeWalker
|
|||||||
else if (SelectedItem.ScenarioNode != null) DeleteScenarioNode();
|
else if (SelectedItem.ScenarioNode != null) DeleteScenarioNode();
|
||||||
else if (SelectedItem.Audio?.AudioZone != null) DeleteAudioZone();
|
else if (SelectedItem.Audio?.AudioZone != null) DeleteAudioZone();
|
||||||
else if (SelectedItem.Audio?.AudioEmitter != null) DeleteAudioEmitter();
|
else if (SelectedItem.Audio?.AudioEmitter != null) DeleteAudioEmitter();
|
||||||
|
else if (SelectedItem.CollisionVertex != null) DeleteCollisionVertex();
|
||||||
|
else if (SelectedItem.CollisionPoly != null) DeleteCollisionPoly();
|
||||||
|
else if (SelectedItem.CollisionBounds != null) DeleteCollisionBounds();
|
||||||
}
|
}
|
||||||
private void CopyItem()
|
private void CopyItem()
|
||||||
{
|
{
|
||||||
@ -5695,6 +5709,101 @@ namespace CodeWalker
|
|||||||
ProjectForm.NewAudioEmitter(SelectedItem.Audio, true);
|
ProjectForm.NewAudioEmitter(SelectedItem.Audio, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void DeleteCollisionVertex()
|
||||||
|
{
|
||||||
|
var vertex = SelectedItem.CollisionVertex;
|
||||||
|
if (vertex == null) return;
|
||||||
|
|
||||||
|
if ((ProjectForm != null) && (ProjectForm.IsCurrentCollisionVertex(vertex)))
|
||||||
|
{
|
||||||
|
if (!ProjectForm.DeleteCollisionVertex())
|
||||||
|
{
|
||||||
|
//MessageBox.Show("Unable to delete this collision vertex from the current project. Make sure the ybn file exists in the current project.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SelectItem(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//project not open, or vertex not selected there, just remove the vertex from the geometry...
|
||||||
|
var bgeom = vertex.Owner;
|
||||||
|
if ((bgeom == null) || (!bgeom.DeleteVertex(vertex.Index)))
|
||||||
|
{
|
||||||
|
MessageBox.Show("Unable to remove vertex.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UpdateCollisionBoundsGraphics(bgeom);
|
||||||
|
SelectItem(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void DeleteCollisionBounds()
|
||||||
|
{
|
||||||
|
var bounds = SelectedItem.CollisionBounds;
|
||||||
|
if (bounds == null) return;
|
||||||
|
|
||||||
|
if ((ProjectForm != null) && (ProjectForm.IsCurrentCollisionBounds(bounds)))
|
||||||
|
{
|
||||||
|
if (!ProjectForm.DeleteCollisionBounds())
|
||||||
|
{
|
||||||
|
//MessageBox.Show("Unable to delete this collision bounds from the current project. Make sure the ybn file exists in the current project.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SelectItem(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var parent = bounds.Parent;
|
||||||
|
if (parent != null)
|
||||||
|
{
|
||||||
|
parent.DeleteChild(bounds);
|
||||||
|
UpdateCollisionBoundsGraphics(parent);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var ybn = bounds.GetRootYbn();
|
||||||
|
ybn.RemoveBounds(bounds);
|
||||||
|
}
|
||||||
|
|
||||||
|
SelectItem(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void DeleteCollisionPoly()
|
||||||
|
{
|
||||||
|
var poly = SelectedItem.CollisionPoly;
|
||||||
|
if (poly == null) return;
|
||||||
|
|
||||||
|
if ((ProjectForm != null) && (ProjectForm.IsCurrentCollisionPoly(poly)))
|
||||||
|
{
|
||||||
|
if (!ProjectForm.DeleteCollisionPoly())
|
||||||
|
{
|
||||||
|
//MessageBox.Show("Unable to delete this collision polygon from the current project. Make sure the ybn file exists in the current project.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SelectItem(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//project not open, or polygon not selected there, just remove the vertex from the geometry...
|
||||||
|
var bgeom = poly.Owner;
|
||||||
|
if ((bgeom == null) || (!bgeom.DeletePolygon(poly)))
|
||||||
|
{
|
||||||
|
MessageBox.Show("Unable to remove polygon.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UpdateCollisionBoundsGraphics(bgeom);
|
||||||
|
SelectItem(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private void SetMouseSelect(bool enable)
|
private void SetMouseSelect(bool enable)
|
||||||
|
Loading…
Reference in New Issue
Block a user