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_BEModel.cls < prev    next >
Text File  |  2007-04-22  |  17KB  |  392 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_BEModel"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. '//
  15. '// BE_BEModel handles loading and rendering of Blank Engine's model format
  16. '//
  17.  
  18. Public Vertices As Long                 '# of vertices in model
  19. Public Triangles As Long                '# of triangles in model
  20. Public Bones As Long                    '# of bones in model
  21. Public Sectors As Long                  '# of sectors in model
  22. Public Animations As Long               '# of animations in model
  23. Private VertList() As UnlitVertex       'List of vertices in model
  24. Private BoneList() As Bone              'List of bones in model
  25. Private SectorList() As Sector          'List of sectors in model
  26. Private AnimList() As Animation         'List of animations for model
  27. Private TriList() As Triangle           'List of triangles
  28.  
  29. '// Used in frame animation
  30. Private Declare Function GetTickCount Lib "kernel32" () As Long
  31. Private LastCheck As Long
  32. Private CurrFrame As Long
  33.  
  34. Private Type Bone
  35.     Vertices() As Long                  'Pointer to vertex list
  36.     nVerts As Long                      '# of vertices in bone
  37.     BoneName As String                  'Name of bone
  38.     Parent As Long                      'Parent bone
  39.     Children() As Long                  'Children bones
  40.     nChild As Long                      '# of children bones
  41. End Type
  42.  
  43. Private Type Sector
  44.     Texture As Direct3DTexture8         'Texture for sector
  45.     TexPath As String                   'Path to the texture
  46.     Bones() As Long                     'Pointer to bone list
  47.     Vertices() As Long                  'Pointer to vertex list
  48.     Triangles() As Long                 'Pointer to triangle list
  49.     nVerts As Long                      '# of vertices
  50.     nBones As Long                      '# of bones
  51.     nTris As Long                       '# of triangles
  52.     SectorName As String                'Name of sector
  53. End Type
  54.  
  55. Private Type AnimFrame
  56.     Vertices() As Long                  'Pointer to vertex list
  57.     x() As Single                       'X change
  58.     y() As Single                       'Y change
  59.     z() As Single                       'Z change
  60.     nVerts As Long                      '# of vertices in frame
  61. End Type
  62.  
  63. Private Type Animation
  64.     AnimName As String                  'Name of animation
  65.     nFrames As Long                     '# of frames
  66.     Frames() As AnimFrame               'List of frames in animation
  67.     Time As Long                        'Time inbetween frames
  68. End Type
  69.  
  70. Private Type Triangle
  71.     Point1 As Long                      '1st point
  72.     Point2 As Long                      '2nd point
  73.     Point3 As Long                      '3rd point
  74. End Type
  75.  
  76. Public Function BE_BEMODEL_LOAD(File As String) As Boolean
  77. '// Load a .bem model from file
  78. On Error GoTo Err
  79.  
  80. Dim ff As Integer, Temp As String, parse() As String, I As Long
  81. ff = FreeFile()
  82.  
  83.     'input model
  84.     Open File For Input As #ff
  85.         Do Until EOF(ff)
  86.             Line Input #ff, Temp
  87.             If (UCase$(Left$(Temp, 6)) = "SECTOR") Then
  88.                 'add a sector
  89.                 Sectors = Sectors + 1
  90.                 ReDim Preserve SectorList(1 To Sectors) As Sector
  91.                 SectorList(Sectors).SectorName = Trim$(Right$(Temp, Len(Temp) - 6))
  92.             ElseIf (UCase$(Left$(Temp, 7)) = "TEXTURE") Then
  93.                 'add a texture to sector
  94.                 SectorList(Sectors).TexPath = Trim$(Right$(Temp, Len(Temp) - 7))
  95.                 Set SectorList(Sectors).Texture = BE_IMAGE_LOAD_TEXTURE(SectorList(Sectors).TexPath)
  96.             ElseIf (UCase$(Left$(Temp, 5)) = "POINT") Then
  97.                 'add a point to sector
  98.                 SectorList(Sectors).nVerts = SectorList(Sectors).nVerts + 1
  99.                 ReDim Preserve SectorList(Sectors).Vertices(1 To SectorList(Sectors).nVerts) As Long
  100.                 parse = Split(Trim$(Right$(Temp, Len(Temp) - 5)), ",")
  101.                 'add point to vert list
  102.                 Vertices = Vertices + 1
  103.                 ReDim Preserve VertList(1 To Vertices) As UnlitVertex
  104.                 VertList(Vertices).x = parse(0)
  105.                 VertList(Vertices).y = parse(1)
  106.                 VertList(Vertices).z = parse(2)
  107.                 VertList(Vertices).tu = parse(3)
  108.                 VertList(Vertices).tv = parse(4)
  109.                 SectorList(Sectors).Vertices(SectorList(Sectors).nVerts) = Vertices
  110.             ElseIf (UCase$(Left$(Temp, 4)) = "BONE") Then
  111.                 'add bone to bonelist
  112.                 Bones = Bones + 1
  113.                 ReDim Preserve BoneList(1 To Bones) As Bone
  114.                 BoneList(Bones).BoneName = Trim$(Right$(Temp, Len(Temp) - 4))
  115.                 'add a bone to sector
  116.                 SectorList(Sectors).nBones = SectorList(Sectors).nBones + 1
  117.                 ReDim Preserve SectorList(Sectors).Bones(1 To SectorList(Sectors).nBones) As Long
  118.                 SectorList(Sectors).Bones(SectorList(Sectors).nBones) = Bones
  119.             ElseIf (UCase$(Left$(Temp, 6)) = "BPOINT") Then
  120.                 'add vertices to bone
  121.                 If (Bones > 0) Then
  122.                     parse = Split(Trim$(Right$(Temp, Len(Temp) - 6)), ",")
  123.                     For I = 0 To UBound(parse)
  124.                         BoneList(Bones).nVerts = BoneList(Bones).nVerts + 1
  125.                         ReDim Preserve BoneList(Bones).Vertices(1 To I + 1) As Long
  126.                         BoneList(Bones).Vertices(I + 1) = parse(I)
  127.                     Next I
  128.                 End If
  129.             ElseIf (UCase$(Left$(Temp, 6)) = "PARENT") Then
  130.                 'make bone a child
  131.                 BoneList(Bones).Parent = Trim$(Right$(Temp, Len(Temp) - 6))
  132.                 BoneList(BoneList(Bones).Parent).nChild = BoneList(BoneList(Bones).Parent).nChild + 1
  133.                 ReDim Preserve BoneList(BoneList(Bones).Parent).Children(1 To BoneList(BoneList(Bones).Parent).nChild) As Long
  134.                 BoneList(BoneList(Bones).Parent).Children(BoneList(BoneList(Bones).Parent).nChild) = Bones
  135.             ElseIf (UCase$(Left$(Temp, 9)) = "ANIMATION") Then
  136.                 'add an animation
  137.                 Animations = Animations + 1
  138.                 ReDim Preserve AnimList(1 To Animations) As Animation
  139.                 AnimList(Animations).AnimName = Trim$(Right$(Temp, Len(Temp) - 9))
  140.             ElseIf (UCase$(Left$(Temp, 5)) = "FRAME") Then
  141.                 'add a frame to animation
  142.                 If (Animations > 0) Then
  143.                     AnimList(Animations).nFrames = AnimList(Animations).nFrames + 1
  144.                     ReDim Preserve AnimList(Animations).Frames(1 To AnimList(Animations).nFrames) As AnimFrame
  145.                 End If
  146.             ElseIf (UCase$(Left$(Temp, 6)) = "FPOINT") Then
  147.                 'add a point translation to frame
  148.                 If (Animations > 0) Then
  149.                     If (AnimList(Animations).nFrames > 0) Then
  150.                         parse = Split(Trim$(Right$(Temp, Len(Temp) - 6)), ",")
  151.                         AnimList(Animations).Frames(AnimList(Animations).nFrames).nVerts = AnimList(Animations).Frames(AnimList(Animations).nFrames).nVerts + 1
  152.                         ReDim Preserve AnimList(Animations).Frames(AnimList(Animations).nFrames).Vertices(1 To AnimList(Animations).Frames(AnimList(Animations).nFrames).nVerts) As Long
  153.                         ReDim Preserve AnimList(Animations).Frames(AnimList(Animations).nFrames).x(1 To AnimList(Animations).Frames(AnimList(Animations).nFrames).nVerts) As Single
  154.                         ReDim Preserve AnimList(Animations).Frames(AnimList(Animations).nFrames).y(1 To AnimList(Animations).Frames(AnimList(Animations).nFrames).nVerts) As Single
  155.                         ReDim Preserve AnimList(Animations).Frames(AnimList(Animations).nFrames).z(1 To AnimList(Animations).Frames(AnimList(Animations).nFrames).nVerts) As Single
  156.                         AnimList(Animations).Frames(AnimList(Animations).nFrames).Vertices(AnimList(Animations).Frames(AnimList(Animations).nFrames).nVerts) = parse(0)
  157.                         AnimList(Animations).Frames(AnimList(Animations).nFrames).x(AnimList(Animations).Frames(AnimList(Animations).nFrames).nVerts) = parse(1)
  158.                         AnimList(Animations).Frames(AnimList(Animations).nFrames).y(AnimList(Animations).Frames(AnimList(Animations).nFrames).nVerts) = parse(2)
  159.                         AnimList(Animations).Frames(AnimList(Animations).nFrames).z(AnimList(Animations).Frames(AnimList(Animations).nFrames).nVerts) = parse(3)
  160.                     End If
  161.                 End If
  162.             ElseIf (UCase$(Left$(Temp, 4)) = "TIME") Then
  163.                 'set animation's time
  164.                 If (Animations > 0) Then
  165.                     AnimList(Animations).Time = Trim$(Right$(Temp, Len(Temp) - 4))
  166.                 End If
  167.             ElseIf (UCase$(Left$(Temp, 8)) = "TRIANGLE") Then
  168.                 'add a triangle
  169.                 If (Sectors > 0) Then
  170.                     If (Vertices > 2) Then
  171.                         SectorList(Sectors).nTris = SectorList(Sectors).nTris + 1
  172.                         Triangles = Triangles + 1
  173.                         ReDim Preserve TriList(1 To Triangles) As Triangle
  174.                         ReDim Preserve SectorList(Sectors).Triangles(1 To SectorList(Sectors).nTris) As Long
  175.                         parse = Split(Trim$(Right$(Temp, Len(Temp) - 8)), ",")
  176.                         SectorList(Sectors).Triangles(SectorList(Sectors).nTris) = Triangles
  177.                         TriList(Triangles).Point1 = parse(0)
  178.                         TriList(Triangles).Point2 = parse(1)
  179.                         TriList(Triangles).Point3 = parse(2)
  180.                     End If
  181.                 End If
  182.             End If
  183.         Loop
  184.     Close #ff
  185.  
  186.     'exit
  187.     BE_BEMODEL_LOAD = True
  188.     Exit Function
  189.     
  190. Err:
  191. 'send to logger
  192.     Logger.BE_LOGGER_SAVE_LOG "Error[" & Err.Number & "] " & Err.Source & "{BE_BEMODEL_LOAD} : " & Err.Description, App.Path & "\Log.txt"
  193. End Function
  194.  
  195. Public Function BE_BEMODEL_RENDER() As Boolean
  196. '// Render the BE Model
  197. On Error GoTo Err
  198.  
  199. Dim I As Long, t As Long
  200.  
  201.     'go through sector list and render verts
  202.     For I = 1 To Sectors
  203.         If (SectorList(I).nTris > 0) Then
  204.             D3Device.SetTexture 0, SectorList(I).Texture
  205.             For t = 1 To SectorList(I).nTris
  206.                 D3Device.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 1, VertList(TriList(SectorList(I).Triangles(t)).Point1), Len(VertList(TriList(SectorList(I).Triangles(t)).Point1))
  207.             Next t
  208.         End If
  209.     Next I
  210.     
  211.     'exit
  212.     BE_BEMODEL_RENDER = True
  213.     Exit Function
  214.     
  215. Err:
  216. 'send to logger
  217.     Logger.BE_LOGGER_SAVE_LOG "Error[" & Err.Number & "] " & Err.Source & "{BE_BEMODEL_RENDER} : " & Err.Description, App.Path & "\Log.txt"
  218. End Function
  219.  
  220. Public Function BE_BEMODEL_MOVE_MODEL(x As Single, y As Single, z As Single) As Boolean
  221. '// Move the whole model
  222. On Error GoTo Err
  223.  
  224. Dim I As Long
  225.  
  226.     If (Vertices < 0) Then Exit Function
  227.  
  228.     For I = 1 To Vertices
  229.         VertList(I).x = VertList(I).x + x
  230.         VertList(I).y = VertList(I).y + y
  231.         VertList(I).z = VertList(I).z + z
  232.     Next I
  233.     
  234.     'exit
  235.     BE_BEMODEL_MOVE_MODEL = True
  236.     Exit Function
  237.     
  238. Err:
  239. 'send to logger
  240.     Logger.BE_LOGGER_SAVE_LOG "Error[" & Err.Number & "] " & Err.Source & "{BE_BEMODEL_MOVE_MODEL} : " & Err.Description, App.Path & "\Log.txt"
  241. End Function
  242.  
  243. Public Function BE_BEMODEL_MOVE_SECTOR(SectorID As Long, x As Single, y As Single, z As Single) As Boolean
  244. '// Move a sector
  245. On Error GoTo Err
  246.  
  247. Dim I As Long
  248.  
  249.     If (Sectors <= 0) Then Exit Function
  250.     If (SectorList(SectorID).nVerts < 0) Then Exit Function
  251.  
  252.     For I = 1 To SectorList(SectorID).nVerts
  253.         VertList(SectorList(SectorID).Vertices(I)).x = VertList(SectorList(SectorID).Vertices(I)).x + x
  254.         VertList(SectorList(SectorID).Vertices(I)).y = VertList(SectorList(SectorID).Vertices(I)).y + y
  255.         VertList(SectorList(SectorID).Vertices(I)).z = VertList(SectorList(SectorID).Vertices(I)).z + z
  256.     Next I
  257.     
  258.     'exit
  259.     BE_BEMODEL_MOVE_SECTOR = True
  260.     Exit Function
  261.     
  262. Err:
  263. 'send to logger
  264.     Logger.BE_LOGGER_SAVE_LOG "Error[" & Err.Number & "] " & Err.Source & "{BE_BEMODEL_MOVE_SECTOR} : " & Err.Description, App.Path & "\Log.txt"
  265. End Function
  266.  
  267. Public Function BE_BEMODEL_MOVE_BONE(BoneID As Long, x As Single, y As Single, z As Single) As Boolean
  268. '// Move a bone
  269. On Error GoTo Err
  270.  
  271. Dim I As Long, v As Long
  272.  
  273.     If (Bones <= 0) Then Exit Function
  274.     If (BoneList(BoneID).nVerts <= 0) Then Exit Function
  275.  
  276.     'loop through bone's vertices
  277.     For I = 1 To BoneList(BoneID).nVerts
  278.         VertList(BoneList(BoneID).Vertices(I)).x = VertList(BoneList(BoneID).Vertices(I)).x + x
  279.         VertList(BoneList(BoneID).Vertices(I)).y = VertList(BoneList(BoneID).Vertices(I)).y + y
  280.         VertList(BoneList(BoneID).Vertices(I)).z = VertList(BoneList(BoneID).Vertices(I)).z + z
  281.     Next I
  282.     
  283.     'loop through children bones if any
  284.     If (BoneList(BoneID).nChild > 0) Then
  285.         For I = 1 To BoneList(BoneID).nChild
  286.             If (BoneList(I).nVerts > 0) Then
  287.                 For v = 1 To BoneList(I).nVerts
  288.                     VertList(BoneList(I).Vertices(v)).x = VertList(BoneList(I).Vertices(v)).x + x
  289.                     VertList(BoneList(I).Vertices(v)).y = VertList(BoneList(I).Vertices(v)).y + y
  290.                     VertList(BoneList(I).Vertices(v)).z = VertList(BoneList(I).Vertices(v)).z + z
  291.                 Next v
  292.             End If
  293.         Next I
  294.     End If
  295.     
  296.     'exit
  297.     BE_BEMODEL_MOVE_BONE = True
  298.     Exit Function
  299.     
  300. Err:
  301. 'send to logger
  302.     Logger.BE_LOGGER_SAVE_LOG "Error[" & Err.Number & "] " & Err.Source & "{BE_BEMODEL_MOVE_BONE} : " & Err.Description, App.Path & "\Log.txt"
  303. End Function
  304.  
  305. Public Function BE_BEMODEL_MOVE_TRIANGLE(Triangle As Long, x As Single, y As Single, z As Single) As Boolean
  306. '// Move a triangle
  307. On Error GoTo Err
  308.  
  309.     If (Vertices <= 0) Then Exit Function
  310.     If (Triangles <= 0) Then Exit Function
  311.     
  312.     BE_BEMODEL_MOVE_POINT TriList(Triangle).Point1, x, y, z
  313.     BE_BEMODEL_MOVE_POINT TriList(Triangle).Point2, x, y, z
  314.     BE_BEMODEL_MOVE_POINT TriList(Triangle).Point3, x, y, z
  315.     
  316.     'exit
  317.     BE_BEMODEL_MOVE_TRIANGLE = True
  318.     Exit Function
  319.     
  320. Err:
  321. 'send to logger
  322.     Logger.BE_LOGGER_SAVE_LOG "Error[" & Err.Number & "] " & Err.Source & "{BE_BEMODEL_MOVE_TRIANGLE} : " & Err.Description, App.Path & "\Log.txt"
  323. End Function
  324.  
  325. Public Function BE_BEMODEL_MOVE_POINT(Point As Long, x As Single, y As Single, z As Single) As Boolean
  326. '// Move a point
  327. On Error GoTo Err
  328.  
  329.     If (Vertices <= 0) Then Exit Function
  330.  
  331.     VertList(Point).x = VertList(Point).x + x
  332.     VertList(Point).y = VertList(Point).y + y
  333.     VertList(Point).z = VertList(Point).z + z
  334.     
  335.     'exit
  336.     BE_BEMODEL_MOVE_POINT = True
  337.     Exit Function
  338.     
  339. Err:
  340. 'send to logger
  341.     Logger.BE_LOGGER_SAVE_LOG "Error[" & Err.Number & "] " & Err.Source & "{BE_BEMODEL_MOVE_POINT} : " & Err.Description, App.Path & "\Log.txt"
  342. End Function
  343.  
  344. Public Function BE_BEMODEL_ANIMATE(Animation As Long, Frame As Long) As Boolean
  345. '// Applies animation to vertices
  346. On Error GoTo Err
  347.  
  348. Dim I As Long
  349.  
  350.     If (Animations <= 0) Then Exit Function
  351.     If (AnimList(Animation).nFrames <= 0) Then Exit Function
  352.     
  353.     'loop through frame
  354.     For I = 1 To AnimList(Animation).Frames(Frame).nVerts
  355.         VertList(AnimList(Animation).Frames(Frame).Vertices(I)).x = VertList(AnimList(Animation).Frames(Frame).Vertices(I)).x + AnimList(Animation).Frames(Frame).x(I)
  356.         VertList(AnimList(Animation).Frames(Frame).Vertices(I)).y = VertList(AnimList(Animation).Frames(Frame).Vertices(I)).y + AnimList(Animation).Frames(Frame).y(I)
  357.         VertList(AnimList(Animation).Frames(Frame).Vertices(I)).z = VertList(AnimList(Animation).Frames(Frame).Vertices(I)).z + AnimList(Animation).Frames(Frame).z(I)
  358.     Next I
  359.     
  360.     'exit
  361.     BE_BEMODEL_ANIMATE = True
  362.     Exit Function
  363.     
  364. Err:
  365. 'send to logger
  366.     Logger.BE_LOGGER_SAVE_LOG "Error[" & Err.Number & "] " & Err.Source & "{BE_BEMODEL_ANIMATE} : " & Err.Description, App.Path & "\Log.txt"
  367. End Function
  368.  
  369. Public Function BE_BEMODEL_ANIMATE_FRAMES(Animation As Long) As Boolean
  370. '// animates through frames after given time
  371. On Error GoTo Err
  372.  
  373.     If (Animations <= 0) Then Exit Function
  374.     If (AnimList(Animation).nFrames <= 0) Then Exit Function
  375.     
  376.     If (GetTickCount() - LastCheck >= AnimList(Animation).Time) Then
  377.         'update frame
  378.         CurrFrame = CurrFrame + 1
  379.         If (CurrFrame > AnimList(Animation).nFrames) Then CurrFrame = 1
  380.         BE_BEMODEL_ANIMATE Animation, CurrFrame
  381.         LastCheck = GetTickCount()
  382.     End If
  383.     
  384.     'exit
  385.     BE_BEMODEL_ANIMATE_FRAMES = True
  386.     Exit Function
  387.     
  388. Err:
  389. 'send to logger
  390.     Logger.BE_LOGGER_SAVE_LOG "Error[" & Err.Number & "] " & Err.Source & "{BE_BEMODEL_ANIMATE_FRAMES} : " & Err.Description, App.Path & "\Log.txt"
  391. End Function
  392.