
''=============================================================================
''
''    Easy GL2D (FB.IMAGE compatible version)
''    By Relminator (Richard Eric M. Lope)
''    http://rel.betterwebber.com
''    
''    An easy to use OpenGL 2d lib
''    As easy as fbgfx (easier IMHO if you use my Texture packer)
''    
''    Can automatically load BMP's supported by BLOAD
''    Adds alpha transparency if you want
''    No external dependencies (only uses OpenGL/GLU and FBGFX)
''    Source license is "use or abuse"
''
''=============================================================================


*Use this with my texture packer and it would
be very easy to construct an engine.
         
Texturepacker
http://rel.betterwebber.com/junk.php?id=106


Everything is the same as the standard mode except that:

1. all calls to "byref image as Tglsprite" has been changed to
   "byval spr as image ptr"

2. Calling the sprite routines needs casting
   ie.
   PUT (310,30), images(81)
   
   becomes:

   gl2d.sprite(310,30,cast(gl2d.image ptr, images(81)))
	
   * no way to go around this as of the moment as we cannot undef stuff
     inside namespaces

3. init_sprites() changed prototypes (a lot simpler now)

4. Added load_image_to_HW(byval spr as image ptr) 
   * Loads an FB.image to texture
   * See example file
 
''=============================================================================
''
''    FUNCTION PROTOYPES
''
''=============================================================================


declare sub vsync_on()

	Desc: 	Enables screensync
	Parameters: 
	example: 

==============================================================================

declare sub start_2d(byval wid as integer, byval hei as integer)

	Desc: Sets up 2d mode. Useful if you want to combine 2d and 3d
		  No need to call this is you just want a pure 2d engine.
	Parameters: wid = widh of screen
				hei = height of screen
	example: gl2.start_2d(640, 480)

==============================================================================

declare sub end_2d()  

	Desc: ends 2d mode. Useful if you want to combine 2d and 3d
		  No need to call this is you just want a pure 2d engine.
	Parameters: none
	example: gl2.end_2d(640, 480)

==============================================================================
	
declare sub screen_init(byval screen_wid as integer, byval screen_hei as integer)

	Desc: sets up GL2D. Call this before any of GL2D's function.
	Parameters: screen_wid = width of screen
				screen_hei = height of screen
	example: gl2.screen_init(640, 480)

==============================================================================
	

declare sub set_blend_mode(byval blend_mode as E_BLEND_MODE)

	Desc: Sets the blending mode. Mode stays until changed.
		  mode can be applied to any sprite or primitive.
	Parameters: blend_mode = an enum for blending states
				blend modes 
				E_TRANS = normal transparent
				E_SOLID = solid with no transparency
				E_BLENDED = blending
				E_GLOW = ADDITIVE blending(Particles)
	
	example: gl2.set_blend_mode(GL2D.E_SOLID)

==============================================================================

	
declare sub enable_antialias(byval switch as integer = 1)

	Desc: Enables/disables AA. If switch = 0 AA is disabled
	Parameters: switch(optional)
	example: gl2.enable_antialias()

==============================================================================
	
declare sub clear_screen()

	Desc: clears the depth and color buffer
	Parameters: none
	example: gl2.clear_screen()

==============================================================================
declare sub put_pixel( byval x as integer, byval y as integer, byval gl2dcolor as GLuint )

	Desc: Same as Pset	
	Parameters: see the demo(Anyone up for writing docs?)
	example: gl2.put_pixel(100,100,GL2D_RGBA(220,255,55,255))

==============================================================================

declare sub line_2d( byval x1 as integer, byval y1 as integer, byval x2 as integer, byval y2 as integer, byval gl2dcolor as GLuint )

	Desc: 	draws a 2d line 
	Parameters: see the demo(Anyone up for writing docs?)
	example: gl2.line_2d(620,290,620,425,GL2D_RGBA(255,255,0,255))

==============================================================================

declare sub box( byval x1 as integer, byval y1 as integer, byval x2 as integer, byval y2 as integer, byval gl2dcolor as GLuint )

	Desc: 	Draws a box
	Parameters: see the demo(Anyone up for writing docs?)
	example: gl2.box(400,40,639,479,GL2D_RGBA(220,255,55,0))

==============================================================================

declare sub box_filled( byval x1 as integer, byval y1 as integer, byval x2 as integer, byval y2 as integer, byval gl2dcolor as GLuint )

	Desc: 	Draws a filled box
	Parameters: see the demo(Anyone up for writing docs?)
	example: gl2.box_filled(400,40,639,479,GL2D_RGBA(220,255,55,0))

==============================================================================

