DreiDe - 3D Engine

BlitzMax Forums/BlitzMax Programming/DreiDe - 3D Engine

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.

Very good Vertex!

I added Modulate2X blendmode to the texture mod:
Strict

Import Pub.Glew
?Linux
Import "-lX11"
Import "-lXxf86vm"
? 
Import Brl.BlitzGL
Import Brl.LinkedList
Import Brl.Pixmap
Import "Error.bmx"
Import "HardwareInfo.bmx"

' Cube-Faces
Const DDD_TEXTURE_POSX = 1 ' Positive X = Right
Const DDD_TEXTURE_NEGX = 2 ' Negative X = Left
Const DDD_TEXTURE_POSY = 3 ' Positive Y = Top
Const DDD_TEXTURE_NEGY = 4 ' Negative Y = Bottom
Const DDD_TEXTURE_POSZ = 5 ' Positive Z = Back
Const DDD_TEXTURE_NEGZ = 6 ' Negative Z = Front

' Rendering-Modes
Const DDD_TEXTURE_TRANSFORM = %00000001
Const DDD_TEXTURE_MIPMAP    = %00000010
Const DDD_TEXTURE_SPHEREMAP = %00000100
Const DDD_TEXTURE_CUBEMAP   = %00001000

' Cube-Modes
Const DDD_TEXTURE_REFLECTION = 1
Const DDD_TEXTURE_NORMAL     = 2

' Filter
Const DDD_TEXTURE_SHARP   = 1
Const DDD_TEXTURE_BLURRED = 2

' Clamp-Modes
Const DDD_TEXTURE_CLAMP  = 1
Const DDD_TEXTURE_REPEAT = 2

' Blending-Modes
Const DDD_TEXTURE_REPLACE     = 1
Const DDD_TEXTURE_MODULATE    = 2
Const DDD_TEXTURE_DECAL       = 3
Const DDD_TEXTURE_BLEND       = 4
Const DDD_TEXTURE_ADD         = 5
Const DDD_TEXTURE_SUBTRACT    = 6
Const DDD_TEXTURE_INTERPOLATE = 7
Const DDD_TEXTURE_DOT3        = 8
Const DDD_TEXTURE_MODULATE2X  = 9

