rem GL defines.
import "gl_h.lib"

visible:
	gl_dll

hidden:

function glInit(title$, x, y, w, h, hideNaaLaa)
	gl_dll = DLL_LOAD("gl_next.dll")
	if gl_dll < 0 then return false
	params?.x = x
	params.y = y
	params.w = w
	params.h = h
	params.title$ = title
	params.hide = hideNaaLaa
	DLL_CALL gl_dll, "gl_init", params
endfunc

procedure glSetFocus()
	params?
	DLL_CALL gl_dll, "gl_focus_window", params
endproc

function glRunning()
	params?
	DLL_CALL gl_dll, "gl_running", params
	return params.result;
endfunc

procedure glSet3D(fov#, zMin#, zMax#)
	params?
	params.fov# = fov
	params.zmin# = zMin
	params.zmax# = zMax
	DLL_CALL gl_dll, "gl_set_3d", params
endproc

procedure glMake2D()
	params?
	DLL_CALL gl_dll, "gl_make_2d", params
endproc

procedure glMake3D()
	params?
	DLL_CALL gl_dll, "gl_make_3d", params
endproc

function glWidth()
	params?
	DLL_CALL gl_dll, "gl_win_w", params
	return params.w
endfunc

function glHeight()
	params?
	DLL_CALL gl_dll, "gl_win_h", params
	return params.h
endfunc

procedure glRender()
	params?
	DLL_CALL gl_dll, "gl_redisplay", params
endproc

procedure glUpdate()
	params?
	DLL_CALL gl_dll, "gl_update", params
endproc

function glCreateTexture(img, smooth)
	params?.img = img
	DLL_CALL gl_dll, "create_texture", params
	if params.result
		_glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR
		_glTexParameteri GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR
	endif
	return params.result
endfunc

procedure glDeleteTexture(tex)
	params?.texture = tex
	DLL_CALL gl_dll, "gl_delete_texture", params
endproc

procedure addv(&a#[], &b#[])
	a[0] = a[0] + b[0]
	a[1] = a[1] + b[1]
	a[2] = a[2] + b[2]
endproc

function get_addv#[](&a#[], &b#[])
	return [a[0] + b[0], a[1] + b[1], a[2] + b[2]] 
endfunc

procedure subv(&a#[], &b#[])
	a[0] = a[0] - b[0]
	a[1] = a[1] - b[1]
	a[2] = a[2] - b[2]
endproc

function get_subv#[](&a#[], &b#[])
	return [a[0] - b[0], a[1] - b[1], a[2] - b[2]] 
endfunc

procedure mulv(&a#[], s#)
	a[0] = a[0]*s
	a[1] = a[1]*s
	a[2] = a[2]*s
endproc

function get_mulv#[](&a#[], s#)
	return [a[0]*s, a[1]*s, a[2]*s]
endfunc

procedure divv(&a#[], s#)
	a[0] = a[0]/s
	a[1] = a[1]/s
	a[2] = a[2]/s
endproc

function get_divv#[](&a#[], s#)
	return [a[0]/s, a[1]/s, a[2]/s]
endfunc

rem Dot vector product.
function dotvp#(&a#[], &b#[])
	return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]
endfunc

rem Distance between vectors.
function distv#(&a#[], &b#[])
	dx# = b[0] - a[0]
	dy# = b[1] - a[1]
	dz# = b[2] - a[2]
	return sqr(dx*dx + dy*dy + dz*dz)
endfunc

rem Cross vector product.
function crossvp#[](&u#[], &v#[])
	return [u[1]*v[2] - u[2]*v[1], u[2]*v[0] - u[0]*v[2], u[0]*v[1] - u[1]*v[0]]
endfunc

procedure normv(&a#[])
	k# = 1.0/sqr(a[0]*a[0] + a[1]*a[1] + a[2]*a[2])
	a[0] = a[0]*k
	a[1] = a[1]*k
	a[2] = a[2]*k
endproc

function get_normv#[](&a#[])
	k# = 1.0/sqr(a[0]*a[0] + a[1]*a[1] + a[2]*a[2])
	return [a[0]*k, a[1]*k, a[2]*k] 
endfunc

rem ///////////////////////////////////////////////////////////////////
rem GL command set.
rem ///////////////////////////////////////////////////////////////////

procedure glMatrixMode(mode)
	params?.mode = mode
	DLL_CALL gl_dll, "gl_matrix_mode", params
endproc

procedure glPushMatrix()
	params?
	DLL_CALL gl_dll, "gl_push_matrix", params
endproc

procedure glPopMatrix()
	params?
	DLL_CALL gl_dll, "gl_pop_matrix", params
endproc

procedure glLoadIdentity()
	params?
	DLL_CALL gl_dll, "gl_load_identity", params
endproc

procedure glTranslatef(x#, y#, z#)
	params?.x# = x
	params.y# = y
	params.z# = z
	DLL_CALL gl_dll, "gl_translate", params
endproc

procedure glScalef(x#, y#, z#)
	params?.x# = x
	params.y# = y
	params.z# = z
	DLL_CALL gl_dll, "gl_scale", params
endproc

procedure glRotatef(angle#, x#, y#, z#)
	params?.a# = angle
	params.x# = x
	params.y# = y
	params.z# = z
	DLL_CALL gl_dll, "gl_rotate", params
endproc

procedure glBegin(mode)
	params?.mode = mode
	DLL_CALL gl_dll, "gl_begin", params
endproc

procedure glEnd()
	params?
	DLL_CALL gl_dll, "gl_end", params
endproc

procedure glVertex2i(x, y)
	params?.x = x
	params.y = y
	DLL_CALL gl_dll, "gl_vertex_2i", params
endproc

procedure glVertex2f(x#, y#)
	params?.x# = x
	params.y# = y
	DLL_CALL gl_dll, "gl_vertex_2f", params
endproc

procedure glVertex3f(x#, y#, z#)
	params?.x# = x
	params.y# = y
	params.z# = z
	DLL_CALL gl_dll, "gl_vertex_3f", params
endproc

procedure glNormal3f(x#, y#, z#)
	params?.x# = x
	params.y# = y
	params.z# = z
	DLL_CALL gl_dll, "gl_normal", params
endproc

procedure glTexCoord2f(u#, v#)
	params?.u# = u
	params.v# = v
	DLL_CALL gl_dll, "gl_tex_coord", params
endproc

procedure glBindTexture(target, tex)
	params?.t = target
	params.id = tex
	DLL_CALL gl_dll, "gl_bind_texture", params
endproc

function glGenLists(range)
	params?.range = range
	DLL_CALL gl_dll, "gl_gen_lists", params
	return params.result
endfunc

procedure glNewList(list, mode)
	params?.list = list
	params.mode = mode
	DLL_CALL gl_dll, "gl_new_list", params
endproc

procedure glEndList()
	params?
	DLL_CALL gl_dll, "gl_end_list", params
endproc

procedure glDeleteLists(list, range)
	params?.list = list
	params?.range = range
	DLL_CALL gl_dll, "gl_delete_list", params
endproc

procedure glCallList(list)
	params?.id =  list
	DLL_CALL gl_dll, "gl_call_list", params
endproc

procedure glClearColor(red#, green#, blue#, alpha#)
	params?.r# = red
	params.g# = green
	params.b# = blue
	params.a# = alpha 
	DLL_CALL gl_dll, "gl_clear_color", params
endproc

procedure glColor4ub(red, green, blue, alpha)
	params?.r = red
	params.g = green
	params.b = blue
	params.a = alpha
	DLL_CALL gl_dll, "gl_color_4ub", params
endproc

procedure glEnable(cap)
	params?.cap = cap
	DLL_CALL gl_dll, "gl_enable", params
endproc

procedure glDisable(cap)
	params?.cap = cap
	DLL_CALL gl_dll, "gl_disable", params
endproc

procedure glClear(mask)
	params?.mask = mask
	DLL_CALL gl_dll, "gl_clear", params
endproc

procedure glColor3ub(red, green, blue)
	params?.r = red
	params.g = green
	params.b = blue
	DLL_CALL gl_dll, "gl_color_3ub", params
endproc

procedure glColor3f(red#, green#, blue#)
	params?.r# = red
	params.g# = green
	params.b# = blue
	DLL_CALL gl_dll, "gl_color_3f", params
endproc

procedure glColor4f(red#, green#, blue#, alpha#)
	params?.r# = red
	params.g# = green
	params.b# = blue
	DLL_CALL gl_dll, "gl_color_4f", params
endproc

procedure glFogi(pname, param)
	params?.pn = pname
	params.p = param
	DLL_CALL gl_dll, "gl_fog_i", params
endproc

procedure glFogf(pname, param#)
	params?.pn = pname
	params.p# = param#
	DLL_CALL gl_dll, "gl_fog_f", params
endproc

procedure glFogfv(pname, params#[])
	p?.pn = pname
	p.r# = params[0]
	p.g# = params[1]
	p.b# = params[2]
	p.a# = params[3]
	DLL_CALL gl_dll, "gl_fog_fv", p
endproc

procedure glTexParameterf(target, pname, param#)
	params?.t = target
	params.pn = pname
	params.p# = param
	DLL_CALL gl_dll, "gl_tex_parameter_f", params
endproc

procedure glTexParameteri(target, pname, param)
	params?.t = target
	params.pn = pname
	params.p = param
	DLL_CALL gl_dll, "gl_tex_parameter_i", params
endproc

procedure glDepthMask(flag)
	params?.f = flag
	DLL_CALL gl_dll, "gl_depth_mask", params
endproc

procedure glScissor(x, y, w, h)
	params?.x = x
	params.y = y
	params.w = w
	params.h = h
	DLL_CALL gl_dll, "gl_scissor", params
endproc

procedure glBlendFunc(sfactor, dfactor)
	params?.s = sfactor
	params.d = dfactor
	DLL_CALL gl_dll, "gl_blend_func", params
endproc

procedure glPointSize(size#)
	params?.s# = size
	DLL_CALL gl_dll, "gl_point_size", params
endproc