declare sub box_filled_gradient( byval x1 as integer, byval y1 as integer,_
								 byval x2 as integer, byval y2 as integer,_
								 byval gl2dcolor1 as GLuint,_
								 byval gl2dcolor2 as GLuint,_
								 byval gl2dcolor3 as GLuint,_
								 byval gl2dcolor4 as GLuint )

	Desc: 	fills a box with gradient colors (gouraud shaded)
	Parameters: 
	example: gl2.box_filled_gradient(20,350,560,460,_
			   			  	 GL2D_RGBA(0,255,255,255),_
							 GL2D_RGBA(255,255,0,255),_
							 GL2D_RGBA(255,255,255,255),_
							 GL2D_RGBA(255,0,255,255))

==============================================================================

declare sub triangle( byval x1 as integer, byval y1 as integer, byval x2 as integer, byval y2 as integer,_
					  byval x3 as integer, byval y3 as integer, byval gl2dcolor as GLuint )

	Desc: 	Draws a triangle
	Parameters: see the demo(Anyone up for writing docs?)
	example: gl2.triangle(480,100,630,50,560,200,GL2D_RGBA(25,2,255,255))

==============================================================================

declare sub triangle_filled( byval x1 as integer, byval y1 as integer, byval x2 as integer, byval y2 as integer,_
			                 byval x3 as integer, byval y3 as integer, byval gl2dcolor as GLuint )

	Desc: 	fills a box with gradient colors (gouraud shaded)
	Parameters: 
	example: gl2.triangle_filled(490,105,610,60,590,135,GL2D_RGBA(255,255,255,255))

==============================================================================

declare sub triangle_filled_gradient( byval x1 as integer, byval y1 as integer,_ 
									  byval x2 as integer, byval y2 as integer,_
									  byval x3 as integer, byval y3 as integer,_
									  byval gl2dcolor1 as GLuint, byval gl2dcolor2 as GLuint, byval gl2dcolor3 as GLuint )

	Desc: 	fills a triangle with gradient colors (gouraud shaded)
	Parameters: see the demo(Anyone up for writing docs?)
	example: gl2.triangle_filled_gradient(290,150,510,60,490,135,_
								  GL2D_RGBA(0,255,255,255),_
								  GL2D_RGBA(255,255,0,255),_
								  GL2D_RGBA(255,0,255,255))

==============================================================================

declare sub circle_2d(byval x as integer, byval y as integer, byval radius as integer, byval gl2dcolor as GLuint)

	Desc: 	Draws a circle
	Parameters: 
	example: 

==============================================================================

declare sub circle_2d_filled(byval x as integer, byval y as integer, byval radius as integer, byval gl2dcolor as GLuint )

	Desc: 	Draws a filled circle
	Parameters: 
	example: 

==============================================================================

declare sub ellipse(byval x as single, byval y as single, byval a as single, byval b as single, byval angle as single, byval gl2dcolor as GLuint )

	Desc: 	Draws an ellipse
	Parameters: 
	example: 

==============================================================================

declare sub ellipse_filled(byval x as single, byval y as single, byval a as single, byval b as single, byval angle as single, byval gl2dcolor as GLuint )


	Desc: 	Draws a filled ellipse
	Parameters: 
	example: 

==============================================================================

declare sub sprite( byval x as integer, byval y as integer, byref image as Tglsprite)

	Desc: 	Draws a sprite 
	Parameters: see the demo(Anyone up for writing docs?)
	example: gl2.sprite(280,330,images(81))

==============================================================================

declare sub sprite_scale( byval x as integer, byval y as integer, byval scale as single, byref image as Tglsprite)

	Desc: 	Draws a scaled sprite
	Parameters: see the demo(Anyone up for writing docs?)
	example: gl2.sprite_scale(310,30,5,images(81))

==============================================================================

declare sub sprite_rotate( byval x as integer, byval y as integer, byval angle as integer,  byref image as Tglsprite)

	Desc: 	draws a rotated sprite
	Parameters: see the demo(Anyone up for writing docs?)
	example: gl2.sprite_rotate(130,120,50,images(30))

==============================================================================

declare sub sprite_rotate_scale( byval x as integer, byval y as integer, byval angle as integer, byval scale as single, byref image as Tglsprite)

	Desc: 	draws a rotated and scaled sprite
	Parameters: see the demo(Anyone up for writing docs?)
	example: gl2.sprite_rotate_scale(320, 240, 130, 3,images(30))

==============================================================================

declare sub sprite_stretch( byval x1 as integer, byval y1 as integer,_
					byval x2 as integer, byval y2 as integer,_
					byref image as Tglsprite)

	Desc: 	Stretches a sprite (useful for effects)
	Parameters: see the demo(Anyone up for writing docs?)
	example: gl2.sprite_stretch(10,10, 200,198, images(10))

