MiniB3D Thread 2

BlitzMax Modules Forums/MiniB3D/MiniB3D Thread 2

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

hmm, GLAdjustTexSize doesn't work here, becouse there is any bug with proxy textures.

See: http://www.blitzbasic.com/Community/posts.php?topic=55157

Please use:
Function AdjustTexSize(Width:Int Var, Height:Int Var)
	Local MaxSize:Int

	glGetIntegerv(GL_MAX_TEXTURE_SIZE, Varptr(MaxSize))
	Width  = Pow2Size(Width, MaxSize)
	Height = Pow2Size(Height, MaxSize)

	Function Pow2Size:Int(Size:Int, MaxSize:Int)
		Local QuadSize:Int

		QuadSize = 1
		While QuadSize < Size And QuadSize < MaxSize
			QuadSize = QuadSize Shl 1
		Wend

		Return QuadSize
	End Function
End Function


What about shaders? Very easy to bind this in TBrush.

Like:
Type TFragmentProgram
	Global MaxInstructions    : Int
	Global MaxLocalParams     : Int
	Global MaxEnvParams       : Int
	Global MaxTemporaries     : Int
	Global MaxParams          : Int
	Global MaxAttribs         : Int
	Global MaxTexInstructions : Int

	Field ProgramID : Int

	Method Delete()
		glDeleteProgramsARB(1, Varptr(Self.ProgramID))
	End Method

	Method SetLocalParameter(Index:Int, X:Float, Y:Float, Z:Float, W:Float)
		If Index => 0 And Index <= TFragmentProgram.MaxLocalParams Then
			glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, Index, X, Y, Z, W)
		Else
			RuntimeError("FragmentProgram-Local-Parameter-Index out of range!")
		EndIf
	End Method

	Function CreateFragmentProgram:TFragmentProgram(Program:String)
		Local FragmentProgram:TFragmentProgram

		FragmentProgram = New TFragmentProgram
		glGenProgramsARB(1, Varptr(FragmentProgram.ProgramID))
		glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, FragmentProgram.ProgramID)
		glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, ..
		                   Program.Length, Program.ToCString())

		If glGetError() = GL_INVALID_OPERATION Then
			Local Error:String

			Error = String.FromCString(Byte Ptr(glGetString(GL_PROGRAM_ERROR_STRING_ARB)))
			RuntimeError("FragmentProgram Error: "+Error)

			Return Null
		Else
			Return FragmentProgram
		EndIf
	End Function

	Function SetEnvParameter(Index:Int, X:Float, Y:Float, Z:Float, W:Float)
		If Index => 0 And Index <= TFragmentProgram.MaxEnvParams Then
			glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, Index, X, Y, Z, W)
		Else
			RuntimeError("FragmentProgram-Environment-Parameter-Index out of range!")
		EndIf
	End Function

	Function GetInfo()
		glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_INSTRUCTIONS_ARB, ..
		                  Varptr(MaxInstructions))
		glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB, ..
		   	              Varptr(MaxLocalParams))
		glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, ..
		                  Varptr(MaxEnvParams))
		glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_TEMPORARIES_ARB, ..
		                  Varptr(MaxTemporaries))
		glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_PARAMETERS_ARB, ..
		                  Varptr(MaxParams))
		glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_ATTRIBS_ARB, ..
		                  Varptr(MaxAttribs))
		glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB, ..
		                  Varptr(MaxTexInstructions))
	End Function
End Type

