123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- Namespace mojo.graphics.glutil
- Private
- Global bindings:=New IntStack
- Public
- Function glShaderSourceEx:Void( shader:GLuint,source:String )
- Local n:=source.Length
- Local buf:=Cast<Byte Ptr>( libc.malloc( n+1 ) )
- For Local i:=0 Until n
- buf[i]=source[i]
- Next
- buf[n]=0
-
- Local p:=Cast<GLcchar Ptr>( buf )
-
- glShaderSource( shader,1,Varptr p,Null )
-
- libc.free( buf )
- End
- Function glGetShaderInfoLogEx:String( shader:GLuint )
- Local buf:=New Byte[1024],length:GLsizei
-
- glGetShaderInfoLog( shader,buf.Length,Varptr length,Cast<GLchar Ptr>( Varptr buf[0] ) )
-
- Return String.FromCString( Varptr buf[0] )
- End
- Function glGetProgramInfoLogEx:String( program:GLuint )
- Local buf:=New Byte[1024],length:GLsizei
-
- glGetProgramInfoLog( program,buf.Length,Varptr length,Cast<GLchar Ptr>( Varptr buf[0] ) )
-
- Return String.FromCString( Varptr buf[0] )
- End
- #rem monkeydoc @hidden
- #end
- Global glDebug:Bool=False
- #rem monkeydoc @hidden
- #end
- Global glGraphicsSeq:Int=1
- #rem monkeydoc @hidden
- #end
- Global glRetroMode:Bool=False
- #rem monkeydoc @hidden
- #end
- Global glRetroSeq:Int=1
- #rem monkeydoc @hidden
- #end
- Function glInvalidateGraphics()
-
- glGraphicsSeq+=1
- End
- #rem monkeydoc @hidden
- #end
- Function glCheck()
-
- If Not glDebug Return
-
- Local err:=glGetError()
- If err=GL_NO_ERROR Return
-
- Local msg:=""
- Select err
- Case GL_INVALID_ENUM
- msg="INVALID_ENUM"
- Case GL_INVALID_VALUE
- msg="INVALID_VALUE"
- Case GL_INVALID_OPERATION
- msg="INVALID_OPERATION"
- Case GL_INVALID_FRAMEBUFFER_OPERATION
- msg="INVALID_FRAMEBUFFER_OPERATION"
- Case GL_OUT_OF_MEMORY
- msg="OUT_OF_MEMORY"
- Default
- msg="?????"
- End
-
- RuntimeError( "GL ERROR: "+msg+" "+err )
- End
- #rem monkeydoc @hidden
- #end
- Function glPushTexture:Void( target:GLenum,texture:GLuint )
- Assert( target=GL_TEXTURE_2D Or target=GL_TEXTURE_CUBE_MAP )
-
- Local binding:Int
- glGetIntegerv( target=GL_TEXTURE_2D ? GL_TEXTURE_BINDING_2D Else GL_TEXTURE_BINDING_CUBE_MAP,Varptr binding )
- bindings.Push( binding )
- bindings.Push( target )
-
- glBindTexture( target,texture )
- End
- #rem monkeydoc @hidden
- #end
- Function glPopTexture:Void()
-
- Local target:=bindings.Pop()
- Assert( target=GL_TEXTURE_2D Or target=GL_TEXTURE_CUBE_MAP )
-
- glBindTexture( target,bindings.Pop() )
- End
- #rem monkeydoc @hidden
- #end
- Function glPushBuffer( target:GLenum,buf:GLuint )
-
- Assert( target=GL_ARRAY_BUFFER Or target=GL_ELEMENT_ARRAY_BUFFER )
-
- Local binding:Int
- glGetIntegerv( target=GL_ARRAY_BUFFER ? GL_ARRAY_BUFFER_BINDING Else GL_ELEMENT_ARRAY_BUFFER_BINDING,Varptr binding )
-
- bindings.Push( binding )
- bindings.Push( target )
-
- glBindBuffer( target,buf )
- End
- #rem monkeydoc @hidden
- #end
- Function glPopBuffer()
-
- Local target:=bindings.Pop()
- Assert( target=GL_ARRAY_BUFFER Or target=GL_ELEMENT_ARRAY_BUFFER )
-
- glBindBuffer( target,bindings.Pop() )
- End
- #rem monkeydoc @hidden
- #end
- Function glPushFramebuffer:Void( target:GLenum,framebuf:GLuint )
-
- Assert( target=GL_FRAMEBUFFER )
-
- Local binding:Int
- glGetIntegerv( GL_FRAMEBUFFER_BINDING,Varptr binding )
-
- bindings.Push( framebuf )
- bindings.Push( target )
-
- glBindFramebuffer( target,framebuf )
- End
- #rem monkeydoc @hidden
- #end
- Function glPopFramebuffer:Void()
-
- Local target:=bindings.Pop()
- Assert( target=GL_FRAMEBUFFER )
-
- glBindFramebuffer( target,bindings.Pop() )
- End
- #rem monkeydoc @hidden
- #end
- Function glCompile:Int( type:Int,source:String )
-
- If BBGL_ES
-
- Local prefix:="
- #ifdef GL_ES
- #ifdef GL_FRAGMENT_PRECISION_HIGH
- precision highp float;
- #else
- precision mediump float;
- #endif
- #endif
- "
- source=prefix+source
-
- If BBGL_draw_buffers source="#extension GL_EXT_draw_buffers : require~n"+source
-
- ' If glexts.GL_standard_derivatives source="#extension GL_OES_standard_derivatives : require~n"+source
- Else
-
- Local prefix:="
- #version 120
- "
- source=prefix+source
- Endif
-
- Local shader:=glCreateShader( type )
- glShaderSourceEx( shader,source )
- glCompileShader( shader )
-
- Local status:Int
- glGetShaderiv( shader,GL_COMPILE_STATUS,Varptr status )
- If Not status
-
- Local lines:=source.Split( "~n" )
-
- For Local i:=0 Until lines.Length
- Print (i+1)+":~t"+lines[i]
- Next
-
- RuntimeError( "Failed to compile shader:"+glGetShaderInfoLogEx( shader ) )
- Endif
- Return shader
- End
- #rem monkeydoc @hidden
- #end
- Function glLink:Void( program:Int )
- glLinkProgram( program )
- Local status:Int
- glGetProgramiv( program,GL_LINK_STATUS,Varptr status )
- If Not status
- RuntimeError( "Failed to link program:"+glGetProgramInfoLogEx( program ) )
- Endif
- End
|