==============================================================================

declare sub sprite_stretch_h( byval x as integer, byval y as integer, byval length as integer, byref image as Tglsprite )

	Desc: 	"Cleanly" stretches the sprite horizontally.  Useful for lifebars, lasers, and dialoagboxes.
	Parameters: see the demo(Anyone up for writing docs?)
	example: gl2.sprite_stretch_h(10,400, 50), images(14))


==============================================================================

declare sub sprite_stretch_on_quad( byval x1 as integer, byval y1 as integer,_
							byval x2 as integer, byval y2 as integer,_
							byval x3 as integer, byval y3 as integer,_
							byval x4 as integer, byval y4 as integer,_
							byref image as const Tglsprite)

	Desc: 	Stretches a sprite (effect I've seen in Castlevania Order of Ecclesia)
	Parameters: see the demo(Anyone up for writing docs?)
	example: 

==============================================================================

declare sub line_glow ( byval x1 as single, byval y1 as single, byval x2 as single, byval y2 as single,_
						byval lwidth as single, byval mycolor as GLuint)

	Desc: 	Glowing lines (simulates the old arcade vector graphics)
	Parameters: see the demo(Anyone up for writing docs?)
	example: gl2.line_glow(320,290,620,290,20,GL2D_RGBA(128,32,225,128))

==============================================================================

declare sub print_scale(byval x as integer, byval y as integer,byval scale as single, byref text as const string)


	Desc: 	Rudimentary printing function which behaves like draw string
	Parameters: see the demo(Anyone up for writing docs?)
	example: gl2d.print_scale(40, 10,2, "Easy GL2D by Relminato FPS = " + str(fps))

==============================================================================

declare function load_image( byval image as any ptr ) as GLuint

	Desc: 	Loads an FB.Image pointer to a GL texture
	Parameters: see the demo(Anyone up for writing docs?)
	example: gl2.load_image()

==============================================================================

declare function load_image_24bit_alpha( byval image as any ptr ) as GLuint

	Desc: 	Loads a color-keyed FB.Image to a GL texture adding an alpha
			channel with (RGBA(255,0,255,0)) for RGB(255,0,255,255).
	Parameters: see the demo(Anyone up for writing docs?)
	example: gl2.load_image_24bit_alpha()

==============================================================================

declare function load_image_8bit_alpha( byval image as any ptr ) as GLuint

	Desc: 	Loads a non-color-keyed FB.Image to a GL texture adding an alpha
			channel with (RGBA(255,0,255,0)) f0r color 0.
	Parameters: see the demo(Anyone up for writing docs?)
	example: gl2.load_image_8bit_alpha()

==============================================================================

declare function load_BMP_to_texture(byref filename as string) as GLuint

	Desc: 	Loads a BMP file to a GLtexture. Alpha transparency is auto-
			matically added. Can load BMPs of any bit-depth.
	Parameters: see the demo(Anyone up for writing docs?)
	example: gl2.load_BMP_to_texture()

==============================================================================

declare function load_BMP_to_glsprite(byref filename as string) as Tglsprite

	Desc: 	Loads a BMP to a sprite adding an alpha transparency.
	Parameters: see the demo(Anyone up for writing docs?)
	example: gl2.load_BMP_to_glsprite()

==============================================================================

declare sub load_image_to_HW(byval spr as image ptr)

	Desc: 	Loads an FBGFX FB.IMAGE sprite to HW
                * Sprite can be used in SW or HW
	Parameters: see the demo(Anyone up for writing docs?)
	example: 

==============================================================================

declare sub init_sprites(spriteset() as IMAGE ptr, texcoords() as uinteger,_
				 byref filename as string)

	Desc: 	Loads a spriteset made by my texture packer
	Parameters: see the demo(Anyone up for writing docs?)
	example: 

==============================================================================

declare sub destroy_sprites(spriteset() as Tglsprite)


	Desc: 	Called at program end
	Parameters: see the demo(Anyone up for writing docs?)
	example: 

==============================================================================

declare sub destroy()

	Desc: 	Called at program end
	Parameters: see the demo(Anyone up for writing docs?)
	example: 

==============================================================================

declare sub destroy_image(byval spr as IMAGE ptr)

	Desc: 	Called at program end for each HW sprite
	Parameters: see the demo(Anyone up for writing docs?)
	example: 

==============================================================================

declare function fps_limit(byval max_FPS as single) as single

	Desc: 	For some who don't want vsync and wanted to limit FPS
	Parameters: see the demo(Anyone up for writing docs?)
	example: 

==============================================================================
