Fix position anchoring. (2)

This commit is contained in:
2023-04-20 14:31:49 +08:00
parent fdb4ab55a3
commit e5956f2b34

View File

@@ -13,9 +13,12 @@ namespace Cryville.Crtr {
SectionalGameObject[] sgos; SectionalGameObject[] sgos;
bool sflag; // Did pre-graphical update
Vector3 spos; // Start position offset Vector3 spos; // Start position offset
Vector3 ppt = Vector3.zero; // Previous point Vector3 ppt = Vector3.zero; // Previous screen point
Vector3 plp = Vector3.zero; // Previous local point
Vector3 pwp = Vector3.zero; // Previous world point Vector3 pwp = Vector3.zero; // Previous world point
Vector3 ppwp = Vector3.zero; // Previous parent world point
double ptime; // Previous time double ptime; // Previous time
float length; float length;
@@ -28,11 +31,16 @@ namespace Cryville.Crtr {
protected override void StartPreGraphicalUpdate(ContainerState s) { protected override void StartPreGraphicalUpdate(ContainerState s) {
base.StartPreGraphicalUpdate(s); base.StartPreGraphicalUpdate(s);
spos = Vector3.zero; spos = Vector3.zero;
sflag = true;
pwp = Parent != null ? Parent.Position : Vector3.zero;
TransformAwake(s); TransformAwake(s);
} }
protected override void StartGraphicalUpdate(ContainerState s) { protected override void StartGraphicalUpdate(ContainerState s) {
base.StartGraphicalUpdate(s); base.StartGraphicalUpdate(s);
if (RootTransform) { if (RootTransform) {
if (!sflag && Parent != null) { // No pre-graphical update; inherit from parent
spos = Parent.Position + (Vector3)s.ScreenPoint - (Vector3)s.Parent.ScreenPoint;
}
TransformAwake(s); TransformAwake(s);
var p = Position; var p = Position;
foreach (var i in sgos) { foreach (var i in sgos) {
@@ -42,7 +50,7 @@ namespace Cryville.Crtr {
} }
} }
void TransformAwake(ContainerState s) { void TransformAwake(ContainerState s) {
ppt = s.ScreenPoint; plp = s.ScreenPoint;
pwp = Vector3.zero; pwp = Vector3.zero;
ptime = s.Time; ptime = s.Time;
Position = spos; Position = spos;
@@ -52,10 +60,10 @@ namespace Cryville.Crtr {
public override void Update(ContainerState s, StampedEvent ev) { public override void Update(ContainerState s, StampedEvent ev) {
base.Update(s, ev); base.Update(s, ev);
if (CanDoGraphicalUpdate(s)) { if (CanDoGraphicalUpdate(s)) {
var tpt = s.ScreenPoint; ppt = s.ScreenPoint;
var tsv = s.ScrollVelocity; var tsv = s.ScrollVelocity;
Vector3 dpt = (Vector3)tpt - ppt; // Delta 2D point Vector3 dpt = ppt - plp; // Delta 2D point
dpt.z = (float)((s.Time - ptime) * ChartPlayer.sv * tsv); // Delta Z dpt.z = (float)((s.Time - ptime) * ChartPlayer.sv * tsv); // Delta Z
Quaternion rotq = Quaternion.Euler(s.Direction); // Rotation Quaternion rotq = Quaternion.Euler(s.Direction); // Rotation
var dwp = rotq * dpt; // Delta world point var dwp = rotq * dpt; // Delta world point
@@ -68,7 +76,8 @@ namespace Cryville.Crtr {
length = nl; length = nl;
var wp = pwp + dwp; // World point var wp = pwp + dwp; // World point
pwp = wp; pwp = wp;
ppt += dpt; if (Parent != null) ppwp = Parent.Position;
plp += dpt;
ptime = s.Time; ptime = s.Time;
Position = pwp + spos; Position = pwp + spos;
@@ -82,7 +91,7 @@ namespace Cryville.Crtr {
} }
void UpdatePosition(ContainerState s) { void UpdatePosition(ContainerState s) {
ppt = s.ScreenPoint; plp = s.ScreenPoint;
pwp = Vector3.zero; pwp = Vector3.zero;
ptime = s.Time; ptime = s.Time;
length = 0; length = 0;
@@ -93,7 +102,12 @@ namespace Cryville.Crtr {
// TODO Fix anchor rotation // TODO Fix anchor rotation
public override void Anchor() { public override void Anchor() {
base.Anchor(); base.Anchor();
spos = (Vector3)cs.ScreenPoint - Position; spos = ppt - Position;
if (ptime < cs.Time) { // Pre-graphical update ends before anchor, compensate from parent
var dspos = ppwp - (Parent != null ? Parent.Position : Vector3.zero);
spos += dspos;
Position -= dspos;
}
} }
protected override void EndGraphicalUpdate(ContainerState s) { protected override void EndGraphicalUpdate(ContainerState s) {
@@ -104,13 +118,14 @@ namespace Cryville.Crtr {
i.AppendPoint(p, Rotation); i.AppendPoint(p, Rotation);
i.Seal(); i.Seal();
} }
sflag = false;
} }
void EndUpdatePosition(ContainerState s) { void EndUpdatePosition(ContainerState s) {
var tpt = s.ScreenPoint; ppt = s.ScreenPoint;
var tsv = s.ScrollVelocity; var tsv = s.ScrollVelocity;
Vector3 dpt = (Vector3)tpt - ppt; Vector3 dpt = ppt - plp;
dpt.z = (float)((s.Time - ptime) * ChartPlayer.sv * tsv); dpt.z = (float)((s.Time - ptime) * ChartPlayer.sv * tsv);
Quaternion rotq = Quaternion.Euler(s.Direction); Quaternion rotq = Quaternion.Euler(s.Direction);
var dwp = rotq * dpt; // Delta world point var dwp = rotq * dpt; // Delta world point
@@ -121,7 +136,7 @@ namespace Cryville.Crtr {
length = nl; length = nl;
var wp = pwp + dwp; // World point var wp = pwp + dwp; // World point
pwp = wp; pwp = wp;
ppt += dpt; plp += dpt;
Position = pwp + spos; Position = pwp + spos;
Rotation = s.QuatDir; Rotation = s.QuatDir;
} }