glutil.monkey2 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. Namespace mojo.graphics.glutil
  2. Private
  3. Global bindings:=New IntStack
  4. Public
  5. Function glShaderSourceEx:Void( shader:GLuint,source:String )
  6. Local n:=source.Length
  7. Local buf:=Cast<Byte Ptr>( libc.malloc( n+1 ) )
  8. For Local i:=0 Until n
  9. buf[i]=source[i]
  10. Next
  11. buf[n]=0
  12. Local p:=Cast<GLcchar Ptr>( buf )
  13. glShaderSource( shader,1,Varptr p,Null )
  14. libc.free( buf )
  15. End
  16. Function glGetShaderInfoLogEx:String( shader:GLuint )
  17. Local buf:=New Byte[1024],length:GLsizei
  18. glGetShaderInfoLog( shader,buf.Length,Varptr length,Cast<GLchar Ptr>( Varptr buf[0] ) )
  19. Return String.FromCString( Varptr buf[0] )
  20. End
  21. Function glGetProgramInfoLogEx:String( program:GLuint )
  22. Local buf:=New Byte[1024],length:GLsizei
  23. glGetProgramInfoLog( program,buf.Length,Varptr length,Cast<GLchar Ptr>( Varptr buf[0] ) )
  24. Return String.FromCString( Varptr buf[0] )
  25. End
  26. #rem monkeydoc @hidden
  27. #end
  28. Global glDebug:Bool=False
  29. #rem monkeydoc @hidden
  30. #end
  31. Global glGraphicsSeq:Int=1
  32. #rem monkeydoc @hidden
  33. #end
  34. Global glRetroMode:Bool=False
  35. #rem monkeydoc @hidden
  36. #end
  37. Global glRetroSeq:Int=1
  38. #rem monkeydoc @hidden
  39. #end
  40. Function glInvalidateGraphics()
  41. glGraphicsSeq+=1
  42. End
  43. #rem monkeydoc @hidden
  44. #end
  45. Function glCheck()
  46. If Not glDebug Return
  47. Local err:=glGetError()
  48. If err=GL_NO_ERROR Return
  49. Local msg:=""
  50. Select err
  51. Case GL_INVALID_ENUM
  52. msg="INVALID_ENUM"
  53. Case GL_INVALID_VALUE
  54. msg="INVALID_VALUE"
  55. Case GL_INVALID_OPERATION
  56. msg="INVALID_OPERATION"
  57. Case GL_INVALID_FRAMEBUFFER_OPERATION
  58. msg="INVALID_FRAMEBUFFER_OPERATION"
  59. Case GL_OUT_OF_MEMORY
  60. msg="OUT_OF_MEMORY"
  61. Default
  62. msg="?????"
  63. End
  64. RuntimeError( "GL ERROR: "+msg+" "+err )
  65. End
  66. #rem monkeydoc @hidden
  67. #end
  68. Function glPushTexture:Void( target:GLenum,texture:GLuint )
  69. Assert( target=GL_TEXTURE_2D Or target=GL_TEXTURE_CUBE_MAP )
  70. Local binding:Int
  71. glGetIntegerv( target=GL_TEXTURE_2D ? GL_TEXTURE_BINDING_2D Else GL_TEXTURE_BINDING_CUBE_MAP,Varptr binding )
  72. bindings.Push( binding )
  73. bindings.Push( target )
  74. glBindTexture( target,texture )
  75. End
  76. #rem monkeydoc @hidden
  77. #end
  78. Function glPopTexture:Void()
  79. Local target:=bindings.Pop()
  80. Assert( target=GL_TEXTURE_2D Or target=GL_TEXTURE_CUBE_MAP )
  81. glBindTexture( target,bindings.Pop() )
  82. End
  83. #rem monkeydoc @hidden
  84. #end
  85. Function glPushBuffer( target:GLenum,buf:GLuint )
  86. Assert( target=GL_ARRAY_BUFFER Or target=GL_ELEMENT_ARRAY_BUFFER )
  87. Local binding:Int
  88. glGetIntegerv( target=GL_ARRAY_BUFFER ? GL_ARRAY_BUFFER_BINDING Else GL_ELEMENT_ARRAY_BUFFER_BINDING,Varptr binding )
  89. bindings.Push( binding )
  90. bindings.Push( target )
  91. glBindBuffer( target,buf )
  92. End
  93. #rem monkeydoc @hidden
  94. #end
  95. Function glPopBuffer()
  96. Local target:=bindings.Pop()
  97. Assert( target=GL_ARRAY_BUFFER Or target=GL_ELEMENT_ARRAY_BUFFER )
  98. glBindBuffer( target,bindings.Pop() )
  99. End
  100. #rem monkeydoc @hidden
  101. #end
  102. Function glPushFramebuffer:Void( target:GLenum,framebuf:GLuint )
  103. Assert( target=GL_FRAMEBUFFER )
  104. Local binding:Int
  105. glGetIntegerv( GL_FRAMEBUFFER_BINDING,Varptr binding )
  106. bindings.Push( framebuf )
  107. bindings.Push( target )
  108. glBindFramebuffer( target,framebuf )
  109. End
  110. #rem monkeydoc @hidden
  111. #end
  112. Function glPopFramebuffer:Void()
  113. Local target:=bindings.Pop()
  114. Assert( target=GL_FRAMEBUFFER )
  115. glBindFramebuffer( target,bindings.Pop() )
  116. End
  117. #rem monkeydoc @hidden
  118. #end
  119. Function glCompile:Int( type:Int,source:String )
  120. If BBGL_ES
  121. Local prefix:="
  122. #ifdef GL_ES
  123. #ifdef GL_FRAGMENT_PRECISION_HIGH
  124. precision highp float;
  125. #else
  126. precision mediump float;
  127. #endif
  128. #endif
  129. "
  130. source=prefix+source
  131. If BBGL_draw_buffers source="#extension GL_EXT_draw_buffers : require~n"+source
  132. ' If glexts.GL_standard_derivatives source="#extension GL_OES_standard_derivatives : require~n"+source
  133. Else
  134. Local prefix:="
  135. #version 120
  136. "
  137. source=prefix+source
  138. Endif
  139. Local shader:=glCreateShader( type )
  140. glShaderSourceEx( shader,source )
  141. glCompileShader( shader )
  142. Local status:Int
  143. glGetShaderiv( shader,GL_COMPILE_STATUS,Varptr status )
  144. If Not status
  145. Local lines:=source.Split( "~n" )
  146. For Local i:=0 Until lines.Length
  147. Print (i+1)+":~t"+lines[i]
  148. Next
  149. RuntimeError( "Failed to compile shader:"+glGetShaderInfoLogEx( shader ) )
  150. Endif
  151. Return shader
  152. End
  153. #rem monkeydoc @hidden
  154. #end
  155. Function glLink:Void( program:Int )
  156. glLinkProgram( program )
  157. Local status:Int
  158. glGetProgramiv( program,GL_LINK_STATUS,Varptr status )
  159. If Not status
  160. RuntimeError( "Failed to link program:"+glGetProgramInfoLogEx( program ) )
  161. Endif
  162. End