rem Soft3D, a wrapper for CGE.
rem
rem By JSM.
rem
rem http://forum.retrogamecoding.org
rem http://www.naalaa.com

constant:
	rem shaders.
	S3D_NONE 0
	S3D_FLAT 1
	S3D_SMOOTH 2
	MAX_OBJECTS 100

visible:
	vMeshName
	vObjects?[MAX_OBJECTS]
	
	rem camera.
	vCamX#
	vCamY#
	vCamZ#
	vCamYaw#
	vCamPitch#
	vCamRoll#

hidden:

rem init.
procedure S3D_Init(fov#, zMin#, zMax#)
	cge create primary, fov, zMin, zMax
	vMeshName = 1
	for i = 0 to MAX_OBJECTS - 1
		vObjects[i].used = false
	next
endproc

rem load mesh, return handle.
function S3D_LoadMesh(filename$)
	cge load	mesh vMeshName, filename
	vMeshName = vMeshName + 1
	return vMeshName - 1
endfunc

rem free mesh.
procedure S3D_FreeMesh(handle)
	rem ???
	rem cge free mesh handle	
endproc

rem ==================================================================
rem objects.
rem ==================================================================

rem create object, return handle.
function S3D_CreateObj(meshHandle)
	for i = 0 to MAX_OBJECTS - 1
		if vObjects[i].used = false then break
	next

	if i < MAX_OBJECTS
		vObjects[i].used = true
		vObjects[i].m = meshHandle
		vObjects[i].x# = 0.0
		vObjects[i].y# = 0.0
		vObjects[i].z# = 0.0
		vObjects[i].pivx# = 0.0
		vObjects[i].pivy# = 0.0
		vObjects[i].pivz# = 0.0
		vObjects[i].yaw# = 0.0
		vObjects[i].pitch# = 0.0
		vObjects[i].roll# = 0.0
		vObjects[i].tex = 0
		vObjects[i].lgt = 0
		vObjects[i].shd = S3D_NONE
		return i + 1
	else
		return 0
	endif
endfunc

procedure S3D_FreeObject(obj)
	obj = obj - 1
	vObjects[obj].used = false
endproc

rem set position.
procedure S3D_SetObjPosition(obj, x#, y#, z#)
	obj = obj - 1
	vObjects[obj].x# = x
	vObjects[obj].y# = y
	vObjects[obj].z# = z
endproc

rem set pivot.
procedure S3D_SetObjPivot(obj, x#, y#, z#)
	obj = obj - 1
	vObjects[obj].pivx# = x
	vObjects[obj].pivy# = y
	vObjects[obj].pivz# = z
endproc

rem set orientation.
procedure S3D_SetObjOrientation(obj, yaw#, pitch#, roll#)
	obj = obj - 1
	vObjects[obj].yaw# = yaw
	vObjects[obj].pitch# = pitch
	vObjects[obj].roll# = roll
endproc

rem set texture.
procedure S3D_SetObjTexture(obj, tex)
	obj = obj - 1
	vObjects[obj].tex = tex
endproc

procedure S3D_SetObjShader(obj, type)
	obj = obj - 1
	vObjects[obj].shd = type
endproc

rem set light.
procedure S3D_SetObjLightmap(obj, lgt)
	obj = obj - 1
	vObjects[obj].lgt = lgt
endproc

rem ==================================================================
rem camera.
rem ==================================================================

rem set position.
procedure S3D_SetCamPosition(x#, y#, z#)
	vCamX = x
	vCamY = y
	vCamZ = z
endproc

rem set orientation.
procedure S3D_SetCamOrientation(yaw#, pitch#, roll#)
	vCamYaw = yaw
	vCamPitch = pitch
	vCamRoll = roll
endproc

rem ==================================================================
rem other.
rem ==================================================================

procedure S3D_Render()
	set image primary
	cge clear transformation
	cge clear zbuffer

	cge rotatez -vCamRoll
	cge rotatex -vCamPitch
	cge rotatey -vCamYaw
	cge translate -vCamX, -vCamY, -vCamZ

	for i = 0 to MAX_OBJECTS - 1
		if vObjects[i].used
			cge push transformation
			cge translate vObjects[i].x#, vObjects[i].y#, vObjects[i].z#
			cge rotatey vObjects[i].yaw#
			cge rotatex vObjects[i].pitch#
			cge rotatez vObjects[i].roll#
			cge translate -vObjects[i].pivx#, -vObjects[i].pivy#, -vObjects[i].pivz#
			cge set shader vObjects[i].shd
			if vObjects[i].tex
				cge set texture vObjects[i].tex
				cge draw mesh vObjects[i].m
			else
				cge set texture off
				cge draw mesh vObjects[i].m
			endif
			cge pop transformation
		endif
	next
endproc