Type TVertexProgram
	Global MaxInstructions    : Int
	Global MaxLocalParams     : Int
	Global MaxEnvParams       : Int
	Global MaxTemporaries     : Int
	Global MaxParams          : Int
	Global MaxAttribs         : Int
	Global MaxTexInstructions : Int

	Field ProgramID : Int

	Method Delete()
		glDeleteProgramsARB(1, Varptr(Self.ProgramID))
	End Method

	Method SetLocalParameter(Index:Int, X:Float, Y:Float, Z:Float, W:Float)
		If Index => 0 And Index <= TVertexProgram.MaxLocalParams Then
			glProgramLocalParameter4fARB(GL_VERTEX_PROGRAM_ARB, Index, X, Y, Z, W)
		Else
			RuntimeError("VertexProgram-Local-Parameter-Index out of range!")
		EndIf
	End Method

	Function CreateVertexProgram:TVertexProgram(Program:String)
		Local VertexProgram:TVertexProgram

		VertexProgram = New TVertexProgram
		glGenProgramsARB(1, Varptr(VertexProgram.ProgramID))
		glBindProgramARB(GL_VERTEX_PROGRAM_ARB, VertexProgram.ProgramID)
		glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, ..
		                   Program.Length, Program.ToCString())

		If glGetError() = GL_INVALID_OPERATION Then
			Local Error:String

			Error = String.FromCString(Byte Ptr(glGetString(GL_PROGRAM_ERROR_STRING_ARB)))
			RuntimeError("VertexProgram Error: "+Error)

			Return Null
		Else
			Return VertexProgram
		EndIf
	End Function

	Function SetEnvParameter(Index:Int, X:Float, Y:Float, Z:Float, W:Float)
		If Index => 0 And Index <= TFragmentProgram.MaxEnvParams Then
			glProgramEnvParameter4fARB(GL_VERTEX_PROGRAM_ARB, Index, X, Y, Z, W)
		Else
			RuntimeError("VertexProgram-Environment-Parameter-Index out of range!")
		EndIf
	End Function

	Function GetInfo()
		glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_INSTRUCTIONS_ARB, ..
		                  Varptr(MaxInstructions))
		glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB, ..
		                  Varptr(MaxLocalParams))
		glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, ..
		                  Varptr(MaxEnvParams))
		glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_TEMPORARIES_ARB, ..
		                  Varptr(MaxTemporaries))
		glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_PARAMETERS_ARB, ..
		                  Varptr(MaxParams))
		glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_ATTRIBS_ARB, ..
		                  Varptr(MaxAttribs))
		glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB, ..
		                  Varptr(MaxTexInstructions))
	End Function
End Type

Function CreateVertexProgram:TVertexProgram(Program:String)
	Return TVertexProgram.CreateVertexProgram(Program)
End Function

Function VertexProgramLocalParameter(VP:TVertexProgram, Index:Int, ..
                                     X:Float, Y:Float, Z:Float, W:Float)
	VP.SetLocalParameter(Index, X, Y, Z, W)
End Function

Function VertexProgramEnvParameter(Index:Int, X:Float, Y:Float, Z:Float, W:Float)
	TVertexProgram.SetEnvParameter(Index, X, Y, Z, W)
End Function

Function CreateFragmentProgram:TFragmentProgram(Program:String)
	Return TFragmentProgram.CreateFragmentProgram(Program)
End Function

Function FragmentProgramLocalParameter(FP:TVertexProgram, Index:Int, ..
                                       X:Float, Y:Float, Z:Float, W:Float)
	FP.SetLocalParameter(Index, X, Y, Z, W)
End Function

Function FragmentProgramEnvParameter(Index:Int, X:Float, Y:Float, Z:Float, W:Float)
	TFragmentProgram.SetEnvParameter(Index, X, Y, Z, W)
End Function

(Shit big functionnames, but you can find a way to use like TShader)

Make a function like BrushVertexProgram(Brush:TBrush, VP:TVertexProgram) and BrushFragmentProgram(Brush:TBrush, FP:TFragmentProgram).

Render it with
glEnable(GL_VERTEX_PROGRAM_ARB)
glBindProgramARB(GL_VERTEX_PROGRAM_ARB, VP.ProgramID)

and

glEnable(GL_FRAGMENT_PROGRAM_ARB)
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, FP.ProgramID)

cu olli