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); }
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); }
/// <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); }
public Matrixf Invert() { Mat4f.Invert(Values, Values); return(this); }
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(); } } } }