- Fix model projection matrix

This commit is contained in:
Magnus Norddahl 2018-04-08 03:57:05 +02:00
parent 7f25913b2d
commit b1355d472c
2 changed files with 11 additions and 7 deletions

View file

@ -62,7 +62,7 @@ namespace swrenderer
void RenderViewport::SetupPolyViewport(RenderThread *thread) void RenderViewport::SetupPolyViewport(RenderThread *thread)
{ {
WorldToView = SoftwareWorldToView(viewpoint); WorldToView = SoftwareWorldToView(viewpoint);
ViewToClip = SoftwareViewToClip(viewwindow.FocalTangent, CenterY, YaspectMul); ViewToClip = SoftwareViewToClip();
WorldToClip = ViewToClip * WorldToView; WorldToClip = ViewToClip * WorldToView;
} }
@ -78,14 +78,17 @@ namespace swrenderer
return m * Mat4f::Translate((float)-viewpoint.Pos.X, (float)-viewpoint.Pos.Y, (float)-viewpoint.Pos.Z); return m * Mat4f::Translate((float)-viewpoint.Pos.X, (float)-viewpoint.Pos.Y, (float)-viewpoint.Pos.Z);
} }
Mat4f RenderViewport::SoftwareViewToClip(double focalTangent, double centerY, double YaspectMul) Mat4f RenderViewport::SoftwareViewToClip()
{ {
float near = 5.0f; float near = 5.0f;
float far = 65536.0f; float far = 65536.0f;
float width = (float)(focalTangent * near); float width = CenterX / FocalLengthX;
float top = (float)(centerY / viewheight * YaspectMul * near); float height = viewheight * 0.5 / FocalLengthY;
float bottom = (float)(top - YaspectMul * near); float offset = CenterY / FocalLengthY - height;
return Mat4f::Frustum(-width, width, bottom, top, near, far, Handedness::Right, ClipZRange::NegativePositiveW); width *= near;
height *= near;
offset *= near;
return Mat4f::Frustum(-width, width, -height + offset, height + offset, near, far, Handedness::Right, ClipZRange::NegativePositiveW);
} }
void RenderViewport::SetViewport(RenderThread *thread, int fullWidth, int fullHeight, float trueratio) void RenderViewport::SetViewport(RenderThread *thread, int fullWidth, int fullHeight, float trueratio)

View file

@ -84,6 +84,7 @@ namespace swrenderer
void SetupBuffer(); void SetupBuffer();
static Mat4f SoftwareWorldToView(const FRenderViewpoint &viewpoint); static Mat4f SoftwareWorldToView(const FRenderViewpoint &viewpoint);
static Mat4f SoftwareViewToClip(double focalTangent, double centerY, double YaspectMul);
Mat4f SoftwareViewToClip();
}; };
} }