protected virtual void ResetInstanceProperties() { if (instanceDefinition != null) { this.InstanceName = instanceDefinition.InstanceName; this.DefinitionName = instanceDefinition.DefinitionName; this.Position = new Vector2((int)instanceDefinition.X, (int)instanceDefinition.Y); this.Rotation = instanceDefinition.Rotation; this.Scale = new Vector2(instanceDefinition.ScaleX, instanceDefinition.ScaleY); this.State.Origin = instanceDefinition.Definition == null ? Vector2.Zero : new Vector2(-instanceDefinition.Definition.OffsetX, -instanceDefinition.Definition.OffsetY); this.Alpha = instanceDefinition.Alpha; this.Visible = instanceDefinition.Visible; this.Depth = instanceDefinition.Depth; transforms = V2DTransform.GetV2DTransformArray(instanceDefinition.Transforms); //// normalize all transforms to base position //this.transforms = new V2DTransform[instanceDefinition.Transforms.Length]; //float ox = instanceDefinition.X; //float oy = instanceDefinition.Y; //for (int i = 0; i < instanceDefinition.Transforms.Length; i++) //{ // transforms[i] = instanceDefinition.Transforms[i].Clone(); // //transforms[i].Position.X -= ox; // //transforms[i].Position.Y -= oy; //} this.State.StartFrame = instanceDefinition.StartFrame; this.State.EndFrame = instanceDefinition.EndFrame; } }
public Vector2 GetGlobalScale(Vector2 sc) { if (parent != null) { sc = parent.GetGlobalScale(sc); if (transforms != null) { V2DTransform t = transforms.First(tr => tr.StartFrame <= (parent.CurChildFrame) && tr.EndFrame >= (parent.CurChildFrame)); sc.X *= t.Scale.X; sc.Y *= t.Scale.Y; } else { } } return(sc); }
public float GetGlobalRotation(float rot) { if (parent != null) { rot = parent.GetGlobalRotation(rot); if (transforms != null) { V2DTransform t = transforms.First(tr => tr.StartFrame <= (parent.CurChildFrame) && tr.EndFrame >= (parent.CurChildFrame)); rot += t.Rotation + State.Rotation; //180f * 3.14159265f; } else { rot += State.Rotation; } } return(rot); }
//public void LocalToGlobal(ref float x, ref float y) //{ // if (parent != null) // { // parent.LocalToGlobal(ref x, ref y); // } // x += this.X; // y += this.Y; //} //public Vector2 LocalToGlobal(Vector2 p) //{ // if (parent != null) // { // p = parent.LocalToGlobal(p); // } // p.X += this.X; // p.Y += this.Y; // return p; //} public Vector2 GetGlobalOffset(Vector2 offset) { if (parent != null) { offset = parent.GetGlobalOffset(offset); if (transforms != null) { V2DTransform t = transforms.FirstOrDefault(tr => tr.StartFrame <= (parent.CurChildFrame) && tr.EndFrame >= (parent.CurChildFrame)); offset.X += t.Position.X + State.Position.X; offset.Y += t.Position.Y + State.Position.Y; } else { offset.X += State.Position.X; offset.Y += State.Position.Y; } } return(offset); }
//Vector2 absPosition; //float curRot; //protected Matrix m = Matrix.Identity; protected virtual void SetCurrentState() { for (int i = 0; i < transforms.Length; i++) { if (transforms[i].StartFrame <= parent.CurChildFrame && transforms[i].EndFrame >= (parent.CurChildFrame)) { transformIndex = i; break; } } V2DTransform t = transforms[transformIndex]; //m = parent.m; //Matrix sm = Matrix.CreateScale(State.Scale.X * t.Scale.X, State.Scale.Y * t.Scale.Y, 0f); //Matrix rm = Matrix.CreateRotationZ(State.Rotation + t.Rotation); //Matrix tm = Matrix.CreateTranslation(State.Position.X + t.Position.X, State.Position.Y + t.Position.Y, 0f); //Matrix om = Matrix.CreateTranslation(Origin.X, Origin.Y, 0f); //Matrix.Multiply(ref sm, ref m, out m); // scale //Matrix.Subtract(ref om, ref m, out m); //Matrix.Multiply(ref rm, ref m, out m); // rotate //Matrix.Add(ref om, ref m, out m); //Matrix.Add(ref tm, ref m, out m); // translate //Vector3 s; //Quaternion r; //Vector3 tr; //m.Decompose(out s, out r, out tr); Vector2 relativePosition = State.Position + t.Position; relativePosition *= parent.CurrentState.Scale; CurrentState.Scale = parent.CurrentState.Scale * State.Scale * t.Scale; CurrentState.Rotation = parent.CurrentState.Rotation + State.Rotation + t.Rotation; CurrentState.Origin = Origin;// *(Vector2.One / parent.CurrentState.Scale); float tempX = relativePosition.X; float cosRot = (float)Math.Cos(parent.CurrentState.Rotation); float sinRot = (float)Math.Sin(parent.CurrentState.Rotation); relativePosition.X = cosRot * tempX - sinRot * relativePosition.Y; relativePosition.Y = sinRot * tempX + cosRot * relativePosition.Y; CurrentState.Position = parent.CurrentState.Position + relativePosition; CurrentState.Alpha = parent.CurrentState.Alpha * State.Alpha * t.Alpha; if (color.A != (byte)(CurrentState.Alpha * 255)) { color.A = (byte)(CurrentState.Alpha * 255); } //absPosition = parent.CurrentState.Position + State.Position + t.Position; //CurrentState.Position.X = (absPosition.X - State.Origin.X) * (1f/CurrentState.Scale.X); //CurrentState.Position.Y = absPosition.Y - State.Origin.Y * (1f/CurrentState.Scale.Y); //CurrentState.Scale = parent.CurrentState.Scale * State.Scale * t.Scale; //absPosition = parent.CurrentState.Position + State.Position + t.Position; //CurrentState.Position.X = (absPosition.X - State.Origin.X) * (1f/CurrentState.Scale.X); //CurrentState.Position.Y = absPosition.Y - State.Origin.Y * (1f/CurrentState.Scale.Y); //curRot = State.Rotation + t.Rotation; //CurrentState.Rotation = parent.CurrentState.Rotation + State.Rotation + t.Rotation; //absPosition = (Origin) * (1f / CurrentState.Scale.X); //CurrentState.Position.X += (float)(Math.Cos(curRot) * absPosition.X - Math.Sin(curRot) * absPosition.Y); //CurrentState.Position.Y += (float)(Math.Sin(curRot) * absPosition.X + Math.Cos(curRot) * absPosition.Y); //curRot = State.Rotation + t.Rotation; //float parRot = parent.CurrentState.Rotation; //CurrentState.Rotation = parent.CurrentState.Rotation + curRot; //CurrentState.Position.X = parent.CurrentState.Position.X + (float)(Math.Cos(curRot) * curPos.X - Math.Sin(curRot) * curPos.Y); //CurrentState.Position.Y = parent.CurrentState.Position.Y + (float)(Math.Sin(curRot) * curPos.X + Math.Cos(curRot) * curPos.Y); /* * CurrentState.Scale = parent.CurrentState.Scale * State.Scale * t.Scale; * //CurrentState.Rotation = parent.CurrentState.Rotation + State.Rotation + t.Rotation; * //CurrentState.Position = parent.CurrentState.Position + State.Position + t.Position; * CurrentState.Origin = State.Origin; * * if (!(this is DisplayObjectContainer) || ((DisplayObjectContainer)this).NumChildren > 0) * { * CurrentState.Position = parent.CurrentState.Position + State.Position + t.Position; * CurrentState.Rotation = parent.CurrentState.Rotation + State.Rotation + t.Rotation; * } * else * { * curPos = State.Position + t.Position; * curRot = parent.CurrentState.Rotation + State.Rotation + t.Rotation; * CurrentState.Rotation = parent.CurrentState.Rotation + State.Rotation + t.Rotation; * CurrentState.Position = parent.CurrentState.Position + curPos; * // todo: this is needed for b2d elements, investigate * // CurrentState.Position.X = parent.CurrentState.Position.X + (float)(Math.Cos(curRot) * curPos.X - Math.Sin(curRot) * curPos.Y); * // CurrentState.Position.Y = parent.CurrentState.Position.Y + (float)(Math.Sin(curRot) * curPos.X + Math.Cos(curRot) * curPos.Y); * } */ }
public DisplayObject() { id = idCounter++; this.instanceName = "_inst" + id; transforms = new V2DTransform[] { State }; }