Type TTexture
	Global List : TList

	Field Name        : String
	Field Filename    : String

	Field TextureID   : Int
	Field CubeFace    : Int

	Field RenderMode  : Int
	Field BlendMode   : Int
	Field CubeMode    : Int

	Field Position    : Float[2]
	Field Rotation    : Float
	Field Scale       : Float[2]

	Method SetName(Name:String)
		Self.Name = Name
	End Method

	Method GetName:String()
		Return Self.Name
	End Method

	Method SetFilename(Name:String)
		Self.Filename = Filename
	End Method

	Method GetFilename:String()
		Return Self.Filename
	End Method

	Method SetPixmap(Pixmap:TPixmap)
		Local Target:Int, Width:Int, Height:Int

		If Pixmap = Null Then TDreiDeError.DisplayError("Pixmap does not exist!")

		If Self.RenderMode & DDD_TEXTURE_CUBEMAP Then
			Target = GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT+Self.CubeFace-1
		Else
			Target = GL_TEXTURE_2D
		EndIf
		glBindTexture(Target, Self.TextureID)

		' Has Pixmap the Pixelformat RGBA8888?
		If Pixmap.Format <> PF_RGBA8888 Then Pixmap = Pixmap.Convert(PF_RGBA8888)

		' Get supported TextureSize
		Width  = Pixmap.Width
		Height = Pixmap.Height
		bglAdjustTexSize width,height
		If (Width <> Pixmap.Width) Or (Height <> Pixmap.Height) Then
			Pixmap = ResizePixmap(Pixmap, Width, Height)
		EndIf

		If Self.RenderMode & DDD_TEXTURE_MIPMAP Then
			gluBuild2DMipmaps(Target, 4, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, ..
			                  Pixmap.Pixels)
		Else
			glTexImage2D(Target, 0, 4, Width, Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, ..
			             Pixmap.Pixels)
		EndIf
	End Method

	Method SetCubeFace(Face:Int)
		If (Face > 0) Or (Face < 6) Then
			Self.CubeFace = Face
		Else
			TDreiDeError.DisplayError("Cubeface is not supported!")
		EndIf
	End Method

	Method GetCubeFace:Int()
		Return Self.CubeFace
	End Method

	Method SetRenderMode(Mode:Int)
		If (Mode & DDD_TEXTURE_CUBEMAP) And (THardwareInfo.CubemapSupport = False) Then
			TDreiDeError.DisplayError("Cubemapping is not supported!")
		EndIf
		Self.RenderMode = Mode
	End Method

	Method AddRenderMode(Mode:Int)
		If (Mode & DDD_TEXTURE_CUBEMAP) And (THardwareInfo.CubemapSupport = False) Then
			TDreiDeError.DisplayError("Cubemapping is not supported!")
		EndIf
		Self.RenderMode :| Mode
	End Method

	Method RemoveRenderMode(Mode:Int)
		Self.RenderMode :& (~Mode)
	End Method

	Method GetRenderMode:Int()
		Return Self.RenderMode
	End Method

	Method SetBlendMode(Mode:Int)
		If (Mode > 0) And (Mode < 10) Then
			Self.BlendMode = Mode
		Else
			TDreiDeError.DisplayError("Blendmode is not supported!")
		EndIf
	End Method

	Method GetBlendMode:Int()
		Return Self.BlendMode
	End Method

	Method SetCubeMode(Mode:Int)
		If (Mode > 0) And (Mode < 3) Then
			Self.CubeMode = Mode
		Else
			TDreiDeError.DisplayError("Cubemode is not supported!")
		EndIf
	End Method

	Method GetCubeMode:Int()
		Return Self.CubeMode
	End Method

	Method SetFilter(MinFilter:Int, MagFilter:Int)
		Local Filter:Int

		If Self.RenderMode & DDD_TEXTURE_CUBEMAP Then
			glBindTexture(GL_TEXTURE_2D, 0)
		Else
			glBindTexture(GL_TEXTURE_2D, Self.TextureID)
		EndIf

		' Setting Minificant Filter
		If Self.RenderMode & DDD_TEXTURE_MIPMAP Then
			If MinFilter = DDD_TEXTURE_SHARP Then
				Filter = GL_NEAREST_MIPMAP_NEAREST
			Else
				Filter = GL_LINEAR_MIPMAP_LINEAR
			EndIf
		Else
			If MinFilter = DDD_TEXTURE_SHARP Then
				Filter = GL_NEAREST
			Else
				Filter = GL_LINEAR
			EndIf
		EndIf

		If Self.RenderMode & DDD_TEXTURE_CUBEMAP Then
			glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, Filter)
		Else
			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, Filter)
		EndIf

		' Setting Magnificant Filter
		If MagFilter = DDD_TEXTURE_SHARP Then
			Filter = GL_NEAREST
		Else
			Filter = GL_LINEAR
		EndIf
		If Self.RenderMode & DDD_TEXTURE_CUBEMAP Then
			glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, Filter)
		Else
			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, Filter)
		EndIf
	End Method

	Method SetClamp(UClamp:Int, VClamp:Int)
		Local Target:Int
		If Self.RenderMode & DDD_TEXTURE_CUBEMAP Then
			glBindTexture(GL_TEXTURE_2D, 0)
			Target = GL_TEXTURE_CUBE_MAP
		Else
			glBindTexture(GL_TEXTURE_2D, Self.TextureID)
			Target = GL_TEXTURE_2D
		EndIf

		If UClamp = DDD_TEXTURE_CLAMP Then
			glTexParameteri(Target, GL_TEXTURE_WRAP_S, GL_CLAMP)
		Else
			glTexParameteri(Target, GL_TEXTURE_WRAP_S, GL_REPEAT)
		EndIf

		If VClamp = DDD_TEXTURE_CLAMP Then
			glTexParameteri(Target, GL_TEXTURE_WRAP_T, GL_CLAMP)
		Else
			glTexParameteri(Target, GL_TEXTURE_WRAP_T, GL_REPEAT)
		EndIf
	End Method

	Method SetPosition(U:Float, V:Float)
		Self.Position[0] = U
		Self.Position[1] = V
	End Method

	Method Translate(U:Float, V:Float)
		Self.Position[0] :+ U
		Self.Position[1] :+ V
	End Method

	Method GetPosition(U:Float Var, V:Float Var)
		U = Self.Position[0]
		V = Self.Position[1]
	End Method

	Method GetU:Float()
		Return Self.Position[0]
	End Method

	Method GetV:Float()
		Return Self.Position[0]
	End Method

	Method SetRotation(Roll:Float)
		Self.Rotation = Roll
	End Method

	Method Turn(Roll:Float)
		Self.Rotation :+ Roll
	End Method

	Method GetRotation:Float()
		Return Self.Rotation
	End Method

	Method SetScale(U:Float, V:Float)
		Self.Scale[0] = U
		Self.Scale[1] = V
	End Method

	Method GetScale(U:Float Var, V:Float Var)
		U = Self.Scale[0]
		V = Self.Scale[1]
	End Method

	Method GetScaleU:Float()
		Return Self.Scale[0]
	End Method

	Method GetScaleV:Float()
		Return Self.Scale[1]
	End Method

	Method Render()
		Local Matrix:Int

		If Self.RenderMode & DDD_TEXTURE_TRANSFORM Then
			glGetIntegerv(GL_MATRIX_MODE, Varptr(Matrix))

			glMatrixMode(GL_TEXTURE)
			glLoadIdentity()

			glTranslatef(Self.Position[0], Self.Position[1], 0.0)
			glRotatef(Self.Rotation, 0.0, 0.0, 1.0)
			glScalef(Self.Scale[0], Self.Scale[1], -1.0)

			glMatrixMode(Matrix)
		EndIf

		If Self.RenderMode & DDD_TEXTURE_SPHEREMAP Then
			glEnable(GL_TEXTURE_2D)
			glEnable(GL_TEXTURE_GEN_S)
			glEnable(GL_TEXTURE_GEN_T)

			glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP)
			glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP)

		ElseIf Self.RenderMode & DDD_TEXTURE_CUBEMAP Then
			glEnable(GL_TEXTURE_CUBE_MAP)
			
			' Bind all Sides of the CubeMap
			glBindTexture(GL_TEXTURE_CUBE_MAP_POSITIVE_X, Self.TextureID)
			glBindTexture(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, Self.TextureID)
			glBindTexture(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, Self.TextureID)
			glBindTexture(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, Self.TextureID)
			glBindTexture(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, Self.TextureID)
			glBindTexture(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, Self.TextureID)

			glEnable(GL_TEXTURE_GEN_S)
			glEnable(GL_TEXTURE_GEN_T)
			glEnable(GL_TEXTURE_GEN_R)

			If Self.CubeMode = DDD_TEXTURE_REFLECTION Then
				glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_ARB)
				glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_ARB)
				glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_ARB)
			Else
				glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_ARB)
				glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_ARB)
				glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_ARB)
			EndIf

		Else
			glDisable(GL_TEXTURE_CUBE_MAP)
			glDisable(GL_TEXTURE_GEN_S)
			glDisable(GL_TEXTURE_GEN_T)
			glDisable(GL_TEXTURE_GEN_R)

			glEnable(GL_TEXTURE_2D)
			glBindTexture(GL_TEXTURE_2D, Self.TextureID)
		EndIf

		If THardwareInfo.TexBlendSupport Then
			Select Self.BlendMode
				Case DDD_TEXTURE_REPLACE
					glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE)

				Case DDD_TEXTURE_MODULATE
					glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)

				Case DDD_TEXTURE_MODULATE2X
					glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE)
					glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE)
					glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS)
					glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE)
					glTexEnvf(GL_TEXTURE_ENV, GL_RGB_SCALE, 2.0)

				Case DDD_TEXTURE_DECAL
					glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)

				Case DDD_TEXTURE_MODULATE
					glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND)

				Case DDD_TEXTURE_ADD
					glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD)

				Case DDD_TEXTURE_SUBTRACT
					glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_SUBTRACT_ARB)

				Case DDD_TEXTURE_INTERPOLATE
					glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_INTERPOLATE_ARB)

				Case DDD_TEXTURE_DOT3
					glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE)
					glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_DOT3_RGB)
					glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS)
					glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE)
			End Select
		EndIf
	End Method

	Method New()
		glGenTextures(1, Varptr(Self.TextureID))

		Self.Name        = "Unnamed Texture"
		Self.Filename    = ""
		Self.CubeFace    = DDD_TEXTURE_POSX
		Self.RenderMode  = DDD_TEXTURE_TRANSFORM
		Self.BlendMode   = DDD_TEXTURE_MODULATE
		Self.CubeMode    = DDD_TEXTURE_REFLECTION
		Self.Position    = [0.0, 0.0]
		Self.Rotation    = 0.0
		Self.Scale       = [1.0, 1.0]

		Self.SetFilter(DDD_TEXTURE_BLURRED, DDD_TEXTURE_BLURRED)

		TTexture.List.AddLast(Self)
	End Method

	Method Delete()
		glDeleteTextures(1, Varptr(Self.TextureID))
	End Method
End Type