Lua OpenGL Api: Difference between revisions

From Spring
Jump to navigationJump to search
JK (talk | contribs)
 
(118 intermediate revisions by 17 users not shown)
Line 1: Line 1:
== Spring ==
[[Engine_Development|Development]] < [[Lua_Scripting|Lua Scripting]] < {{FULLPAGENAME}}
'''gl.GetSun'''
  ()        -> number sunPosX, number sunPosY, number sunPosZ
  ( "pos" ) -> number sunPosX, number sunPosY, number sunPosZ
  ( "shadowDensity" [, "unit"] ) -> number shadowDensity
  ( "diffuse"      [, "unit"] ) -> nil | number r, number g, number b
  ( "ambient"      [, "unit"] ) -> nil | number r, number g, number b
  ( "specular" )                -> nil | number r, number g, number b


'''gl.ConfigScreen'''
= Spring =
  ( number screenWidth, number screenDistanc e) -> nil


'''gl.DrawMiniMap'''
{{LuaCallout
  () -> nil
|prefix = gl.
|name = GetSun
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|number}} sunPosX, {{type|number}} sunPosY, {{type|number}} sunPosZ
|info =
}}


'''gl.SlaveMiniMap'''
or
  ( boolean mode ) -> nil


'''gl.ConfigMiniMap'''
{{LuaCallout
  ( int px, int py, int sx, int sy ) -> nil
|prefix = gl.
|name = GetSun
|arg1 = {{type|string}} "pos"
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|number}} sunPosX, {{type|number}} sunPosY, {{type|number}} sunPosZ
|info =
}}


== Basics ==
or


'''gl.PushMatrix'''
{{LuaCallout
  () -> nil
|prefix = gl.
|name = GetSun
|arg1 = {{type|string}} "shadowDensity" {{bracket}}
|arg2 = {{type|string}} "unit" {{rbracket}}
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|number}} shadowDensity
|info =
}}


'''gl.PopMatrix'''
or
  () -> nil
 
{{LuaCallout
|prefix = gl.
|name = GetSun
|arg1 = {{type|string}} "diffuse" {{bracket}}
|arg2 = {{type|string}} "unit" {{rbracket}}
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b
|info =
}}
 
or
 
{{LuaCallout
|prefix = gl.
|name = GetSun
|arg1 = {{type|string}} "ambient" {{bracket}}
|arg2 = {{type|string}} "unit" {{rbracket}}
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b
|info =
}}
 
or
 
{{LuaCallout
|prefix = gl.
|name = GetSun
|arg1 = {{type|string}} "specular" {{bracket}}
|arg2 = {{type|string}} "unit" {{rbracket}}
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b
|info =
}}
 
 
 
