Very good Vertex!
I added Modulate2X blendmode to the texture mod:
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