public EntityHeadController(IAnimationManager animator, EntityAgent entity, Shape entityShape)
        {
            this.entity      = entity;
            this.animManager = animator;

            HeadElement = entityShape.GetElementByName("head");
            NeckElement = entityShape.GetElementByName("neck");

            HeadGlobalMatrix         = Mat4f.Create();
            HeadGlobalMatrixInverted = Mat4f.Create();
            HeadLocalMatrix          = Mat4f.Create();

            // Head
            List <ShapeElement> elems = HeadElement.GetParentPath();

            for (int i = 0; i < elems.Count; i++)
            {
                ShapeElement elem           = elems[i];
                float[]      localTransform = elem.GetLocalTransformMatrix();
                Mat4f.Mul(HeadGlobalMatrix, HeadGlobalMatrix, localTransform);
            }

            Mat4f.Mul(HeadGlobalMatrix, HeadGlobalMatrix, HeadElement.GetLocalTransformMatrix());
            Mat4f.Invert(HeadGlobalMatrixInverted, HeadGlobalMatrix);
        }
        private float[] GetFirstPersonHandsMatrix(EntityAgent entity, float[] viewMat, float deltaTime)
        {
            var modelMat = Mat4f.Invert(Mat4f.Create(), viewMat);

            // If the hands haven't been rendered in the last 10 render ticks, reset wobble and such.
            if (_renderTick - _lastTickHandsRendered > 10)
            {
                _moveWobble    = 0;
                _lastYaw       = entity.Pos.Yaw;;
                _yawDifference = 0;
            }
            _lastTickHandsRendered = _renderTick;


            if (entity.Controls.TriesToMove)
            {
                var moveSpeed = entity.Controls.MovespeedMultiplier * (float)entity.GetWalkSpeedMultiplier();
                _moveWobble += moveSpeed * deltaTime * 5.0F;
            }
            else
            {
                var target = (float)(Math.Round(_moveWobble / Math.PI) * Math.PI);
                var speed  = deltaTime * (0.2F + Math.Abs(target - _moveWobble) * 4);
                if (Math.Abs(target - _moveWobble) < speed)
                {
                    _moveWobble = target;
                }
                else
                {
                    _moveWobble += Math.Sign(target - _moveWobble) * speed;
                }
            }
            _moveWobble = _moveWobble % (GameMath.PI * 2);

            var moveWobbleOffsetX = GameMath.Sin((_moveWobble + GameMath.PI)) * 0.03F;
            var moveWobbleOffsetY = GameMath.Sin(_moveWobble * 2) * 0.02F;


            _yawDifference += GameMath.AngleRadDistance(_lastYaw, entity.Pos.Yaw);
            _yawDifference *= (1 - 0.075F);
            _lastYaw        = entity.Pos.Yaw;

            var yawRotation   = -_yawDifference / 2;
            var pitchRotation = (entity.Pos.Pitch - GameMath.PI) / 4;


            Mat4f.RotateY(modelMat, modelMat, yawRotation);
            Mat4f.Translate(modelMat, modelMat, 0.0F, -0.35F, -0.20F);
            Mat4f.RotateY(modelMat, modelMat, -yawRotation);
            Mat4f.RotateX(modelMat, modelMat, pitchRotation / 2);
            Mat4f.Translate(modelMat, modelMat, 0.0F, 0.0F, -0.20F);
            Mat4f.RotateX(modelMat, modelMat, pitchRotation);
            Mat4f.RotateY(modelMat, modelMat, yawRotation);

            Mat4f.Translate(modelMat, modelMat, moveWobbleOffsetX, moveWobbleOffsetY, 0.0F);
            Mat4f.RotateY(modelMat, modelMat, 90.0F * GameMath.DEG2RAD);

            return(modelMat);
        }
