Yes, there is another way ;)
Use my modified (partly 0.42 ext) TTexture.bmx and recompile
the module.
TTexture.bmx
And in func.bmx change the LoadTexture Function to this:
After rebuilding the module you should normally be able to load Textures which are incbin, TImage or TPixmap .
Use my modified (partly 0.42 ext) TTexture.bmx and recompile
the module.
TTexture.bmx
' Updates: ' 30/01/07 - AdjustPixmap Type TTexture Global tex_list:TList=CreateList() Field file$,flags,blend=2,coords,u_scale#=1.0,v_scale#=1.0,u_pos#,v_pos#,angle# Field file_abs$,width,height ' returned by Name/Width/Height commands Field pixmap:TPixmap Field gltex[1] Field cube_pixmap:TPixmap[7] Field no_frames=1 Field no_mipmaps Field cube_face=0,cube_mode=1 Method FreeTexture() ListRemove(tex_list,Self) pixmap=Null cube_pixmap=Null gltex=Null End Method Function CreateTexture:TTexture(width,height,flags=1,frames=1,RenderTarget:Int = GL_RGBA) If flags&128 Then Return CreateCubeMapTexture(width,height,flags) Local tex:TTexture=New TTexture tex.pixmap=CreatePixmap(width*frames,height,PF_RGBA8888) ' *** tex.flags=flags tex.FilterFlags() tex.no_frames=frames tex.gltex=tex.gltex[..tex.no_frames] ' *** ' pixmap -> tex Local x=0 Local pixmap:TPixmap For Local i=0 To tex.no_frames-1 pixmap=tex.pixmap.Window(x*width,0,width,height) x=x+1 ' *** pixmap=AdjustPixmap(pixmap) tex.width=pixmap.width tex.height=pixmap.height Local Name glGenTextures 1,Varptr Name glBindtexture GL_TEXTURE_2D,Name Local mipmap If tex.flags&8 Then mipmap=True Local mip_level = 0 Local Internal:Int Select RenderTarget Case GL_RGBA Internal = GL_RGBA8 Case GL_DEPTH_COMPONENT Internal = GL_DEPTH_COMPONENT End Select Repeat glPixelStorei GL_UNPACK_ROW_LENGTH,pixmap.pitch/BytesPerPixel[pixmap.format] glTexImage2D GL_TEXTURE_2D,mip_level,Internal,tex.width,tex.height,0,RenderTarget,GL_UNSIGNED_BYTE,pixmap.pixels If Not mipmap Then Exit If tex.width=1 And tex.height=1 Exit If tex.width>1 tex.width:/2 If tex.height>1 tex.height:/2 pixmap=ResizePixmap(pixmap,tex.width,tex.height) mip_level:+1 Forever tex.no_mipmaps=mip_level tex.gltex[i]=Name Next ListAddLast(tex_list,tex) Return tex End Function Function LoadTexture:TTexture(file:Object,flags=1) Return LoadAnimTexture:TTexture(file,flags,0,0,0,1) End Function Function LoadAnimTexture:TTexture(file2:Object,flags,frame_width,frame_height,first_frame,frame_count) Local file:Object = file2 If flags&128 Then Return LoadCubeMapTexture(file,flags) Local tex:TTexture = New TTexture '() 'DebugStop() file = Filefind(String(file)) If File = Null Then If TImage(file2) <> Null Then tex.file$="image"+tex_list.count() tex.file_abs$="//" ' set tex.flags before TexInList tex.flags=flags tex.FilterFlags() Local old_tex:TTexture old_tex=tex.TexInList() If old_tex<>Null Then Return old_tex ' load pixmap tex.pixmap = LockImage(TImage(file2) ) ElseIf TPixmap(file2) <> Null Then tex.file$="pixmap"+tex_list.count() tex.file_abs$="//" ' set tex.flags before TexInList tex.flags=flags tex.FilterFlags() Local old_tex:TTexture old_tex=tex.TexInList() If old_tex<>Null Then Return old_tex ' load pixmap tex.pixmap = TPixmap(file2) Else Return Null EndIf Else 'If FileFind(file)=False Then Return Null tex.file$=String(file) tex.file_abs$=FileAbs$(String(file)) ' set tex.flags before TexInList tex.flags=flags tex.FilterFlags() Local old_tex:TTexture old_tex=tex.TexInList() If old_tex<>Null Then Return old_tex ' load pixmap tex.pixmap = LoadPixmap(file) EndIf If tex.pixmap = Null Then Return ' convert pixmap to appropriate format If tex.pixmap.format<>PF_RGBA8888 tex.pixmap=tex.pixmap.Convert(PF_RGBA8888) EndIf ' *** ' if tex not anim tex, get frame width and height If frame_width=0 And frame_height=0 frame_width=tex.pixmap.width frame_height=tex.pixmap.height EndIf ' *** 'tex.flags=flags 'tex.FilterFlags() tex.no_frames=frame_count tex.gltex=tex.gltex[..tex.no_frames] ' *** ' pixmap -> tex Local xframes=tex.pixmap.width/frame_width Local yframes=tex.pixmap.height/frame_height Local startx=first_frame Mod xframes Local starty=(first_frame/yframes) Mod yframes Local x=startx Local y=starty Local pixmap:TPixmap For Local i=0 To tex.no_frames-1 ' get static pixmap window. when resize pixmap is called new pixmap will be returned. pixmap=tex.pixmap.Window(x*frame_width,y*frame_height,frame_width,frame_height) x=x+1 If x>=xframes x=0 y=y+1 EndIf ' *** pixmap=AdjustPixmap(pixmap) tex.width=pixmap.width tex.height=pixmap.height Local Name glGenTextures 1,Varptr Name glBindtexture GL_TEXTURE_2D,Name Local mipmap If tex.flags&8 Then mipmap=True Local mip_level=0 Repeat glPixelStorei GL_UNPACK_ROW_LENGTH,pixmap.pitch/BytesPerPixel[pixmap.format] glTexImage2D GL_TEXTURE_2D,mip_level,GL_RGBA8,tex.width,tex.height,0,GL_RGBA,GL_UNSIGNED_BYTE,pixmap.pixels If Not mipmap Then Exit If tex.width=1 And tex.height=1 Exit If tex.width>1 tex.width:/2 If tex.height>1 tex.height:/2 pixmap=ResizePixmap(pixmap,tex.width,tex.height) mip_level:+1 Forever tex.no_mipmaps=mip_level tex.gltex[i]=Name Next ListAddLast(tex_list,tex) TGlobal.Errorhandler.CheckError("TTextrue.bmx",204) TGlobal.ErrorHandler.SendMsg("texture '"+String(file)+" succesfully loaded") Return tex End Function Function CreateCubeMapTexture:TTexture(width,height,flags) Local tex:TTexture=New TTexture tex.pixmap=CreatePixmap(width*6,height,PF_RGBA8888) ' *** tex.flags=flags 'tex.FilterFlags() tex.no_frames=1'frame_count 'tex.gltex=tex.gltex[..tex.no_frames] ' *** ' pixmap -> tex Local Name glGenTextures 1,Varptr Name glBindtexture GL_TEXTURE_CUBE_MAP,Name Local pixmap:TPixmap For Local i=0 To 5 pixmap=tex.pixmap.Window(width*i,0,width,height) ' *** pixmap=AdjustPixmap(pixmap) tex.width=pixmap.width tex.height=pixmap.height Local mipmap If tex.flags&8 Then mipmap=True Local mip_level=0 Repeat glPixelStorei GL_UNPACK_ROW_LENGTH,pixmap.pitch/BytesPerPixel[pixmap.format] Select i Case 0 glTexImage2D GL_TEXTURE_CUBE_MAP_NEGATIVE_X,mip_level,GL_RGBA8,tex.width,tex.height,0,GL_RGBA,GL_UNSIGNED_BYTE,pixmap.pixels Case 1 glTexImage2D GL_TEXTURE_CUBE_MAP_POSITIVE_Z,mip_level,GL_RGBA8,tex.width,tex.height,0,GL_RGBA,GL_UNSIGNED_BYTE,pixmap.pixels Case 2 glTexImage2D GL_TEXTURE_CUBE_MAP_POSITIVE_X,mip_level,GL_RGBA8,tex.width,tex.height,0,GL_RGBA,GL_UNSIGNED_BYTE,pixmap.pixels Case 3 glTexImage2D GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,mip_level,GL_RGBA8,tex.width,tex.height,0,GL_RGBA,GL_UNSIGNED_BYTE,pixmap.pixels Case 4 glTexImage2D GL_TEXTURE_CUBE_MAP_POSITIVE_Y,mip_level,GL_RGBA8,tex.width,tex.height,0,GL_RGBA,GL_UNSIGNED_BYTE,pixmap.pixels Case 5 glTexImage2D GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,mip_level,GL_RGBA8,tex.width,tex.height,0,GL_RGBA,GL_UNSIGNED_BYTE,pixmap.pixels End Select If Not mipmap Then Exit If tex.width=1 And tex.height=1 Exit If tex.width>1 tex.width:/2 If tex.height>1 tex.height:/2 pixmap=ResizePixmap(pixmap,tex.width,tex.height) mip_level:+1 Forever tex.no_mipmaps=mip_level Next tex.gltex[0]=Name ListAddLast(tex_list,tex) Return tex End Function Function LoadCubeMapTexture:TTexture(file:Object,flags=1) Local tex:TTexture=New TTexture 'If FileFind(String(file))=False Then Return Null tex.file$=String(file) tex.file_abs$=FileAbs$(String(file)) ' set tex.flags before TexInList tex.flags=flags tex.FilterFlags() Local old_tex:TTexture old_tex=tex.TexInList() If old_tex<>Null Then Return old_tex ' load pixmap tex.pixmap=LoadPixmap(file) ' convert pixmap to appropriate format If tex.pixmap.format<>PF_RGBA8888 tex.pixmap=tex.pixmap.Convert(PF_RGBA8888) EndIf ' *** ' get tex width,height Local width=tex.pixmap.width/6 Local height=tex.pixmap.height ' *** 'tex.flags=flags 'tex.FilterFlags() tex.no_frames=1'frame_count 'tex.gltex=tex.gltex[..tex.no_frames] ' *** ' pixmap -> tex Local Name glGenTextures 1,Varptr Name glBindtexture GL_TEXTURE_CUBE_MAP,Name Local pixmap:TPixmap For Local i=0 To 5 pixmap=tex.pixmap.Window(width*i,0,width,height) ' *** pixmap=AdjustPixmap(pixmap) tex.width=pixmap.width tex.height=pixmap.height Local mipmap If tex.flags&8 Then mipmap=True Local mip_level=0 Repeat glPixelStorei GL_UNPACK_ROW_LENGTH,pixmap.pitch/BytesPerPixel[pixmap.format] Select i Case 0 glTexImage2D GL_TEXTURE_CUBE_MAP_NEGATIVE_X,mip_level,GL_RGBA8,tex.width,tex.height,0,GL_RGBA,GL_UNSIGNED_BYTE,pixmap.pixels Case 1 glTexImage2D GL_TEXTURE_CUBE_MAP_POSITIVE_Z,mip_level,GL_RGBA8,tex.width,tex.height,0,GL_RGBA,GL_UNSIGNED_BYTE,pixmap.pixels Case 2 glTexImage2D GL_TEXTURE_CUBE_MAP_POSITIVE_X,mip_level,GL_RGBA8,tex.width,tex.height,0,GL_RGBA,GL_UNSIGNED_BYTE,pixmap.pixels Case 3 glTexImage2D GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,mip_level,GL_RGBA8,tex.width,tex.height,0,GL_RGBA,GL_UNSIGNED_BYTE,pixmap.pixels Case 4 glTexImage2D GL_TEXTURE_CUBE_MAP_POSITIVE_Y,mip_level,GL_RGBA8,tex.width,tex.height,0,GL_RGBA,GL_UNSIGNED_BYTE,pixmap.pixels Case 5 glTexImage2D GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,mip_level,GL_RGBA8,tex.width,tex.height,0,GL_RGBA,GL_UNSIGNED_BYTE,pixmap.pixels End Select If Not mipmap Then Exit If tex.width=1 And tex.height=1 Exit If tex.width>1 tex.width:/2 If tex.height>1 tex.height:/2 pixmap=ResizePixmap(pixmap,tex.width,tex.height) mip_level:+1 Forever tex.no_mipmaps=mip_level Next tex.gltex[0]=Name ListAddLast(tex_list,tex) Return tex End Function Method TextureBlend(blend_no) blend=blend_no End Method Method TextureCoords(coords_no) coords=coords_no End Method Method ScaleTexture(u_s#,v_s#) u_scale#=1.0/u_s# v_scale#=1.0/v_s# End Method Method PositionTexture(u_p#,v_p#) u_pos#=-u_p# v_pos#=-v_p# End Method Method RotateTexture(ang#) angle#=ang# End Method Method TextureWidth() Return width End Method Method TextureHeight() Return height End Method Method TextureName$() Return file_abs$ End Method Function GetBrushTexture:TTexture(brush:TBrush,index=0) Return brush.tex[index] End Function Function ClearTextureFilters() ClearList TTextureFilter.filter_list End Function Function TextureFilter(match_text$,flags) Local filter:TTextureFilter=New TTextureFilter filter.text$=match_text$ filter.flags=flags ListAddLast(TTextureFilter.filter_list,filter) End Function Method SetCubeFace(face) cube_face=face End Method Method SetCubeMode(mode) cube_mode=mode End Method ' MiniB3D functions ' Essential - offers Blitz3D functionality that cannot be exactly matched Method BackBufferToTex(mipmap_no=0,frame=0) Local x=0,y=0 glBindtexture GL_TEXTURE_2D,gltex[frame] glCopyTexImage2D(GL_TEXTURE_2D,mipmap_no,GL_RGBA8,x,TGlobal.height-y-height,width,height,0) End Method Method BackBufferToTexExt(mipmap_no=0,frame=0,Kind=GL_RGBA) Local x=0,y=0 glBindtexture GL_TEXTURE_2D,gltex[frame] glCopyTexImage2D(GL_TEXTURE_2D,mipmap_no,Kind,x,TGlobal.height-y-height,width,height,0) 'gluBuild2DMipmaps(GL_TEXTURE_2D, 4,pixmap.width,pixmap.height,Kind, GL_UNSIGNED_BYTE, pixmap.pixels) End Method Method BackBufferToCubeTex(mipmap_no=0) Local x=0,y=0 glBindtexture GL_TEXTURE_CUBE_MAP_EXT,gltex[0] Select cube_face Case 0 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X,mipmap_no,GL_RGBA8,x,TGlobal.height-y-height,width,height,0) Case 1 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z,mipmap_no,GL_RGBA8,x,TGlobal.height-y-height,width,height,0) Case 2 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X,mipmap_no,GL_RGBA8,x,TGlobal.height-y-height,width,height,0) Case 3 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,mipmap_no,GL_RGBA8,x,TGlobal.height-y-height,width,height,0) Case 4 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,mipmap_no,GL_RGBA8,x,TGlobal.height-y-height,width,height,0) Case 5 glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y,mipmap_no,GL_RGBA8,x,TGlobal.height-y-height,width,height,0) End Select End Method ' Extra - offers extra functionality that Blitz3D does not Method CountMipmaps() Return no_mipmaps End Method Method MipmapWidth(mipmap_no) If mipmap_no>=0 And mipmap_no<=no_mipmaps Return width/(mipmap_no+1) Else Return 0 EndIf End Method Method MipmapHeight(mipmap_no) If mipmap_no>=0 And mipmap_no<=no_mipmaps Return height/(mipmap_no+1) Else Return 0 EndIf End Method ' Internal - not recommended for general use Function FileFind:Object(file2:Object) Local file:String = String(File2) Local fback:String = file Local isIncbin:Byte = False If file[..6] = "incbin" Then IsIncbin = True If FileType(file)=0 Repeat If isIncbin = True Then file$="incbin::" + Right$(file$,(Len(file$)-Instr(file$,"",1))) Else file$ = Right$(file$ , (Len(file$) - Instr(file$ , "" , 1) ) ) EndIf Until Instr(file$,"",1)=0 Repeat file$ = Right$(file$ , (Len(file$) - Instr(file$ , "/" , 1) ) ) Until Instr(file$ , "/" , 1) = 0 If IsIncbin = False Then If FileType(file$)=0 DebugLog "ERROR: Cannot find texture: "+file$ Return Null EndIf Else If ReadStream(File) = Null Then DebugLog "ERROR: Cannot find texture: "+file$ Return Null EndIf EndIf EndIf Return file End Function Function FileAbs$(file$) Local file_abs$ If Instr(file$,":")=False file_abs$=CurrentDir$()+"/"+file$ Else file_abs$=file$ EndIf file_abs$=Replace$(file_abs$,"","/") Return file_abs$ End Function Method TexInList:TTexture() ' check if tex already exists in list and if so return it For Local tex:TTexture=EachIn tex_list If file$=tex.file$ And flags=tex.flags Return tex EndIf Next Return Null End Method Method FilterFlags() ' combine specifieds flag with texture filter flags For Local filter:TTextureFilter=EachIn TTextureFilter.filter_list If Instr(file$,filter.text$) Then flags=flags|filter.flags Next End Method Function AdjustPixmap:TPixmap(pixmap:TPixmap) ' adjust width and height size to next biggest power of 2 size Local width=Pow2Size(pixmap.width) Local height=Pow2Size(pixmap.height) ' check that width and height size are valid (not too big) Repeat Local t glTexImage2D GL_PROXY_TEXTURE_2D,0,4,width,height,0,GL_RGBA,GL_UNSIGNED_BYTE,Null glGetTexLevelParameteriv GL_PROXY_TEXTURE_2D,0,GL_TEXTURE_WIDTH,Varptr t If t Exit If width=1 And height=1 RuntimeError "Unable to calculate tex size" If width>1 width:/2 If height>1 height:/2 Forever ' if width or height have changed then resize pixmap If width<>pixmap.width Or height<>pixmap.height pixmap=ResizePixmap(pixmap,width,height) EndIf ' return pixmap Return pixmap End Function Function Pow2Size( n ) Local t=1 While t<n t:*2 Wend Return t End Function Rem Function AdjustPixmap:TPixmap(pixmap:TPixmap) Local width=Pow2Size(pixmap.width) Local height=Pow2Size(pixmap.height) If width<>pixmap.width Or height<>pixmap.height pixmap=ResizePixmap(pixmap,width,height) EndIf Return pixmap End Function Function Pow2Size( n ) Local t=1 While t<n t:*2 Wend Return t End Function End Rem End Type Type TTextureFilter Global filter_list:TList=CreateList() Field text$ Field flags End Type
And in func.bmx change the LoadTexture Function to this:
Function LoadTexture:TTexture(file:Object,flags=1) Return TTexture.LoadTexture(file,flags) End Function
After rebuilding the module you should normally be able to load Textures which are incbin, TImage or TPixmap .