Пример #1
0
        public void OnRenderFrame(float deltaTime, EnumRenderStage stage)
        {
            if (backPackMeshRef == null)
            {
                Block block = api.World.GetBlock(new AssetLocation("stationarybasket-north"));
                backPackMeshRef          = api.Render.UploadMesh(api.TesselatorManager.GetDefaultBlockMesh(block));
                backPackTextureId        = api.BlockTextureAtlas.Positions[0].atlasTextureId;
                backPackTransform.Origin = block.GuiTransform.Origin;
            }

            for (int i = 0; i < api.World.AllPlayers.Length; i++)
            {
                IPlayer             plr  = api.World.AllPlayers[i];
                EntityShapeRenderer rend = plr.Entity.Properties.Client.Renderer as EntityShapeRenderer;
                if (rend == null)
                {
                    continue;
                }

                if (plr == api.World.Player && api.World.Player.CameraMode == EnumCameraMode.FirstPerson)
                {
                    continue;
                }

                RenderBackPack(plr.Entity, rend, stage != EnumRenderStage.Opaque);
            }
        }
Пример #2
0
        /// <summary> Returns a model view matrix for rendering a carried block on the specified attachment point. </summary>
        private float[] GetAttachmentPointMatrix(EntityShapeRenderer renderer, AttachmentPointAndPose attachPointAndPose)
        {
            var modelMat     = Mat4f.CloneIt(renderer.ModelMat);
            var animModelMat = attachPointAndPose.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);

            return(modelMat);
        }
Пример #3
0
        private void RenderBackPack(EntityPlayer entity, EntityShapeRenderer rend, bool isShadowPass)
        {
            IRenderAPI             rpi      = api.Render;
            ClientAnimator         animator = entity.AnimManager.Animator as ClientAnimator;
            AttachmentPointAndPose apap     = null;

            animator.AttachmentPointByCode.TryGetValue("Back", out apap);

            if (apap == null || backPackMeshRef == null)
            {
                return;
            }

            for (int i = 0; i < 16; i++)
            {
                modelMat[i] = rend.ModelMat[i];
            }

            AttachmentPoint ap = apap.AttachPoint;

            float[] animModelMat = apap.CachedPose.AnimModelMatrix;
            float[] viewMatrix   = new float[16];
            for (int i = 0; i < 16; i++)
            {
                viewMatrix[i] = (float)api.Render.CameraMatrixOrigin[i];
            }

            Mat4f.Mul(modelMat, modelMat, animModelMat);

            IStandardShaderProgram prog = null;

            if (isShadowPass)
            {
                rpi.CurrentActiveShader.BindTexture2D("tex2d", backPackTextureId, 0);
            }
            else
            {
                prog           = rpi.PreparedStandardShader((int)entity.Pos.X, (int)entity.Pos.Y, (int)entity.Pos.Z);
                prog.Tex2D     = backPackTextureId;
                prog.AlphaTest = 0.01f;
            }


            Mat4f.Translate(modelMat, modelMat, backPackTransform.Origin.X, backPackTransform.Origin.Y, backPackTransform.Origin.Z);
            Mat4f.Scale(modelMat, modelMat, backPackTransform.ScaleXYZ.X, backPackTransform.ScaleXYZ.Y, backPackTransform.ScaleXYZ.Z);
            Mat4f.Translate(modelMat, modelMat, (float)ap.PosX / 16f + backPackTransform.Translation.X, (float)ap.PosY / 16f + backPackTransform.Translation.Y, (float)ap.PosZ / 16f + backPackTransform.Translation.Z);
            Mat4f.RotateX(modelMat, modelMat, (float)(ap.RotationX + backPackTransform.Rotation.X) * GameMath.DEG2RAD);
            Mat4f.RotateY(modelMat, modelMat, (float)(ap.RotationY + backPackTransform.Rotation.Y) * GameMath.DEG2RAD);
            Mat4f.RotateZ(modelMat, modelMat, (float)(ap.RotationZ + backPackTransform.Rotation.Z) * GameMath.DEG2RAD);
            Mat4f.Translate(modelMat, modelMat, -(backPackTransform.Origin.X), -(backPackTransform.Origin.Y), -(backPackTransform.Origin.Z));

            if (isShadowPass)
            {
                Mat4f.Mul(modelMat, api.Render.CurrentShadowProjectionMatrix, modelMat);
                api.Render.CurrentActiveShader.UniformMatrix("mvpMatrix", modelMat);
                api.Render.CurrentActiveShader.Uniform("origin", rend.OriginPos);
            }
            else
            {
                prog.ModelMatrix = modelMat;
                prog.ViewMatrix  = viewMatrix;
            }

            api.Render.RenderMesh(backPackMeshRef);

            if (!isShadowPass)
            {
                prog.Stop();
            }
        }
Пример #4
0
        /// <summary> Renders the specified carried block on the specified entity. </summary>
        private void RenderCarried(EntityAgent entity, CarriedBlock carried, float deltaTime,
                                   bool isLocalPlayer, bool isFirstPerson, bool isImmersiveFirstPerson,
                                   bool isShadowPass, EntityShapeRenderer renderer, IAnimator animator)
        {
            var inHands = (carried.Slot == CarrySlot.Hands);

            if (!inHands && isFirstPerson && !isShadowPass)
            {
                return;                                                         // Only Hands slot is rendered in first person.
            }
            var viewMat        = Array.ConvertAll(API.Render.CameraMatrixOrigin, i => (float)i);
            var renderSettings = _renderSettings[carried.Slot];
            var renderInfo     = GetRenderInfo(carried);

            float[] modelMat;
            if (inHands && isFirstPerson && !isImmersiveFirstPerson && !isShadowPass)
            {
                modelMat = GetFirstPersonHandsMatrix(entity, viewMat, deltaTime);
            }
            else
            {
                var attachPointAndPose = animator.GetAttachmentPointPose(renderSettings.AttachmentPoint);
                if (attachPointAndPose == null)
                {
                    return;                                             // Couldn't find attachment point.
                }
                modelMat = GetAttachmentPointMatrix(renderer, attachPointAndPose);
                // If in immersive first person, move the model down a bit so it's not too much "in your face".
                if (isImmersiveFirstPerson)
                {
                    Mat4f.Translate(modelMat, modelMat, 0.0F, -0.12F, 0.0F);
                }
            }

            // 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.RotateZ(modelMat, modelMat, t.Rotation.Z * GameMath.DEG2RAD);
            Mat4f.RotateY(modelMat, modelMat, t.Rotation.Y * 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 = API.Render.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 = API.Render.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();
            }
        }