NLDClient-yudde/ProjectNLD/Assets/ThirdParty/TerrainGridSystem/Scripts/Geom/Segment.cs

154 lines
3.3 KiB
C#
Raw Normal View History

2023-08-22 19:08:45 +08:00
using UnityEngine;
using System;
using System.Runtime.Serialization;
using System.Collections;
using System.Collections.Generic;
namespace TGS.Geom {
[Serializable]
public class Segment : IDeserializationCallback {
public Point start, end;
public bool border;
public bool deleted;
[NonSerialized]
public bool done;
[NonSerialized]
public List<Segment> subdivisions;
[NonSerialized]
public int territoryIndex = -1;
[NonSerialized]
public int disputingTerritory1Index = -1;
[NonSerialized]
public int disputingTerritory2Index = -1;
[NonSerialized]
public int cellIndex = -1;
public Vector3 startToVector3 {
get {
return new Vector3 ((float)start.x, (float)start.y, 0);
}
}
public Vector3 endToVector3 {
get {
return new Vector3 ((float)end.x, (float)end.y, 0);
}
}
void IDeserializationCallback.OnDeserialization(object tgs) {
// deserializer calls this and ensures default values are correct because these fields are not serialized
disputingTerritory1Index = disputingTerritory2Index = territoryIndex = cellIndex = -1;
}
public Segment (Point start, Point end) : this (start, end, false) {
}
public Segment (Point start, Point end, bool border) {
this.start = start;
this.end = end;
this.border = border;
done = true;
}
public void Init(Point start, Point end) {
this.start = start;
this.end = end;
done = true;
}
public Segment (Point p) {
start = p;
}
public void Finish (Point p) {
if (done)
return;
end = p;
done = true;
}
public double sqrMagnitude {
get {
double dx = end.x - start.x;
double dy = end.y - start.y;
return dx * dx + dy * dy;
}
}
public double magnitude {
get {
double dx = end.x - start.x;
double dy = end.y - start.y;
return Math.Sqrt (dx * dx + dy * dy);
}
}
public List<Segment> Subdivide (int divisions, double waveAmount) {
if (subdivisions != null)
return subdivisions;
// Divide and add random displacement
if (subdivisions != null) {
subdivisions.Clear ();
} else {
subdivisions = new List<Segment> (divisions);
}
Point normal = Point.zero;
double l = 0;
if (!border && waveAmount > 0 && divisions > 1) {
// safety check - length must be > 0.01f;
l = waveAmount * Math.Sqrt (sqrMagnitude);
normal = new Point (-(end.y - start.y), end.x - start.x);
normal = normal.normalized * l;
if (UnityEngine.Random.value > 0.5f)
normal *= -1;
}
Point d0 = start;
for (int d = 1; d < divisions; d++) {
Point d1 = Point.Lerp (start, end, (double)d / divisions);
if (!border && waveAmount > 0) {
double s = 1 - Math.Abs (d - (double)divisions / 2) / ((double)divisions / 2);
d1 += normal * Math.Sin (d * Math.PI / divisions) * s;
}
subdivisions.Add (new Segment (d0, d1, border));
d0 = d1;
}
subdivisions.Add (new Segment (d0, end, border));
return subdivisions;
}
public override string ToString () {
return string.Format ("start:" + start.ToString () + ", end:" + end.ToString ());
}
public void CropBottom () {
start.CropBottom ();
end.CropBottom ();
if (Point.EqualsBoth (start, end))
deleted = true;
}
public void CropRight () {
start.CropRight ();
end.CropRight ();
if (Point.EqualsBoth (start, end))
deleted = true;
}
}
}