{{LuaCallout
|prefix = gl.
|name = GetAtmosphere
|arg1 = {{type|string}} name
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|number}} r, {{type|number}} g, {{type|number}} b
|info = {{new|101.0}}<br>See [[Lua_UnsyncedCtrl#Sun|Spring.SetAtmosphere]] for details.
}}
 
 
{{LuaCallout
|prefix = gl.
|name = GetWaterRendering
|arg1 = {{type|string}} name
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b {{pipe}} {{type|string}} texName {{pipe}} {{type|bool}} active
|info = {{new|104.0}}<br>See [[Lua_UnsyncedCtrl#Developers|Spring.SetWaterParams]] for details.
}}
 
 
 
{{LuaCallout
|prefix = gl.
|name = GetMapRendering
|arg1 = {{type|string}} name
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b {{pipe}} {{type|bool}} active
|info = {{new|104.0}}<br>See [[Lua_UnsyncedCtrl#Developers|Spring.SetMapRenderingParams]] for details.
}}
 
 
{{LuaCallout
|prefix = gl.
|name = ConfigScreen
|arg1 = {{type|number}} screenWidth
|arg2 = {{type|number}} screenDistance
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Used for Unit LODs.
}}
 
 
 
{{LuaCallout
|prefix = gl.
|name = DrawMiniMap
|arg1 = {{type|bool}} transform = true
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = SlaveMiniMap
|arg1 = {{type|bool}} mode
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = ConfigMiniMap
|arg1 = {{type|number}} intPX
|arg2 = {{type|number}} intPY
|arg3 = {{type|number}} intSX
|arg4 = {{type|number}} intSY
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = GetViewSizes
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|number}} x, {{type|number}} y
|info =
}}
 
= Matrices & Viewport =
 
{{LuaCallout
|prefix = gl.
|name = Viewport
|arg1 = {{type|number}} x
|arg2 = {{type|number}} y
|arg3 = {{type|number}} w
|arg4 = {{type|number}} h
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = PushMatrix
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = PopMatrix
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = Translate
|arg1 = {{type|number}} x
|arg2 = {{type|number}} y
|arg3 = {{type|number}} z
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = Scale
|arg1 = {{type|number}} x
|arg2 = {{type|number}} y
|arg3 = {{type|number}} z
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = Scale
|arg1 = {{type|number}} angle
|arg2 = {{type|number}} x
|arg3 = {{type|number}} y
|arg4 = {{type|number}} z
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
'''gl.Translate'''
  (number x, number y, number z) -> nil


'''gl.Scale'''
{{LuaCallout
   (number x, number y, number z) -> nil
|prefix = gl.
|name = Billboard
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Use this to draw 2d primitives in DrawWorld().
}}
<pre>To render a 2D billboarded quad in the gameworld at world position x,y,z, you do the following (at a minimum; I am skipping blending / depthtesting) here:
  gl.PushMatrix()
  gl.Texture(read what you need here)
   gl.Translate(x,y,z)
  gl.Billboard()
  gl.TexRect(x1,y1,x2,y2)
  gl.PopMatrix()</pre>
 
 
{{LuaCallout
|prefix = gl.
|name = MatrixMode
|arg1 = {{type|number}} [[Lua_ConstGL#MatrixMode|mode]]
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = LoadIdentity
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = LoadMatrix
|arg1 = 16 {{type|numbers}} or a [https://github.com/spring/spring/blob/develop/rts/Lua/LuaOpenGLUtils.cpp#L60 matrix name]
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = MultMatrix
|arg1 = ???
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = ???
|info =
}}
 
 
 
{{LuaCallout
|prefix = gl.
|name = Ortho
|arg1 = {{type|number}} left
|arg2 = {{type|number}} right
|arg3 = {{type|number}} bottom
|arg4 = {{type|number}} top
|arg5 = {{type|number}} near
|arg6 = {{type|number}} far
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = Frustum
|arg1 = {{type|number}} left
|arg2 = {{type|number}} right
|arg3 = {{type|number}} bottom
|arg4 = {{type|number}} top
|arg5 = {{type|number}} near
|arg6 = {{type|number}} far
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = PushPopMatrix
|arg1 = ???
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = ???
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = ClipPlane
|arg1 = {{type|number}} intPlane
|arg2 = {{type|bool}} enable {{pipe}} {{type|number}} A, {{type|number}} B, {{type|number}} C, {{type|number}} D
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Note: intPlane can only be 1 or 2.
}}
 
= Clear =
 
{{LuaCallout
|prefix = gl.
|name = Clear
|arg1 = {{type|GL.DEPTH_BUFFER_BIT}} {{bracket}}
|arg2 = {{type|number}} cleardepth {{rbracket}}
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


'''gl.Rotate'''
or
  (number angle, number x, number y, number z) -> nil


'''gl.Color'''
{{LuaCallout
  ( { number r, number g, number b[, number a] } |
|prefix = gl.
      number r, number g, number b[, number a] ) -> nil
|name = Clear
|arg1 = {{type|GL.STENCIL_BUFFER_BIT}} {{bracket}}
|arg2 = {{type|number}} intClearStencil {{rbracket}}
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


'''gl.LineWidth'''
or
  ( number width ) -> nil


'''gl.PointSize'''
{{LuaCallout
  ( number size ) -> nil
|prefix = gl.
|name = Clear
|arg1 = {{type|GL.COLOR_BUFFER_BIT}} {{pipe}} {{type|GL.ACCUM_BUFFER_BIT}} {{bracket}}
|arg2 = {{type|number}} r
|arg3 = {{type|number}} g
|arg4 = {{type|number}} b
|arg5 = {{type|number}} a {{rbracket}}
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


'''gl.Billboard''' <font color="green">use this to draw 2d primitives in DrawWorld</font>
  () -> nil


'''gl.ResetState'''
{{LuaCallout
  () -> nil
|prefix = gl.
<font color="green">
|name = SwapBuffers
  ShadeModel = GL_SMOOTH
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|104.0}}<br>Available only in LuaMenu, meant for frame-limited LuaMenu's that want identical content in both buffers.
}}
 
= ResetState/Matrices =
 
{{LuaCallout
|prefix = gl.
|name = ResetState
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = DON'T USE IT UNLESS YOU KNOW WHAT YOU ARE DOING! Each call-in has different default states, but this function resets all states to the states below no matter what!
}}
<pre> ShadeModel = GL.SMOOTH
   Scissor    = false
   Scissor    = false
   Texture    = false
   Texture    = false
  Lighting    = false,
   ColorMask  = true, true, true, true
   ColorMask  = true, true, true, true
   DepthMask  = false
   DepthMask  = false
   DepthTest  = false  (GL_LEQUAL)
   DepthTest  = false  (GL.LEQUAL)
   Culling    = false  (GL_BACK)
   Culling    = false  (GL.BACK)
   LogicOp    = false  (GL_INVERT)
   LogicOp    = false  (GL.INVERT)
   AlphaTest  = false  (GL_GREATER, 0.5f)
   AlphaTest  = false  (GL.GREATER, 0.5f)
   Blending  = GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA
   Blending  = true (GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA)</pre>
</font>
 
 
{{LuaCallout
|prefix = gl.
|name = ResetMatrices
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
<pre>  Resets GL.TEXTURE matrix stack
  Resets GL.MODELVIEW matrix stack
  Resets GL.PROJECTION matrix stack</pre>
 
= Draw Basics =
 
{{LuaCallout
|prefix = gl.
|name = BeginEnd
|arg1 = {{type|number}} [[Lua_ConstGL#Drawing_Primitives|GLType]]
|arg2 = {{type|function}} {{bracket}}
|arg3 = arg1
|arg4 = ... {{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = Color
|arg1 = {{type|number}} r,  {{type|number}} g,  {{type|number}} b {{bracket}},  {{type|number}} a {{rbracket}} {{pipe}} {{type|table}} colors = { {{type|number}} r,  {{type|number}} g,  {{type|number}} b {{bracket}},  {{type|number}} a {{rbracket}} }
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = Vertex
|arg1 = {{type|table}} vertex = { {{type|number}} x,  {{type|number}} y,  {{bracket}},  {{type|number}} z {{bracket}}, {{type|number}} w {{rbracket}}{{rbracket}} }
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
or
 
{{LuaCallout
|prefix = gl.
|name = Vertex
|arg1 = {{type|number}} x,  {{type|number}} y
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
or
 
{{LuaCallout
|prefix = gl.
|name = Vertex
|arg1 = {{type|number}} x,  {{type|number}} y,  {{type|number}} z
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
or
 
{{LuaCallout
|prefix = gl.
|name = Vertex
|arg1 = {{type|number}} x,  {{type|number}} y,  {{type|number}} z, {{type|number}} w
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = Normal
|arg1 = {{type|table}} normal = { {{type|number}} x,  {{type|number}} y,  {{type|number}} z } {{pipe}} {{type|number}} x,  {{type|number}} y,  {{type|number}} z
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = EdgeFlag
|arg1 = {{type|bool}} enable
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = Rect
|arg1 = {{type|number}} x1
|arg2 = {{type|number}} y1
|arg3 = {{type|number}} x2
|arg4 = {{type|number}} y2
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = TexRect
|arg1 = {{type|number}} x1
|arg2 = {{type|number}} y1
|arg3 = {{type|number}} x2
|arg4 = {{type|number}} y2 {{bracket}}
|arg5 = {{type|bool}} flip_s, {{type|bool}} flip_t {{pipe}} {{type|number}} s1, {{type|number}} t1, {{type|number}} s2, {{type|number}} t2 {{rbracket}}
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Texture rect.
}}
 
 
{{LuaCallout
|prefix = gl.
|name = Shape
|arg1 = {{type|number}} [[Lua_ConstGL#Drawing_Primitives|GLtype]]
|arg2 = {{type|table}} elements
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Elements contains:
}}
<pre>  elements = {
    [1] = { v | vertex  = { number x, number y, number z },          <font color="#55ee99">required</font>
            n | normal  = { number x, number y, number z },          <font color="#55ee99">optional</font>
            t | texcoord = { number x, number y },                    <font color="#55ee99">optional</font>
            c | color    = { number r, number g, number b, number a }  <font color="#55ee99">optional</font>
    },
    etc ...
  }</pre>
 
 
 
{{LuaCallout
|prefix = gl.
|name = SecondaryColor
|arg1 = {{type|table}} color = { {{type|number}} r, {{type|number}} g, {{type|number}} b } {{pipe}} {{type|number}} r, {{type|number}} g, {{type|number}} b
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = FogCoord
|arg1 = {{type|number}} value
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
= Display Lists =
<span class=note>Display Lists save given vertex attributes in a static buffer, so the GPU can directly read them (without the CPU). Display Lists are a lot faster (10-60x) than standard drawing with glShape/glBeginEnd, so try to use them when ever you can. If you want to learn more about them, g00gle is your friend ;)</span>
 
{{LuaCallout
|prefix = gl.
|name = CreateList
|arg1 = {{type|function}} {{bracket}}
|arg2 = arg1 {{bracket}}
|arg3 = arg2 ... {{rbracket}}{{rbracket}}
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|number}} listID
|info =
}}
 
 
 
{{LuaCallout
|prefix = gl.
|name = CallList
|arg1 = {{type|number}} listID
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = DeleteList
|arg1 = {{type|number}} listID
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
= Vertex Array Objects =
<span class=note> <font color=darkblue> Only available in "develop" branch of spring (the future 105.0+). This is conceptually similar and serve as modern OpenGL replacement to deprecated Display Lists. </font> </span>
 
{{LuaCallout
|prefix = gl.
|name = CreateVertexArray
|arg1 = {{type|number}} numElements
|arg2 = {{type|number}} numIndices {{bracket}}
|arg3 = {{type|bool}} persistentBuffer = false {{rbracket}}
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|number}} bufferID
|info =
}}
<pre>See what elements and indices are here: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-9-vbo-indexing/
numElements and numIndices define the size of for elements and indices respectively. if indices are not going to be used, then set numIndices to 0
Persistent buffers (persistentBuffer = true) are more efficient for dynamically/often updated geometry.</pre>
 
 
{{LuaCallout
|prefix = gl.
|name = UpdateVertexArray
|arg1 = {{type|number}} bufferID
|arg2 = {{type|number}} elementPos
|arg3 = {{type|number}} indexPos
|arg4 = {{type|table}} tbl {{pipe}} {{type|function}} func
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|bool}} success
|info =
}}
<pre>{elementPos, indexPos} define starting element in {element, index} VBO corresponding to 1st element of the supplied vertex data
4 elements table example:
  local verts = {
    p  = {0,0,0,1,  4,0,0,1,  4,4,0,1,  0,4,0,1},
    n  = {0,1,0  ,  0,1,0  ,  0,1,0  ,  0,1,0  },
    uv = {0,0,0,0,  1,0,0,0,  1,1,0,0,  0,1,0,0},
    c0 = {1,0,0,1,  0,1,0,1,  0,0,1,1,  1,1,1,0},
    i = {0, 1, 2, 2, 1, 3},            optional, use in case of indexed VBO
    c1 = {...} }
 
Alternatively Lua func can use gl.Vertex/gl.Color/gl.Normal/gl.TexCoord to define vertices, similarly how it used to be done in gl.BeginEnd.Note there is no function yet to define indices.</pre>
 
 
{{LuaCallout
|prefix = gl.
|name = RenderVertexArray
|arg1 = {{type|number}} bufferID
|arg2 = {{type|number}} primType {{bracket}}
|arg3 = {{type|number}} firstIndex = 0
|arg4 = {{type|number}} count = numElements {{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|bool}} success
|info =
}}
<pre>primType can be GL.POINTS, GL.LINE_STRIP, GL.LINE_LOOP, GL.LINES, GL.LINE_STRIP_ADJACENCY, GL.LINES_ADJACENCY, GL.TRIANGLE_STRIP, GL.TRIANGLE_FAN, GL.TRIANGLES, GL.TRIANGLE_STRIP_ADJACENCY, GL.TRIANGLES_ADJACENCY and GL.PATCHES
firstIndex specifies the starting index in the enabled arrays.
count specifies the number of indices to be rendered.</pre>
 
 
{{LuaCallout
|prefix = gl.
|name = DeleteVertexArray
|arg1 = {{type|number}} bufferID
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|bool}} success
|info = Releases previously allocated VAO
}}
 
= Text =
 
{{LuaCallout
|prefix = gl.
|name = Text
|arg1 = {{type|string}} "text"
|arg2 = {{type|number}} x
|arg3 = {{type|number}} y
|arg4 = {{type|number}} size {{bracket}}
|arg5 = {{type|string}} "options" {{rbracket}}
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
<pre>  options are:
    horizontal alignment:
      'c' = center
      'r' = right
    vertical alignment:
      'a' = ascender
      't' = top
      'v' = vertical center
      'x' = baseline
      'b' = bottom
      'd' = descender
    decorations:
      'o' = black outline
      'O' = white outline
      's' = shadow
    other:
      'n' = don't round vertex coords to nearest integer (font may get blurry)</pre>
 
 
{{LuaCallout
|prefix = gl.
|name = GetTextWidth
|arg1 = {{type|string}} "text"
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|number}} width 
|info = Width in pixels, with a font size of 1.0.
}}
 
 
{{LuaCallout
|prefix = gl.
|name = GetTextHeight
|arg1 = {{type|string}} "text"
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} height, {{type|number}} descender, {{type|number}} numlines
|info = Height in pixels, with a font size of 1.0. Further descriptions here: [[GetTextHeight]]
}}
 
 
{{LuaCallout
|prefix = gl.
|name = BeginText
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = If you have multiple gl.Text calls, then you can bunch them between a gl.BeginText and gl.EndText to speedup the rendering.
}}
 
 
{{LuaCallout
|prefix = gl.
|name = EndText
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
= Unit/Feature Draw Functions =
 
{{LuaCallout
|prefix = gl.
|name = Unit
|arg1 = {{type|number}} unitID {{bracket}}
|arg2 = {{type|bool}} rawdraw
|arg3 = {{type|number}} intLOD {{rbracket}}
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Draws a unit - on default it uses LOD, with lod<0 it is turned off, else it defines a specific level.
}}
 
 
{{LuaCallout
|prefix = gl.
|name = UnitRaw
|arg1 = {{type|number}} unitID {{bracket}}
|arg2 = {{type|bool}} rawdraw
|arg3 = {{type|number}} intLOD {{rbracket}}
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Doesn't apply worldspace->unit transformation! only works if <i>rawdraw</i> is true.
}}
 
 
{{LuaCallout
|prefix = gl.
|name = UnitShape
|arg1 = {{type|number}} unitDefID
|arg2 = {{type|number}} teamID
|arg3 = {{type|bool}} rawState
|arg4 = {{type|bool}} toScreen
|arg5 = {{type|bool}} opaque
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|101.0}}<br>The three extra boolean arguments make it so that calling only these functions is enough to get correctly rendered models; pass in 'false' for the THIRD argument to get the fixed behavior, omit it or pass in 'true' [default] to render with your own custom state instead. The FOURTH argument should be 'true' if in DrawScreen and 'false' (default) if in DrawWorld; any transforms for these two functions *MUST* include a gl.LoadIdentity call when argument #3 is false (whether they are used in DrawWorld or in DrawScreen) the FIFTH argument determines whether the model is drawn opaque ('true' [default]) or with translucency ('false'); only has an effect when argument #3 is false.
}}
 
 
{{LuaCallout
|prefix = gl.
|name = UnitMultMatrix
|arg1 = {{type|number}} unitID
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = world space -> unit space
}}
 
 
{{LuaCallout
|prefix = gl.
|name = UnitPieceMultMatrix
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} intPiece
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = unit space -> piece space
}}
 
 
{{LuaCallout
|prefix = gl.
|name = UnitPiece
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} intPiece
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Draws the unit piece.
}}
 
 
{{LuaCallout
|prefix = gl.
|name = UnitPieceMatrix
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} intPiece
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Use gl.UnitPieceMultMatrix instead!
}}
 
 
{{LuaCallout
|prefix = gl.
|name = Feature
|arg1 = {{type|number}} featureID
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = FeatureRaw
|arg1 = {{type|number}} featureID {{bracket}}
|arg2 = {{type|bool}} rawdraw
|arg3 = {{type|number}} intLOD {{rbracket}}
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|101.0}}
}}
 
 
{{LuaCallout
|prefix = gl.
|name = FeatureShape
|arg1 = {{type|number}} featureDefID
|arg2 = {{type|number}} teamID
|arg3 = {{type|bool}} custom
|arg4 = {{type|bool}} drawScreen
|arg5 = {{type|bool}} opaque 
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = FeatureMultMatrix
|arg1 = {{type|number}} featureID
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|101.0}}<br>world space -> feature space
}}
 
 
{{LuaCallout
|prefix = gl.
|name = FeaturePieceMultMatrix
|arg1 = {{type|number}} featureID
|arg2 = {{type|number}} intPiece
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|101.0}}<br>feature space -> piece space
}}
 
 
{{LuaCallout
|prefix = gl.
|name = FeaturePiece
|arg1 = {{type|number}} featureID
|arg2 = {{type|number}} intPiece
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|101.0}}<br>Draws the Feature piece.
}}
 
 
{{LuaCallout
|prefix = gl.
|name = FeaturePieceMatrix
|arg1 = {{type|number}} featureID
|arg2 = {{type|number}} intPiece
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{new|101.0}}<br>Use gl.FeaturePieceMultMatrix instead!
}}
 
 
{{LuaCallout
|prefix = gl.
|name = DrawListAtUnit
|arg1 = {{type|number}} unitID
|arg2 = {{type|number}} listID {{bracket}}
|arg3 = {{type|bool}} midPos
|arg4 = {{type|number}} scaleX, {{type|number}} scaleY, {{type|number}} scaleZ
|arg5 = {{type|number}} degrees
|arg6 = {{type|number}} rotX, {{type|number}} rotY, {{type|number}} rotZ {{rbracket}}
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = DrawFuncAtUnit
|arg1 = {{type|number}} unitID
|arg2 = {{type|bool}} midPos
|arg3 = {{type|function}} {{bracket}}, arg1, ... {{rbracket}}
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
= States (Blending,AlphaTest...) =
 
{{LuaCallout
|prefix = gl.
|name = Blending
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcmode]]
|arg2 = {{type|number}} [[Lua_ConstGL#BlendingFactorDest|dstmode]]
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
or
 
{{LuaCallout
|prefix = gl.
|name = Blending
|arg1 = {{type|string}} mode
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Mode can be set to:
}}
<pre>"add"
= GL.ONE, GL.ONE
 
"alpha_add"
= GL.SRC_ALPHA, GL.ONE
 
"alpha"
= GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA
 
"reset"
= GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA
 
"color"
= GL.SRC_COLOR, GL.ONE_MINUS_SRC_ALPHA
 
"modulate"
= GL.DST_COLOR, GL.ZERO
 
"disable"
= GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA</pre>
 
 
{{LuaCallout
|prefix = gl.
|name = BlendEquation
|arg1 = {{type|number}} mode
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = BlendFunc
|arg1 = {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcmode]]
|arg2 = {{type|number}} [[Lua_ConstGL#BlendingFactorDest|dstmode]]
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = BlendEquationSeparate
|arg1 = {{type|number}} modeRGB
|arg2 = {{type|number}} modeAlpha
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Needs openGL2.0!
}}
 
 
{{LuaCallout
|prefix = gl.
|name = BlendFuncSeparate
|arg1 = {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcRGB]]
|arg2 = {{type|number}} [Lua_ConstGL#BlendingFactorDest|dstRGB]]
|arg3 = {{type|number}} [[Lua_ConstGL#BlendingFactorSrc|srcAlpha]]
|arg4 = {{type|number}} [[Lua_ConstGL#BlendingFactorDest|dstAlpha]]
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Needs openGL2.0!
}}
 
 
{{LuaCallout
|prefix = gl.
|name = AlphaTest
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#AlphaFunction and  DepthFunction|func]]
|arg2 = {{type|number}} threshold
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = DepthTest
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#AlphaFunction and  DepthFunction|func]]
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = Culling
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#Culling|face]]
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = DepthClamp
|arg1 = {{type|bool}} enable
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Not always available, needs GL.NV_depth_clamp!
}}
 
 
{{LuaCallout
|prefix = gl.
|name = DepthMask
|arg1 = {{type|bool}} enable
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = ColorMask
|arg1 = {{type|bool}} masked
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
or
 
{{LuaCallout
|prefix = gl.
|name = ColorMask
|arg1 = {{type|bool}} r, {{type|bool}} g, {{type|bool}} b, {{type|bool}} a
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
{{LuaCallout
|prefix = gl.
|name = LogicOp
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} [[Lua_ConstGL#LogicOp|func]]
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = Fog
|arg1 = {{type|bool}} enable
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = Smoothing
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} point
|arg2 = {{type|bool}} enable {{pipe}} {{type|number}} line
|arg3 = {{type|bool}} enable {{pipe}} {{type|number}} polygon
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = {{removed|104.0}}
}}
 
 
{{LuaCallout
|prefix = gl.
|name = EdgeFlag
|arg1 = {{type|bool}} enable
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = Scissor
|arg1 = {{type|bool}} enable
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
or
 
{{LuaCallout
|prefix = gl.
|name = Scissor
|arg1 = {{type|number}} intX, {{type|number}} intY, {{type|number}} intW, {{type|number}} intH
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = LineStipple
|arg1 = {{type|string}} any
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Use springs default line stipple.
}}
 
or
 
{{LuaCallout
|prefix = gl.
|name = LineStipple
|arg1 = {{type|bool}} enable
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
or
 
{{LuaCallout
|prefix = gl.
|name = LineStipple
|arg1 = {{type|number}} intFactor
|arg2 = {{type|number}} pattern
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = PolygonMode
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]
|arg2 = {{type|number}} [[Lua_ConstGL#PolygonMode|mode]]
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = PolygonOffset
|arg1 = {{type|bool}} enable {{pipe}} {{type|number}} factor
|arg2 = {{type|number}} units
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = PushAttrib
|arg1 = {{bracket}} {{type|number}} [[Lua_ConstGL#glPushAttrib.28.29_bits|attrib]] {{rbracket}}
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = PopAttrib
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
= Stencil =
 
{{LuaCallout
|prefix = gl.
|name = StencilTest
|arg1 = {{type|bool}} enable
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = StencilMask
|arg1 = {{type|number}} mask
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = StencilFunc
|arg1 = {{type|number}} func
|arg2 = {{type|number}} ref
|arg3 = {{type|number}} mask
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = StencilOp
|arg1 = {{type|number}} fail
|arg2 = {{type|number}} zfail
|arg3 = {{type|number}} zpass
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = StencilMaskSeparate
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]
|arg2 = {{type|number}} mask
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Needs OpenGL2.0!
}}
 
 
{{LuaCallout
|prefix = gl.
|name = StencilFuncSeparate
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]
|arg2 = {{type|number}} func
|arg3 = {{type|number}} ref
|arg4 = {{type|number}} mask
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Needs OpenGL2.0!
}}
 
 
{{LuaCallout
|prefix = gl.
|name = StencilOpSeparate
|arg1 = {{type|number}} [[Lua_ConstGL#Culling|face]]
|arg2 = {{type|number}} fail
|arg3 = {{type|number}} zfail
|arg4 = {{type|number}} zpass
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Needs OpenGL2.0!
}}
 
= LineWidth & PointSize =
 
{{LuaCallout
|prefix = gl.
|name = LineWidth
|arg1 = {{type|number}} width
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = PointSize
|arg1 = {{type|number}} size
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Values != 1 can break severely on ATI cards, see http://springrts.com/mantis/view.php?id=2390
}}
 
 
{{LuaCallout
|prefix = gl.
|name = PointSprite
|arg1 = {{type|bool}} enable {{bracket}}
|arg2 = {{type|bool}} coord_replace
|arg3 = {{type|bool}} coord_origin_upper {{rbracket}}
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Needs OpenGL2.0!
}}
 
 
{{LuaCallout
|prefix = gl.
|name = PointParameter
|arg1 = {{type|number}} v1, {{type|number}} v2, {{type|number}} v3 {{bracket}}
|arg2 = {{type|number}} sizeMin
|arg3 = {{type|number}} sizeMax
|arg4 = {{type|number}} sizeFade {{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Needs OpenGL2.0!
}}
 
= Textures =
 
{{LuaCallout
|prefix = gl.
|name = Texture
|arg1 = {{bracket}} {{type|number}} texNum, {{rbracket}} {{type|bool}} enable {{pipe}} {{type|string}} name
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|bool}} loaded
|info = This is the only call-out that is needed to load and draw any texture in a Lua script. All you have to do is pass it a valid path to a valid png and it will use that image for drawing any subsequent textured rectangles. This is shown in the last line of the following list of valid strings for the name parameter.
}}
<span>name may be:
 
#12
= unitDef 12 buildpic
 
%34:1
= unitDef 34 s3o tex2 (:0->tex1,:1->tex2)
 
%-102:0
= featureDef 102 s3o tex1
 
!56
= lua generated texture 56 (= return value of gl.CreateTexture)
 
$units
= 3do textureatlas tex1
 
$units1
= 3do textureatlas tex1
 
$units2
= 3do textureatlas tex2
 
$shadow
= shadowmap
 
$specular
= specular cube map <font color="red">(removed in the latest develop)</font>
 
$reflection
= reflection cube map <font color="red">(can be mipmaped starting from 104.0.1-714-ga29177f. Set CubeTexGenerateMipMaps=1 in settings)</font>
 
$shading
= ground shading texture
 
$grass
= grass shading texture
 
$heightmap
= heightmap, the height in elmos is in the R channel (needs HeightMapTexture=1 set in spring config)
 
$minimap
= minimap texture
 
$map_reflection
= same as "$reflection" {{new|101.0}}
 
$sky_reflection
= defined for SSMF maps that have a skyReflectModTex {{new|101.0}}
 
$detail
= detail texture {{new|101.0}}
 
$normals
= auto generated normals texture, X normal component is in r,g and b channels, Z normal component is in the A channel. If you need Y you'll need to reconstruct it form X and Z. {{new|101.0}}


'''gl.ResetMatrices'''
$ssmf_normals
  () -> nil
= SSMF normals texture {{new|101.0}}
<font color="green">
  Resets GL_TEXTURE matrix stack
  Resets GL_MODELVIEW matrix stack
  Resets GL_PROJECTION matrix stack
</font>


'''gl.Clear'''
$ssmf_specular
  ( GL.DEPTH_BUFFER_BIT, number cleardepth ) -> nil
= SSMF specular texture {{new|101.0}}
  ( GL.STENCIL_BUFFER_BIT, int clearstencil ) -> nil
  ( GL.COLOR_BUFFER_BIT | GL.ACCUM_BUFFER_BIT, number r, number g, number b, number a ) -> nil


== Draw Basics ==
$ssmf_splat_distr
= SSMF splat distribution texture {{new|101.0}}


'''gl.Text'''
$ssmf_splat_detail
  (string "text", number x, number y, number size, string "options")
= SSMF splat detail texture {{new|101.0}}
<font color="green">
  options:
  'c' = center
  'r' = right
  'n' = deactives colorCodes (so you can use gl.Color() to write transparent text etc.)
  'o' = black outline
  'O' = white outline
</font>


'''gl.GetTextWidth'''
$ssmf_splat_normals
  (string "text") -> number width  --  in pixels, with a font size of 1.0
= SSMF splat normals texture {{new|101.0}}, used as "$ssmf_splat_normals" or "$ssmf_splat_normals:X", 'X' can be a value between 0 and 3, defaults to 0 if ":X" is omitted


'''gl.Rect'''
$ssmf_emission
  ( number x1, number y1, number x2, number y2 ) -> nil
= SSMF emission texture {{new|101.0}}


'''gl.TexRect'''
$ssmf_parallax
  ( number x1, number y1, number x2, number y2,
= SSMF parallax texture {{new|101.0}}
  [ boolean flip_s, boolean flip_t | number s1, number t1, number s2, number t2 ] ) -> nil


'''gl.Unit'''
$info
  ( number unitID, [ boolean rawdraw, int lod ] ) -> nil
= currently active info texture (los, airlos, radar, jammer)<br/> Note that textures contain no data until user switches to their respective modes and non-active textures are not updated in the background, so will go stale


'''gl.UnitShape'''
$info_losmap
  ( number unitDefID, number teamID ) -> nil
= los texture (L-view)


'''gl.Feature'''
$info_mtlmap
  ( number featureID ) -> nil
= metal map texture (F4-view)


'''gl.FeatureShape'''
$info_hgtmap
  ( number featureDefID, number teamID ) -> nil
= height map texture (F1-view)


== Switches ==
$info_blkmap
= blocking map texture (F2-view)


'''gl.Blending'''
$map_gbuffer_normtex
  ( boolean enable | number srcmode, number dstmode ) -> nil
= contains the smoothed normals buffer of the map in view in world space coordinates (note that to get true normal vectors from it, you must multiply the vector by 2 and subtract 1) {{new|95}}


'''gl.AlphaTest'''
$map_gbuffer_difftex
  ( boolean enable | number func, number threshold ) -> nil
= contains the diffuse texture buffer of the map in view {{new|95}}


'''gl.DepthTest'''
$map_gbuffer_spectex
  ( boolean enable | number func ) -> nil
= contains the specular textures of the map in view {{new|95}}


'''gl.Culling'''
$map_gbuffer_emittex
  ( boolean enable | number face ) -> nil
= for emissive materials (bloom would be the canonical use) {{new|95}}


'''gl.Lighting'''
$map_gbuffer_misctex
  ( boolean enable ) -> nil
= for arbitrary shader data {{new|95}}


'''gl.ShadeModel'''
$map_gbuffer_zvaltex
  ( number mode ) -> nil
= contains the depth values (z-buffer) of the map in view. {{new|95}} <br/>To translate this to world position coordinates, use:


'''gl.DepthMask'''
  '''No clip control / clipspace for depth is [-1,1]'''
   ( boolean enable ) -> nil
   vec4 worldpos= viewProjectionInv * vec4(vec3(gl_TexCoord[0].st,
  texture2D( map_gbuffer_zvaltex,gl_TexCoord[0].st ).x) * 2.0 - 1.0, 1.0);


'''gl.ColorMask'''
  '''Default if clip control is supported / clipspace for depth is [0,1].'''
   ( boolean ) -> nil
   vec4 worldpos= viewProjectionInv * vec4(gl_TexCoord[0].st * 2.0 - 1.0,
   ( boolean r, boolean g, boolean b, boolean a ) -> nil
   texture2D( map_gbuffer_zvaltex,gl_TexCoord[0].st ).x, 1.0);


'''gl.LogicOp'''
  worldpos.xyz = worldpos.xyz / worldpos.w;
  ( boolean enable | number func ) -> nil


'''gl.Fog'''
$model_gbuffer_normtex
  ( boolean enable ) -> nil
= contains the smoothed normals buffer of the models in view in world space coordinates (note that to get true normal vectors from it, you must multiply the vector by 2 and subtract 1) {{new|95}}


'''gl.Smoothing'''
$model_gbuffer_difftex
  ( (boolean enable | number POINT),
= contains the diffuse texture buffer of the models in view {{new|95}}
  (boolean enable | number LINE),
  (boolean enable | number POLYGON) ) -> nil


'''gl.Scissor'''
$model_gbuffer_spectex
  ( boolean ) -> nil
= contains the specular textures of the models in view  {{new|95}}
  ( int x, int y, int w, int h ) -> nil


'''gl.LineStipple'''
$model_gbuffer_emittex
  ( string any ) -> nil <font color="green">(use springs default line stipple)</font>
= for emissive materials (bloom would be the canonical use) {{new|95}}
  ( boolean enable ) -> nil
  ( int factor, number pattern ) -> nil


'''gl.PolygonMode'''
$model_gbuffer_misctex
  ( number face, number mode ) -> nil
= for arbitrary shader data  {{new|95}}


'''gl.PolygonOffset'''
$model_gbuffer_zvaltex
  ( boolean enable | number factor, number units ) -> nil
= contains the depth values (z-buffer) of the models in view.  {{new|95}}


== Textures ==
${opt}:/LuaUI/images/image.png
= load a texture from the VFS


'''gl.Material'''
  ({
    ambient  = {number r, number g, number b[, number a]},
    diffuse  = {number r, number g, number b[, number a]},
    ambidiff  = {number r, number g, number b[, number a]},
    emission  = {number r, number g, number b[, number a]},
    specular  = {number r, number g, number b[, number a]},
    shininess = number specularExponent
  }) -> nil


'''gl.Texture'''
  possible ${opt}'s are:
  ( boolean enable | string name )
      'n' = nearest
<font color="green">
      'l' = linear
                  current formats:
      'a' = aniso
      'i' = invert
      'g' = greyed
      'c' = clamped
      'b' = border
      't%r,%g,%b' = tint
      'r%width,%height' = resize
  The above ${opt}'s are NOT available for .DDS textures! .dds will load faster than other image formats.
 
    example: ":iac:/LuaUI/images/image.png"
    example: ":cr16,16:/LuaUI/images/image.png"
    example2: ":t1.0,0.5,0:/LuaUI/images/image.png"  (orange tint)
</span>


  /LuaUI/images/image.png = filename
                      #12 = unitDef 12 buildpic
                    %34%2 = unitDef 34 s3o tex2
                      !56 = lua generated texture 56
                  $shadow = shadowmap
                $specular = specular cube map
              $reflection = reflection cube map
</font>


'''gl.CreateTexture'''
{{LuaCallout
  ( int xsize, int ysize,
|prefix = gl.
  [ {  
|name = CreateTexture
     [target    = number,]
|arg1 = {{type|number}} intXSize
|arg2 = {{type|number}} intYSize {{bracket}}
|arg3 = {{type|table}} texProps {{rbracket}}
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|string}} texture
|info = texProps contains:
}}
<pre>texProps = {
     [target    = number,](like GL.TEXTURE_1D,GL.TEXTURE_2D,...)(Added support for GL_TEXTURE_2D_MULTISAMPLE in 104.0.1-1015-g8e36ef2 maintenance)
     [format    = number,]
     [format    = number,]
     [min_filter = number,]
     [min_filter = [[Lua_ConstGL#Texture_Filtering|number]],]
     [mag_filter = number,]
     [mag_filter = [[Lua_ConstGL#Texture_Filtering|number]],]
     [wrap_s    = number,]
     [wrap_s    = [[Lua_ConstGL#Texture_Clamping|number]],]
     [wrap_t    = number,]
     [wrap_t    = [[Lua_ConstGL#Texture_Clamping|number]],]
     [wrap_r    = number,]
     [wrap_r    = [[Lua_ConstGL#Texture_Clamping|number]],]
     [aniso      = number,]
     [aniso      = number,]
     [border    = boolean,]
     [border    = boolean,]
     [fbo        = boolean,]
     [fbo        = boolean,] (needs GLEW_EXT_framebuffer_object!)
     [fboDepth  = boolean]
     [fboDepth  = boolean,] (needs GLEW_EXT_framebuffer_object!)
   } ]
    [samples    = number,] specify any number here and target = GL_TEXTURE_2D_MULTISAMPLE to create multisample texture (Added in 104.0.1-1015-g8e36ef2 maintenance)
  ) -> string
   }</pre>
 
 
{{LuaCallout
|prefix = gl.
|name = DeleteTexture
|arg1 = {{type|string}} texture
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|bool}} deleted
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = DeleteTextureFBO
|arg1 = {{type|string}} texture
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|bool}} deleted
|info = Needs GLEW_EXT_framebuffer_object!
}}
 
 
{{LuaCallout
|prefix = gl.
|name = TextureInfo
|arg1 = {{type|string}} texture
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|table}} texInfo
|info = texInfo contains:
}}
<pre> texInfo = {
      xsize = number,
      ysize = number,
      alpha = boolean, //not used yet
      type  = number,  //not used yet
    }
 
The format of the texture string is the same as in gl.Texture().</pre>
 
 
{{LuaCallout
|prefix = gl.
|name = MultiTexCoord
|arg1 = {{type|number}} x {{bracket}}, {{type|number}} y {{bracket}}, {{type|number}} z {{bracket}}, {{type|number}} w {{rbracket}}{{rbracket}}{{rbracket}} {{pipe}} {{type|table}} texCoords = { {{type|number}} x {{bracket}}, {{type|number}} y {{bracket}}, {{type|number}} z {{bracket}}, {{type|number}} w {{rbracket}}{{rbracket}}{{rbracket}} }
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = TexEnv
|arg1 = {{type|number}} [[Lua_ConstGL#Texture_Environment|target]]
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|value]]
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
or
 
{{LuaCallout
|prefix = gl.
|name = TexEnv
|arg1 = {{type|number}} [[Lua_ConstGL#Texture_Environment|target]]
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]
|arg3 = {{type|number}} var1
|arg4 = {{type|number}} var2
|arg5 = {{type|number}} var3
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = MultiTexEnv
|arg1 = {{type|number}} texNum
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Environment|target]]
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]
|arg4 = {{type|number}} [[Lua_ConstGL#Texture_Environment|value]]
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
or
 
{{LuaCallout
|prefix = gl.
|name = MultiTexEnv
|arg1 = {{type|number}} texNum
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Environment|target]]
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]
|arg4 = {{type|number}} var1
|arg5 = {{type|number}} var2
|arg6 = {{type|number}} var3
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = TexGen
|arg1 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]
|arg2 = {{type|bool}} state
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
or
 
{{LuaCallout
|prefix = gl.
|name = TexGen
|arg1 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|value]]
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
or
 
{{LuaCallout
|prefix = gl.
|name = TexGen
|arg1 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]
|arg2 = {{type|bool}} [[Lua_ConstGL#Texture_Environment|pname]]
|arg3 = {{type|number}} var1
|arg4 = {{type|number}} var2
|arg5 = {{type|number}} var3
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = MultiTexGen
|arg1 = {{type|number}} intTexNum
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]
|arg3 = {{type|bool}} state
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
or
 
{{LuaCallout
|prefix = gl.
|name = MultiTexGen
|arg1 = {{type|number}} intTexNum
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]
|arg4 = {{type|number}} [[Lua_ConstGL#Texture_Environment|value]]
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
or
 
{{LuaCallout
|prefix = gl.
|name = MultiTexGen
|arg1 = {{type|number}} intTexNum
|arg2 = {{type|number}} [[Lua_ConstGL#Texture_Generation|target]]
|arg3 = {{type|number}} [[Lua_ConstGL#Texture_Environment|pname]]
|arg4 = {{type|number}} var1
|arg5 = {{type|number}} var2
|arg6 = {{type|number}} var3
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = CopyToTexture
|arg1 = {{type|string}} texture
|arg2 = {{type|number}} intXOff
|arg3 = {{type|number}} intYOff
|arg4 = {{type|number}} intX
|arg5 = {{type|number}} intY
|arg6 = {{type|number}} intW
|arg7 = {{type|number}} intH {{bracket}}
|arg8 = {{type|number}} target
|arg9 = {{type|number}} level {{rbracket}}
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = RenderToTexture
|arg1 = {{type|string}} fbotexture
|arg2 = {{type|function}} lua_func
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Needs GLEW_EXT_framebuffer_object!
}}
 
   
{{LuaCallout
|prefix = gl.
|name = GenerateMipmap
|arg1 = {{type|string}} texture
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|bool}} created
|info = Needs glGenerateMipmapEXT!
}}
<pre>The following are primarily intended to be used in conjunction with
    gl.{Unit,Feature}(objID, ..., raw=true)
    gl.{Unit,Feature}Shape(defID, ..., raw=true)
and apply a model's default textures; easier than gl.Texture("$%...")</pre>
 
 
{{LuaCallout
|prefix = gl.
|name = UnitTextures
|arg1 = {{type|number}} unitID
|arg2 = {{type|bool}} enable
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|bool}} enabled
|info =
}}
 


'''gl.DeleteTexture'''
{{LuaCallout
  ( string texture ) -> boolean
|prefix = gl.
|name = UnitShapeTextures
|arg1 = {{type|number}} unitDefID
|arg2 = {{type|bool}} enable
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|bool}} enabled
|info =
}}


'''gl.TextureInfo'''


{{LuaCallout
|prefix = gl.
|name = FeatureTextures
|arg1 = {{type|number}} featureID
|arg2 = {{type|bool}} enable
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|bool}} enabled
|info =
}}


'''gl.CopyToTexture'''
  (string texture, int xoff, int yoff, int x, int y, int w, int h
  [,number target,number level])->nil


'''gl.DeleteTextureFBO''' <font color="red">(needs GLEW_EXT_framebuffer_object!)</font>
{{LuaCallout
  ( string texture ) -> boolean
|prefix = gl.
|name = FeatureShapeTextures
|arg1 = {{type|number}} featureDefID
|arg2 = {{type|bool}} enable
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|bool}} enabled
|info =
}}


'''gl.RenderToTexture''' <font color="red">(needs GLEW_EXT_framebuffer_object!)</font>
= PixelReadback =
  ( string fbotexture, lua_func ) -> nil


'''gl.GenerateMipmap''' <font color="red">(needs glGenerateMipmapEXT!)</font>
{{LuaCallout
  ( string texture ) -> boolean
|prefix = gl.
|name = SaveImage
|arg1 = {{type|number}} x
|arg2 = {{type|number}} y
|arg3 = {{type|number}} w
|arg4 = {{type|number}} h
|arg5 = {{type|string}} filename {{bracket}}
|arg6 = {{type|table}} imgProps = { alpha={{type|bool}}, yflip={{type|bool}}, grayscale16bit={{type|bool}}, readbuffer={{type|number}} } {{rbracket}}
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|bool}} success
|info = grayscale16bit is {{new|99.0}} and allows to save single color 16bit PNG<br>
readbuffer is {{new|104+}} and allows to choose the attachment of MRT FBO, use GL_COLOR_ATTACHMENT0_EXT and further as index
}}


== Shapes ==


'''gl.UnitPiece'''
{{LuaCallout
  ( number unitID, int piece ) -> nil
|prefix = gl.
|name = ReadPixels
|arg1 = {{type|number}} x
|arg2 = {{type|number}} y
|arg3 = {{type|number}} w
|arg4 = {{type|number}} h {{bracket}}
|arg5 = {{type|number}} format = GL.RGBA {{rbracket}}
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} r {{bracket}}, g {{bracket}}, b {{bracket}}, a {rbracket}}{rbracket}}{rbracket}} {{pipe}} {{type|table}} readPixels = { { { 1 = {{type|number}} r, 2 = {{type|number}} g, 3 = {{type|number}} b, 4 = {{type|number}} a}, ... }, ... }
|info = This reads back pixels from the final rendered screen. E.g. you can make a screenshot by grabbing the whole view.
}}


'''gl.UnitPieceMatrix'''
= Lights =
  ( number unitID, int piece ) -> nil


'''gl.DrawListAtUnit'''
{{LuaCallout
  ( number unitID, number listID, boolean midPos ) -> nil  
|prefix = gl.
|name = Lighting
|arg1 = {{type|bool}} enable
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


'''gl.DrawFuncAtUnit'''
  ( number unitID, boolean midPos, function [, arg1,... ]) -> nil


'''gl.DrawGroundCircle'''
{{LuaCallout
  ( number x, number y, number z, number radius, number divs [, number slope ] ) -> nil
|prefix = gl.
|name = ShadeModel
|arg1 = {{type|number}} [[Lua_ConstGL#ShadeModel|mode]]
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


'''gl.DrawGroundQuad'''
  ( number x1, number z1, number x2, number z2,
  [ boolean useNorm, number u1, number v1, number u2, number v2 ] ) -> nil


'''gl.Light'''
{{LuaCallout
  ( int light,
|prefix = gl.
  boolean enable |
|name = Light
  number pname, number param |
|arg1 = {{type|number}} intLight
   number pname, number param1, number param2, number param3 ) -> nil
|arg2 = {{type|bool}} enable  
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
or
 
{{LuaCallout
|prefix = gl.
|name = Light
|arg1 = {{type|number}} intLight
|arg2 = {{type|number}} [[Lua_ConstGL#Light_Specification|pname]]
|arg3 = {{type|number}} param  
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
or
 
{{LuaCallout
|prefix = gl.
|name = Light
|arg1 = {{type|number}} intLight
|arg2 = {{type|number}} [[Lua_ConstGL#Light_Specification|pname]]
|arg3 = {{type|number}} param1
|arg4 = {{type|number}} param2
|arg5 = {{type|number}} param3
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = Material
|arg1 = {{type|table}} material
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = material contains:
}}
<pre>material = {
    ambient   = {number r, number g, number b[, number a]},
    diffuse  = {number r, number g, number b[, number a]},
    ambidiff  = {number r, number g, number b[, number a]},
    emission  = {number r, number g, number b[, number a]},
    specular  = {number r, number g, number b[, number a]},
    shininess = number specularExponent
  }</pre>
 
= Hardware relevant =
 
{{LuaCallout
|prefix = gl.
|name = HasExtension
|arg1 = {{type|string}} extname
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|bool}} hasExtension
|info =
}}
 
 
 
{{LuaCallout
|prefix = gl.
|name = GetNumber
|arg1 = {{type|number}} ext
|arg2 = {{type|number}} intCount
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|number}} number1 {{bracket}}, {{type|number}} number2, {{type|number}} number3, ... #count {{rbracket}}
|info =
}}
 
 
{{LuaCallout
|prefix = gl.
|name = GetString
|arg1 = {{type|number}} ext
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|string}} extString
|info =
}}
 
= DrawGroundPrimitives =
 
{{LuaCallout
|prefix = gl.
|name = DrawGroundCircle
|arg1 = {{type|number}} x
|arg2 = {{type|number}} y
|arg3 = {{type|number}} z
|arg4 = {{type|number}} radius
|arg5 = {{type|number}} divs {{bracket}}
|arg6 = {{type|number}} slope {{rbracket}}
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Note: Number divs is the number of sides the circle will have. The higher the smoother the circle (and more GPU intensive).
}}


'''gl.Shape'''
( number GLtype,
  elements = {
    [1] = { v | vertex  = { number x, number y, number z },          <font color="green">required</font>
            n | normal  = { number x, number y, number z },          <font color="green">optional</font>
            t | texcoord = { number x, number y },                    <font color="green">optional</font>
            c | color    = { number r, number g, number b, number a }  <font color="green">optional</font>
    },
    etc ...
  }
) -> nil


'''gl.BeginEnd'''
{{LuaCallout
  ( number GLType, function [, arg1,... ] ) -> nil
|prefix = gl.
|name = DrawGroundQuad
|arg1 = {{type|number}} x1
|arg2 = {{type|number}} z1
|arg3 = {{type|number}} x2
|arg4 = {{type|number}} z2 {{bracket}}
|arg5 = {{type|bool}} useNorm {{bracket}}
|arg6 = {{type|number}} tu1, {{type|number}} tv1
|arg7 = {{type|number}} tu2, {{type|number}} tv2 {{rbracket}} {{pipe}} {{bracket}} {{type|bool}} useTextureCoord {{rbracket}} {{rbracket}}
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Note: x1, z1, x2 & z2 are rounded, so don't use it for very small or moving objects. x and z correspond to the coordinates displayed by the tooltip.<br>Also note: useNorm does nothing!
}}


'''gl.Vertex'''
= Queries =
  ( { number x, number y [, number z [, number w ]] } |
    number x, number y |
    number x, number y, number z |
    number x, number y, number z, number w ) -> nil


'''gl.Normal'''
{{LuaCallout
  (  number x, number y, number z |
|prefix = gl.
  { number x, number y, number z } ) -> nil
|name = CreateQuery
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|userdata}} query
|info = Needs >=OpengGL2.0!
}}


'''gl.TexCoord'''
  ( number x | { number x [, number y [, number z [, number w ]]] } |
    number x, number y |
    number x, number y, number z |
    number x, number y, number z, number w ) -> nil


'''gl.MultiTexCoord'''
{{LuaCallout
  ( int texNum,
|prefix = gl.
    number x | { number x [, number y [, number z [, number w ]]] } |
|name = DeleteQuery
    number x, number y |
|arg1 = {{type|userdata}} query
    number x, number y, number z |
|arg2 =
    number x, number y, number z, number w ) -> nil
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Needs >=OpengGL2.0!
}}


== Display Lists ==


'''gl.CreateList'''
{{LuaCallout
  ( function [,arg1 [,arg2...]] ) -> nil
|prefix = gl.
|name = RunQuery
|arg1 = {{type|userdata}} query
|arg2 = {{type|function}} func
|arg3 = {{type|arg1}}
|arg4 = {{type|arg2}}
|arg5 = ...
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Needs >=OpengGL2.0!
}}


'''gl.CallList'''
  ( number listID ) -> nil


'''gl.DeleteList'''
{{LuaCallout
  ( number listID ) -> nil
|prefix = gl.
|name = GetQuery
|arg1 = {{type|userdata}} query
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} renderedFragments
|info =
}}


== Hardware relevant ==
= Extended =


'''gl.HasExtension'''
{{LuaCallout
  ( string extname ) -> boolean
|prefix = gl.
|name = ActiveTexture
|arg1 = {{type|number}} intTexNum
|arg2 = {{type|function}} func {{bracket}}
|arg3 = {{type|arg1}}
|arg4 = ... {{rbracket}}
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


'''gl.GetNumber'''
  ( number ext, int count ) -> number


'''gl.GetString'''
{{LuaCallout
  ( number ext ) -> string
|prefix = gl.
|name = GetGlobalTexNames
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|table}} texNames = { {{bracket|1}} = {{type|string}} texture, etc ...  }
|info =
}}


== Extended ==


'''gl.GetGlobalTexNames'''
{{LuaCallout
  () -> { [1] = string texture, etc ... }
|prefix = gl.
|name = GetGlobalTexCoords
|arg1 = {{type|string}} 3doTextureName
|arg2 =  
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|number}} xstart, {{type|number}} ystart, {{type|number}} xend, {{type|number}} yend
|info = Gets the texcoord of a 3do texture in the 3do texture atlas.
}}


'''gl.GetGlobalTexCoords'''
  ( string tatexture ) -> number xstart, number ystart, number xend, number yend


'''gl.GetShadowMapParams'''
{{LuaCallout
  () -> number xmid, number ymid, number p17, number p18
|prefix = gl.
|name = UnsafeState
|arg1 = {{type|number}} state  {{bracket}}
|arg2 = {{type|bool}} disable_state {{rbracket}}
|arg3 = {{type|bool}} func
|arg4 = {{type|arg1}}
|arg5 = {{type|arg2}}
|arg6 = ...
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info = Calls glEnable(state) or glDisable(state) (if disable_state==true) and<br>then calls the lua_function and afterwards reverts the state.
}}


'''gl.GetMatrixData'''
  ( GL.PROJECTION [, int i] ) -> nil | { [1] = number, etc.. } | number Matrix[i]
  ( GL.MODELVIEW  [, int i] ) -> nil | { [1] = number, etc.. } | number Matrix[i]
  ( GL.TEXTURE    [, int i] ) -> nil | { [1] = number, etc.. } | number Matrix[i]
  ( "shadow" )                -> nil | { [1] = number, etc.. }
  ( "camera" )                -> nil | { [1] = number, etc.. }
  ( "caminv" )                -> nil | { [1] = number, etc.. }
  ( "camprj" )                -> nil | { [1] = number, etc.. }
  ( "billboard" )            -> nil | { [1] = number, etc.. }


'''gl.PointSprite''' <font color="red">(needs openGL2.0!)</font>
{{LuaCallout
  ( boolean enable, [boolean coord_replace, boolean coord_origin_upper] ) -> nil
|prefix = gl.
|name = GetShadowMapParams
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =  
|return = {{type|number}} xmid, {{type|number}} ymid, {{type|number}} p17, {{type|number}} p18
|info =
}}


'''gl.PointParameter''' <font color="red">(needs openGL2.0!)</font>
  ( number v1, number v2, number v3,
    [ number sizeMin, number sizeMax, number sizeFade ] ) -> nil


'''gl.ActiveTexture'''
{{LuaCallout
  ( int texNum, function [, arg1,... ] ) -> nil
|prefix = gl.
|name = GetMatrixData
|arg1 = GL.PROJECTION {{bracket}}
|arg2 = {{type|number}} intI
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc... {{pipe}} {{type|number}} Matrix{{bracket|i}}
|info =
}}


'''gl.TexEnv'''
or
  ( number target, number pname,
    number value |
    number var1, number var2, number var3 ) -> nil


'''gl.MultiTexEnv'''
{{LuaCallout
  ( int texNum, number target, number pname,
|prefix = gl.
    number value |
|name = GetMatrixData
    number var1, number var2, number var3 ) -> nil
|arg1 = GL.MODELVIEW {{bracket}}
|arg2 = {{type|number}} intI
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc... {{pipe}} {{type|number}} Matrix{{bracket|i}}
|info =
}}


'''gl.TexGen'''
or
  ( number target,
    boolean state |
    number pname, number value |
    number pname, number var1, number var2, number var3 ) -> nil


'''gl.MultiTexGen'''
{{LuaCallout
  ( int texNum, number target,
|prefix = gl.
    boolean state |
|name = GetMatrixData
    number pname, number value |
|arg1 = GL.TEXTURE {{bracket}}
    number pname, number var1, number var2, number var3 ) -> nil
|arg2 = {{type|number}} intI
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc... {{pipe}} {{type|number}} Matrix{{bracket|i}}
|info =
}}


'''gl.SecondaryColor'''
or
  ( { number r, number g, number b } |
      number r, number g, number b ) -> nil


'''gl.FogCoord'''
{{LuaCallout
  ( number value ) -> nil
|prefix = gl.
|name = GetMatrixData
|arg1 = {{type|string}} "shadow"
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc...
|info =
}}


'''gl.ClipPlane'''
or
  ( int plane, <font color="green">note: $plane can only be 1 or 2</font>
  boolean enable |
  number A, number B, number C, number D ) -> nil


'''gl.MatrixMode'''
{{LuaCallout
  ( number mode ) -> nil
|prefix = gl.
|name = GetMatrixData
|arg1 = {{type|string}} "camera"
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc...
|info =
}}
{{LuaCallout
|prefix = gl.
|name = GetMatrixData
|arg1 = {{type|string}} "caminv"
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc...
|info =
}}


'''gl.LoadIdentity'''
or
  () -> nil


'''gl.LoadMatrix'''
{{LuaCallout
  () -> nil
|prefix = gl.
|name = GetMatrixData
|arg1 = {{type|string}} "camprj"
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc...
|info =
}}


'''gl.MultMatrix'''
or


'''gl.Ortho'''
{{LuaCallout
  ( number left, number right, number bottom, number top, number near, number far ) -> nil
|prefix = gl.
|name = GetMatrixData
|arg1 = {{type|string}} "billboard"
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}} {{pipe}} {{type|number}} number1, etc...
|info =
}}


'''gl.Frustum'''
  ( number left, number right, number bottom, number top, number near, number far ) -> nil


'''gl.PushPopMatrix'''
{{LuaCallout
|prefix = gl.
|name = Flush
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


'''gl.PushAttrib'''
  ( [number] ) -> nil


'''gl.PopAttrib'''
{{LuaCallout
  () -> nil
|prefix = gl.
|name = Finish
|arg1 =
|arg2 =
|arg3 =
|arg4 =
|arg5 =
|arg6 =
|arg7 =
|arg8 =
|arg9 =
|return = {{type|nil}}
|info =
}}


'''gl.Flush'''
= Shaders (GLSL) =
   () -> nil
   [[Lua_GLSL_Api]]


'''gl.Finish'''
[[category: Lua]]
  () -> nil

Latest revision as of 16:26, 30 November 2021

Development < Lua Scripting < Lua OpenGL Api

Spring

gl.GetSun ( )
return: number sunPosX, number sunPosY, number sunPosZ

or

gl.GetSun ( string "pos" )
return: number sunPosX, number sunPosY, number sunPosZ

or

gl.GetSun ( string "shadowDensity" [, string "unit" ] )
return: number shadowDensity

or

gl.GetSun ( string "diffuse" [, string "unit" ] )
return: nil | number r, number g, number b

or

gl.GetSun ( string "ambient" [, string "unit" ] )
return: nil | number r, number g, number b

or

gl.GetSun ( string "specular" [, string "unit" ] )
return: nil | number r, number g, number b


gl.GetAtmosphere ( string name )
return: number r, number g, number b

New in version 101.0
See Spring.SetAtmosphere for details.


gl.GetWaterRendering ( string name )
return: nil | number r, number g, number b | string texName | bool active

New in version 104.0
See Spring.SetWaterParams for details.


gl.GetMapRendering ( string name )
return: nil | number r, number g, number b | bool active

New in version 104.0
See Spring.SetMapRenderingParams for details.


gl.ConfigScreen ( number screenWidth, number screenDistance )
return: nil

Used for Unit LODs.


gl.DrawMiniMap ( bool transform = true )
return: nil


gl.SlaveMiniMap ( bool mode )
return: nil


gl.ConfigMiniMap ( number intPX, number intPY, number intSX, number intSY )
return: nil


gl.GetViewSizes ( )
return: number x, number y

Matrices & Viewport

gl.Viewport ( number x, number y, number w, number h )
return: nil


gl.PushMatrix ( )
return: nil


gl.PopMatrix ( )
return: nil


gl.Translate ( number x, number y, number z )
return: nil


gl.Scale ( number x, number y, number z )
return: nil


gl.Scale ( number angle, number x, number y, number z )
return: nil


gl.Billboard ( )
return: nil

Use this to draw 2d primitives in DrawWorld().
To render a 2D billboarded quad in the gameworld at world position x,y,z, you do the following (at a minimum; I am skipping blending / depthtesting) here:
  gl.PushMatrix()
  gl.Texture(read what you need here)
  gl.Translate(x,y,z)
  gl.Billboard()			
  gl.TexRect(x1,y1,x2,y2)
  gl.PopMatrix()


gl.MatrixMode ( number mode )
return: nil


gl.LoadIdentity ( )
return: nil


gl.LoadMatrix ( 16 numbers or a matrix name )
return: nil


gl.MultMatrix ( ??? )
return: ???


gl.Ortho ( number left, number right, number bottom, number top, number near, number far )
return: nil


gl.Frustum ( number left, number right, number bottom, number top, number near, number far )
return: nil


gl.PushPopMatrix ( ??? )
return: ???


gl.ClipPlane ( number intPlane, bool enable | number A, number B, number C, number D )
return: nil

Note: intPlane can only be 1 or 2.

Clear

gl.Clear ( GL.DEPTH_BUFFER_BIT [, number cleardepth ] )
return: nil

or

gl.Clear ( GL.STENCIL_BUFFER_BIT [, number intClearStencil ] )
return: nil

or

gl.Clear ( GL.COLOR_BUFFER_BIT | GL.ACCUM_BUFFER_BIT [, number r, number g, number b, number a ] )
return: nil


gl.SwapBuffers ( )
return: nil

New in version 104.0
Available only in LuaMenu, meant for frame-limited LuaMenu's that want identical content in both buffers.

ResetState/Matrices

gl.ResetState ( )
return: nil

DON'T USE IT UNLESS YOU KNOW WHAT YOU ARE DOING! Each call-in has different default states, but this function resets all states to the states below no matter what!
  ShadeModel = GL.SMOOTH
  Scissor    = false
  Texture    = false
  Lighting    = false,
  ColorMask  = true, true, true, true
  DepthMask  = false
  DepthTest  = false  (GL.LEQUAL)
  Culling    = false  (GL.BACK)
  LogicOp    = false  (GL.INVERT)
  AlphaTest  = false  (GL.GREATER, 0.5f)
  Blending   = true (GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA)


gl.ResetMatrices ( )
return: nil

  Resets GL.TEXTURE matrix stack
  Resets GL.MODELVIEW matrix stack
  Resets GL.PROJECTION matrix stack

Draw Basics

gl.BeginEnd ( number GLType, function [, arg1, ... ] )
return: nil


gl.Color ( number r, number g, number b [, number a ] | table colors = { number r, number g, number b [, number a ] } )
return: nil


gl.Vertex ( table vertex = { number x, number y, [, number z [, number w ]] } )
return: nil

or

gl.Vertex ( number x, number y )
return: nil

or

gl.Vertex ( number x, number y, number z )
return: nil

or

gl.Vertex ( number x, number y, number z, number w )
return: nil


gl.Normal ( table normal = { number x, number y, number z } | number x, number y, number z )
return: nil


gl.EdgeFlag ( bool enable )
return: nil


gl.Rect ( number x1, number y1, number x2, number y2 )
return: nil


gl.TexRect ( number x1, number y1, number x2, number y2 [, bool flip_s, bool flip_t | number s1, number t1, number s2, number t2 ] )
return: nil

Texture rect.


gl.Shape ( number GLtype, table elements )
return: nil

Elements contains:
   elements = {
     [1] = { v | vertex   = { number x, number y, number z },           <font color="#55ee99">required</font>
             n | normal   = { number x, number y, number z },           <font color="#55ee99">optional</font>
             t | texcoord = { number x, number y },                     <font color="#55ee99">optional</font>
             c | color    = { number r, number g, number b, number a }  <font color="#55ee99">optional</font>
     },
     etc ...
   }


gl.SecondaryColor ( table color = { number r, number g, number b } | number r, number g, number b )
return: nil


gl.FogCoord ( number value )
return: nil

Display Lists

Display Lists save given vertex attributes in a static buffer, so the GPU can directly read them (without the CPU). Display Lists are a lot faster (10-60x) than standard drawing with glShape/glBeginEnd, so try to use them when ever you can. If you want to learn more about them, g00gle is your friend ;)

gl.CreateList ( function [, arg1 [, arg2 ... ]] )
return: number listID


gl.CallList ( number listID )
return: nil


gl.DeleteList ( number listID )
return: nil

Vertex Array Objects

Only available in "develop" branch of spring (the future 105.0+). This is conceptually similar and serve as modern OpenGL replacement to deprecated Display Lists.

gl.CreateVertexArray ( number numElements, number numIndices [, bool persistentBuffer = false ] )
return: number bufferID

See what elements and indices are here: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-9-vbo-indexing/ 
numElements and numIndices define the size of for elements and indices respectively. if indices are not going to be used, then set numIndices to 0
Persistent buffers (persistentBuffer = true) are more efficient for dynamically/often updated geometry.


gl.UpdateVertexArray ( number bufferID, number elementPos, number indexPos, table tbl | function func )
return: bool success

{elementPos, indexPos} define starting element in {element, index} VBO corresponding to 1st element of the supplied vertex data
4 elements table example:
  local verts = {
    p  = {0,0,0,1,  4,0,0,1,  4,4,0,1,  0,4,0,1},
    n  = {0,1,0  ,  0,1,0  ,  0,1,0  ,  0,1,0  },
    uv = {0,0,0,0,  1,0,0,0,  1,1,0,0,  0,1,0,0},
    c0 = {1,0,0,1,  0,1,0,1,  0,0,1,1,  1,1,1,0},
    i = {0, 1, 2, 2, 1, 3},            optional, use in case of indexed VBO
    c1 = {...} }

Alternatively Lua func can use gl.Vertex/gl.Color/gl.Normal/gl.TexCoord to define vertices, similarly how it used to be done in gl.BeginEnd.Note there is no function yet to define indices.


gl.RenderVertexArray ( number bufferID, number primType [, number firstIndex = 0, number count = numElements ] )
return: bool success

primType can be GL.POINTS, GL.LINE_STRIP, GL.LINE_LOOP, GL.LINES, GL.LINE_STRIP_ADJACENCY, GL.LINES_ADJACENCY, GL.TRIANGLE_STRIP, GL.TRIANGLE_FAN, GL.TRIANGLES, GL.TRIANGLE_STRIP_ADJACENCY, GL.TRIANGLES_ADJACENCY and GL.PATCHES
firstIndex specifies the starting index in the enabled arrays.
count specifies the number of indices to be rendered.


gl.DeleteVertexArray ( number bufferID )
return: bool success

Releases previously allocated VAO

Text

gl.Text ( string "text", number x, number y, number size [, string "options" ] )
return: nil

  options are:
    horizontal alignment:
       'c' = center
       'r' = right
    vertical alignment:
       'a' = ascender
       't' = top
       'v' = vertical center
       'x' = baseline
       'b' = bottom
       'd' = descender
    decorations:
       'o' = black outline
       'O' = white outline
       's' = shadow
    other:
       'n' = don't round vertex coords to nearest integer (font may get blurry)


gl.GetTextWidth ( string "text" )
return: number width

Width in pixels, with a font size of 1.0.


gl.GetTextHeight ( string "text" )
return: nil | number height, number descender, number numlines

Height in pixels, with a font size of 1.0. Further descriptions here: GetTextHeight


gl.BeginText ( )
return: nil

If you have multiple gl.Text calls, then you can bunch them between a gl.BeginText and gl.EndText to speedup the rendering.


gl.EndText ( )
return: nil

Unit/Feature Draw Functions

gl.Unit ( number unitID [, bool rawdraw, number intLOD ] )
return: nil

Draws a unit - on default it uses LOD, with lod<0 it is turned off, else it defines a specific level.


gl.UnitRaw ( number unitID [, bool rawdraw, number intLOD ] )
return: nil

Doesn't apply worldspace->unit transformation! only works if rawdraw is true.


gl.UnitShape ( number unitDefID, number teamID, bool rawState, bool toScreen, bool opaque )
return: nil

New in version 101.0
The three extra boolean arguments make it so that calling only these functions is enough to get correctly rendered models; pass in 'false' for the THIRD argument to get the fixed behavior, omit it or pass in 'true' [default] to render with your own custom state instead. The FOURTH argument should be 'true' if in DrawScreen and 'false' (default) if in DrawWorld; any transforms for these two functions *MUST* include a gl.LoadIdentity call when argument #3 is false (whether they are used in DrawWorld or in DrawScreen) the FIFTH argument determines whether the model is drawn opaque ('true' [default]) or with translucency ('false'); only has an effect when argument #3 is false.


gl.UnitMultMatrix ( number unitID )
return: nil

world space -> unit space


gl.UnitPieceMultMatrix ( number unitID, number intPiece )
return: nil

unit space -> piece space


gl.UnitPiece ( number unitID, number intPiece )
return: nil

Draws the unit piece.


gl.UnitPieceMatrix ( number unitID, number intPiece )
return: nil

Use gl.UnitPieceMultMatrix instead!


gl.Feature ( number featureID )
return: nil


gl.FeatureRaw ( number featureID [, bool rawdraw, number intLOD ] )
return: nil

New in version 101.0


gl.FeatureShape ( number featureDefID, number teamID, bool custom, bool drawScreen, bool opaque )
return: nil


gl.FeatureMultMatrix ( number featureID )
return: nil

New in version 101.0
world space -> feature space


gl.FeaturePieceMultMatrix ( number featureID, number intPiece )
return: nil

New in version 101.0
feature space -> piece space


gl.FeaturePiece ( number featureID, number intPiece )
return: nil

New in version 101.0
Draws the Feature piece.


gl.FeaturePieceMatrix ( number featureID, number intPiece )
return: nil

New in version 101.0
Use gl.FeaturePieceMultMatrix instead!


gl.DrawListAtUnit ( number unitID, number listID [, bool midPos, number scaleX, number scaleY, number scaleZ, number degrees, number rotX, number rotY, number rotZ ] )
return: nil


gl.DrawFuncAtUnit ( number unitID, bool midPos, function [, arg1, ... ] )
return: nil

States (Blending,AlphaTest...)

gl.Blending ( bool enable | number srcmode, number dstmode )
return: nil

or

gl.Blending ( string mode )
return: nil

Mode can be set to:
"add"
 = GL.ONE, GL.ONE

 "alpha_add"
 = GL.SRC_ALPHA, GL.ONE

 "alpha"
 = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA

 "reset"
 = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA

 "color"
 = GL.SRC_COLOR, GL.ONE_MINUS_SRC_ALPHA

 "modulate"
 = GL.DST_COLOR, GL.ZERO

 "disable"
 = GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA


gl.BlendEquation ( number mode )
return: nil


gl.BlendFunc ( number srcmode, number dstmode )
return: nil


gl.BlendEquationSeparate ( number modeRGB, number modeAlpha )
return: nil

Needs openGL2.0!


gl.BlendFuncSeparate ( number srcRGB, number [Lua_ConstGL#BlendingFactorDest, number srcAlpha, number dstAlpha )
return: nil

Needs openGL2.0!


gl.AlphaTest ( bool enable | number func, number threshold )
return: nil


gl.DepthTest ( bool enable | number func )
return: nil


gl.Culling ( bool enable | number face )
return: nil


gl.DepthClamp ( bool enable )
return: nil

Not always available, needs GL.NV_depth_clamp!


gl.DepthMask ( bool enable )
return: nil


gl.ColorMask ( bool masked )
return: nil

or

gl.ColorMask ( bool r, bool g, bool b, bool a )
return: nil

gl.LogicOp ( bool enable | number func )
return: nil


gl.Fog ( bool enable )
return: nil


gl.Smoothing ( bool enable | number point, bool enable | number line, bool enable | number polygon )
return: nil

Removed from version 104.0


gl.EdgeFlag ( bool enable )
return: nil


gl.Scissor ( bool enable )
return: nil

or

gl.Scissor ( number intX, number intY, number intW, number intH )
return: nil


gl.LineStipple ( string any )
return: nil

Use springs default line stipple.

or

gl.LineStipple ( bool enable )
return: nil

or

gl.LineStipple ( number intFactor, number pattern )
return: nil


gl.PolygonMode ( number face, number mode )
return: nil


gl.PolygonOffset ( bool enable | number factor, number units )
return: nil


gl.PushAttrib ( [ number attrib ] )
return: nil


gl.PopAttrib ( )
return: nil

Stencil

gl.StencilTest ( bool enable )
return: nil


gl.StencilMask ( number mask )
return: nil


gl.StencilFunc ( number func, number ref, number mask )
return: nil


gl.StencilOp ( number fail, number zfail, number zpass )
return: nil


gl.StencilMaskSeparate ( number face, number mask )
return: nil

Needs OpenGL2.0!


gl.StencilFuncSeparate ( number face, number func, number ref, number mask )
return: nil

Needs OpenGL2.0!


gl.StencilOpSeparate ( number face, number fail, number zfail, number zpass )
return: nil

Needs OpenGL2.0!

LineWidth & PointSize

gl.LineWidth ( number width )
return: nil


gl.PointSize ( number size )
return: nil

Values != 1 can break severely on ATI cards, see http://springrts.com/mantis/view.php?id=2390


gl.PointSprite ( bool enable [, bool coord_replace, bool coord_origin_upper ] )
return: nil

Needs OpenGL2.0!


gl.PointParameter ( number v1, number v2, number v3 [, number sizeMin, number sizeMax, number sizeFade ] )
return: nil

Needs OpenGL2.0!

Textures

gl.Texture ( [ number texNum, ] bool enable | string name )
return: nil | bool loaded

This is the only call-out that is needed to load and draw any texture in a Lua script. All you have to do is pass it a valid path to a valid png and it will use that image for drawing any subsequent textured rectangles. This is shown in the last line of the following list of valid strings for the name parameter.

name may be:

  1. 12

= unitDef 12 buildpic

%34:1 = unitDef 34 s3o tex2 (:0->tex1,:1->tex2)

%-102:0 = featureDef 102 s3o tex1

!56 = lua generated texture 56 (= return value of gl.CreateTexture)

$units = 3do textureatlas tex1

$units1 = 3do textureatlas tex1

$units2 = 3do textureatlas tex2

$shadow = shadowmap

$specular = specular cube map (removed in the latest develop)

$reflection = reflection cube map (can be mipmaped starting from 104.0.1-714-ga29177f. Set CubeTexGenerateMipMaps=1 in settings)

$shading = ground shading texture

$grass = grass shading texture

$heightmap = heightmap, the height in elmos is in the R channel (needs HeightMapTexture=1 set in spring config)

$minimap = minimap texture

$map_reflection = same as "$reflection" New in version 101.0

$sky_reflection = defined for SSMF maps that have a skyReflectModTex New in version 101.0

$detail = detail texture New in version 101.0

$normals = auto generated normals texture, X normal component is in r,g and b channels, Z normal component is in the A channel. If you need Y you'll need to reconstruct it form X and Z. New in version 101.0

$ssmf_normals = SSMF normals texture New in version 101.0

$ssmf_specular = SSMF specular texture New in version 101.0

$ssmf_splat_distr = SSMF splat distribution texture New in version 101.0

$ssmf_splat_detail = SSMF splat detail texture New in version 101.0

$ssmf_splat_normals = SSMF splat normals texture New in version 101.0, used as "$ssmf_splat_normals" or "$ssmf_splat_normals:X", 'X' can be a value between 0 and 3, defaults to 0 if ":X" is omitted

$ssmf_emission = SSMF emission texture New in version 101.0

$ssmf_parallax = SSMF parallax texture New in version 101.0

$info = currently active info texture (los, airlos, radar, jammer)
Note that textures contain no data until user switches to their respective modes and non-active textures are not updated in the background, so will go stale

$info_losmap = los texture (L-view)

$info_mtlmap = metal map texture (F4-view)

$info_hgtmap = height map texture (F1-view)

$info_blkmap = blocking map texture (F2-view)

$map_gbuffer_normtex = contains the smoothed normals buffer of the map in view in world space coordinates (note that to get true normal vectors from it, you must multiply the vector by 2 and subtract 1) New in version 95

$map_gbuffer_difftex = contains the diffuse texture buffer of the map in view New in version 95

$map_gbuffer_spectex = contains the specular textures of the map in view New in version 95

$map_gbuffer_emittex = for emissive materials (bloom would be the canonical use) New in version 95

$map_gbuffer_misctex = for arbitrary shader data New in version 95

$map_gbuffer_zvaltex = contains the depth values (z-buffer) of the map in view. New in version 95
To translate this to world position coordinates, use:

 No clip control / clipspace for depth is [-1,1]
 vec4 worldpos= viewProjectionInv * vec4(vec3(gl_TexCoord[0].st, 
 texture2D( map_gbuffer_zvaltex,gl_TexCoord[0].st ).x) * 2.0 - 1.0, 1.0);
 Default if clip control is supported / clipspace for depth is [0,1].
 vec4 worldpos= viewProjectionInv * vec4(gl_TexCoord[0].st * 2.0 - 1.0, 
 texture2D( map_gbuffer_zvaltex,gl_TexCoord[0].st ).x, 1.0);
 worldpos.xyz = worldpos.xyz / worldpos.w; 

$model_gbuffer_normtex = contains the smoothed normals buffer of the models in view in world space coordinates (note that to get true normal vectors from it, you must multiply the vector by 2 and subtract 1) New in version 95

$model_gbuffer_difftex = contains the diffuse texture buffer of the models in view New in version 95

$model_gbuffer_spectex = contains the specular textures of the models in view New in version 95

$model_gbuffer_emittex = for emissive materials (bloom would be the canonical use) New in version 95

$model_gbuffer_misctex = for arbitrary shader data New in version 95

$model_gbuffer_zvaltex = contains the depth values (z-buffer) of the models in view. New in version 95

${opt}:/LuaUI/images/image.png = load a texture from the VFS


  possible ${opt}'s are:
     'n' = nearest
     'l' = linear
     'a' = aniso
     'i' = invert
     'g' = greyed
     'c' = clamped
     'b' = border
     't%r,%g,%b' = tint
     'r%width,%height' = resize
  The above ${opt}'s are NOT available for .DDS textures! .dds will load faster than other image formats.
   example: ":iac:/LuaUI/images/image.png"
   example: ":cr16,16:/LuaUI/images/image.png"
   example2: ":t1.0,0.5,0:/LuaUI/images/image.png"  (orange tint)


gl.CreateTexture ( number intXSize, number intYSize [, table texProps ] )
return: string texture

texProps contains:
texProps = {
    [target     = number,](like GL.TEXTURE_1D,GL.TEXTURE_2D,...)(Added support for GL_TEXTURE_2D_MULTISAMPLE in 104.0.1-1015-g8e36ef2 maintenance)
    [format     = number,]
    [min_filter = [[Lua_ConstGL#Texture_Filtering|number]],]
    [mag_filter = [[Lua_ConstGL#Texture_Filtering|number]],]
    [wrap_s     = [[Lua_ConstGL#Texture_Clamping|number]],]
    [wrap_t     = [[Lua_ConstGL#Texture_Clamping|number]],]
    [wrap_r     = [[Lua_ConstGL#Texture_Clamping|number]],]
    [aniso      = number,]
    [border     = boolean,]
    [fbo        = boolean,] (needs GLEW_EXT_framebuffer_object!)
    [fboDepth   = boolean,] (needs GLEW_EXT_framebuffer_object!)
    [samples    = number,] specify any number here and target = GL_TEXTURE_2D_MULTISAMPLE to create multisample texture (Added in 104.0.1-1015-g8e36ef2 maintenance)
  }


gl.DeleteTexture ( string texture )
return: bool deleted


gl.DeleteTextureFBO ( string texture )
return: bool deleted

Needs GLEW_EXT_framebuffer_object!


gl.TextureInfo ( string texture )
return: nil | table texInfo

texInfo contains:
 texInfo = {
      xsize = number,
      ysize = number,
      alpha = boolean, //not used yet
      type  = number,  //not used yet
    }

The format of the texture string is the same as in gl.Texture().


gl.MultiTexCoord ( number x [, number y [, number z [, number w ]]] | table texCoords = { number x [, number y [, number z [, number w ]]] } )
return: nil


gl.TexEnv ( number target, number pname, number value )
return: nil

or

gl.TexEnv ( number target, number pname, number var1, number var2, number var3 )
return: nil


gl.MultiTexEnv ( number texNum, number target, number pname, number value )
return: nil

or

gl.MultiTexEnv ( number texNum, number target, number pname, number var1, number var2, number var3 )
return: nil


gl.TexGen ( number target, bool state )
return: nil

or

gl.TexGen ( number target, number pname, number value )
return: nil

or

gl.TexGen ( number target, bool pname, number var1, number var2, number var3 )
return: nil


gl.MultiTexGen ( number intTexNum, number target, bool state )
return: nil

or

gl.MultiTexGen ( number intTexNum, number target, number pname, number value )
return: nil

or

gl.MultiTexGen ( number intTexNum, number target, number pname, number var1, number var2, number var3 )
return: nil


gl.CopyToTexture ( string texture, number intXOff, number intYOff, number intX, number intY, number intW, number intH [, number target, number level ] )
return: nil


gl.RenderToTexture ( string fbotexture, function lua_func )
return: nil

Needs GLEW_EXT_framebuffer_object!


gl.GenerateMipmap ( string texture )
return: bool created

Needs glGenerateMipmapEXT!
The following are primarily intended to be used in conjunction with
     gl.{Unit,Feature}(objID, ..., raw=true)
     gl.{Unit,Feature}Shape(defID, ..., raw=true)
and apply a model's default textures; easier than gl.Texture("$%...")


gl.UnitTextures ( number unitID, bool enable )
return: bool enabled


gl.UnitShapeTextures ( number unitDefID, bool enable )
return: bool enabled


gl.FeatureTextures ( number featureID, bool enable )
return: bool enabled


gl.FeatureShapeTextures ( number featureDefID, bool enable )
return: bool enabled

PixelReadback

gl.SaveImage ( number x, number y, number w, number h, string filename [, table imgProps = { alpha=bool, yflip=bool, grayscale16bit=bool, readbuffer=number } ] )
return: nil | bool success

grayscale16bit is New in version 99.0 and allows to save single color 16bit PNG

readbuffer is New in version 104+ and allows to choose the attachment of MRT FBO, use GL_COLOR_ATTACHMENT0_EXT and further as index


gl.ReadPixels ( number x, number y, number w, number h [, number format = GL.RGBA ] )
return: nil | number r [, g [, b [, a {rbracket

{rbracket}}{rbracket}} | table readPixels = { { { 1 = number r, 2 = number g, 3 = number b, 4 = number a}, ... }, ... }

|info = This reads back pixels from the final rendered screen. E.g. you can make a screenshot by grabbing the whole view. }}

Lights

gl.Lighting ( bool enable )
return: nil


gl.ShadeModel ( number mode )
return: nil


gl.Light ( number intLight, bool enable )
return: nil

or

gl.Light ( number intLight, number pname, number param )
return: nil

or

gl.Light ( number intLight, number pname, number param1, number param2, number param3 )
return: nil


gl.Material ( table material )
return: nil

material contains:
material = {
    ambient   = {number r, number g, number b[, number a]},
    diffuse   = {number r, number g, number b[, number a]},
    ambidiff  = {number r, number g, number b[, number a]},
    emission  = {number r, number g, number b[, number a]},
    specular  = {number r, number g, number b[, number a]},
    shininess = number specularExponent
  }

Hardware relevant

gl.HasExtension ( string extname )
return: bool hasExtension


gl.GetNumber ( number ext, number intCount )
return: number number1 [, number number2, number number3, ... #count ]


gl.GetString ( number ext )
return: string extString

DrawGroundPrimitives

gl.DrawGroundCircle ( number x, number y, number z, number radius, number divs [, number slope ] )
return: nil

Note: Number divs is the number of sides the circle will have. The higher the smoother the circle (and more GPU intensive).


gl.DrawGroundQuad ( number x1, number z1, number x2, number z2 [, bool useNorm [, number tu1, number tv1, number tu2, number tv2 ] | [ bool useTextureCoord ] ] )
return: nil

Note: x1, z1, x2 & z2 are rounded, so don't use it for very small or moving objects. x and z correspond to the coordinates displayed by the tooltip.
Also note: useNorm does nothing!

Queries

gl.CreateQuery ( )
return: nil | userdata query

Needs >=OpengGL2.0!


gl.DeleteQuery ( userdata query )
return: nil

Needs >=OpengGL2.0!


gl.RunQuery ( userdata query, function func, arg1, arg2, ... )
return: nil

Needs >=OpengGL2.0!


gl.GetQuery ( userdata query )
return: nil | number renderedFragments

Extended

gl.ActiveTexture ( number intTexNum, function func [, arg1, ... ] )
return: nil


gl.GetGlobalTexNames ( )
return: table texNames = { [1] = string texture, etc ... }


gl.GetGlobalTexCoords ( string 3doTextureName )
return: number xstart, number ystart, number xend, number yend

Gets the texcoord of a 3do texture in the 3do texture atlas.


gl.UnsafeState ( number state [, bool disable_state ], bool func, arg1, arg2, ... )
return: nil

Calls glEnable(state) or glDisable(state) (if disable_state==true) and
then calls the lua_function and afterwards reverts the state.


gl.GetShadowMapParams ( )
return: number xmid, number ymid, number p17, number p18


gl.GetMatrixData ( GL.PROJECTION [, number intI )
return: nil | number number1, etc... | number Matrix[i]

or

gl.GetMatrixData ( GL.MODELVIEW [, number intI )
return: nil | number number1, etc... | number Matrix[i]

or

gl.GetMatrixData ( GL.TEXTURE [, number intI )
return: nil | number number1, etc... | number Matrix[i]

or

gl.GetMatrixData ( string "shadow" )
return: nil | number number1, etc...

or

gl.GetMatrixData ( string "camera" )
return: nil | number number1, etc...

gl.GetMatrixData ( string "caminv" )
return: nil | number number1, etc...

or

gl.GetMatrixData ( string "camprj" )
return: nil | number number1, etc...

or

gl.GetMatrixData ( string "billboard" )
return: nil | number number1, etc...


gl.Flush ( )
return: nil


gl.Finish ( )
return: nil

Shaders (GLSL)

 Lua_GLSL_Api