home *** CD-ROM | disk | FTP | other *** search
/ Microsoft DirectX SDK 7.0 / Dx7.bin / DXF / samples / multimedia / vbsamples / d3dim / src / imcontrol / imtexture.cls < prev   
Encoding:
Visual Basic class definition  |  1999-03-03  |  4.2 KB  |  158 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4. END
  5. Attribute VB_Name = "IMTexture"
  6. Attribute VB_GlobalNameSpace = False
  7. Attribute VB_Creatable = False
  8. Attribute VB_PredeclaredId = False
  9. Attribute VB_Exposed = True
  10.  
  11. Dim m_ddsd As DDSURFACEDESC2
  12. Dim m_dd As DirectDraw4
  13. Dim m_d3d As Direct3D3
  14. Dim m_d3ddev As Direct3DDevice3
  15. Dim m_width As Integer
  16. Dim m_height As Integer
  17. Public SurfaceObject As DirectDrawSurface4
  18. Public TextureObject As Direct3DTexture2
  19.  
  20.  
  21. Const D3DTEXTR_TRANSPARENTBLACK = 1
  22. Const D3DTEXTR_TRANSPARENTWHITE = 2
  23.  
  24.  
  25. Function Init(dd As DirectDraw4, d3d As Direct3D3, d3ddev As Direct3DDevice3, sFile As String, extraFlags As Long, w As Long, h As Long)
  26.     Dim bOK As Boolean
  27.     Dim enumTex As Direct3DEnumPixelFormats
  28.     
  29.     Dim sLoadFile As String
  30.     
  31.     Dim i As Long
  32.         
  33.         
  34.     Set m_d3ddev = d3ddev
  35.     Set m_d3d = d3d
  36.     Set m_dd = dd
  37.         
  38.     m_ddsd.lFlags = DDSD_CAPS Or DDSD_TEXTURESTAGE Or DDSD_PIXELFORMAT
  39.     If ((h <> 0) And (w <> 0)) Then
  40.         m_ddsd.lFlags = m_ddsd.lFlags Or DDSD_HEIGHT Or DDSD_WIDTH
  41.         m_ddsd.lHeight = h
  42.         m_ddsd.lWidth = w
  43.     End If
  44.     
  45.  
  46.      
  47.     Set enumTex = m_d3ddev.GetTextureFormatsEnum()
  48.     
  49.    
  50.     
  51.     For i = 1 To enumTex.GetCount()
  52.         bOK = True
  53.         Call enumTex.GetItem(i, m_ddsd.ddpfPixelFormat)
  54.             
  55.         With m_ddsd.ddpfPixelFormat
  56.             
  57.             If .lRGBBitCount <> 16 Then bOK = False
  58.             If .lFourCC <> 0 Then bOK = False
  59.                         
  60.             
  61.             If ((D3DTEXTR_TRANSPARENTBLACK And extraFlags) _
  62.                   Or (D3DTEXTR_TRANSPARENTWHITE And extraFlags)) Then
  63.                   If (.lRGBAlphaBitMask = 0) Then bOK = False
  64.                   'DDPF_ALPHAPIXELS
  65.             Else
  66.                   If (.lRGBAlphaBitMask <> 0) Then bOK = False
  67.             End If
  68.                   
  69.             
  70.         End With
  71.         If bOK = True Then Exit For
  72.     Next
  73.     
  74.     If bOK = False Then
  75.         Debug.Print "Unable to find 16bit surface support on your hardware - exiting"
  76.         Init = False
  77.     End If
  78.     
  79.     If (((D3DTEXTR_TRANSPARENTBLACK And extraFlags) _
  80.           Or (D3DTEXTR_TRANSPARENTWHITE And extraFlags))) Then
  81.         m_ddsd.ddpfPixelFormat.lFlags = DDPF_ALPHAPIXELS Or DDPF_RGB
  82.         m_ddsd.lFlags = m_ddsd.lFlags Or DDSD_PIXELFORMAT
  83.         
  84.     Else
  85.         m_ddsd.ddpfPixelFormat.lFlags = DDPF_RGB
  86.   
  87.     End If
  88.     
  89.     m_ddsd.ddsCaps.lCaps = DDSCAPS_TEXTURE
  90.     m_ddsd.ddsCaps.lCaps2 = DDSCAPS2_TEXTUREMANAGE
  91.     m_ddsd.lTextureStage = 0
  92.     
  93.         
  94.  
  95.     
  96.     Set SurfaceObject = m_dd.CreateSurfaceFromFile(sFile, m_ddsd)
  97.     Set TextureObject = SurfaceObject.GetTexture()
  98.     
  99.     
  100.     
  101.     If Not (((D3DTEXTR_TRANSPARENTBLACK = extraFlags) _
  102.         Or (D3DTEXTR_TRANSPARENTWHITE = extraFlags)) _
  103.         ) Then Exit Function
  104.  
  105.         
  106.         
  107.     Dim ddsd3 As DDSURFACEDESC2
  108.     Dim mem() As Integer
  109.     Dim lAlphaMask As Long
  110.     Dim lRGBMask As Long
  111.     Dim lColorKey As Long
  112.     Dim c As Long
  113.     Dim x As Long
  114.     Dim y As Long
  115.     Dim r1 As RECT
  116.     
  117.     ReDim mem(m_ddsd.lHeight * m_ddsd.lPitch)
  118.                         
  119.     With m_ddsd.ddpfPixelFormat
  120.         lAlphaMask = .lRGBAlphaBitMask
  121.         lRGBMask = .lRBitMask Or .lGBitMask Or .lBBitMask
  122.     End With
  123.     If (extraFlags And D3DTEXTR_TRANSPARENTWHITE) Then
  124.         lColorKey = lRGBMask     'color key on white
  125.     End If
  126.     If (extraFlags And D3DTEXTR_TRANSPARENTBLACK) Then
  127.         lColorKey = 0                  'color key on black
  128.     End If
  129.     
  130.     'pixel format should be 16 bit because thats what we selected
  131.     r1.bottom = m_ddsd.lHeight
  132.     r1.right = m_ddsd.lWidth
  133.     SurfaceObject.Lock r1, ddsd3, DDLOCK_WAIT, 0
  134.     
  135.     ' Add an opaque alpha value to each non-colorkeyed pixel
  136.     For y = 0 To ddsd3.lHeight - 1
  137.         For x = 0 To ddsd3.lWidth - 1
  138.             c = SurfaceObject.GetLockedPixel(x, y)
  139.             If c And lRGBMask <> lColorKey Then
  140.                 SurfaceObject.SetLockedPixel x, y, c Or lAlphaMask
  141.             End If
  142.         Next
  143.     Next
  144.  
  145.     SurfaceObject.Unlock r1
  146.         
  147.     
  148. End Function
  149.  
  150.  
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.