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(); }
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"); } }