Exemple #1
0
        public override void OnBlockPlaced(ItemStack byItemStack = null)
        {
            BlockCompass blockCompass = byItemStack?.Block as BlockCompass;

            if (blockCompass != null && byItemStack != null)
            {
                this.IsCrafted          = BlockCompass.IsCrafted(byItemStack);
                this.CraftedByPlayerUID = BlockCompass.GetCraftedByPlayerUID(byItemStack);
                this.TargetPos          = blockCompass.GetTargetPos(byItemStack);
                if (blockCompass.ShouldPointToTarget(Pos, byItemStack))
                {
                    this.AngleRad = blockCompass.GetNeedle2DAngleRadians(this.Pos, byItemStack);
                }
            }
            if (Api.Side == EnumAppSide.Client)
            {
                this.renderer.AngleRad = this.AngleRad;
                if (compassBaseMesh == null)
                {
                    compassBaseMesh = GenMesh("base");
                }
                if (compassNeedleMesh == null)
                {
                    compassNeedleMesh = GenMesh("needle");
                }
                MarkDirty(true);
            }
        }
        public void OnRenderFrame(float deltaTime, EnumRenderStage stage)
        {
            if (meshref == null)
            {
                return;
            }

            IRenderAPI rpi    = api.Render;
            Vec3d      camPos = api.World.Player.Entity.CameraPos;

            rpi.GlDisableCullFace();
            rpi.GlToggleBlend(true);

            IStandardShaderProgram prog = rpi.PreparedStandardShader(compassPos.X, compassPos.Y, compassPos.Z);

            prog.Tex2D = api.BlockTextureAtlas.AtlasTextureIds[0];

            // TODO: Decouple from BlockCompass
            var renderAngle = AngleRad ?? BlockCompass.GetWildSpinAngle(api);

            prog.ModelMatrix = ModelMat
                               .Identity()
                               .Translate(compassPos.X - camPos.X, compassPos.Y - camPos.Y, compassPos.Z - camPos.Z)
                               .Translate(0.5f, 11f / 16f, 0.5f)
                               .RotateY(renderAngle)
                               .Translate(-0.5f, -11f / 16f, -0.5f)
                               .Values
            ;

            prog.ViewMatrix       = rpi.CameraMatrixOriginf;
            prog.ProjectionMatrix = rpi.CurrentProjectionMatrix;
            rpi.RenderMesh(meshref);
            prog.Stop();
        }
Exemple #3
0
        public override void Initialize(ICoreAPI api)
        {
            base.Initialize(api);

            this.ownBlock = Api.World.BlockAccessor.GetBlock(Pos) as BlockCompass;

            if (api.Side == EnumAppSide.Client)
            {
                renderer          = new CompassNeedleRenderer(api as ICoreClientAPI, Pos, GenMesh("needle"));
                renderer.AngleRad = AngleRad;
                (api as ICoreClientAPI).Event.RegisterRenderer(renderer, EnumRenderStage.Opaque, "compass");
            }
        }