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