Beispiel #3
0
        public void OnRenderFrame(float deltaTime, EnumRenderStage stage)
        {
            // before rendering: update our values
            Mat4f.Invert(InvProjectionMatrix, _mod.CApi.Render.CurrentProjectionMatrix);
            Mat4f.Invert(InvModelViewMatrix, _mod.CApi.Render.CameraMatrixOriginf);

            _tempVec4f.Set(0, 0, 0, 1);
            Mat4f.MulWithVec4(InvModelViewMatrix, _tempVec4f, CameraWorldPosition);

            DayLight = 1.25f * GameMath.Max(
                _mod.CApi.World.Calendar.DayLightStrength -
                _mod.CApi.World.Calendar.MoonLightStrength / 2f, 0.05f);
        }
Beispiel #4
0
        /// <summary>
        /// Returns the full inverse model matrix (includes all parent transforms)
        /// </summary>
        /// <returns></returns>
        public float[] GetInverseModelMatrix()
        {
            List <ShapeElement> elems = GetParentPath();

            float[] modelTransform = Mat4f.Create();

            for (int i = 0; i < elems.Count; i++)
            {
                ShapeElement elem           = elems[i];
                float[]      localTransform = elem.GetLocalTransformMatrix();
                Mat4f.Mul(modelTransform, modelTransform, localTransform);
            }

            Mat4f.Mul(modelTransform, modelTransform, GetLocalTransformMatrix());

            float[] inverseTransformMatrix = Mat4f.Invert(Mat4f.Create(), modelTransform);

            return(inverseTransformMatrix);
        }
Beispiel #5
0
 public Matrixf Invert()
 {
     Mat4f.Invert(Values, Values);
     return(this);
 }
