Hardware occlusion query type
BlitzMax Forums/OpenGL Module/Hardware occlusion query type| 
 | ||
| This code will handle hardware occlusion queries. Usage: If TQuery.supported() query:TQuery=New TQuery query.beginquery() draw stuff query.endquery() Wait a few frames, so a GPU sync isn't forced (use the time value to see how long ago the query was performed)... if query.available() result=query.getqueryresult() endif It's kind of useless, and I have not gained much performance from this approach, and in some cases it makes things slower, but it is good for very expensive objects, like animated meshes and lights. Strict
Import pub.opengl
Import leadwerks.glewex
Type TQuery
	Field id
	Field _available=0
	Field result=-1
	Field pixels=10
	
	Method New()
		glGenQueriesARB 1,Varptr id
	EndMethod
	
	Method Delete()
		glDeleteQueriesARB 1,Varptr id
	EndMethod
	
	Method BeginQuery()
		glColorMask 0,0,0,0
		gldepthmask 0
		gldisable GL_CULL_FACE
		glBeginQueryARB GL_SAMPLES_PASSED_ARB,id
	EndMethod
	
	Method EndQuery()
		glEndQueryARB GL_SAMPLES_PASSED_ARB
		glenable GL_CULL_FACE
		glColorMask 1,1,1,1
		gldepthmask 1
	EndMethod
	
	Method Available:Int()
		If _available Return 1
		glGetQueryObjectivARB(id,GL_QUERY_RESULT_AVAILABLE_ARB,Varptr _available)
		Return _available
	EndMethod
	
	Method GetQueryResult()
		If Not Available() Return 0
		Select result
			Case 1 Return 1
			Case 0 Return 0
			Case -1
				Local bits
				glGetQueryObjectuivARB id,GL_QUERY_RESULT_ARB,Varptr bits
				If bits<pixels result=0 Else result=1
				Return result
		EndSelect
	EndMethod
	
	Function Supported:Int()
		Global support
		Select support
			Case -1 Return 0
			Case 1 Return 1
			Case 0
				Local extensionstring$=String.FromCString( glGetString( GL_EXTENSIONS ) )
				If extensionstring.find("GL_ARB_occlusion_query")>-1 support=1 Else support=-1
				Return support
		EndSelect
	EndFunction
	
EndType |