Пример #1
0
        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;
            }
        }
Пример #2
0
 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);
 }
Пример #3
0
 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);
 }
Пример #4
0
        //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);
        }
Пример #5
0
        //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);
             * }
             */
        }
Пример #6
0
 public DisplayObject()
 {
     id = idCounter++;
     this.instanceName = "_inst" + id;
     transforms        = new V2DTransform[] { State };
 }