add basic imperative shell

This commit is contained in:
2024-12-10 19:48:07 +00:00
parent fb2be7be73
commit 9d42e14b2f
17 changed files with 5083 additions and 1 deletions

83
shell/gl-draw.sml Normal file
View File

@@ -0,0 +1,83 @@
structure GlDraw =
struct
open CML
type t = { window: MLton.Pointer.t }
fun createShader (shaderType, shaderString) =
let
val shader = Gles3.createShader shaderType
val _ = Gles3.shaderSource (shader, shaderString)
val _ = Gles3.compileShader shader
in
shader
end
fun createProgram (vertexShader, fragmentShader) =
let
val program = Gles3.createProgram ()
val _ = Gles3.attachShader (program, vertexShader)
val _ = Gles3.attachShader (program, fragmentShader)
val _ = Gles3.linkProgram program
in
program
end
fun create window =
let
(* 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)
in
{window = window}
end
fun drawXyrgb (vertexBuffer, program, drawLength) =
if drawLength > 0 then
let
val _ = Gles3.bindBuffer vertexBuffer
(* enable xy component from uploaded array *)
val _ = Gles3.vertexAttribPointer (0, 2, 5, 0)
val _ = Gles3.enableVertexAttribArray 0
(* enable rgb component from uploaded array *)
val _ = Gles3.vertexAttribPointer (1, 3, 5, 8)
val _ = Gles3.enableVertexAttribArray 1
val _ = Gles3.useProgram program
val _ = Gles3.drawArrays (Gles3.TRIANGLES, 0, drawLength)
in
()
end
else
()
fun helpLoop (shellState as {window, ...}: t) =
case Glfw.windowShouldClose window of
false =>
let
val _ = Gles3.clearColor (1.0, 1.0, 1.0, 1.0)
val _ = Gles3.clear ()
(* todo:
* - update game state
* - consume draw messages
* - finally, draw
* *)
val _ = Glfw.swapBuffers window
val _ = Glfw.waitEvents ()
in
helpLoop shellState
end
| true => Glfw.terminate ()
fun loop window =
let val shellState = create window
in helpLoop shellState
end
end

23
shell/gl-shaders.sml Normal file
View File

@@ -0,0 +1,23 @@
structure GlShaders =
struct
val xyrgbVertexShaderString =
"#version 300 es\n\
\layout (location = 0) in vec2 apos;\n\
\layout (location = 1) in vec3 col;\n\
\out vec3 frag_col;\n\
\void main()\n\
\{\n\
\ frag_col = col;\n\
\ gl_Position = vec4(apos.x, apos.y, 0.0f, 1.0f);\n\
\}"
val rgbFragmentShaderString =
"#version 300 es\n\
\precision mediump float;\n\
\in vec3 frag_col;\n\
\out vec4 FragColor;\n\
\void main()\n\
\{\n\
\ FragColor = vec4(frag_col.x, frag_col.y, frag_col.z, 1.0f);\n\
\}"
end

21
shell/shell.sml Normal file
View File

@@ -0,0 +1,21 @@
structure Shell =
struct
open CML
fun main () =
let
(* Set up GLFW. *)
val _ = Glfw.init ()
val _ = Glfw.windowHint (Glfw.CONTEXT_VERSION_MAJOR (), 3)
val _ = Glfw.windowHint (Glfw.DEPRECATED (), Glfw.FALSE ())
val _ = Glfw.windowHint (Glfw.WINDOW_MAX (), Glfw.TRUE ())
val window = Glfw.createWindow (1920, 1080, "shf")
val _ = Glfw.makeContextCurrent window
val _ = Gles3.loadGlad ()
in
GlDraw.loop window
end
end
val _ = Shell.main ()