Beispiel #6
0
        public void OnRenderFrame(float deltaTime, EnumRenderStage stage)
        {
            foreach (var player in API.World.AllPlayers)
            {
                // Leaving the additional, more detailed exceptions in just in case other things end up breaking.
                if (player == null)
                {
                    throw new Exception("null player in API.World.AllPlayers!");
                }

                // Player entity may be null in some circumstances.
                // Maybe the other player is too far away, so there's
                // no entity spawned for them on the client's side?
                if (player.Entity == null)
                {
                    continue;
                }

                if (API.World == null)
                {
                    throw new Exception("API.World is null!");
                }
                if (API.World.Player == null)
                {
                    throw new Exception("API.World.Player is null!");
                }

                var entity     = player.Entity;
                var allCarried = entity.GetCarried().ToList();
                if (allCarried.Count == 0)
                {
                    continue;                                        // Entity is not carrying anything.
                }
                var renderApi     = API.Render;
                var isShadowPass  = (stage != EnumRenderStage.Opaque);
                var isFirstPerson = (player == API.World.Player) &&
                                    (API.World.Player.CameraMode == EnumCameraMode.FirstPerson);

                var renderer = (EntityShapeRenderer)entity.Properties.Client.Renderer;
                if (renderer == null)
                {
                    continue;                                   // Apparently this can end up being null?
                }
                // Reported to Tyron, so it might be fixed. Leaving it in for now just in case.

                var animator = entity.AnimManager.Animator;
                if (animator == null)
                {
                    throw new Exception("entity.AnimManager.Animator is null!");
                }

                foreach (var carried in allCarried)
                {
                    var inHands = (carried.Slot == CarrySlot.Hands);
                    if (!inHands && isFirstPerson && !isShadowPass)
                    {
                        continue;
                    }

                    var renderSettings = _renderSettings[carried.Slot];
                    var renderInfo     = GetRenderInfo(carried);

                    var     viewMat = Array.ConvertAll(API.Render.CameraMatrixOrigin, i => (float)i);
                    float[] modelMat;

                    if (inHands && isFirstPerson && !isShadowPass)
                    {
                        modelMat = Mat4f.Invert(Mat4f.Create(), viewMat);

                        if (entity.Controls.TriesToMove)
                        {
                            var moveSpeed = entity.Controls.MovespeedMultiplier * (float)entity.GetWalkSpeedMultiplier();
                            moveWobble += moveSpeed * deltaTime * 5.0F;
                        }
                        else
                        {
                            var target = (float)(Math.Round(moveWobble / Math.PI) * Math.PI);
                            var speed  = deltaTime * (0.2F + Math.Abs(target - moveWobble) * 4);
                            if (Math.Abs(target - moveWobble) < speed)
                            {
                                moveWobble = target;
                            }
                            else
                            {
                                moveWobble += Math.Sign(target - moveWobble) * speed;
                            }
                        }
                        moveWobble = moveWobble % (GameMath.PI * 2);

                        var moveWobbleOffsetX = GameMath.Sin((moveWobble + GameMath.PI)) * 0.03F;
                        var moveWobbleOffsetY = GameMath.Sin(moveWobble * 2) * 0.02F;

                        Mat4f.Translate(modelMat, modelMat, moveWobbleOffsetX, moveWobbleOffsetY - 0.25F, -0.25F);
                        Mat4f.RotateY(modelMat, modelMat, 90.0F * GameMath.DEG2RAD);
                    }
                    else
                    {
                        modelMat = Mat4f.CloneIt(renderer.ModelMat);

                        var attachPointAndPose = animator.GetAttachmentPointPose(renderSettings.AttachmentPoint);
                        if (attachPointAndPose == null)
                        {
                            continue;
                        }
                        var animModelMat = attachPointAndPose.CachedPose.AnimModelMatrix;
                        Mat4f.Mul(modelMat, modelMat, animModelMat);

                        // Apply attachment point transform.
                        var attach = attachPointAndPose.AttachPoint;
                        Mat4f.Translate(modelMat, modelMat, (float)(attach.PosX / 16), (float)(attach.PosY / 16), (float)(attach.PosZ / 16));
                        Mat4f.RotateX(modelMat, modelMat, (float)attach.RotationX * GameMath.DEG2RAD);
                        Mat4f.RotateY(modelMat, modelMat, (float)attach.RotationY * GameMath.DEG2RAD);
                        Mat4f.RotateZ(modelMat, modelMat, (float)attach.RotationZ * GameMath.DEG2RAD);
                    }

                    // Apply carried block's behavior transform.
                    var t = renderInfo.Transform;
                    Mat4f.Scale(modelMat, modelMat, t.ScaleXYZ.X, t.ScaleXYZ.Y, t.ScaleXYZ.Z);
                    Mat4f.Translate(modelMat, modelMat, renderSettings.Offset.X, renderSettings.Offset.Y, renderSettings.Offset.Z);
                    Mat4f.Translate(modelMat, modelMat, t.Origin.X, t.Origin.Y, t.Origin.Z);
                    Mat4f.RotateX(modelMat, modelMat, t.Rotation.X * GameMath.DEG2RAD);
                    Mat4f.RotateY(modelMat, modelMat, t.Rotation.Y * GameMath.DEG2RAD);
                    Mat4f.RotateZ(modelMat, modelMat, t.Rotation.Z * GameMath.DEG2RAD);
                    Mat4f.Translate(modelMat, modelMat, -t.Origin.X, -t.Origin.Y, -t.Origin.Z);
                    Mat4f.Translate(modelMat, modelMat, t.Translation.X, t.Translation.Y, t.Translation.Z);

                    if (isShadowPass)
                    {
                        var prog = renderApi.CurrentActiveShader;
                        Mat4f.Mul(modelMat, API.Render.CurrentShadowProjectionMatrix, modelMat);
                        prog.BindTexture2D("tex2d", renderInfo.TextureId, 0);
                        prog.UniformMatrix("mvpMatrix", modelMat);
                        prog.Uniform("origin", renderer.OriginPos);

                        API.Render.RenderMesh(renderInfo.ModelRef);
                    }
                    else
                    {
                        var prog = renderApi.PreparedStandardShader((int)entity.Pos.X, (int)entity.Pos.Y, (int)entity.Pos.Z);
                        prog.Tex2D            = renderInfo.TextureId;
                        prog.AlphaTest        = 0.01f;
                        prog.ViewMatrix       = viewMat;
                        prog.ModelMatrix      = modelMat;
                        prog.DontWarpVertices = 1;

                        API.Render.RenderMesh(renderInfo.ModelRef);

                        prog.Stop();
                    }
                }
            }
        }