Skip to content

Commit 5e382c5

Browse files
committed
Attempt to fix relative gui rendering.
1 parent dd514e0 commit 5e382c5

File tree

4 files changed

+29
-8
lines changed

4 files changed

+29
-8
lines changed

Nu/Nu/OpenGL/OpenGL.Sprite.fs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,9 @@ module Sprite =
8787
let DrawSprite
8888
(vertices,
8989
indices,
90-
viewProjection : Matrix4x4 inref,
90+
absolute,
91+
viewProjectionAbsolute : Matrix4x4 inref,
92+
viewProjectionClip : Matrix4x4 inref,
9193
modelViewProjection : single array,
9294
insetOpt : Box2 voption inref,
9395
clipOpt : Box2 voption inref,
@@ -149,6 +151,7 @@ module Sprite =
149151
Gl.Enable EnableCap.CullFace
150152
match clipOpt with
151153
| ValueSome clip ->
154+
let viewProjection = if absolute then viewProjectionAbsolute else viewProjectionClip
152155
let minClip = Vector4.Transform (Vector4 (clip.Min, 0.0f, 1.0f), viewProjection)
153156
let minNdc = minClip / minClip.W * single viewport.DisplayScalar
154157
let minScissor = (minNdc.V2 + v2One) * 0.5f * viewport.Bounds.Size.V2

Nu/Nu/OpenGL/OpenGL.SpriteBatch.fs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ module SpriteBatch =
4646
{ mutable SpriteIndex : int
4747
mutable ViewProjectionAbsolute : Matrix4x4
4848
mutable ViewProjectionRelative : Matrix4x4
49+
mutable ViewProjectionClip : Matrix4x4
4950
PerimetersUniform : int
5051
TexCoordsesUniform : int
5152
PivotsUniform : int
@@ -98,7 +99,7 @@ module SpriteBatch =
9899
Gl.Enable EnableCap.CullFace
99100
match env.State.ClipOpt with
100101
| ValueSome clip ->
101-
let viewProjection = if env.State.Absolute then env.ViewProjectionAbsolute else env.ViewProjectionRelative
102+
let viewProjection = if env.State.Absolute then env.ViewProjectionAbsolute else env.ViewProjectionClip
102103
let minClip = Vector4.Transform (Vector4 (clip.Min, 0.0f, 1.0f), viewProjection)
103104
let minNdc = minClip / minClip.W * single viewport.DisplayScalar
104105
let minScissor = (minNdc.V2 + v2One) * 0.5f * viewport.Bounds.Size.V2
@@ -161,9 +162,14 @@ module SpriteBatch =
161162
BeginSpriteBatch state env
162163

163164
/// Beging a new sprite batch frame3.
164-
let BeginSpriteBatchFrame (viewProjectionAbsolute : Matrix4x4 inref, viewProjectionRelative : Matrix4x4 inref, env) =
165+
let BeginSpriteBatchFrame
166+
(viewProjectionAbsolute : Matrix4x4 inref,
167+
viewProjectionRelative : Matrix4x4 inref,
168+
viewProjectionClip : Matrix4x4 inref,
169+
env) =
165170
env.ViewProjectionAbsolute <- viewProjectionAbsolute
166171
env.ViewProjectionRelative <- viewProjectionRelative
172+
env.ViewProjectionClip <- viewProjectionClip
167173
BeginSpriteBatch SpriteBatchState.defaultState env
168174

169175
/// End the current sprite batch frame, if any.
@@ -233,7 +239,7 @@ module SpriteBatch =
233239
Hl.Assert ()
234240

235241
// create env
236-
{ SpriteIndex = 0; ViewProjectionAbsolute = m4Identity; ViewProjectionRelative = m4Identity
242+
{ SpriteIndex = 0; ViewProjectionAbsolute = m4Identity; ViewProjectionRelative = m4Identity; ViewProjectionClip = m4Identity
237243
PerimetersUniform = perimetersUniform; PivotsUniform = pivotsUniform; RotationsUniform = rotationsUniform
238244
TexCoordsesUniform = texCoordsesUniform; ColorsUniform = colorsUniform; ViewProjectionUniform = viewProjectionUniform
239245
TexUniform = texUniform; Shader = shader

Nu/Nu/Render/Renderer2d.fs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -676,7 +676,8 @@ type [<ReferenceEquality>] GlRenderer2d =
676676
let virtualScalar = (v2iDup renderer.Viewport.DisplayScalar).V2
677677
let position = perimeter.Min.V2 * virtualScalar
678678
let size = perimeter.Size.V2 * virtualScalar
679-
let viewProjection = Viewport.getViewProjection2d absolute eyeCenter eyeSize renderer.Viewport
679+
let viewProjection2d = Viewport.getViewProjection2d absolute eyeCenter eyeSize renderer.Viewport
680+
let viewProjectionClip = Viewport.getViewProjectionClip eyeCenter eyeSize renderer.Viewport
680681
match GlRenderer2d.tryGetRenderAsset font renderer with
681682
| ValueSome renderAsset ->
682683
match renderAsset with
@@ -756,7 +757,7 @@ type [<ReferenceEquality>] GlRenderer2d =
756757
let modelTranslation = Matrix4x4.CreateTranslation translation
757758
let modelScale = Matrix4x4.CreateScale scale
758759
let modelMatrix = modelScale * modelTranslation
759-
let modelViewProjection = modelMatrix * viewProjection
760+
let modelViewProjection = modelMatrix * viewProjection2d
760761

761762
// upload texture data
762763
let textTextureId = OpenGL.Gl.GenTexture ()
@@ -779,7 +780,7 @@ type [<ReferenceEquality>] GlRenderer2d =
779780
let (vertices, indices) = renderer.TextQuad
780781
let insetOpt : Box2 voption = ValueNone
781782
let color = Color.White
782-
OpenGL.Sprite.DrawSprite (vertices, indices, &viewProjection, modelViewProjection.ToArray (), &insetOpt, &clipOpt, &color, FlipNone, textSurfaceWidth, textSurfaceHeight, textTexture, renderer.Viewport, modelViewProjectionUniform, texCoords4Uniform, colorUniform, textureUniform, shader, vao)
783+
OpenGL.Sprite.DrawSprite (vertices, indices, absolute, &viewProjection2d, &viewProjectionClip, modelViewProjection.ToArray (), &insetOpt, &clipOpt, &color, FlipNone, textSurfaceWidth, textSurfaceHeight, textTexture, renderer.Viewport, modelViewProjectionUniform, texCoords4Uniform, colorUniform, textureUniform, shader, vao)
783784
OpenGL.Hl.Assert ()
784785

785786
// destroy texture
@@ -848,7 +849,8 @@ type [<ReferenceEquality>] GlRenderer2d =
848849
// begin sprite batch frame
849850
let viewProjectionAbsolute = Viewport.getViewProjection2d true eyeCenter eyeSize renderer.Viewport
850851
let viewProjectionRelative = Viewport.getViewProjection2d false eyeCenter eyeSize renderer.Viewport
851-
OpenGL.SpriteBatch.BeginSpriteBatchFrame (&viewProjectionAbsolute, &viewProjectionRelative, renderer.SpriteBatchEnv)
852+
let viewProjectionClip = Viewport.getViewProjectionClip eyeCenter eyeSize viewport
853+
OpenGL.SpriteBatch.BeginSpriteBatchFrame (&viewProjectionAbsolute, &viewProjectionRelative, &viewProjectionClip, renderer.SpriteBatchEnv)
852854
OpenGL.Hl.Assert ()
853855

854856
// render frame

Nu/Nu/Transform/Viewport.fs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,16 @@ type [<StructuralEquality; NoComparison>] Viewport =
9898
let projection = viewport.Projection2d
9999
view * projection
100100

101+
/// Compute the scissor clip view matrix.
102+
static member getViewClip (eyeCenter : Vector2) eyeSize viewport =
103+
Viewport.getView2d false (eyeCenter / single viewport.DisplayScalar) eyeSize viewport
104+
105+
/// Compute the scissor clip view projection matrix.
106+
static member getViewProjectionClip eyeCenter eyeSize viewport =
107+
let view = Viewport.getViewClip eyeCenter eyeSize viewport
108+
let projection = viewport.Projection2d
109+
view * projection
110+
101111
/// Compute the absolute 2d position from the given relative 3d position.
102112
static member position3dToPosition2d eyeCenter (eyeRotation : Quaternion) eyeFieldOfView (position : Vector3) viewport =
103113
let view = Viewport.getView3d eyeCenter eyeRotation

0 commit comments

Comments
 (0)