Пример #1
0
        private void mixJoints(IJoint result, IJoint joint1, double amount1, IJoint joint2, double amount2)
        {
            double   enableJoint1 = 1.0;
            double   enableJoint2 = 1.0;
            Vector3D p;

            p = joint1.AnimationTransform * new Vector3D(1, 1, 1);     // check, if AnimationTransform is Identity Matrix... for the lazy ones...
            if (p.x == 1 && p.y == 1 && p.z == 1)
            {
                enableJoint1 = 0;
            }
            p = joint2.AnimationTransform * new Vector3D(1, 1, 1);
            if (p.x == 1 && p.y == 1 && p.z == 1)
            {
                enableJoint2 = 0;
            }

            Matrix4x4 resultAnimationT = result.AnimationTransform;

            Matrix4x4Utils.Blend(joint1.AnimationTransform, joint2.AnimationTransform, amount1 * enableJoint1, amount2 * enableJoint2, out resultAnimationT);

            result.AnimationTransform = resultAnimationT;

            for (int i = 0; i < result.Children.Count; i++)
            {
                mixJoints(result.Children[i], joint1.Children[i], amount1, joint2.Children[i], amount2);
            }
        }
Пример #2
0
 void LateUpdate()
 {
     if (updateCameraCalibration)
     {
         updateCameraCalibration = false;
         UpdateCameraCalibration();
     }
     if (reset)
     {
         reset      = false;
         projection = initialProjection;
         theCamera.ResetProjectionMatrix();
         theCamera.ResetWorldToCameraMatrix();
     }
     if (DoUpdate)
     {
         if (UpdateView)
         {
             Matrix4x4Utils.SetTransformFromMatrix(transform, ref cameraPosition);
         }
         //theCamera.worldToCameraMatrix = view;
         //if (UpdateProjection)
         theCamera.projectionMatrix = projection;
     }
 }
        public bool CheckConstraint(Behaviors.ValidateFunctionArguments validateFunctionArguments, CheckConstraintArguments checkConstraintArguments)
        {
            if (this.UpstreamConstraint != null)
            {
                if (!this.UpstreamConstraint.CheckConstraint(validateFunctionArguments, checkConstraintArguments))
                {
                    return(false);
                }
            }

            if (!validateFunctionArguments.ActionsApplied.Contains(Behaviors.ActionsApplied.Translate))
            {
                // Ignore if no translate applied
                return(true);
            }

            Vector3D rotation, scale, translation;

            Matrix4x4Utils.Decompose(validateFunctionArguments.Transform
                                     , out scale
                                     , out rotation
                                     , out translation);

            var translation2 = new Vector2D(translation.x, translation.y);

            var result = translation2.x >= this.Minimum.x &&
                         translation2.y >= this.Minimum.y &&
                         translation2.x <= this.Maximum.x &&
                         translation2.y <= this.Maximum.y;

            return(result);
        }
        public bool CheckConstraint(Behaviors.ValidateFunctionArguments validateFunctionArguments, CheckConstraintArguments checkConstraintArguments)
        {
            if (this.UpstreamConstraint != null)
            {
                if (!this.UpstreamConstraint.CheckConstraint(validateFunctionArguments, checkConstraintArguments))
                {
                    return(false);
                }
            }

            if (!validateFunctionArguments.ActionsApplied.Contains(Behaviors.ActionsApplied.Rotate))
            {
                // Ignore if no rotation applied
                return(true);
            }

            Vector3D rotation, scale, translation;

            Matrix4x4Utils.Decompose(validateFunctionArguments.Transform
                                     , out scale
                                     , out rotation
                                     , out translation);

            return(rotation.z / (Math.PI * 2.0) >= this.Minimum && rotation.z / (Math.PI * 2.0) <= this.Maximum);
        }
Пример #5
0
        public override void World(World world)
        {
            _geometry = world.WorldObject.Model.Geometry;
            var lightSourceView = Matrix4x4Utils.LookAt(new Vector3(0, 0, 0), world.LightDirection, new Vector3(0, 1, 0));

            _transformation = world.ViewportTransform.Mul(world.ProjectionTransform.Mul(lightSourceView.Mul(world.WorldObject.ModelTransform)));
        }
Пример #6
0
        /// <summary>
        ///     Gets the rotation matrix such that the normal faces forwards.
        /// </summary>
        /// <returns>The rotation matrix.</returns>
        /// <param name="pointA">Point a.</param>
        /// <param name="pointB">Point b.</param>
        /// <param name="pointC">Point c.</param>
        public static Matrix4x4 GetRotationMatrix(Vector3 pointA, Vector3 pointB, Vector3 pointC)
        {
            Vector3 normal = GetNormal(pointA, pointB, pointC);

            return(Matrix4x4Utils.Rotate(normal, pointB - pointA).inverse);
        }
Пример #7
0
        public void Evaluate(int SpreadMax)
        {
            if (Pins.InputPins.Count == 0 || Pins.InputSpreadMin == 0)
            {
                FOut.SliceCount = 0;
                return;
            }
            if (Pins.InputPins.Values.Any(pin => pin.Spread[0] == null))
            {
                return;
            }
            if (Pins.InputChanged)
            {
                FOut.Stream.IsChanged = true;
                var currposecount = Pins.InputPins.Count / 2;
                for (int i = 0; i < FOut.SliceCount; i++)
                {
                    if (FOut[i] == null)
                    {
                        FOut[i] = new Skeleton();
                    }
                    else
                    {
                        ((ISkeleton)Pins.InputPins["Pose 0"].Spread[i]).CopyData(FOut[i]);
                    }
                    var outSkeleton = FOut[i];
                    var outAmount   = (double)Pins.InputPins["Amount 0"].Spread[i];
                    var outAmDiv    = 1;
                    for (int j = 1; j < currposecount; j++)
                    {
                        var currSkeleton = (ISkeleton)Pins.InputPins[$"Pose {j}"].Spread[i];
                        var currAmount   = (double)Pins.InputPins[$"Amount {j}"].Spread[i];
                        foreach (var joint in outSkeleton.JointTable.Keys)
                        {
                            if (!currSkeleton.JointTable.ContainsKey(joint))
                            {
                                continue;
                            }

                            Matrix4x4 result;
                            if (!FAnimOnly[0])
                            {
                                var currBase = currSkeleton.JointTable[joint].BaseTransform;
                                var outBase  = outSkeleton.JointTable[joint].BaseTransform;
                                Matrix4x4Utils.Blend(outBase, currBase, outAmount / outAmDiv, currAmount, out result);
                                outSkeleton.JointTable[joint].BaseTransform = result;
                            }

                            var currAnim = currSkeleton.JointTable[joint].AnimationTransform;
                            var outAnim  = outSkeleton.JointTable[joint].AnimationTransform;
                            Matrix4x4Utils.Blend(outAnim, currAnim, outAmount / outAmDiv, currAmount, out result);
                            outSkeleton.JointTable[joint].AnimationTransform = result;
                        }
                        outAmount += currAmount;
                        outAmDiv++;
                    }
                }
            }
            else
            {
                FOut.Stream.IsChanged = false;
            }
        }