mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2024-12-01 19:32:54 +08:00
Collisions editing beginnings
This commit is contained in:
parent
f51d5644fd
commit
d85f5eddb2
@ -130,7 +130,7 @@ namespace CodeWalker.GameFiles
|
|||||||
public float BoundingBoxVolume { get; set; }
|
public float BoundingBoxVolume { get; set; }
|
||||||
|
|
||||||
|
|
||||||
public Bounds Parent { get; set; }
|
public BoundComposite Parent { get; set; }
|
||||||
public string OwnerName { get; set; }
|
public string OwnerName { get; set; }
|
||||||
public string GetName()
|
public string GetName()
|
||||||
{
|
{
|
||||||
@ -147,6 +147,49 @@ namespace CodeWalker.GameFiles
|
|||||||
public Matrix Transform { get; set; } = Matrix.Identity; //when it's the child of a bound composite
|
public Matrix Transform { get; set; } = Matrix.Identity; //when it's the child of a bound composite
|
||||||
public Matrix TransformInv { get; set; } = Matrix.Identity;
|
public Matrix TransformInv { get; set; } = Matrix.Identity;
|
||||||
|
|
||||||
|
public virtual Vector3 Scale
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Transform.ScaleVector;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
var m = Transform;
|
||||||
|
m.ScaleVector = value;
|
||||||
|
Transform = m;
|
||||||
|
TransformInv = Matrix.Invert(m);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public virtual Vector3 Position
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Transform.TranslationVector;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
var m = Transform;
|
||||||
|
m.TranslationVector = value;
|
||||||
|
Transform = m;
|
||||||
|
TransformInv = Matrix.Invert(m);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public virtual Quaternion Orientation
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Transform.ToQuaternion();
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
var m = value.ToMatrix();
|
||||||
|
m.TranslationVector = Transform.TranslationVector;
|
||||||
|
m.ScaleVector = Transform.ScaleVector;
|
||||||
|
Transform = m;
|
||||||
|
TransformInv = Matrix.Invert(m);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Reads the data-block from a stream.
|
/// Reads the data-block from a stream.
|
||||||
@ -1365,6 +1408,9 @@ namespace CodeWalker.GameFiles
|
|||||||
public BoundPolygonType Type { get; set; }
|
public BoundPolygonType Type { get; set; }
|
||||||
public BoundGeometry Owner { get; set; } //for browsing/editing convenience
|
public BoundGeometry Owner { get; set; } //for browsing/editing convenience
|
||||||
public int Index { get; set; } //for editing convenience, not stored
|
public int Index { get; set; } //for editing convenience, not stored
|
||||||
|
public abstract Vector3 Scale { get; set; }
|
||||||
|
public abstract Vector3 Position { get; set; }
|
||||||
|
public abstract Quaternion Orientation { get; set; }
|
||||||
public abstract void Read(byte[] bytes, int offset);
|
public abstract void Read(byte[] bytes, int offset);
|
||||||
public abstract void Write(BinaryWriter bw);
|
public abstract void Write(BinaryWriter bw);
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
@ -1405,6 +1451,41 @@ namespace CodeWalker.GameFiles
|
|||||||
set { if (Owner != null) Owner.SetVertexPos(vertIndex3, value); }
|
set { if (Owner != null) Owner.SetVertexPos(vertIndex3, value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override Vector3 Scale
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Vector3.One;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override Vector3 Position
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return (Vertex1 + Vertex2 + Vertex3) * (1.0f / 3.0f);
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
var offset = value - Position;
|
||||||
|
Vertex1 += offset;
|
||||||
|
Vertex2 += offset;
|
||||||
|
Vertex3 += offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override Quaternion Orientation
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Quaternion.Identity;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public BoundPolygonTriangle()
|
public BoundPolygonTriangle()
|
||||||
{
|
{
|
||||||
Type = BoundPolygonType.Triangle;
|
Type = BoundPolygonType.Triangle;
|
||||||
@ -1442,11 +1523,31 @@ namespace CodeWalker.GameFiles
|
|||||||
public uint unused0 { get; set; }
|
public uint unused0 { get; set; }
|
||||||
public uint unused1 { get; set; }
|
public uint unused1 { get; set; }
|
||||||
|
|
||||||
public Vector3 Position
|
public override Vector3 Scale
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Vector3.One;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override Vector3 Position
|
||||||
{
|
{
|
||||||
get { return (Owner != null) ? Owner.GetVertexPos(sphereIndex) : Vector3.Zero; }
|
get { return (Owner != null) ? Owner.GetVertexPos(sphereIndex) : Vector3.Zero; }
|
||||||
set { if (Owner != null) Owner.SetVertexPos(sphereIndex, value); }
|
set { if (Owner != null) Owner.SetVertexPos(sphereIndex, value); }
|
||||||
}
|
}
|
||||||
|
public override Quaternion Orientation
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Quaternion.Identity;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public BoundPolygonSphere()
|
public BoundPolygonSphere()
|
||||||
{
|
{
|
||||||
@ -1493,6 +1594,40 @@ namespace CodeWalker.GameFiles
|
|||||||
set { if (Owner != null) Owner.SetVertexPos(capsuleIndex2, value); }
|
set { if (Owner != null) Owner.SetVertexPos(capsuleIndex2, value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override Vector3 Scale
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Vector3.One;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override Vector3 Position
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return (Vertex1 + Vertex2) * 0.5f;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
var offset = value - Position;
|
||||||
|
Vertex1 += offset;
|
||||||
|
Vertex2 += offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override Quaternion Orientation
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Quaternion.Identity;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public BoundPolygonCapsule()
|
public BoundPolygonCapsule()
|
||||||
{
|
{
|
||||||
Type = BoundPolygonType.Capsule;
|
Type = BoundPolygonType.Capsule;
|
||||||
@ -1550,6 +1685,42 @@ namespace CodeWalker.GameFiles
|
|||||||
set { if (Owner != null) Owner.SetVertexPos(boxIndex4, value); }
|
set { if (Owner != null) Owner.SetVertexPos(boxIndex4, value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override Vector3 Scale
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Vector3.One;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override Vector3 Position
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return (Vertex1 + Vertex2 + Vertex3 + Vertex4) * 0.25f;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
var offset = value - Position;
|
||||||
|
Vertex1 += offset;
|
||||||
|
Vertex2 += offset;
|
||||||
|
Vertex3 += offset;
|
||||||
|
Vertex4 += offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override Quaternion Orientation
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Quaternion.Identity;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public BoundPolygonBox()
|
public BoundPolygonBox()
|
||||||
{
|
{
|
||||||
Type = BoundPolygonType.Box;
|
Type = BoundPolygonType.Box;
|
||||||
@ -1597,6 +1768,40 @@ namespace CodeWalker.GameFiles
|
|||||||
set { if (Owner != null) Owner.SetVertexPos(cylinderIndex2, value); }
|
set { if (Owner != null) Owner.SetVertexPos(cylinderIndex2, value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override Vector3 Scale
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Vector3.One;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override Vector3 Position
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return (Vertex1 + Vertex2) * 0.5f;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
var offset = value - Position;
|
||||||
|
Vertex1 += offset;
|
||||||
|
Vertex2 += offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override Quaternion Orientation
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Quaternion.Identity;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public BoundPolygonCylinder()
|
public BoundPolygonCylinder()
|
||||||
{
|
{
|
||||||
Type = BoundPolygonType.Cylinder;
|
Type = BoundPolygonType.Cylinder;
|
||||||
@ -1708,6 +1913,14 @@ namespace CodeWalker.GameFiles
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void BuildBVH()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public override SpaceSphereIntersectResult SphereIntersect(ref BoundingSphere sph)
|
public override SpaceSphereIntersectResult SphereIntersect(ref BoundingSphere sph)
|
||||||
{
|
{
|
||||||
var res = new SpaceSphereIntersectResult();
|
var res = new SpaceSphereIntersectResult();
|
||||||
@ -1742,11 +1955,11 @@ namespace CodeWalker.GameFiles
|
|||||||
box.Maximum = new Vector3(node.MaxX, node.MaxY, node.MaxZ) * q + c;
|
box.Maximum = new Vector3(node.MaxX, node.MaxY, node.MaxZ) * q + c;
|
||||||
bool nodehit = sph.Intersects(ref box);
|
bool nodehit = sph.Intersects(ref box);
|
||||||
bool nodeskip = !nodehit;
|
bool nodeskip = !nodehit;
|
||||||
if (node.PolyCount <= 0) //intermediate node with child nodes
|
if (node.ItemCount <= 0) //intermediate node with child nodes
|
||||||
{
|
{
|
||||||
if (nodeskip)
|
if (nodeskip)
|
||||||
{
|
{
|
||||||
nodeind += node.PolyId; //(child node count)
|
nodeind += node.ItemId; //(child node count)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1757,9 +1970,9 @@ namespace CodeWalker.GameFiles
|
|||||||
{
|
{
|
||||||
if (!nodeskip)
|
if (!nodeskip)
|
||||||
{
|
{
|
||||||
var lastp = Math.Min(node.PolyId + node.PolyCount, (int)PolygonsCount);
|
var lastp = Math.Min(node.ItemId + node.ItemCount, (int)PolygonsCount);
|
||||||
|
|
||||||
SphereIntersectPolygons(ref sph, ref res, node.PolyId, lastp);
|
SphereIntersectPolygons(ref sph, ref res, node.ItemId, lastp);
|
||||||
|
|
||||||
}
|
}
|
||||||
nodeind++;
|
nodeind++;
|
||||||
@ -1812,11 +2025,11 @@ namespace CodeWalker.GameFiles
|
|||||||
box.Maximum = new Vector3(node.MaxX, node.MaxY, node.MaxZ) * q + c;
|
box.Maximum = new Vector3(node.MaxX, node.MaxY, node.MaxZ) * q + c;
|
||||||
bool nodehit = ray.Intersects(ref box, out bvhboxhittest);
|
bool nodehit = ray.Intersects(ref box, out bvhboxhittest);
|
||||||
bool nodeskip = !nodehit || (bvhboxhittest > res.HitDist);
|
bool nodeskip = !nodehit || (bvhboxhittest > res.HitDist);
|
||||||
if (node.PolyCount <= 0) //intermediate node with child nodes
|
if (node.ItemCount <= 0) //intermediate node with child nodes
|
||||||
{
|
{
|
||||||
if (nodeskip)
|
if (nodeskip)
|
||||||
{
|
{
|
||||||
nodeind += node.PolyId; //(child node count)
|
nodeind += node.ItemId; //(child node count)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1827,9 +2040,9 @@ namespace CodeWalker.GameFiles
|
|||||||
{
|
{
|
||||||
if (!nodeskip)
|
if (!nodeskip)
|
||||||
{
|
{
|
||||||
var lastp = Math.Min(node.PolyId + node.PolyCount, (int)PolygonsCount);
|
var lastp = Math.Min(node.ItemId + node.ItemCount, (int)PolygonsCount);
|
||||||
|
|
||||||
RayIntersectPolygons(ref ray, ref res, node.PolyId, lastp);
|
RayIntersectPolygons(ref ray, ref res, node.ItemId, lastp);
|
||||||
|
|
||||||
}
|
}
|
||||||
nodeind++;
|
nodeind++;
|
||||||
@ -2008,6 +2221,15 @@ namespace CodeWalker.GameFiles
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void BuildBVH()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public override SpaceSphereIntersectResult SphereIntersect(ref BoundingSphere sph)
|
public override SpaceSphereIntersectResult SphereIntersect(ref BoundingSphere sph)
|
||||||
{
|
{
|
||||||
var res = new SpaceSphereIntersectResult();
|
var res = new SpaceSphereIntersectResult();
|
||||||
@ -2218,12 +2440,12 @@ namespace CodeWalker.GameFiles
|
|||||||
public short MaxX { get; set; }
|
public short MaxX { get; set; }
|
||||||
public short MaxY { get; set; }
|
public short MaxY { get; set; }
|
||||||
public short MaxZ { get; set; }
|
public short MaxZ { get; set; }
|
||||||
public short PolyId { get; set; }
|
public short ItemId { get; set; }
|
||||||
public short PolyCount { get; set; }
|
public short ItemCount { get; set; }
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
return PolyId.ToString() + ": " + PolyCount.ToString();
|
return ItemId.ToString() + ": " + ItemCount.ToString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,6 +45,12 @@ namespace CodeWalker
|
|||||||
return new Vector4(x, y, z, w);
|
return new Vector4(x, y, z, w);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Quaternion ToQuaternion(this Matrix m)
|
||||||
|
{
|
||||||
|
var rmat = m;
|
||||||
|
rmat.TranslationVector = Vector3.Zero;
|
||||||
|
return Quaternion.RotationMatrix(rmat);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,6 +65,7 @@ namespace CodeWalker.Project
|
|||||||
Dictionary<YnvFile, int> navYnvs = new Dictionary<YnvFile, int>();
|
Dictionary<YnvFile, int> navYnvs = new Dictionary<YnvFile, int>();
|
||||||
Dictionary<TrainTrack, int> trainTracks = new Dictionary<TrainTrack, int>();
|
Dictionary<TrainTrack, int> trainTracks = new Dictionary<TrainTrack, int>();
|
||||||
Dictionary<YmtFile, int> scenarioYmts = new Dictionary<YmtFile, int>();
|
Dictionary<YmtFile, int> scenarioYmts = new Dictionary<YmtFile, int>();
|
||||||
|
Dictionary<Bounds, int> bounds = new Dictionary<Bounds, int>();
|
||||||
|
|
||||||
if (Items != null)
|
if (Items != null)
|
||||||
{
|
{
|
||||||
@ -94,9 +95,21 @@ namespace CodeWalker.Project
|
|||||||
{
|
{
|
||||||
scenarioYmts[item.ScenarioNode.Ymt] = 1;
|
scenarioYmts[item.ScenarioNode.Ymt] = 1;
|
||||||
}
|
}
|
||||||
|
if (item.CollisionBounds != null)
|
||||||
|
{
|
||||||
|
bounds[item.CollisionBounds] = 1;
|
||||||
|
}
|
||||||
|
if (item.CollisionPoly?.Owner != null)
|
||||||
|
{
|
||||||
|
bounds[item.CollisionPoly.Owner] = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var kvp in bounds)
|
||||||
|
{
|
||||||
|
wf.UpdateCollisionBoundsGraphics(kvp.Key);
|
||||||
|
}
|
||||||
foreach (var kvp in pathYnds)
|
foreach (var kvp in pathYnds)
|
||||||
{
|
{
|
||||||
wf.UpdatePathYndGraphics(kvp.Key, true);
|
wf.UpdatePathYndGraphics(kvp.Key, true);
|
||||||
@ -172,7 +185,6 @@ namespace CodeWalker.Project
|
|||||||
return (Entity?._CEntityDef.archetypeName.ToString() ?? "") + ": Position";
|
return (Entity?._CEntityDef.archetypeName.ToString() ?? "") + ": Position";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class EntityRotationUndoStep : UndoStep
|
public class EntityRotationUndoStep : UndoStep
|
||||||
{
|
{
|
||||||
public YmapEntityDef Entity { get; set; }
|
public YmapEntityDef Entity { get; set; }
|
||||||
@ -211,7 +223,6 @@ namespace CodeWalker.Project
|
|||||||
return (Entity?._CEntityDef.archetypeName.ToString() ?? "") + ": Rotation";
|
return (Entity?._CEntityDef.archetypeName.ToString() ?? "") + ": Rotation";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class EntityScaleUndoStep : UndoStep
|
public class EntityScaleUndoStep : UndoStep
|
||||||
{
|
{
|
||||||
public YmapEntityDef Entity { get; set; }
|
public YmapEntityDef Entity { get; set; }
|
||||||
@ -252,6 +263,7 @@ namespace CodeWalker.Project
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public class EntityPivotPositionUndoStep : UndoStep
|
public class EntityPivotPositionUndoStep : UndoStep
|
||||||
{
|
{
|
||||||
public YmapEntityDef Entity { get; set; }
|
public YmapEntityDef Entity { get; set; }
|
||||||
@ -288,7 +300,6 @@ namespace CodeWalker.Project
|
|||||||
return (Entity?._CEntityDef.archetypeName.ToString() ?? "") + ": Pivot Position";
|
return (Entity?._CEntityDef.archetypeName.ToString() ?? "") + ": Pivot Position";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class EntityPivotRotationUndoStep : UndoStep
|
public class EntityPivotRotationUndoStep : UndoStep
|
||||||
{
|
{
|
||||||
public YmapEntityDef Entity { get; set; }
|
public YmapEntityDef Entity { get; set; }
|
||||||
@ -366,7 +377,6 @@ namespace CodeWalker.Project
|
|||||||
return "CarGen " + (CarGen?._CCarGen.carModel.ToString() ?? "") + ": Position";
|
return "CarGen " + (CarGen?._CCarGen.carModel.ToString() ?? "") + ": Position";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class CarGenRotationUndoStep : UndoStep
|
public class CarGenRotationUndoStep : UndoStep
|
||||||
{
|
{
|
||||||
public YmapCarGen CarGen { get; set; }
|
public YmapCarGen CarGen { get; set; }
|
||||||
@ -404,7 +414,6 @@ namespace CodeWalker.Project
|
|||||||
return "CarGen " + (CarGen?._CCarGen.carModel.ToString() ?? "") + ": Rotation";
|
return "CarGen " + (CarGen?._CCarGen.carModel.ToString() ?? "") + ": Rotation";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class CarGenScaleUndoStep : UndoStep
|
public class CarGenScaleUndoStep : UndoStep
|
||||||
{
|
{
|
||||||
public YmapCarGen CarGen { get; set; }
|
public YmapCarGen CarGen { get; set; }
|
||||||
@ -445,6 +454,317 @@ namespace CodeWalker.Project
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public class CollisionPositionUndoStep : UndoStep
|
||||||
|
{
|
||||||
|
public Bounds Bounds { get; set; }
|
||||||
|
public Vector3 StartPosition { get; set; }
|
||||||
|
public Vector3 EndPosition { get; set; }
|
||||||
|
|
||||||
|
public CollisionPositionUndoStep(Bounds bounds, Vector3 startpos, WorldForm wf)
|
||||||
|
{
|
||||||
|
Bounds = bounds;
|
||||||
|
StartPosition = startpos;
|
||||||
|
EndPosition = bounds?.Position ?? Vector3.Zero;
|
||||||
|
|
||||||
|
UpdateGraphics(wf);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update(WorldForm wf, ref MapSelection sel, Vector3 p)
|
||||||
|
{
|
||||||
|
if (Bounds != null)
|
||||||
|
{
|
||||||
|
Bounds.Position = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Bounds != sel.CollisionBounds) wf.SelectCollisionBounds(Bounds);
|
||||||
|
wf.SetWidgetPosition(p);
|
||||||
|
|
||||||
|
UpdateGraphics(wf);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateGraphics(WorldForm wf)
|
||||||
|
{
|
||||||
|
if (Bounds != null)
|
||||||
|
{
|
||||||
|
wf.UpdateCollisionBoundsGraphics(Bounds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Undo(WorldForm wf, ref MapSelection sel)
|
||||||
|
{
|
||||||
|
Update(wf, ref sel, StartPosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Redo(WorldForm wf, ref MapSelection sel)
|
||||||
|
{
|
||||||
|
Update(wf, ref sel, EndPosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "Collision " + (Bounds?.GetName() ?? "") + ": Position";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class CollisionRotationUndoStep : UndoStep
|
||||||
|
{
|
||||||
|
public Bounds Bounds { get; set; }
|
||||||
|
public Quaternion StartRotation { get; set; }
|
||||||
|
public Quaternion EndRotation { get; set; }
|
||||||
|
|
||||||
|
public CollisionRotationUndoStep(Bounds bounds, Quaternion startrot, WorldForm wf)
|
||||||
|
{
|
||||||
|
Bounds = bounds;
|
||||||
|
StartRotation = startrot;
|
||||||
|
EndRotation = bounds?.Orientation ?? Quaternion.Identity;
|
||||||
|
|
||||||
|
UpdateGraphics(wf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void Update(WorldForm wf, ref MapSelection sel, Quaternion q)
|
||||||
|
{
|
||||||
|
if (Bounds != null)
|
||||||
|
{
|
||||||
|
Bounds.Orientation = q;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Bounds != sel.CollisionBounds) wf.SelectCollisionBounds(Bounds);
|
||||||
|
wf.SetWidgetRotation(q);
|
||||||
|
|
||||||
|
UpdateGraphics(wf);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateGraphics(WorldForm wf)
|
||||||
|
{
|
||||||
|
if (Bounds != null)
|
||||||
|
{
|
||||||
|
wf.UpdateCollisionBoundsGraphics(Bounds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Undo(WorldForm wf, ref MapSelection sel)
|
||||||
|
{
|
||||||
|
Update(wf, ref sel, StartRotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Redo(WorldForm wf, ref MapSelection sel)
|
||||||
|
{
|
||||||
|
Update(wf, ref sel, EndRotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "Collision " + (Bounds?.GetName() ?? "") + ": Rotation";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class CollisionScaleUndoStep : UndoStep
|
||||||
|
{
|
||||||
|
public Bounds Bounds { get; set; }
|
||||||
|
public Vector3 StartScale { get; set; }
|
||||||
|
public Vector3 EndScale { get; set; }
|
||||||
|
|
||||||
|
public CollisionScaleUndoStep(Bounds bounds, Vector3 startsca, WorldForm wf)
|
||||||
|
{
|
||||||
|
Bounds = bounds;
|
||||||
|
StartScale = startsca;
|
||||||
|
EndScale = bounds?.Scale ?? Vector3.One;
|
||||||
|
|
||||||
|
UpdateGraphics(wf);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update(WorldForm wf, ref MapSelection sel, Vector3 s)
|
||||||
|
{
|
||||||
|
if (Bounds != null)
|
||||||
|
{
|
||||||
|
Bounds.Scale = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Bounds != sel.CollisionBounds) wf.SelectCollisionBounds(Bounds);
|
||||||
|
wf.SetWidgetScale(s);
|
||||||
|
|
||||||
|
UpdateGraphics(wf);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateGraphics(WorldForm wf)
|
||||||
|
{
|
||||||
|
if (Bounds != null)
|
||||||
|
{
|
||||||
|
wf.UpdateCollisionBoundsGraphics(Bounds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Undo(WorldForm wf, ref MapSelection sel)
|
||||||
|
{
|
||||||
|
Update(wf, ref sel, StartScale);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Redo(WorldForm wf, ref MapSelection sel)
|
||||||
|
{
|
||||||
|
Update(wf, ref sel, EndScale);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "Collision " + (Bounds?.GetName() ?? "") + ": Scale";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CollisionPolyPositionUndoStep : UndoStep
|
||||||
|
{
|
||||||
|
public BoundPolygon Polygon { get; set; }
|
||||||
|
public Vector3 StartPosition { get; set; }
|
||||||
|
public Vector3 EndPosition { get; set; }
|
||||||
|
|
||||||
|
public CollisionPolyPositionUndoStep(BoundPolygon poly, Vector3 startpos, WorldForm wf)
|
||||||
|
{
|
||||||
|
Polygon = poly;
|
||||||
|
StartPosition = startpos;
|
||||||
|
EndPosition = poly?.Position ?? Vector3.Zero;
|
||||||
|
|
||||||
|
UpdateGraphics(wf);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update(WorldForm wf, ref MapSelection sel, Vector3 p)
|
||||||
|
{
|
||||||
|
if (Polygon != null)
|
||||||
|
{
|
||||||
|
Polygon.Position = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Polygon != sel.CollisionPoly) wf.SelectCollisionPoly(Polygon);
|
||||||
|
wf.SetWidgetPosition(p);
|
||||||
|
|
||||||
|
UpdateGraphics(wf);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateGraphics(WorldForm wf)
|
||||||
|
{
|
||||||
|
if (Polygon?.Owner != null)
|
||||||
|
{
|
||||||
|
wf.UpdateCollisionBoundsGraphics(Polygon.Owner);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Undo(WorldForm wf, ref MapSelection sel)
|
||||||
|
{
|
||||||
|
Update(wf, ref sel, StartPosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Redo(WorldForm wf, ref MapSelection sel)
|
||||||
|
{
|
||||||
|
Update(wf, ref sel, EndPosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "Collision Poly " + (Polygon?.Index.ToString() ?? "") + ": Position";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class CollisionPolyRotationUndoStep : UndoStep
|
||||||
|
{
|
||||||
|
public BoundPolygon Polygon { get; set; }
|
||||||
|
public Quaternion StartRotation { get; set; }
|
||||||
|
public Quaternion EndRotation { get; set; }
|
||||||
|
|
||||||
|
public CollisionPolyRotationUndoStep(BoundPolygon poly, Quaternion startrot, WorldForm wf)
|
||||||
|
{
|
||||||
|
Polygon = poly;
|
||||||
|
StartRotation = startrot;
|
||||||
|
EndRotation = poly?.Orientation ?? Quaternion.Identity;
|
||||||
|
|
||||||
|
UpdateGraphics(wf);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update(WorldForm wf, ref MapSelection sel, Quaternion q)
|
||||||
|
{
|
||||||
|
if (Polygon != null)
|
||||||
|
{
|
||||||
|
Polygon.Orientation = q;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Polygon != sel.CollisionPoly) wf.SelectCollisionPoly(Polygon);
|
||||||
|
wf.SetWidgetRotation(q);
|
||||||
|
|
||||||
|
UpdateGraphics(wf);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateGraphics(WorldForm wf)
|
||||||
|
{
|
||||||
|
if (Polygon?.Owner != null)
|
||||||
|
{
|
||||||
|
wf.UpdateCollisionBoundsGraphics(Polygon.Owner);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Undo(WorldForm wf, ref MapSelection sel)
|
||||||
|
{
|
||||||
|
Update(wf, ref sel, StartRotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Redo(WorldForm wf, ref MapSelection sel)
|
||||||
|
{
|
||||||
|
Update(wf, ref sel, EndRotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "Collision Poly " + (Polygon?.Index.ToString() ?? "") + ": Rotation";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public class CollisionPolyScaleUndoStep : UndoStep
|
||||||
|
{
|
||||||
|
public BoundPolygon Polygon { get; set; }
|
||||||
|
public Vector3 StartScale { get; set; }
|
||||||
|
public Vector3 EndScale { get; set; }
|
||||||
|
|
||||||
|
public CollisionPolyScaleUndoStep(BoundPolygon poly, Vector3 startsca, WorldForm wf)
|
||||||
|
{
|
||||||
|
Polygon = poly;
|
||||||
|
StartScale = startsca;
|
||||||
|
EndScale = poly?.Scale ?? Vector3.One;
|
||||||
|
|
||||||
|
UpdateGraphics(wf);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Update(WorldForm wf, ref MapSelection sel, Vector3 s)
|
||||||
|
{
|
||||||
|
if (Polygon != null)
|
||||||
|
{
|
||||||
|
Polygon.Scale = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Polygon != sel.CollisionPoly) wf.SelectCollisionPoly(Polygon);
|
||||||
|
wf.SetWidgetScale(s);
|
||||||
|
|
||||||
|
UpdateGraphics(wf);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateGraphics(WorldForm wf)
|
||||||
|
{
|
||||||
|
if (Polygon?.Owner != null)
|
||||||
|
{
|
||||||
|
wf.UpdateCollisionBoundsGraphics(Polygon.Owner);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Undo(WorldForm wf, ref MapSelection sel)
|
||||||
|
{
|
||||||
|
Update(wf, ref sel, StartScale);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Redo(WorldForm wf, ref MapSelection sel)
|
||||||
|
{
|
||||||
|
Update(wf, ref sel, EndScale);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "Collision Poly " + (Polygon?.Index.ToString() ?? "") + ": Scale";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public class PathNodePositionUndoStep : UndoStep
|
public class PathNodePositionUndoStep : UndoStep
|
||||||
{
|
{
|
||||||
public YndNode PathNode { get; set; }
|
public YndNode PathNode { get; set; }
|
||||||
@ -563,7 +883,6 @@ namespace CodeWalker.Project
|
|||||||
return "NavPoint " + (Point?.ToString() ?? "") + ": Position";
|
return "NavPoint " + (Point?.ToString() ?? "") + ": Position";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class NavPointRotationUndoStep : UndoStep
|
public class NavPointRotationUndoStep : UndoStep
|
||||||
{
|
{
|
||||||
public YnvPoint Point { get; set; }
|
public YnvPoint Point { get; set; }
|
||||||
@ -781,7 +1100,6 @@ namespace CodeWalker.Project
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public class ScenarioNodePositionUndoStep : UndoStep
|
public class ScenarioNodePositionUndoStep : UndoStep
|
||||||
{
|
{
|
||||||
public ScenarioNode ScenarioNode { get; set; }
|
public ScenarioNode ScenarioNode { get; set; }
|
||||||
@ -831,7 +1149,6 @@ namespace CodeWalker.Project
|
|||||||
return ScenarioNode.ToString() + ": Position";
|
return ScenarioNode.ToString() + ": Position";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ScenarioNodeRotationUndoStep : UndoStep
|
public class ScenarioNodeRotationUndoStep : UndoStep
|
||||||
{
|
{
|
||||||
public ScenarioNode ScenarioNode { get; set; }
|
public ScenarioNode ScenarioNode { get; set; }
|
||||||
@ -886,7 +1203,6 @@ namespace CodeWalker.Project
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public class AudioPositionUndoStep : UndoStep
|
public class AudioPositionUndoStep : UndoStep
|
||||||
{
|
{
|
||||||
public AudioPlacement Audio { get; set; }
|
public AudioPlacement Audio { get; set; }
|
||||||
@ -923,7 +1239,6 @@ namespace CodeWalker.Project
|
|||||||
return "Audio " + (Audio?.GetNameString() ?? "") + ": Position";
|
return "Audio " + (Audio?.GetNameString() ?? "") + ": Position";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class AudioRotationUndoStep : UndoStep
|
public class AudioRotationUndoStep : UndoStep
|
||||||
{
|
{
|
||||||
public AudioPlacement Audio { get; set; }
|
public AudioPlacement Audio { get; set; }
|
||||||
|
@ -231,20 +231,18 @@ namespace CodeWalker.Rendering
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void Invalidate(BasePathData path)
|
public void Invalidate(Bounds bounds)
|
||||||
{
|
{
|
||||||
//lock (updateSyncRoot)
|
boundcomps.Invalidate(bounds);
|
||||||
|
}
|
||||||
|
public void Invalidate(BasePathData path)
|
||||||
{
|
{
|
||||||
pathbatches.Invalidate(path);
|
pathbatches.Invalidate(path);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
public void Invalidate(YmapGrassInstanceBatch batch)
|
public void Invalidate(YmapGrassInstanceBatch batch)
|
||||||
{
|
|
||||||
//lock (updateSyncRoot)
|
|
||||||
{
|
{
|
||||||
instbatches.Invalidate(batch);
|
instbatches.Invalidate(batch);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -395,12 +395,14 @@ namespace CodeWalker.Rendering
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void Invalidate(Bounds bounds)
|
||||||
|
{
|
||||||
|
renderableCache.Invalidate(bounds);
|
||||||
|
}
|
||||||
public void Invalidate(BasePathData path)
|
public void Invalidate(BasePathData path)
|
||||||
{
|
{
|
||||||
//used to update path graphics.
|
|
||||||
renderableCache.Invalidate(path);
|
renderableCache.Invalidate(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Invalidate(YmapGrassInstanceBatch batch)
|
public void Invalidate(YmapGrassInstanceBatch batch)
|
||||||
{
|
{
|
||||||
renderableCache.Invalidate(batch);
|
renderableCache.Invalidate(batch);
|
||||||
|
@ -540,6 +540,14 @@ namespace CodeWalker
|
|||||||
{
|
{
|
||||||
res = true;
|
res = true;
|
||||||
}
|
}
|
||||||
|
else if (CollisionPoly != null)
|
||||||
|
{
|
||||||
|
res = true;
|
||||||
|
}
|
||||||
|
else if (CollisionBounds != null)
|
||||||
|
{
|
||||||
|
res = true;
|
||||||
|
}
|
||||||
else if (NavPoint != null)
|
else if (NavPoint != null)
|
||||||
{
|
{
|
||||||
res = true;
|
res = true;
|
||||||
@ -583,6 +591,14 @@ namespace CodeWalker
|
|||||||
{
|
{
|
||||||
return CarGenerator.Position;
|
return CarGenerator.Position;
|
||||||
}
|
}
|
||||||
|
else if (CollisionPoly != null)
|
||||||
|
{
|
||||||
|
return CollisionPoly.Position;
|
||||||
|
}
|
||||||
|
else if (CollisionBounds != null)
|
||||||
|
{
|
||||||
|
return CollisionBounds.Center;
|
||||||
|
}
|
||||||
else if (NavPoly != null)
|
else if (NavPoly != null)
|
||||||
{
|
{
|
||||||
return NavPoly.Position;
|
return NavPoly.Position;
|
||||||
@ -630,6 +646,14 @@ namespace CodeWalker
|
|||||||
{
|
{
|
||||||
return CarGenerator.Orientation;
|
return CarGenerator.Orientation;
|
||||||
}
|
}
|
||||||
|
else if (CollisionPoly != null)
|
||||||
|
{
|
||||||
|
return Quaternion.Identity;
|
||||||
|
}
|
||||||
|
else if (CollisionBounds != null)
|
||||||
|
{
|
||||||
|
return Quaternion.Identity;
|
||||||
|
}
|
||||||
else if (NavPoly != null)
|
else if (NavPoly != null)
|
||||||
{
|
{
|
||||||
return Quaternion.Identity;
|
return Quaternion.Identity;
|
||||||
@ -677,6 +701,14 @@ namespace CodeWalker
|
|||||||
{
|
{
|
||||||
return WidgetAxis.Z;
|
return WidgetAxis.Z;
|
||||||
}
|
}
|
||||||
|
else if (CollisionPoly != null)
|
||||||
|
{
|
||||||
|
return WidgetAxis.XYZ;
|
||||||
|
}
|
||||||
|
else if (CollisionBounds != null)
|
||||||
|
{
|
||||||
|
return WidgetAxis.XYZ;
|
||||||
|
}
|
||||||
else if (NavPoly != null)
|
else if (NavPoly != null)
|
||||||
{
|
{
|
||||||
return WidgetAxis.XYZ;
|
return WidgetAxis.XYZ;
|
||||||
@ -724,6 +756,14 @@ namespace CodeWalker
|
|||||||
{
|
{
|
||||||
return new Vector3(CarGenerator.CCarGen.perpendicularLength);
|
return new Vector3(CarGenerator.CCarGen.perpendicularLength);
|
||||||
}
|
}
|
||||||
|
else if (CollisionPoly != null)
|
||||||
|
{
|
||||||
|
return Vector3.One;
|
||||||
|
}
|
||||||
|
else if (CollisionBounds != null)
|
||||||
|
{
|
||||||
|
return Vector3.One;
|
||||||
|
}
|
||||||
else if (NavPoly != null)
|
else if (NavPoly != null)
|
||||||
{
|
{
|
||||||
return Vector3.One;
|
return Vector3.One;
|
||||||
@ -784,14 +824,17 @@ namespace CodeWalker
|
|||||||
{
|
{
|
||||||
PathNode.SetPosition(newpos);
|
PathNode.SetPosition(newpos);
|
||||||
}
|
}
|
||||||
|
else if (CollisionPoly != null)
|
||||||
|
{
|
||||||
|
CollisionPoly.Position = newpos;
|
||||||
|
}
|
||||||
|
else if (CollisionBounds != null)
|
||||||
|
{
|
||||||
|
CollisionBounds.Center = newpos;
|
||||||
|
}
|
||||||
else if (NavPoly != null)
|
else if (NavPoly != null)
|
||||||
{
|
{
|
||||||
NavPoly.SetPosition(newpos);
|
NavPoly.SetPosition(newpos);
|
||||||
|
|
||||||
//if (projectForm != null)
|
|
||||||
//{
|
|
||||||
// projectForm.OnWorldNavPolyModified(NavPoly);
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
else if (NavPoint != null)
|
else if (NavPoint != null)
|
||||||
{
|
{
|
||||||
|
84
WorldForm.cs
84
WorldForm.cs
@ -1821,6 +1821,29 @@ namespace CodeWalker
|
|||||||
return space.NodeGrid.GetYndNode(areaid, nodeid);
|
return space.NodeGrid.GetYndNode(areaid, nodeid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void UpdateCollisionBoundsGraphics(Bounds b)
|
||||||
|
{
|
||||||
|
if (b is BoundBVH bvh)
|
||||||
|
{
|
||||||
|
bvh.BuildBVH();
|
||||||
|
}
|
||||||
|
else if (b is BoundComposite bc)
|
||||||
|
{
|
||||||
|
bc.BuildBVH();
|
||||||
|
}
|
||||||
|
|
||||||
|
var ib = b;
|
||||||
|
while (ib.Parent != null)
|
||||||
|
{
|
||||||
|
ib = ib.Parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
//lock (Renderer.RenderSyncRoot)
|
||||||
|
{
|
||||||
|
Renderer.Invalidate(ib);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void UpdateNavYnvGraphics(YnvFile ynv, bool fullupdate)
|
public void UpdateNavYnvGraphics(YnvFile ynv, bool fullupdate)
|
||||||
{
|
{
|
||||||
ynv.UpdateAllNodePositions();
|
ynv.UpdateAllNodePositions();
|
||||||
@ -2256,9 +2279,6 @@ namespace CodeWalker
|
|||||||
|
|
||||||
if (MouseRayCollision.Hit)
|
if (MouseRayCollision.Hit)
|
||||||
{
|
{
|
||||||
Matrix rmat = MouseRayCollision.HitBounds?.Transform ?? Matrix.Identity;
|
|
||||||
rmat.TranslationVector = Vector3.Zero;
|
|
||||||
|
|
||||||
var position = MouseRayCollision.HitEntity?.Position ?? Vector3.Zero;
|
var position = MouseRayCollision.HitEntity?.Position ?? Vector3.Zero;
|
||||||
var orientation = MouseRayCollision.HitEntity?.Orientation ?? Quaternion.Identity;
|
var orientation = MouseRayCollision.HitEntity?.Orientation ?? Quaternion.Identity;
|
||||||
var scale = MouseRayCollision.HitEntity?.Scale ?? Vector3.One;
|
var scale = MouseRayCollision.HitEntity?.Scale ?? Vector3.One;
|
||||||
@ -2272,7 +2292,7 @@ namespace CodeWalker
|
|||||||
CurMouseHit.HitDist = MouseRayCollision.HitDist;
|
CurMouseHit.HitDist = MouseRayCollision.HitDist;
|
||||||
CurMouseHit.CamRel = camrel + orientation.Multiply(trans);
|
CurMouseHit.CamRel = camrel + orientation.Multiply(trans);
|
||||||
CurMouseHit.BBOffset = trans;
|
CurMouseHit.BBOffset = trans;
|
||||||
CurMouseHit.BBOrientation = Quaternion.RotationMatrix(rmat);
|
CurMouseHit.BBOrientation = MouseRayCollision.HitBounds?.Transform.ToQuaternion() ?? Quaternion.Identity;
|
||||||
CurMouseHit.AABB = new BoundingBox(MouseRayCollision.HitBounds?.BoundingBoxMin ?? Vector3.Zero, MouseRayCollision.HitBounds?.BoundingBoxMax ?? Vector3.Zero);
|
CurMouseHit.AABB = new BoundingBox(MouseRayCollision.HitBounds?.BoundingBoxMin ?? Vector3.Zero, MouseRayCollision.HitBounds?.BoundingBoxMax ?? Vector3.Zero);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3511,6 +3531,40 @@ namespace CodeWalker
|
|||||||
SelectItem(ms);
|
SelectItem(ms);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public void SelectCollisionBounds(Bounds b)
|
||||||
|
{
|
||||||
|
if (b == null)
|
||||||
|
{
|
||||||
|
SelectItem(null);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
MapSelection ms = new MapSelection();
|
||||||
|
ms.CollisionBounds = b;
|
||||||
|
|
||||||
|
ms.AABB = new BoundingBox(b.BoundingBoxMin, b.BoundingBoxMax);
|
||||||
|
|
||||||
|
SelectItem(ms);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public void SelectCollisionPoly(BoundPolygon p)
|
||||||
|
{
|
||||||
|
if (p == null)
|
||||||
|
{
|
||||||
|
SelectItem(null);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
MapSelection ms = new MapSelection();
|
||||||
|
ms.CollisionPoly = p;
|
||||||
|
|
||||||
|
//ms.AABB = new BoundingBox(p.BoundingBoxMin, p.BoundingBoxMax);
|
||||||
|
|
||||||
|
SelectItem(ms);
|
||||||
|
}
|
||||||
|
}
|
||||||
public void SelectNavPoly(YnvPoly poly)
|
public void SelectNavPoly(YnvPoly poly)
|
||||||
{
|
{
|
||||||
if (poly == null)
|
if (poly == null)
|
||||||
@ -4744,6 +4798,8 @@ namespace CodeWalker
|
|||||||
if (SelectedItem.MultipleSelection) return true;
|
if (SelectedItem.MultipleSelection) return true;
|
||||||
if (SelectedItem.EntityDef != null) return true;
|
if (SelectedItem.EntityDef != null) return true;
|
||||||
if (SelectedItem.CarGenerator != null) return true;
|
if (SelectedItem.CarGenerator != null) return true;
|
||||||
|
if (SelectedItem.CollisionBounds != null) return true;
|
||||||
|
if (SelectedItem.CollisionPoly != null) return true;
|
||||||
if (SelectedItem.PathNode != null) return true;
|
if (SelectedItem.PathNode != null) return true;
|
||||||
//if (SelectedItem.NavPoly != null) return true;
|
//if (SelectedItem.NavPoly != null) return true;
|
||||||
if (SelectedItem.NavPoint != null) return true;
|
if (SelectedItem.NavPoint != null) return true;
|
||||||
@ -4768,6 +4824,8 @@ namespace CodeWalker
|
|||||||
if (!CanMarkUndo()) return;
|
if (!CanMarkUndo()) return;
|
||||||
var ent = SelectedItem.EntityDef;
|
var ent = SelectedItem.EntityDef;
|
||||||
var cargen = SelectedItem.CarGenerator;
|
var cargen = SelectedItem.CarGenerator;
|
||||||
|
var bounds = SelectedItem.CollisionBounds;
|
||||||
|
var boundpoly = SelectedItem.CollisionPoly;
|
||||||
var pathnode = SelectedItem.PathNode;
|
var pathnode = SelectedItem.PathNode;
|
||||||
var navpoly = SelectedItem.NavPoly;
|
var navpoly = SelectedItem.NavPoly;
|
||||||
var navpoint = SelectedItem.NavPoint;
|
var navpoint = SelectedItem.NavPoint;
|
||||||
@ -4815,6 +4873,24 @@ namespace CodeWalker
|
|||||||
case WidgetMode.Scale: s = new CarGenScaleUndoStep(cargen, UndoStartScale); break;
|
case WidgetMode.Scale: s = new CarGenScaleUndoStep(cargen, UndoStartScale); break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (boundpoly != null)
|
||||||
|
{
|
||||||
|
switch (tw.Mode)
|
||||||
|
{
|
||||||
|
case WidgetMode.Position: s = new CollisionPolyPositionUndoStep(boundpoly, UndoStartPosition, this); break;
|
||||||
|
case WidgetMode.Rotation: s = new CollisionPolyRotationUndoStep(boundpoly, UndoStartRotation, this); break;
|
||||||
|
case WidgetMode.Scale: s = new CollisionPolyScaleUndoStep(boundpoly, UndoStartScale, this); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (bounds != null)
|
||||||
|
{
|
||||||
|
switch (tw.Mode)
|
||||||
|
{
|
||||||
|
case WidgetMode.Position: s = new CollisionPositionUndoStep(bounds, UndoStartPosition, this); break;
|
||||||
|
case WidgetMode.Rotation: s = new CollisionRotationUndoStep(bounds, UndoStartRotation, this); break;
|
||||||
|
case WidgetMode.Scale: s = new CollisionScaleUndoStep(bounds, UndoStartScale, this); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (pathnode != null)
|
else if (pathnode != null)
|
||||||
{
|
{
|
||||||
switch (tw.Mode)
|
switch (tw.Mode)
|
||||||
|
Loading…
Reference in New Issue
Block a user