Page 1 sur 1

créer un tga en fusionant une texture avec une alphamap

Publié : jeu. 14/déc./2006 15:14
par cha0s
tout est dans le titre voicie une petit fonction detaillé qui permet de créer une image au format TGA 32 non compressé avec une texture et une alphamap

note :
peut importe le format pour les images mais l'alphamap est une image en noir est blanc .
cependant seul la composante bleu donne la transparence, car l'image estant en noir et blanc les composant R V et B sont theoriquement de meme valeur)

Code : Tout sélectionner

Procedure CreateTGA(Image.s, Alphamap.s, FileName.s = "temp.tga")
  Protected FileID, ImgID, AlphaID, *MemoryID
  If FileSize(FileName) > -1
    DeleteFile(FileName)
  EndIf
  FileID = CreateFile(#PB_Any, FileName)
  ImgID = LoadImage(#PB_Any,Image)
  AlphaID = LoadImage(#PB_Any,Alphamap)
  *MemoryID = AllocateMemory(ImageWidth(ImgID)*ImageHeight(ImgID)*4)
  *GetOldMemoryID = *MemoryID
  ;format BVRA (bleu vert rouge alpha

  For x = 0 To ImageWidth(ImgID) - 1
    For y = 0 To ImageHeight(ImgID) - 1
      StartDrawing(ImageOutput(ImgID))
        PokeB(*MemoryID , Blue(Point(x, y)))
        *MemoryID + 1
        PokeB(*MemoryID , Green(Point(x, y))) 
        *MemoryID + 1
        PokeB(*MemoryID , Red(Point(x, y)))
        *MemoryID + 2
      StopDrawing()     
    Next y
  Next x
  
  *MemoryID = *GetOldMemoryID + 3
  For x = 0 To ImageWidth(ImgID) - 1
    For y = 0 To ImageHeight(ImgID) - 1
     StartDrawing(ImageOutput(AlphaID)) 
        PokeB(*MemoryID, Blue(Point(x, y)))
        *MemoryID + 4
      StopDrawing()   
    Next y
  Next x
  
  
  Debug *MemoryID 

  ;header :
  ;adresse  type    description
  ;1        byte    taille
  ;2        byte    0(1 pour colormap)
  ;3        byte    type de compression (2 pour BVRA)
  ;4        short   0
  ;6        short   0
  ;8        byte    0
  ;9        short   0
  ;11       short   0
  ;13       short   largeur
  ;15       short   hauteur
  ;16       byte    profondeur
  ;17       byte    8


  WriteByte(FileID, 0)
  WriteByte(FileID, 0)
  WriteByte(FileID, 2)

  WriteWord(FileID, 0)
  WriteWord(FileID, 0)
  WriteByte(FileID, 0)

  WriteWord(FileID, 0)
  WriteWord(FileID, 0)

  WriteWord(FileID, 512)
  WriteWord(FileID, 512)

  WriteByte(FileID, 32)
  WriteByte(FileID, 8)

  WriteData(FileID, *GetOldMemoryID, ImageWidth(ImgID)*ImageHeight(ImgID)*4) ;Data image
  FreeImage(AlphaID):FreeImage(ImgID):FreeMemory(*GetOldMemoryID):CloseFile(FileID) ;on decharge la memoire
EndProcedure