get player to react to wall quad tree

This commit is contained in:
2024-12-13 22:48:34 +00:00
parent 9d42e14b2f
commit 9144c97fba
6 changed files with 741 additions and 308 deletions

View File

@@ -2,7 +2,16 @@ structure GlDraw =
struct
open CML
type t = { window: MLton.Pointer.t }
type t =
{ window: MLton.Pointer.t
, mbox: InputMsg.t Mailbox.mbox
, wallVertexBuffer: Word32.word
, wallProgram: Word32.word
, wallLength: int
, playerVertexBuffer: Word32.word
, playerProgram: Word32.word
, playerLength: int
}
fun createShader (shaderType, shaderString) =
let
@@ -25,17 +34,86 @@ struct
fun create window =
let
val mbox = Mailbox.mailbox ()
(* create vertex buffer, program, etc. *)
val textVertexBuffer = Gles3.createBuffer ()
val xyrgbVertexShader = createShader
(Gles3.VERTEX_SHADER, GlShaders.xyrgbVertexShaderString)
val rgbFragmentShader = createShader
(Gles3.FRAGMENT_SHADER, GlShaders.rgbFragmentShaderString)
val placeholderProgram = createProgram (xyrgbVertexShader, rgbFragmentShader)
(* wall here includes both walls and platforms *)
val wallVertexBuffer = Gles3.createBuffer ()
val wallProgram = createProgram (xyrgbVertexShader, rgbFragmentShader)
val playerVertexBuffer = Gles3.createBuffer ()
val playerProgram = createProgram (xyrgbVertexShader, rgbFragmentShader)
in
{window = window}
{ window = window
, mbox = mbox
, wallVertexBuffer = wallVertexBuffer
, wallProgram = wallProgram
, wallLength = 0
, playerVertexBuffer = playerVertexBuffer
, playerProgram = playerProgram
, playerLength = 0
}
end
fun uploadWall (shellState: t, vec) =
let
val
{ window
, mbox
, playerVertexBuffer
, playerProgram
, playerLength
, wallVertexBuffer
, wallProgram
, wallLength = _
} = shellState
val _ = Gles3.bindBuffer wallVertexBuffer
val _ = Gles3.bufferData (vec, Vector.length vec, Gles3.STATIC_DRAW)
val newWallLength = Vector.length vec div 5
in
{ window = window
, mbox = mbox
, playerVertexBuffer = playerVertexBuffer
, playerProgram = playerProgram
, playerLength = playerLength
, wallVertexBuffer = wallVertexBuffer
, wallProgram = wallProgram
, wallLength = newWallLength
}
end
fun uploadPlayer (shellState: t, vec) =
let
val
{ window
, mbox
, wallVertexBuffer
, wallProgram
, wallLength
, playerVertexBuffer
, playerProgram
, playerLength = _
} = shellState
val _ = Gles3.bindBuffer playerVertexBuffer
val _ = Gles3.bufferData (vec, Vector.length vec, Gles3.STATIC_DRAW)
val newPlayerLength = Vector.length vec div 5
in
{ window = window
, mbox = mbox
, wallVertexBuffer = wallVertexBuffer
, wallProgram = wallProgram
, wallLength = wallLength
, playerVertexBuffer = playerVertexBuffer
, playerProgram = playerProgram
, playerLength = newPlayerLength
}
end
fun drawXyrgb (vertexBuffer, program, drawLength) =
@@ -57,7 +135,21 @@ struct
else
()
fun helpLoop (shellState as {window, ...}: t) =
fun drawWall ({wallVertexBuffer, wallProgram, wallLength, ...}: t) =
drawXyrgb (wallVertexBuffer, wallProgram, wallLength)
fun drawPlayer ({playerVertexBuffer, playerProgram, playerLength, ...}: t) =
drawXyrgb (playerVertexBuffer, playerProgram, playerLength)
fun draw (shellState: t) =
let
val _ = drawWall shellState
val _ = drawPlayer shellState
in
()
end
fun helpLoop (shellState as {window, ...}: t, player) =
case Glfw.windowShouldClose window of
false =>
let
@@ -69,15 +161,26 @@ struct
* - consume draw messages
* - finally, draw
* *)
val wallVec = Wall.generateWalls ()
val shellState = uploadWall (shellState, wallVec)
val player = Player.move player
val playerVec = Player.getVec player
val shellState = uploadWall (shellState, wallVec)
val shellState = uploadPlayer (shellState, playerVec)
val _ = draw shellState
val _ = Glfw.swapBuffers window
val _ = Glfw.waitEvents ()
in
helpLoop shellState
helpLoop (shellState, player)
end
| true => Glfw.terminate ()
fun loop window =
let val shellState = create window
in helpLoop shellState
in helpLoop (shellState, Player.initial)
end
end