0 people like it.
Like the snippet!
GLTools
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
|
module Varak.UI.GLTools
// Tools for rendering via OpenGL.
// Disposable types in this module must be disposed manually.
// Functions: checkGLError
// Types: GLHandle, Shader, Texture, TextureID, TexArray, IndexArray, RectRenderer, RenderWindow
open Varak
open System
open System.Drawing
open OpenTK
open OpenTK.Graphics
open OpenTK.Graphics.OpenGL4
/// Fails and logs if there is an OpenGL error, including the error itself and the string passed.
let checkGLError where =
let error = GL.GetError()
if error <> ErrorCode.NoError then
let msg = "OGL Error at " + where + ": " + error.ToString()
IO.File.WriteAllText("zz_OGLERROR.txt", msg)
failwith msg
/// Manages an OpenGL handle. The !! operator and the GLID member return the raw ID.
type GLHandle (ownerType, glid : int, deleter) =
let mutable glid = Some(glid)
member this.GLID =
match glid with
| Some(id) -> id
| None -> failwith ("Tried to access disposed GLHandle created by " + ownerType.ToString())
interface IDisposable with
member this.Dispose () =
glid |> Option.iter (fun i ->
deleter i
GC.SuppressFinalize(this)
glid <- None)
override this.Finalize () =
failwith ("GLHandle created by " + ownerType.ToString() + " was not disposed properly.")
static member (!!) (handle : GLHandle) = handle.GLID
/// GLSL shader routine as a disposable object.
type Shader (shaderType : ShaderType, source : string) as shader =
inherit GLHandle(typeof<Shader>, GL.CreateShader(shaderType), GL.DeleteShader)
do
GL.ShaderSource(!!shader, source)
GL.CompileShader(!!shader)
if GL.GetShader(!!shader, ShaderParameter.CompileStatus) = 0 then
failwith (shaderType.ToString() + " compilation error. Output: " + GL.GetShaderInfoLog(!!shader))
checkGLError "MShader"
/// A single OpenGL texture
type Texture private (glid_in) =
inherit GLHandle(typeof<Texture>, glid_in, GL.DeleteTexture)
/// Factory that takes a Drawing.Bitmap, assuming premultiplied alpha for mipmap generation via OpenGL.
static member FromBitmapPA (bmp : Bitmap) =
let id = GL.GenTexture()
GL.BindTexture(TextureTarget.Texture2D, id)
// The following Imaging.PixelFormat is probably a lie.
let bmpData = bmp.LockBits(Rectangle(0, 0, bmp.Width, bmp.Height),
Imaging.ImageLockMode.ReadOnly, Imaging.PixelFormat.Format32bppArgb)
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, bmp.Width, bmp.Height,
0, PixelFormat.Bgra, PixelType.UnsignedByte, bmpData.Scan0)
bmp.UnlockBits(bmpData)
// Enable and generate mipmaps
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, int TextureMinFilter.LinearMipmapLinear)
GL.GenerateMipmap(GenerateMipmapTarget.Texture2D)
GL.BindTexture(TextureTarget.Texture2D, 0)
checkGLError "Texture.FromBitmapPA"
new Texture(id)
/// Shorthand to load file and call FromBitmapPA
static member FromFilePA (s : string) = new Bitmap(s) |> Texture.FromBitmapPA
/// A texture in a texture array, identified by its index.
type [<Struct>] TextureID (index : uint8) =
member t.Index = index
/// An OpenGL array of identically sized textures.
type TexArray private (glid_in : int) =
inherit GLHandle(typeof<TexArray>, glid_in, GL.DeleteTexture)
/// Factory that takes a Bitmap array, assuming premultiplied alpha for mipmap generation via OpenGL.
static member FromBitmapsPA (bmps : Bitmap list) =
if bmps.IsEmpty then failwith "Empty texture arrays are currently not supported." else
let w, h = bmps.Head.Width, bmps.Head.Height
let id = GL.GenTexture()
GL.BindTexture(TextureTarget.Texture2DArray, id)
GL.TexStorage3D(TextureTarget3d.Texture2DArray, Config.mipmapLevels, SizedInternalFormat.Rgba8, w, h, bmps.Length)
bmps |> List.iteri (fun i bmp ->
if bmp.Width <> w || bmp.Height <> h then
failwith "Bitmap size for texture array generation must not vary."
// The following Imaging.PixelFormat is probably a lie.
let bmpData = bmp.LockBits(Rectangle(0, 0, bmp.Width, bmp.Height),
Imaging.ImageLockMode.ReadOnly, Imaging.PixelFormat.Format32bppArgb)
GL.TexSubImage3D(TextureTarget.Texture2DArray, 0, 0, 0, i, w, h, 1,
PixelFormat.Bgra, PixelType.UnsignedByte, bmpData.Scan0)
bmp.UnlockBits(bmpData)
)
// Enable and generate mipmaps
GL.TexParameter(TextureTarget.Texture2DArray, TextureParameterName.TextureMinFilter, int TextureMinFilter.LinearMipmapLinear)
GL.GenerateMipmap(GenerateMipmapTarget.Texture2DArray)
GL.BindTexture(TextureTarget.Texture2DArray, 0)
checkGLError "TexArray.FromBitmapPA"
new TexArray(id)
/// An immutable buffer to hold vertex indices for rendering, also known as Index Buffer Object (IBO).
type IndexArray (data : int []) =
let handle = new GLHandle(typeof<IndexArray>, GL.GenBuffer(), GL.DeleteBuffer)
do
GL.BindBuffer(BufferTarget.ElementArrayBuffer, !!handle)
GL.BufferData(BufferTarget.ElementArrayBuffer, nativeint (data.Length * sizeof<int>), data, BufferUsageHint.StaticDraw)
GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0)
checkGLError "IndexBuffer init"
member ia.GLID = !!handle
interface IDisposable with
member ia.Dispose () = dispose handle
/// Offers a quick way to render a single rectangle.
type RectRenderer () =
let vertexShaderSrc =
""" #version 400
layout(location = 0) in vec2 pos;
out vec2 texcoord;
uniform vec4 texRect;
uniform vec4 transform;
void main() {
vec2 tfPos = (pos * 2. - vec2(1., 1.)) * mat2(transform.xy, transform.zw);
gl_Position = vec4(tfPos, 0, 1);
texcoord = texRect.xy * (vec2(1.,1.) - pos) + texRect.zw * pos;
}
"""
let fragmentShaderSrc =
""" #version 400
in vec2 texcoord;
out vec4 outColor;
uniform sampler2D tex;
void main() {
outColor = texture(tex, texcoord);
}
"""
let programHandle =
use vs = new Shader(ShaderType.VertexShader, vertexShaderSrc)
use fs = new Shader(ShaderType.FragmentShader, fragmentShaderSrc)
let h = new GLHandle(typeof<RectRenderer>, GL.CreateProgram(), GL.DeleteProgram)
GL.AttachShader(!!h, vs.GLID)
GL.AttachShader(!!h, fs.GLID)
GL.LinkProgram(!!h); checkGLError "SimpleRenderer program creation"
if (GL.GetProgram(!!h, GetProgramParameterName.LinkStatus) <> 1) then
failwith "SimpleRenderer shader program failed to link."
h // MShaders get disposed here, but the shader program retains linked shaders until its deletion.
let unLoc_texRect = GL.GetUniformLocation(!!programHandle, "texRect")
let unLoc_transform = GL.GetUniformLocation(!!programHandle, "transform")
let vaoHandle = new GLHandle(typeof<RectRenderer>, GL.GenVertexArray(), GL.DeleteVertexArray)
let vboHandle = new GLHandle(typeof<RectRenderer>, GL.GenBuffer(), GL.DeleteBuffer)
let vertices = [| 0; 0; 1; 0; 0; 1; 1; 1 |] |> Array.map float32
do
GL.BindVertexArray(!!vaoHandle)
GL.BindBuffer(BufferTarget.ArrayBuffer, !!vboHandle)
GL.BufferData(BufferTarget.ArrayBuffer, vertices.Length * sizeof<float32> |> nativeint, vertices, BufferUsageHint.StaticDraw)
GL.VertexAttribPointer(0, 2, VertexAttribPointerType.Float, false, 2 * sizeof<float32>, 0)
GL.EnableVertexAttribArray(0)
GL.BindBuffer(BufferTarget.ArrayBuffer, 0)
GL.BindVertexArray(0)
/// Renders one rectangle. posTransform is applied to the centered maximum-size rectangle and does not affect texture coords.
member this.Render (texture : Texture, texArea : Rectangle<1>, posTransform : mat2d<1>) =
GL.BindVertexArray(!!vaoHandle); checkGLError "Before RectRenderer.Render"
GL.UseProgram(!!programHandle)
let lc, hc = texArea.LowCorner, texArea.HighCorner
GL.Uniform4(unLoc_texRect, lc.x, lc.y, hc.x, hc.y)
GL.Uniform4(unLoc_transform, posTransform.c11, posTransform.c21, posTransform.c12, posTransform.c22)
GL.BindTexture(TextureTarget.Texture2D, !!texture)
GL.DrawArrays(PrimitiveType.TriangleStrip, 0, 4)
GL.BindTexture(TextureTarget.Texture2D, 0)
GL.UseProgram(0)
GL.BindVertexArray(0); checkGLError "After RectRenderer.Render"
interface IDisposable with
member this.Dispose () =
dispose programHandle
dispose vaoHandle
dispose vboHandle
/// Manages the OpenGL context and executes the main rendering call. The initializer function is called after
/// OpenGL is set up, but before rendering begins and sets the initial ViewPartition. Derived from the OpenTK GameWindow.
type RenderWindow (initializer, width, height) =
inherit GameWindow(width, height, GraphicsMode(ColorFormat(32), 0, 0, 4), "ProtoClient running OTK 1.1",
GameWindowFlags.Default, DisplayDevice.Default, 4, 0, GraphicsContextFlags.Default)
let emptyView = {new IView with member v.Render _ = ()}
member val Partition = ViewArea emptyView with get, set
new (init) = new RenderWindow(init, 1280, 720)
override this.OnLoad e =
checkGLError "Before OnLoad"
this.VSync <- VSyncMode.Adaptive
GL.DepthFunc(DepthFunction.Lequal)
GL.Enable(EnableCap.Blend)
GL.BlendFunc(BlendingFactorSrc.One, BlendingFactorDest.OneMinusSrcAlpha) // Premultiplied
GL.ClearColor(Color.Black)
checkGLError "RenderWindow.OnLoad"
this.Partition <- initializer this
checkGLError "RenderWindow.OnLoad initializer call"
/// <summary>
/// Called when it is time to render the next frame.
/// </summary>
/// <param name="e">Contains timing information.</param>
override this.OnRenderFrame e =
checkGLError "Before OnRenderFrame"
base.OnRenderFrame e
GL.Clear(ClearBufferMask.ColorBufferBit ||| ClearBufferMask.DepthBufferBit)
checkGLError "RenderWindow.OnRenderFrame GL.Clear"
let screen = Rect.centered(2., 2.)
let screenPx = vec2(this.ClientRectangle.Width, this.ClientRectangle.Height)
let sglPerPx = Config.minScreenEdge / float (min screenPx.x screenPx.y)
let screenSgl = Vec.d1 screenPx * sglPerPx
let toPxCoords (v : vec2d<1>) =
vec2((v.x / 2. + 0.5) * float screenPx.x, (v.y / 2. + 0.5) * float screenPx.y) |> Vec.ir
for rect, view in this.Partition.Visibles screen do
match Rect.intersection rect screen with
| None -> ()
| Some drawArea ->
let corner = toPxCoords drawArea.LowCorner
let sizePx = toPxCoords drawArea.HighCorner - corner
GL.Viewport(corner.x, corner.y, sizePx.x, sizePx.y); checkGLError "OnRenderFrame GL.Viewport"
view.Render(drawArea.Diagonal /> 2. .* screenSgl |> Vec.f)
this.SwapBuffers()
checkGLError "OnRenderFrame end"
|
namespace Varak
namespace Varak.UI
module GLTools
from Varak.UI
namespace System
namespace System.Drawing
type Graphics =
inherit MarshalByRefObject
member AddMetafileComment : data:byte[] -> unit
member BeginContainer : unit -> GraphicsContainer + 2 overloads
member Clear : color:Color -> unit
member Clip : Region with get, set
member ClipBounds : RectangleF
member CompositingMode : CompositingMode with get, set
member CompositingQuality : CompositingQuality with get, set
member CopyFromScreen : upperLeftSource:Point * upperLeftDestination:Point * blockRegionSize:Size -> unit + 3 overloads
member Dispose : unit -> unit
member DpiX : float32
...
nested type DrawImageAbort
nested type EnumerateMetafileProc
Full name: System.Drawing.Graphics
val checkGLError : where:string -> unit
Full name: Varak.UI.GLTools.checkGLError
Fails and logs if there is an OpenGL error, including the error itself and the string passed.
val where : string
val error : obj
val msg : string
Object.ToString() : string
namespace System.IO
type File =
static member AppendAllLines : path:string * contents:IEnumerable<string> -> unit + 1 overload
static member AppendAllText : path:string * contents:string -> unit + 1 overload
static member AppendText : path:string -> StreamWriter
static member Copy : sourceFileName:string * destFileName:string -> unit + 1 overload
static member Create : path:string -> FileStream + 3 overloads
static member CreateText : path:string -> StreamWriter
static member Decrypt : path:string -> unit
static member Delete : path:string -> unit
static member Encrypt : path:string -> unit
static member Exists : path:string -> bool
...
Full name: System.IO.File
IO.File.WriteAllText(path: string, contents: string) : unit
IO.File.WriteAllText(path: string, contents: string, encoding: Text.Encoding) : unit
val failwith : message:string -> 'T
Full name: Microsoft.FSharp.Core.Operators.failwith
Multiple items
type GLHandle =
interface IDisposable
new : ownerType:Type * glid:int * deleter:(int -> unit) -> GLHandle
override Finalize : unit -> unit
member GLID : int
static member ( !! ) : handle:GLHandle -> int
Full name: Varak.UI.GLTools.GLHandle
Manages an OpenGL handle. The !! operator and the GLID member return the raw ID.
--------------------
new : ownerType:Type * glid:int * deleter:(int -> unit) -> GLHandle
val ownerType : Type
val glid : int
Multiple items
val int : value:'T -> int (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.int
--------------------
type int = int32
Full name: Microsoft.FSharp.Core.int
--------------------
type int<'Measure> = int
Full name: Microsoft.FSharp.Core.int<_>
val deleter : (int -> unit)
val mutable glid : int option
union case Option.Some: Value: 'T -> Option<'T>
val this : GLHandle
member GLHandle.GLID : int
Full name: Varak.UI.GLTools.GLHandle.GLID
val id : int
union case Option.None: Option<'T>
Type.ToString() : string
type IDisposable =
member Dispose : unit -> unit
Full name: System.IDisposable
override GLHandle.Dispose : unit -> unit
Full name: Varak.UI.GLTools.GLHandle.Dispose
module Option
from Microsoft.FSharp.Core
val iter : action:('T -> unit) -> option:'T option -> unit
Full name: Microsoft.FSharp.Core.Option.iter
val i : int
type GC =
static member AddMemoryPressure : bytesAllocated:int64 -> unit
static member CancelFullGCNotification : unit -> unit
static member Collect : unit -> unit + 2 overloads
static member CollectionCount : generation:int -> int
static member GetGeneration : obj:obj -> int + 1 overload
static member GetTotalMemory : forceFullCollection:bool -> int64
static member KeepAlive : obj:obj -> unit
static member MaxGeneration : int
static member ReRegisterForFinalize : obj:obj -> unit
static member RegisterForFullGCNotification : maxGenerationThreshold:int * largeObjectHeapThreshold:int -> unit
...
Full name: System.GC
GC.SuppressFinalize(obj: obj) : unit
override GLHandle.Finalize : unit -> unit
Full name: Varak.UI.GLTools.GLHandle.Finalize
val handle : GLHandle
property GLHandle.GLID: int
Multiple items
type Shader =
inherit GLHandle
new : shaderType:obj * source:string -> Shader
Full name: Varak.UI.GLTools.Shader
GLSL shader routine as a disposable object.
--------------------
new : shaderType:obj * source:string -> Shader
val shaderType : obj
val source : string
Multiple items
val string : value:'T -> string
Full name: Microsoft.FSharp.Core.Operators.string
--------------------
type string = String
Full name: Microsoft.FSharp.Core.string
val shader : Shader
val typeof<'T> : Type
Full name: Microsoft.FSharp.Core.Operators.typeof
Multiple items
type Texture =
inherit GLHandle
private new : glid_in:int -> Texture
static member FromBitmapPA : bmp:Bitmap -> Texture
static member FromFilePA : s:string -> Texture
Full name: Varak.UI.GLTools.Texture
A single OpenGL texture
--------------------
private new : glid_in:int -> Texture
val glid_in : int
static member Texture.FromBitmapPA : bmp:Bitmap -> Texture
Full name: Varak.UI.GLTools.Texture.FromBitmapPA
Factory that takes a Drawing.Bitmap, assuming premultiplied alpha for mipmap generation via OpenGL.
val bmp : Bitmap
Multiple items
type Bitmap =
inherit Image
new : filename:string -> Bitmap + 11 overloads
member Clone : rect:Rectangle * format:PixelFormat -> Bitmap + 1 overload
member GetHbitmap : unit -> nativeint + 1 overload
member GetHicon : unit -> nativeint
member GetPixel : x:int * y:int -> Color
member LockBits : rect:Rectangle * flags:ImageLockMode * format:PixelFormat -> BitmapData + 1 overload
member MakeTransparent : unit -> unit + 1 overload
member SetPixel : x:int * y:int * color:Color -> unit
member SetResolution : xDpi:float32 * yDpi:float32 -> unit
member UnlockBits : bitmapdata:BitmapData -> unit
...
Full name: System.Drawing.Bitmap
--------------------
Bitmap(filename: string) : unit
(+0 other overloads)
Bitmap(stream: IO.Stream) : unit
(+0 other overloads)
Bitmap(original: Image) : unit
(+0 other overloads)
Bitmap(filename: string, useIcm: bool) : unit
(+0 other overloads)
Bitmap(type: Type, resource: string) : unit
(+0 other overloads)
Bitmap(stream: IO.Stream, useIcm: bool) : unit
(+0 other overloads)
Bitmap(width: int, height: int) : unit
(+0 other overloads)
Bitmap(original: Image, newSize: Size) : unit
(+0 other overloads)
Bitmap(width: int, height: int, format: Imaging.PixelFormat) : unit
(+0 other overloads)
Bitmap(width: int, height: int, g: Graphics) : unit
(+0 other overloads)
val bmpData : Imaging.BitmapData
Bitmap.LockBits(rect: Rectangle, flags: Imaging.ImageLockMode, format: Imaging.PixelFormat) : Imaging.BitmapData
Bitmap.LockBits(rect: Rectangle, flags: Imaging.ImageLockMode, format: Imaging.PixelFormat, bitmapData: Imaging.BitmapData) : Imaging.BitmapData
Multiple items
type Rectangle =
struct
new : location:Point * size:Size -> Rectangle + 1 overload
member Bottom : int
member Contains : pt:Point -> bool + 2 overloads
member Equals : obj:obj -> bool
member GetHashCode : unit -> int
member Height : int with get, set
member Inflate : size:Size -> unit + 1 overload
member Intersect : rect:Rectangle -> unit
member IntersectsWith : rect:Rectangle -> bool
member IsEmpty : bool
...
end
Full name: System.Drawing.Rectangle
--------------------
Rectangle()
Rectangle(location: Point, size: Size) : unit
Rectangle(x: int, y: int, width: int, height: int) : unit
property Image.Width: int
property Image.Height: int
namespace System.Drawing.Imaging
type ImageLockMode =
| ReadOnly = 1
| WriteOnly = 2
| ReadWrite = 3
| UserInputBuffer = 4
Full name: System.Drawing.Imaging.ImageLockMode
field Imaging.ImageLockMode.ReadOnly = 1
type PixelFormat =
| Indexed = 65536
| Gdi = 131072
| Alpha = 262144
| PAlpha = 524288
| Extended = 1048576
| Canonical = 2097152
| Undefined = 0
| DontCare = 0
| Format1bppIndexed = 196865
| Format4bppIndexed = 197634
...
Full name: System.Drawing.Imaging.PixelFormat
field Imaging.PixelFormat.Format32bppArgb = 2498570
property Imaging.BitmapData.Scan0: nativeint
Bitmap.UnlockBits(bitmapdata: Imaging.BitmapData) : unit
static member Texture.FromFilePA : s:string -> Texture
Full name: Varak.UI.GLTools.Texture.FromFilePA
Shorthand to load file and call FromBitmapPA
val s : string
static member Texture.FromBitmapPA : bmp:Bitmap -> Texture
Factory that takes a Drawing.Bitmap, assuming premultiplied alpha for mipmap generation via OpenGL.
Multiple items
type StructAttribute =
inherit Attribute
new : unit -> StructAttribute
Full name: Microsoft.FSharp.Core.StructAttribute
--------------------
new : unit -> StructAttribute
Multiple items
type TextureID =
struct
new : index:uint8 -> TextureID
member Index : uint8
end
Full name: Varak.UI.GLTools.TextureID
A texture in a texture array, identified by its index.
--------------------
TextureID()
new : index:uint8 -> TextureID
val index : uint8
Multiple items
val uint8 : value:'T -> byte (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.uint8
--------------------
type uint8 = Byte
Full name: Microsoft.FSharp.Core.uint8
val t : byref<TextureID>
member TextureID.Index : uint8
Full name: Varak.UI.GLTools.TextureID.Index
Multiple items
type TexArray =
inherit GLHandle
private new : glid_in:int -> TexArray
static member FromBitmapsPA : bmps:Bitmap list -> TexArray
Full name: Varak.UI.GLTools.TexArray
An OpenGL array of identically sized textures.
--------------------
private new : glid_in:int -> TexArray
static member TexArray.FromBitmapsPA : bmps:Bitmap list -> TexArray
Full name: Varak.UI.GLTools.TexArray.FromBitmapsPA
Factory that takes a Bitmap array, assuming premultiplied alpha for mipmap generation via OpenGL.
val bmps : Bitmap list
type 'T list = List<'T>
Full name: Microsoft.FSharp.Collections.list<_>
property List.IsEmpty: bool
val w : int
val h : int
property List.Head: Bitmap
property List.Length: int
Multiple items
module List
from Microsoft.FSharp.Collections
--------------------
type List<'T> =
| ( [] )
| ( :: ) of Head: 'T * Tail: 'T list
interface IEnumerable
interface IEnumerable<'T>
member Head : 'T
member IsEmpty : bool
member Item : index:int -> 'T with get
member Length : int
member Tail : 'T list
static member Cons : head:'T * tail:'T list -> 'T list
static member Empty : 'T list
Full name: Microsoft.FSharp.Collections.List<_>
val iteri : action:(int -> 'T -> unit) -> list:'T list -> unit
Full name: Microsoft.FSharp.Collections.List.iteri
Multiple items
type IndexArray =
interface IDisposable
new : data:int [] -> IndexArray
member GLID : int
Full name: Varak.UI.GLTools.IndexArray
An immutable buffer to hold vertex indices for rendering, also known as Index Buffer Object (IBO).
--------------------
new : data:int [] -> IndexArray
val data : int []
Multiple items
val nativeint : value:'T -> nativeint (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.nativeint
--------------------
type nativeint = IntPtr
Full name: Microsoft.FSharp.Core.nativeint
property Array.Length: int
val sizeof<'T> : int
Full name: Microsoft.FSharp.Core.Operators.sizeof
val ia : IndexArray
member IndexArray.GLID : int
Full name: Varak.UI.GLTools.IndexArray.GLID
override IndexArray.Dispose : unit -> unit
Full name: Varak.UI.GLTools.IndexArray.Dispose
Multiple items
type RectRenderer =
interface IDisposable
new : unit -> RectRenderer
member Render : texture:Texture * texArea:'a * posTransform:'b -> unit
Full name: Varak.UI.GLTools.RectRenderer
Offers a quick way to render a single rectangle.
--------------------
new : unit -> RectRenderer
val vertexShaderSrc : string
val fragmentShaderSrc : string
val programHandle : GLHandle
val vs : Shader
val fs : Shader
val h : GLHandle
val unLoc_texRect : obj
val unLoc_transform : obj
val vaoHandle : GLHandle
val vboHandle : GLHandle
val vertices : float32 []
type Array =
member Clone : unit -> obj
member CopyTo : array:Array * index:int -> unit + 1 overload
member GetEnumerator : unit -> IEnumerator
member GetLength : dimension:int -> int
member GetLongLength : dimension:int -> int64
member GetLowerBound : dimension:int -> int
member GetUpperBound : dimension:int -> int
member GetValue : [<ParamArray>] indices:int[] -> obj + 7 overloads
member Initialize : unit -> unit
member IsFixedSize : bool
...
Full name: System.Array
val map : mapping:('T -> 'U) -> array:'T [] -> 'U []
Full name: Microsoft.FSharp.Collections.Array.map
Multiple items
val float32 : value:'T -> float32 (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.float32
--------------------
type float32 = Single
Full name: Microsoft.FSharp.Core.float32
--------------------
type float32<'Measure> = float32
Full name: Microsoft.FSharp.Core.float32<_>
val this : RectRenderer
member RectRenderer.Render : texture:Texture * texArea:'a * posTransform:'b -> unit
Full name: Varak.UI.GLTools.RectRenderer.Render
Renders one rectangle. posTransform is applied to the centered maximum-size rectangle and does not affect texture coords.
val texture : Texture
type Texture =
inherit GLHandle
private new : glid_in:int -> Texture
static member FromBitmapPA : bmp:Bitmap -> Texture
static member FromFilePA : s:string -> Texture
Full name: Varak.UI.GLTools.Texture
A single OpenGL texture
val texArea : 'a
val posTransform : 'b
val lc : obj
val hc : obj
override RectRenderer.Dispose : unit -> unit
Full name: Varak.UI.GLTools.RectRenderer.Dispose
Multiple items
type RenderWindow =
inherit obj
new : init:'a -> RenderWindow
new : initializer:'a * width:'b * height:'c -> RenderWindow
override OnLoad : e:'a -> 'b
override OnRenderFrame : e:'a -> 'b
member Partition : 'a
member Partition : 'a with set
Full name: Varak.UI.GLTools.RenderWindow
Manages the OpenGL context and executes the main rendering call. The initializer function is called after
OpenGL is set up, but before rendering begins and sets the initial ViewPartition. Derived from the OpenTK GameWindow.
--------------------
new : init:'a -> RenderWindow
new : initializer:'a * width:'b * height:'c -> RenderWindow
val initializer : 'a
val width : 'a
val height : 'a
member RenderWindow.Partition : 'a with set
Full name: Varak.UI.GLTools.RenderWindow.Partition
val set : elements:seq<'T> -> Set<'T> (requires comparison)
Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.set
override RenderWindow.OnLoad : e:'a -> 'b
Full name: Varak.UI.GLTools.RenderWindow.OnLoad
type Color =
struct
member A : byte
member B : byte
member Equals : obj:obj -> bool
member G : byte
member GetBrightness : unit -> float32
member GetHashCode : unit -> int
member GetHue : unit -> float32
member GetSaturation : unit -> float32
member IsEmpty : bool
member IsKnownColor : bool
...
end
Full name: System.Drawing.Color
property Color.Black: Color
override RenderWindow.OnRenderFrame : e:'a -> 'b
Full name: Varak.UI.GLTools.RenderWindow.OnRenderFrame
<summary>
Called when it is time to render the next frame.
</summary>
<param name="e">Contains timing information.</param>
Multiple items
val float : value:'T -> float (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.float
--------------------
type float = Double
Full name: Microsoft.FSharp.Core.float
--------------------
type float<'Measure> = float
Full name: Microsoft.FSharp.Core.float<_>
val min : e1:'T -> e2:'T -> 'T (requires comparison)
Full name: Microsoft.FSharp.Core.Operators.min
More information