xamarin / urho

Code to integrate with the Urho3D engine
Other
463 stars 122 forks source link

SetWorldScale producing confusing results for child nodes #377

Open MustacheEmperor opened 5 years ago

MustacheEmperor commented 5 years ago

I'm not positive if this a bug in UrhoSharp or a result of my own confusion, but SetWorldScale doesn't seem to be working properly in my current context. I have Node A with given scale (.525f, .42f, .0462f). Node A itself is locally scaled to Vector3.One, but is scaled to that world scale by its own parent in this context. I'd like to attach Node B to Node A as a child. When I set Node B as a child of Node A, its scale is modified by the parent scale, as expected. However, if I use SetWorldScale to force Node B back to its original scale, that doesn't happen. Instead Node B is scaled to some new set of values seemingly still modified by the parent. This doesn't seem like expected behavior, am I doing something wrong? I've included a detailed snippet below showing the problem. My head is really spinning on this one and I'd greatly appreciate the advice.

Node nodeA = Scene.AddChild();
nodeA.SetWorldScale(new Vector3(3.2f,.2f,.2f);
Node nodeB = Scene.AddChild();
nodeB.SetWorldScale(Vector3.One);

var originalWScale = nodeB.WorldScale;
var originalLScale = nodeB.Scale;

nodeB.ChangeParent(nodeA);

System.Diagnostics.Debug.WriteLine($"Pre Reset: {originalScale} {originalLocalScale} {nodeB.WorldScale} {nodeB.Scale}");

Pre Reset: (0.9999999, 0.9999999, 0.9999999) (1, 1, 1) (0.525, 0.4199999, 0.0462) (1, 1, 1)

this.Node.SetWorldScale(originalScale);
System.Diagnostics.Debug.WriteLine($"Post Reset: {originalScale} {originalLocalScale}{nodeB.WorldScale} {nodeB.Scale});

Post Reset: (0.9999999, 0.9999999, 0.9999999) (1, 1, 1) (0.9999999, 9.090908, 0.11) (1.904762, 21.64502, 2.380952)

I set nodeB's world scale, which should be unmodified by its place in the hierarchy, to (.999,.999,.999). The very next line, nodeB's world scale is (0.9999999, 9.090908, 0.11). I'm mystified.