home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 5_2007-2008.ISO / data / Zips / Blank_Engi2067755272007.psc / BlankEngine / BE_Billboard.cls < prev    next >
Text File  |  2007-03-29  |  8KB  |  222 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "BE_Billboard"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. '//
  15. '// BE_BillBoard handles billboard rendering
  16. '//
  17.  
  18. Private Declare Function GetTickCount Lib "kernel32" () As Long
  19.  
  20. 'Billlboard stuff
  21. Public BE_BILLBOARD_FACEX As Single
  22. Public BE_BILLBOARD_FACEY As Single
  23. Public BE_BILLBOARD_FACEZ As Single
  24. Public BE_BILLBOARD_POSX As Single
  25. Public BE_BILLBOARD_POSY As Single
  26. Public BE_BILLBOARD_POSZ As Single
  27. Private LastX As Single, LastX2 As Single
  28. Private LastY As Single, LastY2 As Single
  29. Private LastZ As Single, LastZ2 As Single
  30. Private BBSize As Single
  31. Public CurrentFrame As Integer
  32. Public TotalFrames As Integer
  33. Dim z(0 To 3) As Single, x(0 To 3) As Single, y(0 To 3) As Single
  34.  
  35. 'Billboard frames
  36. Private BBinterval As Integer
  37. Private LastCheck As Long
  38.  
  39. 'Billboarding angles
  40. Private BBphi As Single
  41. Private BBtheta As Single
  42.  
  43. 'billboard texture
  44. Private TexBillboard() As Direct3DTexture8
  45.  
  46. Public Function BE_BILLBOARD_INIT(TexturePath() As String, Interval As Integer, Width As Long, Height As Long, Depth As CONST_D3DFORMAT, Size As Integer) As Boolean
  47. 'initialize billboard
  48. On Error GoTo Err
  49.  
  50. Dim i As Integer, t As Integer
  51.  
  52.     'set number of frames
  53.     t = UBound(TexturePath)
  54.  
  55.     'load all of the textures
  56.     For i = 0 To t
  57.         'resize variable
  58.         ReDim Preserve TexBillboard(0 To i) As Direct3DTexture8
  59.         
  60.         'load texture
  61.         If D3D.CheckDeviceFormat(0, D3DDEVTYPE_HAL, Depth, 0, D3DRTYPE_TEXTURE, D3DFMT_DXT1) = D3D_OK Then
  62.             Set TexBillboard(i) = D3DX.CreateTextureFromFileEx(D3Device, App.Path & TexturePath(i), Width, Height, 1, 0, D3DFMT_DXT1, D3DPOOL_MANAGED, D3DX_FILTER_LINEAR, D3DX_FILTER_LINEAR, 0, ByVal 0, ByVal 0)
  63.         ElseIf D3D.CheckDeviceFormat(0, D3DDEVTYPE_HAL, Depth, 0, D3DRTYPE_TEXTURE, D3DFMT_A8R8G8B8) = D3D_OK Then
  64.             Set TexBillboard(i) = D3DX.CreateTextureFromFileEx(D3Device, App.Path & TexturePath(i), Width, Height, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, D3DX_FILTER_LINEAR, D3DX_FILTER_LINEAR, 0, ByVal 0, ByVal 0)
  65.         ElseIf D3D.CheckDeviceFormat(0, D3DDEVTYPE_HAL, Depth, 0, D3DRTYPE_TEXTURE, D3DFMT_A4R4G4B4) = D3D_OK Then
  66.             Set TexBillboard(i) = D3DX.CreateTextureFromFileEx(D3Device, App.Path & TexturePath(i), Width, Height, 1, 0, D3DFMT_A4R4G4B4, D3DPOOL_MANAGED, D3DX_FILTER_LINEAR, D3DX_FILTER_LINEAR, 0, ByVal 0, ByVal 0)
  67.         ElseIf D3D.CheckDeviceFormat(0, D3DDEVTYPE_HAL, Depth, 0, D3DRTYPE_TEXTURE, D3DFMT_A1R5G5B5) = D3D_OK Then
  68.             Set TexBillboard(i) = D3DX.CreateTextureFromFileEx(D3Device, App.Path & TexturePath(i), Width, Height, 1, 0, D3DFMT_A1R5G5B5, D3DPOOL_MANAGED, D3DX_FILTER_LINEAR, D3DX_FILTER_LINEAR, 0, ByVal 0, ByVal 0)
  69.         Else
  70.             Err.Description = "Billboard Texture(" & TexturePath(i) & ") Could not be loaded."
  71.             GoTo Err
  72.         End If
  73.     Next i
  74.     
  75.     'set up billboard
  76.     BBinterval = Interval
  77.     LastCheck = GetTickCount()
  78.     TotalFrames = t
  79.     CurrentFrame = 0
  80.     BBSize = Size
  81.  
  82.     'exit
  83.     BE_BILLBOARD_INIT = True
  84.     Exit Function
  85.     
  86. Err:
  87. 'send to logger
  88.     BE_BILLBOARD_INIT = False
  89.     Logger.BE_LOGGER_SAVE_LOG "Error[" & Err.Number & "] " & Err.Source & "{BE_BILLBOARD_INIT} : " & Err.Description, App.Path & "\Log.txt"
  90. End Function
  91.  
  92. Public Sub BE_BILLBOARD_SETUP_RENDER(Angle As Single)
  93. 'draw the billboard
  94. On Error GoTo Err
  95.  
  96.     'find the angles for the billboard
  97.     'BE_BILLBOARD_FIND_ANGLES BE_VERTEX_MAKE_VECTOR(BE_BILLBOARD_FACEX, BE_BILLBOARD_FACEY, BE_BILLBOARD_FACEZ), BE_VERTEX_MAKE_VECTOR(1, 10, 10)
  98.     
  99.     'draw
  100.     BE_BILLBOARD_RENDER
  101.     Exit Sub
  102.     
  103. Err:
  104. 'send to logger
  105.     Logger.BE_LOGGER_SAVE_LOG "Error[" & Err.Number & "] " & Err.Source & "{BE_BILLBOARD_RENDER} : " & Err.Description, App.Path & "\Log.txt"
  106. End Sub
  107.  
  108. Private Sub BE_BILLBOARD_RENDER()
  109. 'Actually draws the billboard
  110. On Error GoTo Err
  111.  
  112.     ' setup device
  113.     D3Device.SetVertexShader Unlit_FVF
  114.     D3Device.SetRenderState D3DRS_ALPHATESTENABLE, 1 'alpha testing is useful... ;)
  115.     D3Device.SetRenderState D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL 'Pixel passes if (pxAlpha>=ALPHAREF)
  116.     D3Device.SetRenderState D3DRS_ALPHAREF, 50 'only if the pixels alpha is greater than or equal to 50 will it be rendered (skips lots of rendering!)
  117.     D3Device.SetRenderState D3DRS_ZWRITEENABLE, 0 'we dont want to affect the depth buffer
  118.     D3Device.SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
  119.     D3Device.SetRenderState D3DRS_DESTBLEND, D3DBLEND_ONE
  120.     D3Device.SetRenderState D3DRS_ALPHABLENDENABLE, 0 '1
  121.     
  122.     'find frame
  123.     If (GetTickCount - LastCheck >= BBinterval) Then
  124.         'advance frame
  125.         CurrentFrame = CurrentFrame + 1
  126.         LastCheck = GetTickCount()
  127.         If CurrentFrame > TotalFrames Then CurrentFrame = 0
  128.     End If
  129.     
  130.     'setup billboard rotation
  131.     If (BECamera.BE_CAMERA_STRAFE < BE_BILLBOARD_POSX) Then
  132.         x(0) = (BECamera.BE_CAMERA_STRAFE - BE_BILLBOARD_POSX) / 100
  133.         x(1) = (BECamera.BE_CAMERA_STRAFE - BE_BILLBOARD_POSX) / 100
  134.     ElseIf (BECamera.BE_CAMERA_STRAFE > BE_BILLBOARD_POSX) Then
  135.         x(2) = (BECamera.BE_CAMERA_STRAFE - BE_BILLBOARD_POSX) / 100
  136.         x(3) = (BECamera.BE_CAMERA_STRAFE - BE_BILLBOARD_POSX) / 100
  137.     End If
  138.     If (BECamera.BE_CAMERA_HEIGHT < BE_BILLBOARD_POSY) Then
  139.         z(0) = (BECamera.BE_CAMERA_HEIGHT - BE_BILLBOARD_POSY) / 100
  140.         z(2) = (BECamera.BE_CAMERA_HEIGHT - BE_BILLBOARD_POSY) / 100
  141.     ElseIf (BECamera.BE_CAMERA_HEIGHT > BE_BILLBOARD_POSY) Then
  142.         z(1) = (BECamera.BE_CAMERA_HEIGHT - BE_BILLBOARD_POSY) / 100
  143.         z(3) = (BECamera.BE_CAMERA_HEIGHT - BE_BILLBOARD_POSY) / 100
  144.     End If
  145.     
  146.     'draw texture
  147.     BE_IMAGE_RENDER_BILLBOARD BE_BILLBOARD_POSX, BE_BILLBOARD_POSY, BE_BILLBOARD_POSZ, x, y, z, BBSize, TexBillboard(CurrentFrame)
  148.     
  149.     'tidy up device
  150.     D3Device.SetRenderState D3DRS_ALPHATESTENABLE, 0
  151.     D3Device.SetRenderState D3DRS_ALPHABLENDENABLE, 0
  152.     D3Device.SetRenderState D3DRS_ZWRITEENABLE, 1
  153.     
  154.     'exit
  155.     Exit Sub
  156.     
  157. Err:
  158. 'send to logger
  159.     Logger.BE_LOGGER_SAVE_LOG "Error[" & Err.Number & "] " & Err.Source & "{BE_BILLBOARD_RENDER} : " & Err.Description, App.Path & "\Log.txt"
  160. End Sub
  161.  
  162. Private Function BE_BILLBOARD_VECTOR_NORMALIZE(dest As D3DVECTOR) As D3DVECTOR
  163. '// Normalizes a vector
  164. On Error Resume Next
  165.  
  166. Dim i As Single
  167.  
  168.     'get vector normal
  169.     i = (dest.x * dest.x) + (dest.y * dest.y) + (dest.z * dest.z)
  170.     i = Sqr(i)
  171.     
  172.     'check for 0
  173.     If (i = 0) Then
  174.         BE_BILLBOARD_VECTOR_NORMALIZE.x = 0
  175.         BE_BILLBOARD_VECTOR_NORMALIZE.y = 0
  176.         BE_BILLBOARD_VECTOR_NORMALIZE.z = 0
  177.         Exit Function
  178.     End If
  179.     
  180.     'return vector normal
  181.     dest.x = dest.x / i
  182.     dest.y = dest.y / i
  183.     dest.z = dest.z / i
  184.     BE_BILLBOARD_VECTOR_NORMALIZE.x = dest.x
  185.     BE_BILLBOARD_VECTOR_NORMALIZE.y = dest.y
  186.     BE_BILLBOARD_VECTOR_NORMALIZE.z = dest.z
  187. End Function
  188.  
  189. Public Sub BE_BILLBOARD_UNLOAD()
  190. '// Unload the currently loaded billboard
  191. On Error GoTo Err
  192.  
  193. Dim i As Integer
  194.  
  195.     'unload textures
  196.     For i = 0 To TotalFrames
  197.         Set TexBillboard(i) = Nothing
  198.     Next i
  199.     
  200.     'resize variables
  201.     ReDim TexBillboard(0) As Direct3DTexture8
  202.     
  203.     'unload other variables
  204.     CurrentFrame = 0
  205.     TotalFrames = 0
  206.     BBphi = 0
  207.     BBtheta = 0
  208.     BE_BILLBOARD_FACE.x = 0: BE_BILLBOARD_FACE.y = 0: BE_BILLBOARD_FACE.z = 0
  209.     BE_BILLBOARD_POSX = 0: BE_BILLBOARD_POSY = 0: BE_BILLBOARD_POSZ = 0
  210.     LastX = 0: LastY = 0: LastZ = 0
  211.     BBinterval = 0
  212.     LastCheck = 0
  213.     
  214.     'exit
  215.     Exit Sub
  216.  
  217. Err:
  218. 'send to logger
  219.     Logger.BE_LOGGER_SAVE_LOG "Error[" & Err.Number & "] " & Err.Source & "{BE_BILLBOARD_UNLOAD} : " & Err.Description, App.Path & "\Log.txt"
  220. End Sub
  221.  
  222.