Add 'shf/' from commit 'b6c5a95b664aeb861d7b33ffc9eefe447ba99dd7'
git-subtree-dir: shf git-subtree-mainline:401408448fgit-subtree-split:b6c5a95b66
This commit is contained in:
82
shf/shell/gl-draw.sml
Normal file
82
shf/shell/gl-draw.sml
Normal file
@@ -0,0 +1,82 @@
|
||||
structure GlDraw =
|
||||
struct
|
||||
open DrawMsg
|
||||
|
||||
type t =
|
||||
{ textVertexBuffer: Word32.word
|
||||
, textProgram: Word32.word
|
||||
, textDrawLength: int
|
||||
}
|
||||
|
||||
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 () =
|
||||
let
|
||||
(* create vertex buffer, program, etc. for text. *)
|
||||
val textVertexBuffer = Gles3.createBuffer ()
|
||||
val xyzRgbVertexShader = createShader
|
||||
(Gles3.VERTEX_SHADER, GlShaders.xyzRgbVertexShaderString)
|
||||
|
||||
val rgbFragmentShader = createShader
|
||||
(Gles3.FRAGMENT_SHADER, GlShaders.rgbFragmentShaderString)
|
||||
|
||||
val textProgram = createProgram (xyzRgbVertexShader, rgbFragmentShader)
|
||||
|
||||
(* clean up shaders which are no longer needed once progran is linked. *)
|
||||
val _ = Gles3.deleteShader xyzRgbVertexShader
|
||||
val _ = Gles3.deleteShader rgbFragmentShader
|
||||
|
||||
(* because we only have a single vertex buffer,
|
||||
* we only need to bind and set attributes once. *)
|
||||
val _ = Gles3.bindBuffer textVertexBuffer
|
||||
|
||||
(* enable xyz component from uploaded array *)
|
||||
val _ = Gles3.vertexAttribPointer (0, 3, 6, 0)
|
||||
val _ = Gles3.enableVertexAttribArray 0
|
||||
(* enable rgb component from uploaded array *)
|
||||
val _ = Gles3.vertexAttribPointer (1, 3, 6, 12)
|
||||
val _ = Gles3.enableVertexAttribArray 1
|
||||
|
||||
val _ = Gles3.useProgram textProgram
|
||||
in
|
||||
{ textVertexBuffer = textVertexBuffer
|
||||
, textProgram = textProgram
|
||||
, textDrawLength = 0
|
||||
}
|
||||
end
|
||||
|
||||
fun uploadText (drawState: t, vec) =
|
||||
let
|
||||
val {textVertexBuffer, textProgram, textDrawLength = _} = drawState
|
||||
|
||||
val _ = Gles3.bufferData (vec, Vector.length vec, Gles3.STATIC_DRAW)
|
||||
val newTextDrawLength = Vector.length vec div 6
|
||||
in
|
||||
{ textVertexBuffer = textVertexBuffer
|
||||
, textProgram = textProgram
|
||||
, textDrawLength = newTextDrawLength
|
||||
}
|
||||
end
|
||||
|
||||
fun draw (drawObject: t) =
|
||||
let val {textVertexBuffer, textDrawLength, textProgram} = drawObject
|
||||
in Gles3.drawArrays (Gles3.TRIANGLES, 0, textDrawLength)
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user